[vhffs-dev] [1248] Importing Dojo, slightly cleaned up but not fully.

[ Thread Index | Date Index | More vhffs.org/vhffs-dev Archives ]


Revision: 1248
Author:   beuss
Date:     2008-08-03 00:33:52 +0200 (Sun, 03 Aug 2008)

Log Message:
-----------
Importing Dojo, slightly cleaned up but not fully. Began to switch to Template::Toolkit, public index uses the new design

Modified Paths:
--------------
    branches/vhffs-design/vhffs-api/src/Vhffs/Makefile.am
    branches/vhffs-design/vhffs-api/src/Vhffs/Panel/Group.pm
    branches/vhffs-design/vhffs-intl/POTFILES.in
    branches/vhffs-design/vhffs-intl/update-POTFILES.in.sh
    branches/vhffs-design/vhffs-panel/Makefile.am
    branches/vhffs-design/vhffs-public/index.pl
    branches/vhffs-design/vhffs-public/templates/Makefile.am
    branches/vhffs-design/vhffs-themes/Makefile.am

Added Paths:
-----------
    branches/vhffs-design/vhffs-api/src/Vhffs/Panel/Public.pm
    branches/vhffs-design/vhffs-panel/js/dijit/
    branches/vhffs-design/vhffs-panel/js/dijit/ColorPalette.js
    branches/vhffs-design/vhffs-panel/js/dijit/Declaration.js
    branches/vhffs-design/vhffs-panel/js/dijit/Dialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/Editor.js
    branches/vhffs-design/vhffs-panel/js/dijit/InlineEditBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/LICENSE
    branches/vhffs-design/vhffs-panel/js/dijit/Menu.js
    branches/vhffs-design/vhffs-panel/js/dijit/ProgressBar.js
    branches/vhffs-design/vhffs-panel/js/dijit/TitlePane.js
    branches/vhffs-design/vhffs-panel/js/dijit/Toolbar.js
    branches/vhffs-design/vhffs-panel/js/dijit/Tooltip.js
    branches/vhffs-design/vhffs-panel/js/dijit/Tree.js
    branches/vhffs-design/vhffs-panel/js/dijit/_Calendar.js
    branches/vhffs-design/vhffs-panel/js/dijit/_Container.js
    branches/vhffs-design/vhffs-panel/js/dijit/_Templated.js
    branches/vhffs-design/vhffs-panel/js/dijit/_TimePicker.js
    branches/vhffs-design/vhffs-panel/js/dijit/_Widget.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/
    branches/vhffs-design/vhffs-panel/js/dijit/_base/bidi.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/focus.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/manager.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/place.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/popup.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/scroll.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/sniff.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/typematic.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/wai.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base/window.js
    branches/vhffs-design/vhffs-panel/js/dijit/_base.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/RichText.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/_Plugin.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/html.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/commands.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/AlwaysShowToolbar.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/EnterKeyHandling.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/FontChoice.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/LinkDialog.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/TextColor.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/ToggleDir.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/range.js
    branches/vhffs-design/vhffs-panel/js/dijit/_editor/selection.js
    branches/vhffs-design/vhffs-panel/js/dijit/_tree/
    branches/vhffs-design/vhffs-panel/js/dijit/_tree/Node.html
    branches/vhffs-design/vhffs-panel/js/dijit/_tree/Tree.html
    branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndContainer.js
    branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndSelector.js
    branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndSource.js
    branches/vhffs-design/vhffs-panel/js/dijit/_tree/model.js
    branches/vhffs-design/vhffs-panel/js/dijit/bench/
    branches/vhffs-design/vhffs-panel/js/dijit/bench/benchReceive.php
    branches/vhffs-design/vhffs-panel/js/dijit/bench/benchTool.html
    branches/vhffs-design/vhffs-panel/js/dijit/bench/create_widgets.html
    branches/vhffs-design/vhffs-panel/js/dijit/bench/test_Button-programmatic.html
    branches/vhffs-design/vhffs-panel/js/dijit/bench/test_button-results.html
    branches/vhffs-design/vhffs-panel/js/dijit/bench/widget_construction_test.php
    branches/vhffs-design/vhffs-panel/js/dijit/changes.txt
    branches/vhffs-design/vhffs-panel/js/dijit/demos/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/chat.css
    branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/chat.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/client.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/community.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/operator.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/room.js
    branches/vhffs-design/vhffs-panel/js/dijit/demos/chat.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/form.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/continents.json
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/data.json
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.css
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.png
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/generate.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/langCountryMap.json
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/languages.json
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/languages.sh
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/sprite.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/icons.gif
    branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/icons.png
    branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.css
    branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.json
    branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/newMail.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/mail.html
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/en/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/en/helloworld.js
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/fr/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/fr/helloworld.js
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/helloworld.js
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/zh/
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/zh/helloworld.js
    branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao.html
    branches/vhffs-design/vhffs-panel/js/dijit/dijit-all.js
    branches/vhffs-design/vhffs-panel/js/dijit/dijit-all.js.uncompressed.js
    branches/vhffs-design/vhffs-panel/js/dijit/dijit.js
    branches/vhffs-design/vhffs-panel/js/dijit/dijit.js.uncompressed.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/
    branches/vhffs-design/vhffs-panel/js/dijit/form/Button.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/CheckBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/CurrencyTextBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/DateTextBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/FilteringSelect.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/Form.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/MultiSelect.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/NumberSpinner.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/NumberTextBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/SimpleTextarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/Slider.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/TextBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/TimeTextBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/ValidationTextBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/_DateTimeTextBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/_FormWidget.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/_Spinner.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/ComboBox.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/Textarea.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/validate.js
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/Button.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/CheckBox.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ComboBox.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ComboButton.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/DropDownButton.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/HorizontalSlider.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/InlineEditBox.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/Spinner.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/TextBox.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/TimePicker.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ValidationTextBox.html
    branches/vhffs-design/vhffs-panel/js/dijit/form/templates/VerticalSlider.html
    branches/vhffs-design/vhffs-panel/js/dijit/layout/
    branches/vhffs-design/vhffs-panel/js/dijit/layout/AccordionContainer.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/BorderContainer.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/ContentPane.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/LayoutContainer.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/LinkPane.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/SplitContainer.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/StackContainer.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/TabContainer.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/_LayoutWidget.js
    branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/
    branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/AccordionPane.html
    branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/TabContainer.html
    branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/TooltipDialog.html
    branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/_TabButton.html
    branches/vhffs-design/vhffs-panel/js/dijit/nls/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/da/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/da/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/da/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/de/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/de/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/de/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ROOT.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ar.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_cs.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_da.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_de-de.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_de.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_el.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en-gb.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en-us.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_es-es.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_es.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fi-fi.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fi.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fr-fr.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fr.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_he-il.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_he.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_hu.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_it-it.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_it.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ja-jp.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ja.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ko-kr.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ko.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_nl-nl.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_nl.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_no.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pl.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt-br.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt-pt.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ru.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_sv.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_tr.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_xx.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh-cn.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh-tw.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/el/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/el/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/el/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/es/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/es/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/es/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/he/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/he/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/he/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/it/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/it/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/it/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/
    branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/common.js
    branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/loading.js
    branches/vhffs-design/vhffs-panel/js/dijit/resources/
    branches/vhffs-design/vhffs-panel/js/dijit/resources/_modules.js
    branches/vhffs-design/vhffs-panel/js/dijit/templates/
    branches/vhffs-design/vhffs-panel/js/dijit/templates/Calendar.html
    branches/vhffs-design/vhffs-panel/js/dijit/templates/ColorPalette.html
    branches/vhffs-design/vhffs-panel/js/dijit/templates/Dialog.html
    branches/vhffs-design/vhffs-panel/js/dijit/templates/InlineEditBox.html
    branches/vhffs-design/vhffs-panel/js/dijit/templates/ProgressBar.html
    branches/vhffs-design/vhffs-panel/js/dijit/templates/TitlePane.html
    branches/vhffs-design/vhffs-panel/js/dijit/templates/Tooltip.html
    branches/vhffs-design/vhffs-panel/js/dijit/templates/buttons/
    branches/vhffs-design/vhffs-panel/js/dijit/templates/buttons/bg-fade.png
    branches/vhffs-design/vhffs-panel/js/dijit/templates/colors3x4.png
    branches/vhffs-design/vhffs-panel/js/dijit/templates/colors7x10.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/a11y/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/a11y/README.txt
    branches/vhffs-design/vhffs-panel/js/dijit/themes/a11y/indeterminate_progress.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ColorPalette.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ColorPalette.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Common.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Common.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ProgressBar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ProgressBar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Toolbar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Toolbar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Checkbox.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Checkbox.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/ComboBox.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/ComboBox.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/RadioButton.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/RadioButton.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Textarea.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Textarea.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/TimeTextBox.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/accordionItemActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonDisabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonEnabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonHover.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndCopy.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndMove.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndNoCopy.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndNoMove.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/editor.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/editor_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/no.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumb.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarAnim.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarEmpty.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarFull.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderEmpty.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderEmptyVertical.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFull.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullVertical.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullVerticalFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumbFocus.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumbFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerH-thumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerH.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerV-thumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerV.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteArrows.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteArrows.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteCheckbox.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteCheckbox.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteDivIcons.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteDivIcons.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRadio.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRadio.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree_rtl.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomActiveC.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomEnabledC.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomHoverC.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabContainerSprite.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabLeftChecked.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabRightChecked.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripe.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeBottom.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeLeft.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeRight.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/titleBar.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/titleBarActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorDown.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorDown.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorLeft.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorLeft.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorRight.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorRight.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorUp.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorUp.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeExpand_loading.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_half.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_half_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/validationInputBg.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/validationInputBg.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/warning.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/BorderContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/SplitContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ColorPalette.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ColorPalette.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Common.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Common.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ProgressBar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ProgressBar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Toolbar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Toolbar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Checkbox.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Checkbox.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/ComboBox.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/ComboBox.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/RadioButton.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/RadioButton.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Textarea.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Textarea.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/TimeTextBox.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/TimeTextBox.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/accordionItemActive.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/accordionItemActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonDisabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonEnabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonHover.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndCopy.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndMove.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndNoCopy.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndNoMove.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/editor.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/editor_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumb.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumbFocus.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumbFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarAnim.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarEmpty.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarFull.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderEmpty.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderEmptyVertical.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFull.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullVertical.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullVerticalFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumbFocus.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumbFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerH-thumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerH.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerV-thumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerV.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteArrows.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteArrows.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteCheckbox.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteCheckbox.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteDivIcons.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteDivIcons.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRadio.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRadio.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmall.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmall.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree_rtl.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomActiveC.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomEnabledC.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomHoverC.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabContainerSprite.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabLeftChecked.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabRightChecked.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripe.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeBottom.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeLeft.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeRight.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/titleBar.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/titleBarActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorDown.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorDown.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorLeft.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorLeft.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorRight.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorRight.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorUp.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorUp.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeExpand_loading.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_half.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_half_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/validationInputBg.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/validationInputBg.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/warning.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/BorderContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/BorderContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/SplitContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/SplitContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/templateThemeTest.html
    branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTester.html
    branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterImages/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterImages/blackButtonHover.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterQuirk.html
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ColorPalette.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ColorPalette.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Common.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Common.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ProgressBar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ProgressBar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Toolbar.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Toolbar.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Button.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Button.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Checkbox.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Checkbox.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Common.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Common.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/RadioButton.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/RadioButton.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/TextArea.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/TextArea.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/accordionItemActive.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowDown.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowDown.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowLeft.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowLeft.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowRight.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowRight.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowUp.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowUp.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonDisabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonEnabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonHover.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarDayLabel.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarMonthLabel.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarYearLabel.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxDisabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxEnabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxHover.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmark.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmark.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmarkNoBorder.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmarkNoBorder.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/circleIcon.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/circleIcon.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/comboArrowDown.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dijitProgressBarAnim.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dijitProgressBarAnim.psd
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndCopy.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndMove.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndNoCopy.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndNoMove.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dojoTundraGradientBg.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dojoTundraGradientBg.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/doubleArrowDown.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/doubleArrowUp.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/editor.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/editor_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/folderClosed.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/folderOpened.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_half.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_half_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/leaf.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/loading.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/menu.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/minusButton.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/no.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/noX.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/plusButton.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/popupMenuBg.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumb.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumbFocus.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumbFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-1.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-2.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-3.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-4.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-5.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-6.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-7.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-8.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-9.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim.psd
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarEmpty.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarFull.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActiveDisabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActiveHover.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonDisabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonEnabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonHover.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderEmpty.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderEmptyVertical.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFull.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullVertical.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullVerticalFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumbFocus.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumbFocus.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/smallArrowDown.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/smallArrowUp.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerH-thumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerH.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerV-thumb.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerV.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabActive.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabClose.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabClose.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabCloseHover.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabCloseHover.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabDisabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabEnabled.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabHover.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabHover.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/titleBar.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/titleBarBg.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorDown.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorDown.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorLeft.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorLeft.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorRight.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorRight.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorUp.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorUp.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_leaf.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_leaf_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_loading.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_minus.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_minus_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_mius.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_plus.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_plus_rtl.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/validationInputBg.gif
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/validationInputBg.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/warning.png
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/AccordionContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/BorderContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/SplitContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra_rtl.css
    branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojo/
    branches/vhffs-design/vhffs-panel/js/dojo/AdapterRegistry.js
    branches/vhffs-design/vhffs-panel/js/dojo/DeferredList.js
    branches/vhffs-design/vhffs-panel/js/dojo/LICENSE
    branches/vhffs-design/vhffs-panel/js/dojo/NodeList-fx.js
    branches/vhffs-design/vhffs-panel/js/dojo/OpenAjax.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/
    branches/vhffs-design/vhffs-panel/js/dojo/_base/Color.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/Deferred.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/NodeList.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/
    branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/bootstrap.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_browser.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_rhino.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_spidermonkey.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader_debug.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader_xd.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/array.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/browser.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/connect.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/declare.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/event.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/fx.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/html.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/json.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/lang.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/query.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/window.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base/xhr.js
    branches/vhffs-design/vhffs-panel/js/dojo/_base.js
    branches/vhffs-design/vhffs-panel/js/dojo/_firebug/
    branches/vhffs-design/vhffs-panel/js/dojo/_firebug/LICENSE
    branches/vhffs-design/vhffs-panel/js/dojo/_firebug/errorIcon.png
    branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.css
    branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.js
    branches/vhffs-design/vhffs-panel/js/dojo/_firebug/infoIcon.png
    branches/vhffs-design/vhffs-panel/js/dojo/_firebug/warningIcon.png
    branches/vhffs-design/vhffs-panel/js/dojo/back.js
    branches/vhffs-design/vhffs-panel/js/dojo/behavior.js
    branches/vhffs-design/vhffs-panel/js/dojo/build.txt
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/LICENSE
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/README
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/monetary.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de-de/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de-de/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it-it/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it-it/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja-jp/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja-jp/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt-br/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt-br/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/gregorian.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/cldr/supplemental.js
    branches/vhffs-design/vhffs-panel/js/dojo/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/cookie.js
    branches/vhffs-design/vhffs-panel/js/dojo/currency.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/
    branches/vhffs-design/vhffs-panel/js/dojo/data/ItemFileReadStore.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/ItemFileWriteStore.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/api/
    branches/vhffs-design/vhffs-panel/js/dojo/data/api/Identity.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/api/Notification.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/api/Read.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/api/Request.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/api/Write.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/util/
    branches/vhffs-design/vhffs-panel/js/dojo/data/util/filter.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/util/simpleFetch.js
    branches/vhffs-design/vhffs-panel/js/dojo/data/util/sorter.js
    branches/vhffs-design/vhffs-panel/js/dojo/date/
    branches/vhffs-design/vhffs-panel/js/dojo/date/locale.js
    branches/vhffs-design/vhffs-panel/js/dojo/date/stamp.js
    branches/vhffs-design/vhffs-panel/js/dojo/date.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/Avatar.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/Container.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/Manager.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/Moveable.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/Mover.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/Selector.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/Source.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/TimedMoveable.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/autoscroll.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/common.js
    branches/vhffs-design/vhffs-panel/js/dojo/dnd/move.js
    branches/vhffs-design/vhffs-panel/js/dojo/dojo.js
    branches/vhffs-design/vhffs-panel/js/dojo/dojo.js.uncompressed.js
    branches/vhffs-design/vhffs-panel/js/dojo/fx.js
    branches/vhffs-design/vhffs-panel/js/dojo/i18n.js
    branches/vhffs-design/vhffs-panel/js/dojo/io/
    branches/vhffs-design/vhffs-panel/js/dojo/io/iframe.js
    branches/vhffs-design/vhffs-panel/js/dojo/io/script.js
    branches/vhffs-design/vhffs-panel/js/dojo/jaxer.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/ar/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/ar/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/cs/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/cs/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/da/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/da/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/de/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/de/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/el/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/el/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/es/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/es/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/fi/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/fi/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/fr/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/fr/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/he/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/he/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/hu/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/hu/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/it/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/it/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/ja/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/ja/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/ko/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/ko/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/nb/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/nb/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/nl/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/nl/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/pl/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/pl/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/pt/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/pt/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/pt-pt/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/pt-pt/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/ru/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/ru/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/sv/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/sv/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/tr/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/tr/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/zh/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/zh/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/nls/zh-tw/
    branches/vhffs-design/vhffs-panel/js/dojo/nls/zh-tw/colors.js
    branches/vhffs-design/vhffs-panel/js/dojo/number.js
    branches/vhffs-design/vhffs-panel/js/dojo/parser.js
    branches/vhffs-design/vhffs-panel/js/dojo/regexp.js
    branches/vhffs-design/vhffs-panel/js/dojo/resources/
    branches/vhffs-design/vhffs-panel/js/dojo/resources/LICENSE
    branches/vhffs-design/vhffs-panel/js/dojo/resources/_modules.js
    branches/vhffs-design/vhffs-panel/js/dojo/resources/blank.gif
    branches/vhffs-design/vhffs-panel/js/dojo/resources/blank.html
    branches/vhffs-design/vhffs-panel/js/dojo/resources/dnd.css
    branches/vhffs-design/vhffs-panel/js/dojo/resources/dnd.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojo/resources/dojo.css
    branches/vhffs-design/vhffs-panel/js/dojo/resources/dojo.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojo/resources/iframe_history.html
    branches/vhffs-design/vhffs-panel/js/dojo/resources/images/
    branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndCopy.png
    branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndMove.png
    branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndNoCopy.png
    branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndNoMove.png
    branches/vhffs-design/vhffs-panel/js/dojo/rpc/
    branches/vhffs-design/vhffs-panel/js/dojo/rpc/JsonService.js
    branches/vhffs-design/vhffs-panel/js/dojo/rpc/JsonpService.js
    branches/vhffs-design/vhffs-panel/js/dojo/rpc/RpcService.js
    branches/vhffs-design/vhffs-panel/js/dojo/string.js
    branches/vhffs-design/vhffs-panel/js/dojo/tests.js
    branches/vhffs-design/vhffs-panel/js/dojox/
    branches/vhffs-design/vhffs-panel/js/dojox/LICENSE
    branches/vhffs-design/vhffs-panel/js/dojox/_sql/
    branches/vhffs-design/vhffs-panel/js/dojox/_sql/LICENSE
    branches/vhffs-design/vhffs-panel/js/dojox/_sql/_crypto.js
    branches/vhffs-design/vhffs-panel/js/dojox/_sql/common.js
    branches/vhffs-design/vhffs-panel/js/dojox/_sql/demos/
    branches/vhffs-design/vhffs-panel/js/dojox/_sql/demos/customers/
    branches/vhffs-design/vhffs-panel/js/dojox/_sql/demos/customers/customers.html
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/README
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/JSON.php
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/dojoxAnalytics.php
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/consoleMessages.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/dojo.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/idle.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/mouseClick.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/mouseOver.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/window.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/analytics.profile.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/analyticsInBase.profile.js
    branches/vhffs-design/vhffs-panel/js/dojox/analytics.js
    branches/vhffs-design/vhffs-panel/js/dojox/av/
    branches/vhffs-design/vhffs-panel/js/dojox/av/README
    branches/vhffs-design/vhffs-panel/js/dojox/av/_base/
    branches/vhffs-design/vhffs-panel/js/dojox/av/_base/_ieFlash.js
    branches/vhffs-design/vhffs-panel/js/dojox/av/_base/flash.js
    branches/vhffs-design/vhffs-panel/js/dojox/av/_base/quicktime.js
    branches/vhffs-design/vhffs-panel/js/dojox/av/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/av/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/av/resources/version.mov
    branches/vhffs-design/vhffs-panel/js/dojox/av.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/
    branches/vhffs-design/vhffs-panel/js/dojox/charting/Chart2D.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/Chart3D.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/Element.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/README
    branches/vhffs-design/vhffs-panel/js/dojox/charting/Series.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/Theme.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/_color.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/
    branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/Base.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/Default.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/common.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Areas.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Bars.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Base.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/ClusteredBars.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/ClusteredColumns.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Columns.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Default.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Grid.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Lines.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Markers.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/MarkersOnly.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Pie.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Scatter.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Stacked.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedAreas.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedBars.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedColumns.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedLines.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/common.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Bars.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Base.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Cylinders.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/scaler.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/ET/
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/ET/greys.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/GreySkies.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/README
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/blue.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/cyan.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/green.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/orange.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/purple.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/red.js
    branches/vhffs-design/vhffs-panel/js/dojox/charting/widget/
    branches/vhffs-design/vhffs-panel/js/dojox/charting/widget/Chart2D.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections/
    branches/vhffs-design/vhffs-panel/js/dojox/collections/ArrayList.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections/BinaryTree.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections/Dictionary.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections/Queue.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections/README
    branches/vhffs-design/vhffs-panel/js/dojox/collections/Set.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections/SortedList.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections/Stack.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/collections.js
    branches/vhffs-design/vhffs-panel/js/dojox/color/
    branches/vhffs-design/vhffs-panel/js/dojox/color/Colorspace.js
    branches/vhffs-design/vhffs-panel/js/dojox/color/Generator.js
    branches/vhffs-design/vhffs-panel/js/dojox/color/README
    branches/vhffs-design/vhffs-panel/js/dojox/color/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/color.js
    branches/vhffs-design/vhffs-panel/js/dojox/cometd/
    branches/vhffs-design/vhffs-panel/js/dojox/cometd/README
    branches/vhffs-design/vhffs-panel/js/dojox/cometd/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/cometd/timestamp.js
    branches/vhffs-design/vhffs-panel/js/dojox/cometd/timesync.js
    branches/vhffs-design/vhffs-panel/js/dojox/cometd.js
    branches/vhffs-design/vhffs-panel/js/dojox/crypto/
    branches/vhffs-design/vhffs-panel/js/dojox/crypto/Blowfish.js
    branches/vhffs-design/vhffs-panel/js/dojox/crypto/MD5.js
    branches/vhffs-design/vhffs-panel/js/dojox/crypto/README
    branches/vhffs-design/vhffs-panel/js/dojox/crypto/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/crypto.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/
    branches/vhffs-design/vhffs-panel/js/dojox/data/AtomReadStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/CsvStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/FlickrRestStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/FlickrStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/HtmlStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/HtmlTableStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/KeyValueStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/OpmlStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/PicasaStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/QueryReadStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/README
    branches/vhffs-design/vhffs-panel/js/dojox/data/SnapLogicStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/XmlStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_DataDemoTable.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_FlickrRestStore.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_FlickrStore.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_LazyLoad.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_MultiStores.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_PicasaStore.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_ComboBox.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_FilteringSelect.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_grid.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/flickrDemo.css
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/flickrDemo.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Argentina/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Argentina/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Brazil/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Brazil/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Ottawa/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Ottawa/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Toronto/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Toronto/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/China/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/China/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Commonwealth of Australia/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Commonwealth of Australia/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Egypt/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Egypt/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/France/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/France/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Germany/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Germany/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/India/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/India/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Italy/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Italy/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Mombasa/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Mombasa/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Nairobi/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Nairobi/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Guadalajara/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Guadalajara/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Mexico City/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Mexico City/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mongolia/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mongolia/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Russia/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Russia/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Spain/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Spain/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/Khartoum/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/Khartoum/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/United States of America/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/United States of America/data.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/root.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography.json
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography.xml
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/picasaDemo.css
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/picasaDemo.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/stores/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/stores/LazyLoadJSIStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/FlickrView.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/FlickrViewList.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/PicasaView.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/PicasaViewList.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/FlickrView.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/FlickrViewList.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/PicasaView.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/PicasaViewList.html
    branches/vhffs-design/vhffs-panel/js/dojox/data/dom.js
    branches/vhffs-design/vhffs-panel/js/dojox/data/jsonPathStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/date/
    branches/vhffs-design/vhffs-panel/js/dojox/date/README
    branches/vhffs-design/vhffs-panel/js/dojox/date/php.js
    branches/vhffs-design/vhffs-panel/js/dojox/date/posix.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/Context.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/README
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/_HtmlTemplated.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/_Templated.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/data.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/dijit.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/html.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/objects.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Animation.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Blog.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Data.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Dijitless.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Events.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_HtmlTemplated.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Inline.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_NodeList.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Table.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Templated.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Tree.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_1.json
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_3.json
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_list.json
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_page_about.json
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/fruit.json
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/morefruit.json
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/animation.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_base.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_detail.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_list.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_page.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/countrychildren.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/gallery.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/nodelist.html
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/ext-dojo/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/ext-dojo/NodeList.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/dates.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/htmlstrings.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/integers.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/lists.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/logic.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/misc.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/strings.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/html.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/render/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/render/html.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/date.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/loader.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/logic.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/loop.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/misc.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/utils/
    branches/vhffs-design/vhffs-panel/js/dojox/dtl/utils/date.js
    branches/vhffs-design/vhffs-panel/js/dojox/dtl.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/LICENSE
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/README
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/ascii85.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/base64.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/bits.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/lzw.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/splay.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/Blowfish.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/MD5.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/encoding/easy64.js
    branches/vhffs-design/vhffs-panel/js/dojox/flash/
    branches/vhffs-design/vhffs-panel/js/dojox/flash/DojoExternalInterface.as
    branches/vhffs-design/vhffs-panel/js/dojox/flash/ExpressInstall.as
    branches/vhffs-design/vhffs-panel/js/dojox/flash/README
    branches/vhffs-design/vhffs-panel/js/dojox/flash/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/flash.js
    branches/vhffs-design/vhffs-panel/js/dojox/form/
    branches/vhffs-design/vhffs-panel/js/dojox/form/CheckedMultiSelect.js
    branches/vhffs-design/vhffs-panel/js/dojox/form/DropDownSelect.js
    branches/vhffs-design/vhffs-panel/js/dojox/form/PasswordValidator.js
    branches/vhffs-design/vhffs-panel/js/dojox/form/README
    branches/vhffs-design/vhffs-panel/js/dojox/form/nls/
    branches/vhffs-design/vhffs-panel/js/dojox/form/nls/PasswordValidator.js
    branches/vhffs-design/vhffs-panel/js/dojox/form/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.css
    branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.html
    branches/vhffs-design/vhffs-panel/js/dojox/form/resources/DropDownSelect.css
    branches/vhffs-design/vhffs-panel/js/dojox/form/resources/DropDownSelect.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/form/resources/PasswordValidator.html
    branches/vhffs-design/vhffs-panel/js/dojox/form/resources/_CheckedMultiSelectItem.html
    branches/vhffs-design/vhffs-panel/js/dojox/fx/
    branches/vhffs-design/vhffs-panel/js/dojox/fx/README
    branches/vhffs-design/vhffs-panel/js/dojox/fx/Shadow.js
    branches/vhffs-design/vhffs-panel/js/dojox/fx/_arg.js
    branches/vhffs-design/vhffs-panel/js/dojox/fx/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/fx/_core.js
    branches/vhffs-design/vhffs-panel/js/dojox/fx/easing.js
    branches/vhffs-design/vhffs-panel/js/dojox/fx/ext-dojo/
    branches/vhffs-design/vhffs-panel/js/dojox/fx/ext-dojo/NodeList.js
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowB.png
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowBL.png
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowBR.png
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowL.png
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowR.png
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowT.png
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowTL.png
    branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowTR.png
    branches/vhffs-design/vhffs-panel/js/dojox/fx/scroll.js
    branches/vhffs-design/vhffs-panel/js/dojox/fx/style.js
    branches/vhffs-design/vhffs-panel/js/dojox/fx.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/Moveable.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/Mover.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/README
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/arc.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/attach.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/canvas.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/canvas_attach.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/decompose.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/beautify.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/butterfly.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/career_test.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/circles.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clock.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clockWidget.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clock_black.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/creator.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Lars.json
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Lars.svg
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/LarsDreaming.json
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/LarsDreaming.svg
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Nils.json
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Nils.svg
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-bg.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-head.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-left-arm.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-left-leg.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-lollipop.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-nose-large.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-nose-medium.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-right-arm.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-right-leg.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-torso.png
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino.jpg
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino.json
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/svg2gfx.xsl
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/transform.json
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/images/
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/images/clock_face.jpg
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/images/clock_face_black.jpg
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/inspector.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/lion.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/roundedPane.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/tiger.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/tooltip.html
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/fx.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/matrix.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/move.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/path.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/shape.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/silverlight.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/silverlight_attach.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/svg.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/svg_attach.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/utils.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/vml.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx/vml_attach.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/README
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/gradient.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/lighting.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/matrix.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/object.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/scheduler.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/vector.js
    branches/vhffs-design/vhffs-panel/js/dojox/gfx3d.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/
    branches/vhffs-design/vhffs-panel/js/dojox/grid/Grid.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/README
    branches/vhffs-design/vhffs-panel/js/dojox/grid/VirtualGrid.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/dijitEditors.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/editors.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/fields.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/model.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid_rtl.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid_rtl.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/builder.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/cell.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/drag.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/edit.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/focus.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_dx_gradient.gif
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_sort_down.gif
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_sort_up.gif
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/tabEnabled_rotated.png
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/tabHover_rotated.png
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/layout.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/lib.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/nihiloGrid.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/nihiloGrid.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/publicEvents.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/rowbar.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/rows.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/scroller.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/selection.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/soriaGrid.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/soriaGrid.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/tundraGrid.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/tundraGrid.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/view.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/views.js
    branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/GridView.html
    branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/VirtualGrid.html
    branches/vhffs-design/vhffs-panel/js/dojox/help/
    branches/vhffs-design/vhffs-panel/js/dojox/help/README
    branches/vhffs-design/vhffs-panel/js/dojox/help/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/help/console.js
    branches/vhffs-design/vhffs-panel/js/dojox/help/demos/
    branches/vhffs-design/vhffs-panel/js/dojox/help/demos/demo_Console.html
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/README
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_all.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_dynamic.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_static.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_www.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/cpp.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/css.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/delphi.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/django.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/html.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/javascript.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/_html.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/_www.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/css.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/html.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/javascript.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/xml.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/python.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/sql.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/xml.js
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/highlight.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/highlight.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/autumn.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/autumn.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/borland.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/borland.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/colorful.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/colorful.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/default.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/default.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/emacs.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/emacs.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/friendly.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/friendly.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/fruity.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/fruity.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/manni.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/manni.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/murphy.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/murphy.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/native.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/native.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/pastie.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/pastie.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/perldoc.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/perldoc.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/trac.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/trac.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/highlight.js
    branches/vhffs-design/vhffs-panel/js/dojox/image/
    branches/vhffs-design/vhffs-panel/js/dojox/image/Gallery.js
    branches/vhffs-design/vhffs-panel/js/dojox/image/Lightbox.js
    branches/vhffs-design/vhffs-panel/js/dojox/image/Magnifier.js
    branches/vhffs-design/vhffs-panel/js/dojox/image/MagnifierLite.js
    branches/vhffs-design/vhffs-panel/js/dojox/image/README
    branches/vhffs-design/vhffs-panel/js/dojox/image/SlideShow.js
    branches/vhffs-design/vhffs-panel/js/dojox/image/ThumbnailPicker.js
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Gallery.html
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Lightbox.html
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Magnifier.css
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Magnifier.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/SlideShow.html
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/ThumbnailPicker.html
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/image.css
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/image.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/buttons.gif
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/buttons.png
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/close.png
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/close_dark.png
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/left.png
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/loading.gif
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/right.png
    branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/warning.png
    branches/vhffs-design/vhffs-panel/js/dojox/io/
    branches/vhffs-design/vhffs-panel/js/dojox/io/README
    branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/
    branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/README
    branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip.js
    branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip_client.html
    branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip_server.html
    branches/vhffs-design/vhffs-panel/js/dojox/io/xhrMultiPart.js
    branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/
    branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/README
    branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/query.js
    branches/vhffs-design/vhffs-panel/js/dojox/jsonPath.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/
    branches/vhffs-design/vhffs-panel/js/dojox/lang/LICENSE
    branches/vhffs-design/vhffs-panel/js/dojox/lang/README
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/array.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/curry.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/fold.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/lambda.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/listcomp.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/object.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/reversed.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/scan.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/sequence.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/zip.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/functional.js
    branches/vhffs-design/vhffs-panel/js/dojox/lang/utils.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/
    branches/vhffs-design/vhffs-panel/js/dojox/layout/BorderContainer.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/ContentPane.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/DragPane.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/ExpandoPane.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/FloatingPane.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/README
    branches/vhffs-design/vhffs-panel/js/dojox/layout/RadioGroup.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/ResizeHandle.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/ScrollPane.js
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.html
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.html
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/RadioGroup.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/RadioGroup.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ResizeHandle.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ResizeHandle.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.html
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/icons/
    branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/icons/resize.png
    branches/vhffs-design/vhffs-panel/js/dojox/math/
    branches/vhffs-design/vhffs-panel/js/dojox/math/README
    branches/vhffs-design/vhffs-panel/js/dojox/math/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/math/curves.js
    branches/vhffs-design/vhffs-panel/js/dojox/math/matrix.js
    branches/vhffs-design/vhffs-panel/js/dojox/math.js
    branches/vhffs-design/vhffs-panel/js/dojox/off/
    branches/vhffs-design/vhffs-panel/js/dojox/off/README
    branches/vhffs-design/vhffs-panel/js/dojox/off/_common.js
    branches/vhffs-design/vhffs-panel/js/dojox/off/docs/
    branches/vhffs-design/vhffs-panel/js/dojox/off/docs/bookmarklets.html
    branches/vhffs-design/vhffs-panel/js/dojox/off/files.js
    branches/vhffs-design/vhffs-panel/js/dojox/off/network_check.txt
    branches/vhffs-design/vhffs-panel/js/dojox/off/offline.js
    branches/vhffs-design/vhffs-panel/js/dojox/off/offline.js.uncompressed.js
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/checkmark.png
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/greenball.png
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/learnhow.html
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/learnhow.js
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.css
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.html
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/redball.png
    branches/vhffs-design/vhffs-panel/js/dojox/off/resources/roller.gif
    branches/vhffs-design/vhffs-panel/js/dojox/off/sync.js
    branches/vhffs-design/vhffs-panel/js/dojox/off/ui.js
    branches/vhffs-design/vhffs-panel/js/dojox/off.js
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/README
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.css
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.html
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Slide.html
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/down.png
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/next.png
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/prev.png
    branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/up.png
    branches/vhffs-design/vhffs-panel/js/dojox/presentation.js
    branches/vhffs-design/vhffs-panel/js/dojox/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/resources/README.template
    branches/vhffs-design/vhffs-panel/js/dojox/resources/_modules.js
    branches/vhffs-design/vhffs-panel/js/dojox/resources/manualTests.html
    branches/vhffs-design/vhffs-panel/js/dojox/resources/manualTests.js
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/CouchDBRestStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonRPC.js
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonReferencing.js
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonRestStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/PersevereRestStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/README
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/Rest.js
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/SMDLibrary/
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/SMDLibrary/yahoo.smd
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/Service.js
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/demo_JsonRestStore_CouchDB.html
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/demo_JsonRestStore_Persevere.html
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/documentation.html
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/documentation.html
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/yahoo.html
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/yahoo.html
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/documentation.smd
    branches/vhffs-design/vhffs-panel/js/dojox/rpc/test.txt
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/Anchor.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/Annotation.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/DoubleArrowAnnotation.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/Figure.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/LeadAnnotation.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/PreexistingAnnotation.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/README
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/SingleArrowAnnotation.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/Slider.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/Toolbar.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/UnderlineAnnotation.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/UndoStack.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/_Plugin.js
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/images/
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/images/icons.gif
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/sketch.css
    branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/sketch.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/sketch.js
    branches/vhffs-design/vhffs-panel/js/dojox/sql.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/
    branches/vhffs-design/vhffs-panel/js/dojox/storage/AirDBStorageProvider.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/AirEncryptedLocalStorageProvider.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/AirFileStorageProvider.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/FlashStorageProvider.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/GearsStorageProvider.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/Provider.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/README
    branches/vhffs-design/vhffs-panel/js/dojox/storage/Storage.as
    branches/vhffs-design/vhffs-panel/js/dojox/storage/Storage.swf
    branches/vhffs-design/vhffs-panel/js/dojox/storage/WhatWGStorageProvider.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/_common.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/buildFlashStorage.sh
    branches/vhffs-design/vhffs-panel/js/dojox/storage/demos/
    branches/vhffs-design/vhffs-panel/js/dojox/storage/demos/helloworld.html
    branches/vhffs-design/vhffs-panel/js/dojox/storage/manager.js
    branches/vhffs-design/vhffs-panel/js/dojox/storage/storage_dialog.fla
    branches/vhffs-design/vhffs-panel/js/dojox/storage.js
    branches/vhffs-design/vhffs-panel/js/dojox/string/
    branches/vhffs-design/vhffs-panel/js/dojox/string/Builder.js
    branches/vhffs-design/vhffs-panel/js/dojox/string/README
    branches/vhffs-design/vhffs-panel/js/dojox/string/sprintf.js
    branches/vhffs-design/vhffs-panel/js/dojox/string/tokenize.js
    branches/vhffs-design/vhffs-panel/js/dojox/timing/
    branches/vhffs-design/vhffs-panel/js/dojox/timing/README
    branches/vhffs-design/vhffs-panel/js/dojox/timing/Sequence.js
    branches/vhffs-design/vhffs-panel/js/dojox/timing/Streamer.js
    branches/vhffs-design/vhffs-panel/js/dojox/timing/ThreadPool.js
    branches/vhffs-design/vhffs-panel/js/dojox/timing/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/timing.js
    branches/vhffs-design/vhffs-panel/js/dojox/uuid/
    branches/vhffs-design/vhffs-panel/js/dojox/uuid/README
    branches/vhffs-design/vhffs-panel/js/dojox/uuid/Uuid.js
    branches/vhffs-design/vhffs-panel/js/dojox/uuid/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/uuid/generateRandomUuid.js
    branches/vhffs-design/vhffs-panel/js/dojox/uuid/generateTimeBasedUuid.js
    branches/vhffs-design/vhffs-panel/js/dojox/uuid.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate/
    branches/vhffs-design/vhffs-panel/js/dojox/validate/README
    branches/vhffs-design/vhffs-panel/js/dojox/validate/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate/ca.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate/check.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate/creditCard.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate/isbn.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate/regexp.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate/us.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate/web.js
    branches/vhffs-design/vhffs-panel/js/dojox/validate.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.html
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/hue.png
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/hueHandle.png
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/pickerPointer.png
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/underlay.png
    branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.html
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInputAuto.html
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/ReceiveFile.php
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInputAuto.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/FisheyeList.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/FisheyeList.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeLite.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Iterator.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/Loader.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/Loader.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/README
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/honey.php
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/icons/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/icons/loading.gif
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/MultiComboBox.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/README
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/Rating.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/Rating.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_empty.gif
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_empty.png
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_full.gif
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_full.png
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_half.png
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.html
    branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/TimeSpinner.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/Toaster.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/Toaster.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.html
    branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ar/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ar/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/cs/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/cs/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/da/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/da/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/de/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/de/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/el/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/el/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/es/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/es/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fi/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fi/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fr/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fr/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/he/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/he/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/hu/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/hu/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/it/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/it/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ja/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ja/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ko/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ko/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nb/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nb/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nl/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nl/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pl/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pl/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt-pt/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt-pt/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ru/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ru/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/sv/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/sv/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/tr/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/tr/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh-tw/
    branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh-tw/Wizard.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/
    branches/vhffs-design/vhffs-panel/js/dojox/wire/CompositeWire.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/DataWire.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/README
    branches/vhffs-design/vhffs-panel/js/dojox/wire/TableAdapter.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/TextAdapter.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/TreeAdapter.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/Wire.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/XmlWire.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/_base.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.css
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/WidgetRepeater.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/countries.json
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ActionChaining.html
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ActionWiring.html
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_BasicChildWire.html
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_BasicColumnWiring.html
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ConditionalActions.html
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_FlickrStoreWire.html
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_TopicWiring.html
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/flickrDemo.css
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/flickrDemo.css.commented.css
    branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/states.json
    branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/
    branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Action.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Data.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/DataStore.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Invocation.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Service.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Transfer.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/util.js
    branches/vhffs-design/vhffs-panel/js/dojox/wire.js
    branches/vhffs-design/vhffs-panel/js/dojox/xml/
    branches/vhffs-design/vhffs-panel/js/dojox/xml/DomParser.js
    branches/vhffs-design/vhffs-panel/js/dojox/xml/README
    branches/vhffs-design/vhffs-panel/js/public.js
    branches/vhffs-design/vhffs-panel/js/util/
    branches/vhffs-design/vhffs-panel/js/util/doh/
    branches/vhffs-design/vhffs-panel/js/util/doh/LICENSE
    branches/vhffs-design/vhffs-panel/js/util/doh/README
    branches/vhffs-design/vhffs-panel/js/util/doh/_browserRunner.js
    branches/vhffs-design/vhffs-panel/js/util/doh/_rhinoRunner.js
    branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/
    branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/LICENSE
    branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/doh.wav
    branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/dohaaa.wav
    branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/woohoo.wav
    branches/vhffs-design/vhffs-panel/js/util/doh/runner.html
    branches/vhffs-design/vhffs-panel/js/util/doh/runner.js
    branches/vhffs-design/vhffs-panel/js/util/doh/runner.sh
    branches/vhffs-design/vhffs-panel/js/util/doh/small_logo.png
    branches/vhffs-design/vhffs-panel/js/vhffs/
    branches/vhffs-design/vhffs-panel/js/vhffs/Menu.js
    branches/vhffs-design/vhffs-public/templates/content/
    branches/vhffs-design/vhffs-public/templates/content/last-groups.tt
    branches/vhffs-design/vhffs-public/templates/layouts/
    branches/vhffs-design/vhffs-public/templates/layouts/public.tt
    branches/vhffs-design/vhffs-public/templates/parts/
    branches/vhffs-design/vhffs-public/templates/parts/footer.tt
    branches/vhffs-design/vhffs-public/templates/parts/header.tt
    branches/vhffs-design/vhffs-public/templates/parts/left-menu.tt
    branches/vhffs-design/vhffs-public/templates/parts/tags-cloud.tt
    branches/vhffs-design/vhffs-public/templates/parts/top-menu.tt
    branches/vhffs-design/vhffs-themes/light-grey/
    branches/vhffs-design/vhffs-themes/light-grey/img/
    branches/vhffs-design/vhffs-themes/light-grey/img/background_body.png
    branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_1.gif
    branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_2.gif
    branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_3.gif
    branches/vhffs-design/vhffs-themes/light-grey/img/bullet.png
    branches/vhffs-design/vhffs-themes/light-grey/img/flag_en.png
    branches/vhffs-design/vhffs-themes/light-grey/img/flag_es.png
    branches/vhffs-design/vhffs-themes/light-grey/img/flag_fr.png
    branches/vhffs-design/vhffs-themes/light-grey/img/loading.gif
    branches/vhffs-design/vhffs-themes/light-grey/img/new_tag.png
    branches/vhffs-design/vhffs-themes/light-grey/img/vhffs-big.png
    branches/vhffs-design/vhffs-themes/light-grey/img/vhffs.png
    branches/vhffs-design/vhffs-themes/light-grey/main.css


Modified: branches/vhffs-design/vhffs-api/src/Vhffs/Makefile.am
===================================================================
--- branches/vhffs-design/vhffs-api/src/Vhffs/Makefile.am	2008-08-02 19:11:50 UTC (rev 1247)
+++ branches/vhffs-design/vhffs-api/src/Vhffs/Makefile.am	2008-08-02 22:33:52 UTC (rev 1248)
@@ -33,6 +33,7 @@
 	Panel/Mysql.pm \
 	Panel/Object.pm \
 	Panel/Pgsql.pm \
+	Panel/Public.pm \
 	Panel/Repository.pm \
 	Panel/Svn.pm \
 	Panel/Tag.pm \

Modified: branches/vhffs-design/vhffs-api/src/Vhffs/Panel/Group.pm
===================================================================
--- branches/vhffs-design/vhffs-api/src/Vhffs/Panel/Group.pm	2008-08-02 19:11:50 UTC (rev 1247)
+++ branches/vhffs-design/vhffs-api/src/Vhffs/Panel/Group.pm	2008-08-02 22:33:52 UTC (rev 1248)
@@ -80,7 +80,7 @@
     my $main = shift;
     my @groups;
 
-    my $sql = 'SELECT g.gid, g.groupname, g.realname, o.description FROM vhffs_groups g LEFT OUTER JOIN vhffs_users u ON u.username=g.groupname INNER JOIN vhffs_object o ON o.object_id=g.object_id WHERE o.state=? AND u.username IS NULL ORDER BY o.date_creation DESC LIMIT 10';
+    my $sql = 'SELECT g.gid, g.groupname, g.realname, o.description, owner.username AS owner_name FROM vhffs_groups g LEFT OUTER JOIN vhffs_users u ON u.username=g.groupname INNER JOIN vhffs_object o ON o.object_id=g.object_id INNER JOIN vhffs_users owner ON owner.uid = o.owner_uid WHERE o.state=? AND u.username IS NULL ORDER BY o.date_creation DESC LIMIT 10';
 
     return fetch_groups_and_users($main, $sql, Vhffs::Constants::ACTIVATED);
 }
@@ -214,7 +214,6 @@
     $sth->execute(@params);
     while(my $row = $sth->fetchrow_hashref) {
         $ssth->execute($row->{gid});
-        $row->{description} = Vhffs::Panel::Main::format_description($row->{description});
         $row->{users} = $ssth->fetchall_arrayref({});
         push @groups, $row;
     }

Added: branches/vhffs-design/vhffs-api/src/Vhffs/Panel/Public.pm
===================================================================
--- branches/vhffs-design/vhffs-api/src/Vhffs/Panel/Public.pm	                        (rev 0)
+++ branches/vhffs-design/vhffs-api/src/Vhffs/Panel/Public.pm	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,96 @@
+#!%PERL%
+# Copyright (c) vhffs project and its contributors
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without 
+# modification, are permitted provided that the following conditions 
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright 
+#   notice, this list of conditions and the following disclaimer.
+#2. 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.
+#3. Neither the name of vhffs 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.
+
+use strict;
+use utf8;
+
+package Vhffs::Panel::Public;
+
+use base qw(Vhffs::Panel::Main);
+
+use locale;
+use Locale::gettext;
+use POSIX qw(locale_h);
+
+use Template;
+
+use lib '%VHFFS_LIB_DIR%';
+use Vhffs::Tag;
+
+sub new {
+	my $class = shift;
+	my $panel = $class->SUPER::new(@_);
+	$panel->check_public();
+	return $panel;
+}
+
+
+sub render {
+	my ($self, $file, $vars) = @_;
+	
+	my $create_vars = {
+		INCLUDE_PATH => $self->{templatedir}.'/public/',
+		FILTERS => {
+			i18n => \&gettext
+		}
+	};
+	
+	
+	$vars = {} unless(defined $vars);
+	#TODO Read theme from config file
+	$vars->{theme} = 'light-grey' unless(defined $vars->{theme});
+	$vars->{left} = 'parts/left-menu.tt' unless(defined $vars->{left});
+	$vars->{right} = 'parts/tags-cloud.tt' unless(defined $vars->{right});
+	$vars->{top} = 'parts/top-menu.tt' unless(defined $vars->{top});
+	
+	# Handling ajax stuff
+	$create_vars->{PROCESS} = 'layouts/public.tt' unless(0); #TODO unless(requested with ajax)
+	
+	# Fill layout stuff (only if !ajax)
+	$vars->{popular_tags} = Vhffs::Tag::get_most_popular_tags($self->{vhffs});
+	$vars->{random_tags} = Vhffs::Tag::get_random_tags($self->{vhffs});
+	
+	my $template = new Template($create_vars);
+
+	binmode STDOUT , ':utf8';	
+	
+	print "Content-type: text/html\n\n";
+	
+
+	# TODO Only do a full layout process if we aren't in the ajax case
+	# To achieve this, add a filter AJAX_WRAPPER which includes the
+	# given file only if X-Requested-By isn't set
+	$template->process($file, $vars) 
+		|| die('Error while processing template: '.$template->error());
+	
+}
+
+1;
\ No newline at end of file

Modified: branches/vhffs-design/vhffs-intl/POTFILES.in
===================================================================
--- branches/vhffs-design/vhffs-intl/POTFILES.in	2008-08-02 19:11:50 UTC (rev 1247)
+++ branches/vhffs-design/vhffs-intl/POTFILES.in	2008-08-02 22:33:52 UTC (rev 1248)
@@ -1,298 +1,325 @@
-vhffs-intl/extra_strings.pl
-vhffs-intl/template_strings.pl
+vhffs-public/tt-test.pl
+vhffs-public/index.pl
+vhffs-public/allgroups.pl
+vhffs-public/group.pl
+vhffs-public/groupsearch.pl
+vhffs-public/allwebsites.pl
+vhffs-public/lastgroups.pl
+vhffs-public/getavatar.pl
+vhffs-public/websitesearch.pl
+vhffs-public/usersearch.pl
+vhffs-public/user.pl
+vhffs-public/tagsearch.pl
+vhffs-public/lastusers.pl
+vhffs-public/extern/newusersrss.pl
+vhffs-public/extern/newgroupsrss.pl
+vhffs-public/extern/stats.pl
+vhffs-jabber/vhffspipe.pl
+vhffs-robots/src/mysql_delete.pl
+vhffs-robots/src/mail_delete.pl
+vhffs-robots/src/dns_delete.pl
 vhffs-robots/src/git_delete.pl
+vhffs-robots/src/object_cleanup.pl
+vhffs-robots/src/user_cleanup.pl
 vhffs-robots/src/group_getquota.pl
-vhffs-robots/src/dns_create.pl
-vhffs-robots/src/pgsql_delete.pl
-vhffs-robots/src/cvs_fixperms.pl
-vhffs-robots/src/pgsql_dump.pl
-vhffs-robots/src/cvs_create.pl
-vhffs-robots/src/group_create.pl
-vhffs-robots/src/group_setquota.pl
-vhffs-robots/src/cvs_viewvcconf.pl
-vhffs-robots/src/listengine_publicarchives.pl
-vhffs-robots/src/mysql_delete.pl
-vhffs-robots/src/svn_create.pl
-vhffs-robots/src/mysql_dump.pl
 vhffs-robots/src/web_stats.pl
-vhffs-robots/src/pgsql_modify.pl
-vhffs-robots/src/mailinglist_create.pl
-vhffs-robots/src/svn_viewvcconf.pl
-vhffs-robots/src/user_delete.pl
-vhffs-robots/src/web_create.pl
-vhffs-robots/src/repository_delete.pl
-vhffs-robots/src/svn_public.pl
+vhffs-robots/src/user_create.pl
+vhffs-robots/src/mail_create.pl
+vhffs-robots/src/user_getquota.pl
+vhffs-robots/src/cron_create.pl
+vhffs-robots/src/svn_delete.pl
 vhffs-robots/src/mail_deleteboxes.pl
-vhffs-robots/src/mail_create.pl
-vhffs-robots/src/dns_delete.pl
-vhffs-robots/src/git_create.pl
-vhffs-robots/src/mail_createboxes.pl
-vhffs-robots/src/pgsql_create.pl
+vhffs-robots/src/svn_websvn.pl
 vhffs-robots/src/mysql_modify.pl
-vhffs-robots/src/object_cleanup.pl
+vhffs-robots/src/svn_public.pl
 vhffs-robots/src/cvs_delete.pl
 vhffs-robots/src/group_delete.pl
+vhffs-robots/src/user_group.pl
+vhffs-robots/src/pgsql_dump.pl
+vhffs-robots/src/dns_create.pl
+vhffs-robots/src/user_delete.pl
+vhffs-robots/src/cron_delete.pl
+vhffs-robots/src/listengine_publicarchives.pl
+vhffs-robots/src/pgsql_create.pl
+vhffs-robots/src/web_create.pl
+vhffs-robots/src/mailinglist_create.pl
+vhffs-robots/src/mailinglist_delete.pl
 vhffs-robots/src/mailing.pl
+vhffs-robots/src/mail_createboxes.pl
+vhffs-robots/src/svn_create.pl
+vhffs-robots/src/web_delete.pl
+vhffs-robots/src/git_create.pl
+vhffs-robots/src/user_setquota.pl
 vhffs-robots/src/git_public.pl
-vhffs-robots/src/user_cleanup.pl
-vhffs-robots/src/user_getquota.pl
-vhffs-robots/src/mysql_create.pl
-vhffs-robots/src/repository_getquota.pl
-vhffs-robots/src/svn_delete.pl
-vhffs-robots/src/svn_websvn.pl
-vhffs-robots/src/user_group.pl
 vhffs-robots/src/repository_stats.pl
-vhffs-robots/src/mailinglist_delete.pl
-vhffs-robots/src/web_delete.pl
-vhffs-robots/src/user_create.pl
 vhffs-robots/src/repository_create.pl
-vhffs-robots/src/user_setquota.pl
-vhffs-robots/src/mail_delete.pl
+vhffs-robots/src/svn_viewvcconf.pl
 vhffs-robots/src/repository_setquota.pl
+vhffs-robots/src/mysql_create.pl
+vhffs-robots/src/repository_delete.pl
+vhffs-robots/src/pgsql_modify.pl
+vhffs-robots/src/repository_getquota.pl
+vhffs-robots/src/cvs_fixperms.pl
+vhffs-robots/src/group_setquota.pl
+vhffs-robots/src/cvs_create.pl
+vhffs-robots/src/mysql_dump.pl
+vhffs-robots/src/cvs_viewvcconf.pl
+vhffs-robots/src/group_create.pl
+vhffs-robots/src/pgsql_delete.pl
 vhffs-robots/misc/svn_post-commit.pl
-vhffs-public/extern/stats.pl
-vhffs-public/extern/newgroupsrss.pl
-vhffs-public/extern/newusersrss.pl
-vhffs-public/lastusers.pl
-vhffs-public/index.pl
-vhffs-public/allgroups.pl
-vhffs-public/websitesearch.pl
-vhffs-public/group.pl
-vhffs-public/allwebsites.pl
-vhffs-public/getavatar.pl
-vhffs-public/user.pl
-vhffs-public/groupsearch.pl
-vhffs-public/lastgroups.pl
-vhffs-public/usersearch.pl
-vhffs-packages/oldbuildwithdput.pl
-vhffs-compat/updatedb.pl
-vhffs-api/src/Vhffs/Services/DNS.pm
-vhffs-api/src/Vhffs/Services/Mysql.pm
-vhffs-api/src/Vhffs/Services/Pgsql.pm
-vhffs-api/src/Vhffs/Services/Svn.pm
-vhffs-api/src/Vhffs/Services/Cvs.pm
-vhffs-api/src/Vhffs/Services/MailingList.pm
-vhffs-api/src/Vhffs/Services/Web.pm
-vhffs-api/src/Vhffs/Services/MailGroup.pm
-vhffs-api/src/Vhffs/Services/Repository.pm
-vhffs-api/src/Vhffs/Services/MailUser.pm
-vhffs-api/src/Vhffs/Services/Mail.pm
-vhffs-api/src/Vhffs/Services/Git.pm
+vhffs-listengine/src/listengine.pl
+vhffs-api/src/Vhffs/Panel/Mail.pm
+vhffs-api/src/Vhffs/Panel/Template.pm
 vhffs-api/src/Vhffs/Panel/Menu.pm
-vhffs-api/src/Vhffs/Panel/Mysql.pm
+vhffs-api/src/Vhffs/Panel/Group.pm
+vhffs-api/src/Vhffs/Panel/Public.pm
+vhffs-api/src/Vhffs/Panel/Repository.pm
+vhffs-api/src/Vhffs/Panel/Admin.pm
+vhffs-api/src/Vhffs/Panel/Git.pm
+vhffs-api/src/Vhffs/Panel/Cvs.pm
 vhffs-api/src/Vhffs/Panel/Svn.pm
+vhffs-api/src/Vhffs/Panel/Pgsql.pm
+vhffs-api/src/Vhffs/Panel/Web.pm
+vhffs-api/src/Vhffs/Panel/MailingList.pm
+vhffs-api/src/Vhffs/Panel/Cron.pm
 vhffs-api/src/Vhffs/Panel/Object.pm
+vhffs-api/src/Vhffs/Panel/Mysql.pm
+vhffs-api/src/Vhffs/Panel/Main.pm
+vhffs-api/src/Vhffs/Panel/Avatar.pm
 vhffs-api/src/Vhffs/Panel/Commons.pm
-vhffs-api/src/Vhffs/Panel/Template.pm
-vhffs-api/src/Vhffs/Panel/MailingList.pm
-vhffs-api/src/Vhffs/Panel/Web.pm
-vhffs-api/src/Vhffs/Panel/Avatar.pm
+vhffs-api/src/Vhffs/Panel/Tag.pm
 vhffs-api/src/Vhffs/Panel/User.pm
-vhffs-api/src/Vhffs/Panel/Repository.pm
-vhffs-api/src/Vhffs/Panel/Mail.pm
-vhffs-api/src/Vhffs/Panel/Git.pm
-vhffs-api/src/Vhffs/Panel/Main.pm
 vhffs-api/src/Vhffs/Panel/DNS.pm
-vhffs-api/src/Vhffs/Panel/Pgsql.pm
-vhffs-api/src/Vhffs/Panel/Admin.pm
-vhffs-api/src/Vhffs/Panel/Cvs.pm
-vhffs-api/src/Vhffs/Panel/Group.pm
-vhffs-api/src/Vhffs/Robots/Mysql.pm
+vhffs-api/src/Vhffs/Conf.pm
+vhffs-api/src/Vhffs/Mailings.pm
+vhffs-api/src/Vhffs/ObjectFactory.pm
+vhffs-api/src/Vhffs/Group.pm
+vhffs-api/src/Vhffs/Functions.pm
+vhffs-api/src/Vhffs/Listengine.pm
+vhffs-api/src/Vhffs/Services/Mail.pm
+vhffs-api/src/Vhffs/Services/Repository.pm
+vhffs-api/src/Vhffs/Services/MailGroup.pm
+vhffs-api/src/Vhffs/Services/Git.pm
+vhffs-api/src/Vhffs/Services/Cvs.pm
+vhffs-api/src/Vhffs/Services/Svn.pm
+vhffs-api/src/Vhffs/Services/Pgsql.pm
+vhffs-api/src/Vhffs/Services/MailUser.pm
+vhffs-api/src/Vhffs/Services/Web.pm
+vhffs-api/src/Vhffs/Services/MailingList.pm
+vhffs-api/src/Vhffs/Services/Cron.pm
+vhffs-api/src/Vhffs/Services/Mysql.pm
+vhffs-api/src/Vhffs/Services/DNS.pm
+vhffs-api/src/Vhffs/Acl.pm
+vhffs-api/src/Vhffs/Object.pm
+vhffs-api/src/Vhffs/Main.pm
+vhffs-api/src/Vhffs/Robots/Mail.pm
+vhffs-api/src/Vhffs/Robots/Group.pm
+vhffs-api/src/Vhffs/Robots/Repository.pm
+vhffs-api/src/Vhffs/Robots/Git.pm
+vhffs-api/src/Vhffs/Robots/Cvs.pm
+vhffs-api/src/Vhffs/Robots/Svn.pm
 vhffs-api/src/Vhffs/Robots/Pgsql.pm
-vhffs-api/src/Vhffs/Robots/Svn.pm
-vhffs-api/src/Vhffs/Robots/Cvs.pm
-vhffs-api/src/Vhffs/Robots/Group.pm
 vhffs-api/src/Vhffs/Robots/Web.pm
+vhffs-api/src/Vhffs/Robots/Mailing.pm
+vhffs-api/src/Vhffs/Robots/Mysql.pm
 vhffs-api/src/Vhffs/Robots/User.pm
-vhffs-api/src/Vhffs/Robots/Repository.pm
-vhffs-api/src/Vhffs/Robots/Mailing.pm
-vhffs-api/src/Vhffs/Robots/Mail.pm
-vhffs-api/src/Vhffs/Robots/Git.pm
-vhffs-api/src/Vhffs/Object.pm
+vhffs-api/src/Vhffs/Constants.pm
+vhffs-api/src/Vhffs/Tag.pm
 vhffs-api/src/Vhffs/Robots.pm
-vhffs-api/src/Vhffs/Functions.pm
-vhffs-api/src/Vhffs/Constants.pm
+vhffs-api/src/Vhffs/Tag/Request.pm
+vhffs-api/src/Vhffs/Tag/Category.pm
 vhffs-api/src/Vhffs/User.pm
 vhffs-api/src/Vhffs/Services.pm
-vhffs-api/src/Vhffs/Main.pm
-vhffs-api/src/Vhffs/Conf.pm
 vhffs-api/src/Vhffs/Debug.pm
-vhffs-api/src/Vhffs/Group.pm
-vhffs-api/src/Vhffs/ObjectFactory.pm
 vhffs-api/src/Vhffs/Stats.pm
-vhffs-api/src/Vhffs/Acl.pm
-vhffs-api/src/Vhffs/Listengine.pm
-vhffs-api/src/Vhffs/Mailings.pm
-vhffs-api/src/examples/create_mail.pl
-vhffs-api/src/examples/add_acl.pl
-vhffs-api/src/examples/create_dns.pl
-vhffs-api/src/examples/create_mysql_panel.pl
-vhffs-api/src/examples/perm_for_user.pl
-vhffs-api/src/examples/show_dumper_group.pl
-vhffs-api/src/examples/show_members_from_list.pl
-vhffs-api/src/examples/get_list.pl
-vhffs-api/src/examples/hashdomain.pl
-vhffs-api/src/examples/add_acl_dns.pl
-vhffs-api/src/examples/generate_password.pl
-vhffs-api/src/examples/create_group.pl
+vhffs-api/src/examples/show_dns_per_user.pl
+vhffs-api/src/examples/create_repository.pl
+vhffs-api/src/examples/create_web_panel.pl
 vhffs-api/src/examples/delete_acl.pl
-vhffs-api/src/examples/create_panel_mail.pl
-vhffs-api/src/examples/show_last_users.pl
 vhffs-api/src/examples/modify_user.pl
-vhffs-api/src/examples/create_mysql.pl
-vhffs-api/src/examples/show_dns_per_user.pl
-vhffs-api/src/examples/show_acl_per_object.pl
-vhffs-api/src/examples/create_cvs_panel.pl
-vhffs-api/src/examples/create_list.pl
-vhffs-api/src/examples/stats.pl
-vhffs-api/src/examples/create_user.pl
-vhffs-api/src/examples/create_dir.pl
+vhffs-api/src/examples/show_mail_per_group.pl
+vhffs-api/src/examples/hashdomain.pl
 vhffs-api/src/examples/modify_acl.pl
+vhffs-api/src/examples/create_forward.pl
+vhffs-api/src/examples/create_mail.pl
 vhffs-api/src/examples/show_dns_per_group.pl
-vhffs-api/src/examples/hashhome_example.pl
-vhffs-api/src/examples/show_dumper_cvs.pl
-vhffs-api/src/examples/join_group.pl
-vhffs-api/src/examples/create_box.pl
-vhffs-api/src/examples/delbox.pl
 vhffs-api/src/examples/create_cvs.pl
+vhffs-api/src/examples/create_dir.pl
+vhffs-api/src/examples/hashpopuser.pl
+vhffs-api/src/examples/show_groups_per_user.pl
+vhffs-api/src/examples/show_dumper_group.pl
+vhffs-api/src/examples/create_panel_mail.pl
+vhffs-api/src/examples/show_mail_conf.pl
+vhffs-api/src/examples/mailuser_add_box.pl
+vhffs-api/src/examples/create_mysql_panel.pl
 vhffs-api/src/examples/hash_webdir.pl
-vhffs-api/src/examples/create_web_panel.pl
+vhffs-api/src/examples/create_group_by_panel.pl
+vhffs-api/src/examples/create_group.pl
+vhffs-api/src/examples/delbox.pl
+vhffs-api/src/examples/perm_for_user.pl
+vhffs-api/src/examples/mailuser.pl
+vhffs-api/src/examples/hashhome_example.pl
 vhffs-api/src/examples/list_themes.pl
-vhffs-api/src/examples/mailuser.pl
-vhffs-api/src/examples/show_dumper_object.pl
 vhffs-api/src/examples/print_domain.pl
-vhffs-api/src/examples/show_groups_per_user.pl
-vhffs-api/src/examples/create_forward.pl
-vhffs-api/src/examples/show_mail_conf.pl
-vhffs-api/src/examples/create_group_by_panel.pl
+vhffs-api/src/examples/show_dumper_cvs.pl
 vhffs-api/src/examples/create_postgres.pl
+vhffs-api/src/examples/get_list.pl
+vhffs-api/src/examples/create_user.pl
+vhffs-api/src/examples/create_box.pl
+vhffs-api/src/examples/create_mysql.pl
+vhffs-api/src/examples/stats.pl
+vhffs-api/src/examples/generate_password.pl
+vhffs-api/src/examples/create_list.pl
+vhffs-api/src/examples/show_acl_per_object.pl
+vhffs-api/src/examples/create_dns.pl
+vhffs-api/src/examples/show_dumper_object.pl
+vhffs-api/src/examples/add_acl_dns.pl
+vhffs-api/src/examples/join_group.pl
+vhffs-api/src/examples/show_members_from_list.pl
+vhffs-api/src/examples/create_cvs_panel.pl
+vhffs-api/src/examples/show_last_users.pl
 vhffs-api/src/examples/show_dumper_user.pl
+vhffs-api/src/examples/add_acl.pl
 vhffs-api/src/examples/create_web.pl
-vhffs-api/src/examples/hashpopuser.pl
-vhffs-api/src/examples/mailuser_add_box.pl
-vhffs-api/src/examples/create_repository.pl
-vhffs-api/src/examples/show_mail_per_group.pl
 vhffs-irc/modobot.pl
-vhffs-jabber/vhffspipe.pl
-vhffs-backend/src/mirror/nss-mirror.pl
-vhffs-backend/src/mirror/mx1-mirror.pl
-vhffs-backend/src/mirror/mx2-mirror.pl
-vhffs-backend/src/mirror/mydns-mirror.pl
-vhffs-panel/repository/index.pl
-vhffs-panel/repository/prefs.pl
-vhffs-panel/repository/delete.pl
-vhffs-panel/repository/create.pl
+vhffs-compat/updatedb.pl
+vhffs-intl/extra_strings.pl
+vhffs-intl/template_strings.pl
+vhffs-panel/history.pl
+vhffs-panel/object/resubmit.pl
+vhffs-panel/object/quickdelete.pl
+vhffs-panel/object/upavatar.pl
+vhffs-panel/lost_ack.pl
+vhffs-panel/lost.pl
+vhffs-panel/web/index.pl
+vhffs-panel/web/delete.pl
+vhffs-panel/web/prefs.pl
+vhffs-panel/web/create.pl
+vhffs-panel/git/index.pl
+vhffs-panel/git/delete.pl
+vhffs-panel/git/prefs.pl
+vhffs-panel/git/create.pl
+vhffs-panel/svn/index.pl
+vhffs-panel/svn/delete.pl
+vhffs-panel/svn/prefs.pl
+vhffs-panel/svn/create.pl
 vhffs-panel/mail/index.pl
+vhffs-panel/mail/delete.pl
 vhffs-panel/mail/prefs.pl
-vhffs-panel/mail/delete.pl
 vhffs-panel/mail/create.pl
-vhffs-panel/git/index.pl
-vhffs-panel/git/prefs.pl
-vhffs-panel/git/delete.pl
-vhffs-panel/git/create.pl
-vhffs-panel/ajax/help.pl
-vhffs-panel/dns/index.pl
-vhffs-panel/dns/prefs.pl
-vhffs-panel/dns/delete.pl
-vhffs-panel/dns/create.pl
-vhffs-panel/pgsql/index.pl
-vhffs-panel/pgsql/prefs.pl
-vhffs-panel/pgsql/delete.pl
-vhffs-panel/pgsql/create.pl
-vhffs-panel/admin/repository/search.pl
-vhffs-panel/admin/repository/index.pl
-vhffs-panel/admin/repository/list.pl
-vhffs-panel/admin/mail/search.pl
-vhffs-panel/admin/mail/index.pl
-vhffs-panel/admin/mail/list.pl
-vhffs-panel/admin/git/search.pl
-vhffs-panel/admin/git/index.pl
-vhffs-panel/admin/git/list.pl
-vhffs-panel/admin/dns/search.pl
-vhffs-panel/admin/dns/index.pl
-vhffs-panel/admin/dns/list.pl
-vhffs-panel/admin/pgsql/search.pl
-vhffs-panel/admin/pgsql/index.pl
-vhffs-panel/admin/pgsql/list.pl
-vhffs-panel/admin/cvs/search.pl
-vhffs-panel/admin/cvs/index.pl
-vhffs-panel/admin/cvs/list.pl
-vhffs-panel/admin/group/search.pl
-vhffs-panel/admin/group/index.pl
-vhffs-panel/admin/group/list.pl
-vhffs-panel/admin/mysql/search.pl
-vhffs-panel/admin/mysql/index.pl
-vhffs-panel/admin/mysql/list.pl
+vhffs-panel/admin/broadcast_submit.pl
+vhffs-panel/admin/index.pl
 vhffs-panel/admin/object/edit.pl
 vhffs-panel/admin/object/search.pl
 vhffs-panel/admin/object/edit_submit.pl
 vhffs-panel/admin/object/list.pl
 vhffs-panel/admin/object/delete_avatar.pl
+vhffs-panel/admin/web/index.pl
+vhffs-panel/admin/web/search.pl
+vhffs-panel/admin/web/list.pl
+vhffs-panel/admin/su.pl
+vhffs-panel/admin/git/index.pl
+vhffs-panel/admin/git/search.pl
+vhffs-panel/admin/git/list.pl
+vhffs-panel/admin/svn/index.pl
 vhffs-panel/admin/svn/search.pl
-vhffs-panel/admin/svn/index.pl
 vhffs-panel/admin/svn/list.pl
+vhffs-panel/admin/mail/index.pl
+vhffs-panel/admin/mail/search.pl
+vhffs-panel/admin/mail/list.pl
+vhffs-panel/admin/pgsql/index.pl
+vhffs-panel/admin/pgsql/search.pl
+vhffs-panel/admin/pgsql/list.pl
+vhffs-panel/admin/dns/index.pl
+vhffs-panel/admin/dns/search.pl
+vhffs-panel/admin/dns/list.pl
+vhffs-panel/admin/broadcast_delete.pl
+vhffs-panel/admin/mysql/index.pl
+vhffs-panel/admin/mysql/search.pl
+vhffs-panel/admin/mysql/list.pl
+vhffs-panel/admin/mailinglist/index.pl
 vhffs-panel/admin/mailinglist/search.pl
-vhffs-panel/admin/mailinglist/index.pl
 vhffs-panel/admin/mailinglist/list.pl
-vhffs-panel/admin/web/search.pl
-vhffs-panel/admin/web/index.pl
-vhffs-panel/admin/web/list.pl
+vhffs-panel/admin/moderation_submit.pl
+vhffs-panel/admin/moderation.pl
+vhffs-panel/admin/repository/index.pl
+vhffs-panel/admin/repository/search.pl
+vhffs-panel/admin/repository/list.pl
+vhffs-panel/admin/user/index.pl
 vhffs-panel/admin/user/search.pl
-vhffs-panel/admin/user/index.pl
 vhffs-panel/admin/user/list.pl
-vhffs-panel/admin/index.pl
-vhffs-panel/admin/moderation_submit.pl
-vhffs-panel/admin/broadcast_delete.pl
-vhffs-panel/admin/broadcast_submit.pl
-vhffs-panel/admin/su.pl
+vhffs-panel/admin/stats.pl
+vhffs-panel/admin/group/index.pl
+vhffs-panel/admin/group/search.pl
+vhffs-panel/admin/group/list.pl
+vhffs-panel/admin/cron/index.pl
+vhffs-panel/admin/cron/search.pl
+vhffs-panel/admin/cron/list.pl
 vhffs-panel/admin/broadcast_view.pl
+vhffs-panel/admin/cvs/index.pl
+vhffs-panel/admin/cvs/search.pl
+vhffs-panel/admin/cvs/list.pl
+vhffs-panel/admin/tag/index.pl
+vhffs-panel/admin/tag/request/list.pl
+vhffs-panel/admin/tag/request/details.pl
+vhffs-panel/admin/tag/edit.pl
+vhffs-panel/admin/tag/list.pl
+vhffs-panel/admin/tag/create.pl
+vhffs-panel/admin/tag/category/edit.pl
+vhffs-panel/admin/tag/category/list.pl
+vhffs-panel/admin/tag/category/create.pl
+vhffs-panel/admin/broadcast.pl
 vhffs-panel/admin/broadcast_list.pl
-vhffs-panel/admin/stats.pl
-vhffs-panel/admin/moderation.pl
-vhffs-panel/admin/broadcast.pl
-vhffs-panel/cvs/index.pl
-vhffs-panel/cvs/prefs.pl
-vhffs-panel/cvs/delete.pl
-vhffs-panel/cvs/create.pl
-vhffs-panel/group/index.pl
-vhffs-panel/group/view.pl
-vhffs-panel/group/prefs.pl
-vhffs-panel/group/history.pl
-vhffs-panel/group/delete.pl
-vhffs-panel/group/create.pl
-vhffs-panel/acl/view.pl
+vhffs-panel/pgsql/index.pl
+vhffs-panel/pgsql/delete.pl
+vhffs-panel/pgsql/prefs.pl
+vhffs-panel/pgsql/create.pl
+vhffs-panel/show_code.pl
+vhffs-panel/dns/index.pl
+vhffs-panel/dns/delete.pl
+vhffs-panel/dns/prefs.pl
+vhffs-panel/dns/create.pl
+vhffs-panel/subscribe.pl
 vhffs-panel/mysql/index.pl
+vhffs-panel/mysql/delete.pl
 vhffs-panel/mysql/prefs.pl
-vhffs-panel/mysql/delete.pl
 vhffs-panel/mysql/create.pl
-vhffs-panel/object/resubmit.pl
-vhffs-panel/object/quickdelete.pl
-vhffs-panel/object/upavatar.pl
-vhffs-panel/svn/index.pl
-vhffs-panel/svn/prefs.pl
-vhffs-panel/svn/delete.pl
-vhffs-panel/svn/create.pl
+vhffs-panel/panel.pl
 vhffs-panel/mailinglist/index.pl
+vhffs-panel/mailinglist/delete.pl
 vhffs-panel/mailinglist/prefs.pl
-vhffs-panel/mailinglist/delete.pl
 vhffs-panel/mailinglist/create.pl
-vhffs-panel/web/index.pl
-vhffs-panel/web/prefs.pl
-vhffs-panel/web/delete.pl
-vhffs-panel/web/create.pl
+vhffs-panel/getavatar.pl
+vhffs-panel/ajax/help.pl
+vhffs-panel/repository/index.pl
+vhffs-panel/repository/delete.pl
+vhffs-panel/repository/prefs.pl
+vhffs-panel/repository/create.pl
+vhffs-panel/user/delete.pl
 vhffs-panel/user/prefs.pl
-vhffs-panel/user/delete.pl
+vhffs-panel/group/history.pl
+vhffs-panel/group/index.pl
+vhffs-panel/group/delete.pl
+vhffs-panel/group/prefs.pl
+vhffs-panel/group/create.pl
+vhffs-panel/group/view.pl
+vhffs-panel/acl/view.pl
+vhffs-panel/cron/index.pl
+vhffs-panel/cron/delete.pl
+vhffs-panel/cron/prefs.pl
+vhffs-panel/cron/create.pl
+vhffs-panel/cvs/index.pl
+vhffs-panel/cvs/delete.pl
+vhffs-panel/cvs/prefs.pl
+vhffs-panel/cvs/create.pl
+vhffs-panel/auth.pl
 vhffs-panel/alert.pl
-vhffs-panel/show_code.pl
-vhffs-panel/getavatar.pl
-vhffs-panel/lost.pl
-vhffs-panel/subscribe.pl
 vhffs-panel/alert_submit.pl
-vhffs-panel/lost_ack.pl
-vhffs-panel/panel.pl
-vhffs-panel/history.pl
-vhffs-panel/auth.pl
-vhffs-listengine/src/listengine.pl
+vhffs-backend/src/mirror/mx1-mirror.pl
+vhffs-backend/src/mirror/mx2-mirror.pl
+vhffs-backend/src/mirror/nss-mirror.pl
+vhffs-backend/src/mirror/mydns-mirror.pl
+vhffs-packages/oldbuildwithdput.pl
+vhffs-tests/src/Vhffs/Tests/Utils.pm
 vhffs-tests/src/Vhffs/Tests/Main.pm
-vhffs-tests/src/Vhffs/Tests/Utils.pm
 vhffs-tests/src/Functions.pl

Modified: branches/vhffs-design/vhffs-intl/update-POTFILES.in.sh
===================================================================
--- branches/vhffs-design/vhffs-intl/update-POTFILES.in.sh	2008-08-02 19:11:50 UTC (rev 1247)
+++ branches/vhffs-design/vhffs-intl/update-POTFILES.in.sh	2008-08-02 22:33:52 UTC (rev 1248)
@@ -1,4 +1,4 @@
 #!/bin/bash
 find .. -name '*.tmpl' | xargs perl -ne 'if(/<TMPL_I18N\s+KEY="([^"]+)/i) { print "gettext(\"$1\");\n"; }' > template_strings.pl
+find .. -name '*.tt' | xargs perl -ne 'print "gettext(\"$1\");\n" if(/\[%\s+'\''([^|]+?)'\''\s*|\s*i18n\b/);' >> template_strings.pl
 find .. -name '*.p[ml]' | sed s!^../!! > 'POTFILES.in'
-

Modified: branches/vhffs-design/vhffs-panel/Makefile.am
===================================================================
--- branches/vhffs-design/vhffs-panel/Makefile.am	2008-08-02 19:11:50 UTC (rev 1247)
+++ branches/vhffs-design/vhffs-panel/Makefile.am	2008-08-02 22:33:52 UTC (rev 1248)
@@ -1,8 +1,182 @@
 javascripts = js/prototype.js \
-    js/commons.js \
-	js/tooltip.js
+	js/commons.js \
+	js/dojo/dnd/Moveable.js \
+	js/dojo/dnd/Manager.js \
+	js/dojo/dnd/Selector.js \
+	js/dojo/dnd/move.js \
+	js/dojo/dnd/common.js \
+	js/dojo/dnd/Container.js \
+	js/dojo/dnd/autoscroll.js \
+	js/dojo/dnd/Source.js \
+	js/dojo/dnd/Avatar.js \
+	js/dojo/dnd/TimedMoveable.js \
+	js/dojo/dnd/Mover.js \
+	js/dojo/tests.js \
+	js/dojo/back.js \
+	js/dojo/colors.js \
+	js/dojo/_base/Deferred.js \
+	js/dojo/_base/Color.js \
+	js/dojo/_base/html.js \
+	js/dojo/_base/_loader/hostenv_spidermonkey.js \
+	js/dojo/_base/_loader/hostenv_rhino.js \
+	js/dojo/_base/_loader/bootstrap.js \
+	js/dojo/_base/_loader/loader.js \
+	js/dojo/_base/_loader/loader_xd.js \
+	js/dojo/_base/_loader/loader_debug.js \
+	js/dojo/_base/_loader/hostenv_browser.js \
+	js/dojo/_base/browser.js \
+	js/dojo/_base/query.js \
+	js/dojo/_base/connect.js \
+	js/dojo/_base/NodeList.js \
+	js/dojo/_base/json.js \
+	js/dojo/_base/lang.js \
+	js/dojo/_base/window.js \
+	js/dojo/_base/declare.js \
+	js/dojo/_base/xhr.js \
+	js/dojo/_base/fx.js \
+	js/dojo/_base/array.js \
+	js/dojo/_base/event.js \
+	js/dojo/parser.js \
+	js/dojo/i18n.js \
+	js/dojo/dojo.js.uncompressed.js \
+	js/dojo/date.js \
+	js/dojo/AdapterRegistry.js \
+	js/dojo/data/ItemFileWriteStore.js \
+	js/dojo/data/api/Identity.js \
+	js/dojo/data/api/Write.js \
+	js/dojo/data/api/Read.js \
+	js/dojo/data/api/Request.js \
+	js/dojo/data/api/Notification.js \
+	js/dojo/data/ItemFileReadStore.js \
+	js/dojo/data/util/sorter.js \
+	js/dojo/data/util/filter.js \
+	js/dojo/data/util/simpleFetch.js \
+	js/dojo/jaxer.js \
+	js/dojo/currency.js \
+	js/dojo/behavior.js \
+	js/dojo/_base.js \
+	js/dojo/string.js \
+	js/dojo/dojo.js \
+	js/dojo/rpc/RpcService.js \
+	js/dojo/rpc/JsonService.js \
+	js/dojo/rpc/JsonpService.js \
+	js/dojo/nls/sv/colors.js \
+	js/dojo/nls/de/colors.js \
+	js/dojo/nls/nb/colors.js \
+	js/dojo/nls/fi/colors.js \
+	js/dojo/nls/colors.js \
+	js/dojo/nls/fr/colors.js \
+	js/dojo/nls/tr/colors.js \
+	js/dojo/nls/zh-tw/colors.js \
+	js/dojo/nls/pt-pt/colors.js \
+	js/dojo/nls/pt/colors.js \
+	js/dojo/nls/hu/colors.js \
+	js/dojo/nls/zh/colors.js \
+	js/dojo/nls/it/colors.js \
+	js/dojo/nls/cs/colors.js \
+	js/dojo/nls/ko/colors.js \
+	js/dojo/nls/pl/colors.js \
+	js/dojo/nls/ja/colors.js \
+	js/dojo/nls/he/colors.js \
+	js/dojo/nls/el/colors.js \
+	js/dojo/nls/nl/colors.js \
+	js/dojo/nls/ar/colors.js \
+	js/dojo/nls/es/colors.js \
+	js/dojo/nls/da/colors.js \
+	js/dojo/nls/ru/colors.js \
+	js/dojo/resources/dnd.css.commented.css \
+	js/dojo/resources/dnd.css \
+	js/dojo/resources/_modules.js \
+	js/dojo/resources/dojo.css \
+	js/dojo/resources/blank.gif \
+	js/dojo/resources/images/dndCopy.png \
+	js/dojo/resources/images/dndNoMove.png \
+	js/dojo/resources/images/dndNoCopy.png \
+	js/dojo/resources/images/dndMove.png \
+	js/dojo/resources/dojo.css.commented.css \
+	js/dojo/resources/blank.html \
+	js/dojo/resources/LICENSE \
+	js/dojo/resources/iframe_history.html \
+	js/dojo/_firebug/firebug.css \
+	js/dojo/_firebug/warningIcon.png \
+	js/dojo/_firebug/firebug.js \
+	js/dojo/_firebug/errorIcon.png \
+	js/dojo/_firebug/infoIcon.png \
+	js/dojo/_firebug/firebug.css.commented.css \
+	js/dojo/_firebug/LICENSE \
+	js/dojo/NodeList-fx.js \
+	js/dojo/regexp.js \
+	js/dojo/fx.js \
+	js/dojo/number.js \
+	js/dojo/io/script.js \
+	js/dojo/io/iframe.js \
+	js/dojo/build.txt \
+	js/dojo/DeferredList.js \
+	js/dojo/cookie.js \
+	js/dojo/LICENSE \
+	js/dojo/date/stamp.js \
+	js/dojo/date/locale.js \
+	js/dojo/OpenAjax.js \
+	js/dojo/cldr/README \
+	js/dojo/cldr/supplemental.js \
+	js/dojo/cldr/monetary.js \
+	js/dojo/cldr/nls/it-it/gregorian.js \
+	js/dojo/cldr/nls/es-es/number.js \
+	js/dojo/cldr/nls/es-es/gregorian.js \
+	js/dojo/cldr/nls/de/currency.js \
+	js/dojo/cldr/nls/de/number.js \
+	js/dojo/cldr/nls/de/gregorian.js \
+	js/dojo/cldr/nls/en/currency.js \
+	js/dojo/cldr/nls/en/number.js \
+	js/dojo/cldr/nls/en/gregorian.js \
+	js/dojo/cldr/nls/fr/currency.js \
+	js/dojo/cldr/nls/fr/number.js \
+	js/dojo/cldr/nls/fr/gregorian.js \
+	js/dojo/cldr/nls/zh-tw/currency.js \
+	js/dojo/cldr/nls/zh-tw/number.js \
+	js/dojo/cldr/nls/zh-tw/gregorian.js \
+	js/dojo/cldr/nls/ja-jp/number.js \
+	js/dojo/cldr/nls/en-us/currency.js \
+	js/dojo/cldr/nls/en-us/number.js \
+	js/dojo/cldr/nls/pt/currency.js \
+	js/dojo/cldr/nls/pt/number.js \
+	js/dojo/cldr/nls/pt/gregorian.js \
+	js/dojo/cldr/nls/currency.js \
+	js/dojo/cldr/nls/en-ca/currency.js \
+	js/dojo/cldr/nls/en-ca/gregorian.js \
+	js/dojo/cldr/nls/zh/currency.js \
+	js/dojo/cldr/nls/zh/number.js \
+	js/dojo/cldr/nls/zh/gregorian.js \
+	js/dojo/cldr/nls/it/currency.js \
+	js/dojo/cldr/nls/it/number.js \
+	js/dojo/cldr/nls/it/gregorian.js \
+	js/dojo/cldr/nls/ko/currency.js \
+	js/dojo/cldr/nls/ko/number.js \
+	js/dojo/cldr/nls/ko/gregorian.js \
+	js/dojo/cldr/nls/ja/currency.js \
+	js/dojo/cldr/nls/ja/number.js \
+	js/dojo/cldr/nls/ja/gregorian.js \
+	js/dojo/cldr/nls/en-au/currency.js \
+	js/dojo/cldr/nls/en-au/number.js \
+	js/dojo/cldr/nls/en-au/gregorian.js \
+	js/dojo/cldr/nls/number.js \
+	js/dojo/cldr/nls/ko-kr/number.js \
+	js/dojo/cldr/nls/ko-kr/gregorian.js \
+	js/dojo/cldr/nls/gregorian.js \
+	js/dojo/cldr/nls/pt-br/gregorian.js \
+	js/dojo/cldr/nls/es/currency.js \
+	js/dojo/cldr/nls/es/number.js \
+	js/dojo/cldr/nls/es/gregorian.js \
+	js/dojo/cldr/nls/en-gb/number.js \
+	js/dojo/cldr/nls/en-gb/gregorian.js \
+	js/dojo/cldr/nls/de-de/number.js \
+	js/dojo/cldr/nls/zh-cn/number.js \
+	js/dojo/cldr/nls/zh-cn/gregorian.js \
+	js/dojo/cldr/LICENSE \
+	js/public.js \
+	js/tooltip.js \
+	js/vhffs/Menu.js
 
-
 if INSTALL_PANEL
 SUBDIRS = templates
 

Added: branches/vhffs-design/vhffs-panel/js/dijit/ColorPalette.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/ColorPalette.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/ColorPalette.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,292 @@
+if(!dojo._hasResource["dijit.ColorPalette"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.ColorPalette"] = true;
+dojo.provide("dijit.ColorPalette");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dojo.colors");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojo", "colors", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,nl,ko,zh-tw,pl,it,hu,ROOT");
+
+dojo.declare("dijit.ColorPalette",
+	[dijit._Widget, dijit._Templated],
+	{
+	// summary: A keyboard accessible color-picking widget
+	// description:
+	//	Grid showing various colors, so the user can pick a certain color
+	//	Can be used standalone, or as a popup.
+	//
+	// example:
+	// |	<div dojoType="dijit.ColorPalette"></div>
+	//
+	// example:
+	// |    var picker = new dijit.ColorPalette({ },srcNode);
+	// |	picker.startup();
+	//
+	// defaultTimeout: Number
+	//		number of milliseconds before a held key or button becomes typematic
+	defaultTimeout: 500,
+
+	// timeoutChangeRate: Number
+	//		fraction of time used to change the typematic timer between events
+	//		1.0 means that each typematic event fires at defaultTimeout intervals
+	//		< 1.0 means that each typematic event fires at an increasing faster rate
+	timeoutChangeRate: 0.90,
+
+	// palette: String
+	//		Size of grid, either "7x10" or "3x4".
+	palette: "7x10",
+
+	//_value: String
+	//		The value of the selected color.
+	value: null,
+
+	//_currentFocus: Integer
+	//		Index of the currently focused color.
+	_currentFocus: 0,
+
+	// _xDim: Integer
+	//		This is the number of colors horizontally across.
+	_xDim: null,
+
+	// _yDim: Integer
+	///		This is the number of colors vertically down.
+	_yDim: null,
+
+	// _palettes: Map
+	// 		This represents the value of the colors.
+	//		The first level is a hashmap of the different arrays available
+	//		The next two dimensions represent the columns and rows of colors.
+	_palettes: {
+
+		"7x10":	[["white", "seashell", "cornsilk", "lemonchiffon","lightyellow", "palegreen", "paleturquoise", "lightcyan",	"lavender", "plum"],
+				["lightgray", "pink", "bisque", "moccasin", "khaki", "lightgreen", "lightseagreen", "lightskyblue", "cornflowerblue", "violet"],
+				["silver", "lightcoral", "sandybrown", "orange", "palegoldenrod", "chartreuse", "mediumturquoise", 	"skyblue", "mediumslateblue","orchid"],
+				["gray", "red", "orangered", "darkorange", "yellow", "limegreen", 	"darkseagreen", "royalblue", "slateblue", "mediumorchid"],
+				["dimgray", "crimson", 	"chocolate", "coral", "gold", "forestgreen", "seagreen", "blue", "blueviolet", "darkorchid"],
+				["darkslategray","firebrick","saddlebrown", "sienna", "olive", "green", "darkcyan", "mediumblue","darkslateblue", "darkmagenta" ],
+				["black", "darkred", "maroon", "brown", "darkolivegreen", "darkgreen", "midnightblue", "navy", "indigo", 	"purple"]],
+
+		"3x4": [["white", "lime", "green", "blue"],
+			["silver", "yellow", "fuchsia", "navy"],
+			["gray", "red", "purple", "black"]]	
+
+	},
+
+	// _imagePaths: Map
+	//		This is stores the path to the palette images
+	_imagePaths: {
+		"7x10": dojo.moduleUrl("dijit", "templates/colors7x10.png"),
+		"3x4": dojo.moduleUrl("dijit", "templates/colors3x4.png")
+	},
+
+	// _paletteCoords: Map
+	//		This is a map that is used to calculate the coordinates of the
+	//		images that make up the palette.
+	_paletteCoords: {
+		"leftOffset": 3, "topOffset": 3,
+		"cWidth": 20, "cHeight": 20
+		
+	},
+
+	// templatePath: String
+	//		Path to the template of this widget.
+	templateString:"<div class=\"dijitInline dijitColorPalette\">\n\t<div class=\"dijitColorPaletteInner\" dojoAttachPoint=\"divNode\" waiRole=\"grid\" tabIndex=\"${tabIndex}\">\n\t\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\">\n\t</div>\t\n</div>\n",
+
+	// _paletteDims: Object
+	//		Size of the supported palettes for alignment purposes.
+	_paletteDims: {
+		"7x10": {"width": "206px", "height": "145px"},
+		"3x4": {"width": "86px", "height": "64px"}
+	},
+
+	// tabIndex: String
+	//		Widget tabindex.
+	tabIndex: "0",
+
+	postCreate: function(){
+		// A name has to be given to the colorMap, this needs to be unique per Palette.
+		dojo.mixin(this.divNode.style, this._paletteDims[this.palette]);
+		this.imageNode.setAttribute("src", this._imagePaths[this.palette]);
+		var choices = this._palettes[this.palette];	
+		this.domNode.style.position = "relative";
+		this._cellNodes = [];	
+		this.colorNames = dojo.i18n.getLocalization("dojo", "colors", this.lang);
+		var url = dojo.moduleUrl("dojo", "resources/blank.gif"),
+            colorObject = new dojo.Color(),
+		    coords = this._paletteCoords;
+		for(var row=0; row < choices.length; row++){
+			for(var col=0; col < choices[row].length; col++) {
+                var imgNode = dojo.doc.createElement("img");
+                imgNode.src = url;
+                dojo.addClass(imgNode, "dijitPaletteImg");
+                var color = choices[row][col],
+                        colorValue = colorObject.setColor(dojo.Color.named[color]);
+                imgNode.alt = this.colorNames[color];
+                imgNode.color = colorValue.toHex();
+                var imgStyle = imgNode.style;
+                imgStyle.color = imgStyle.backgroundColor = imgNode.color;
+                var cellNode = dojo.doc.createElement("span");
+                cellNode.appendChild(imgNode);
+                dojo.forEach(["Dijitclick", "MouseEnter", "Focus", "Blur"], function(handler) {
+                    this.connect(cellNode, "on" + handler.toLowerCase(), "_onCell" + handler);
+                }, this);
+                this.divNode.appendChild(cellNode);
+                var cellStyle = cellNode.style;
+                cellStyle.top = coords.topOffset + (row * coords.cHeight) + "px";
+                cellStyle.left = coords.leftOffset + (col * coords.cWidth) + "px";
+                dojo.attr(cellNode, "tabindex", "-1");
+                cellNode.title = this.colorNames[color];
+                dojo.addClass(cellNode, "dijitPaletteCell");
+                dijit.setWaiRole(cellNode, "gridcell");
+                cellNode.index = this._cellNodes.length;
+                this._cellNodes.push(cellNode);
+            }
+		}
+		this._xDim = choices[0].length;
+		this._yDim = choices.length;
+		this.connect(this.divNode, "onfocus", "_onDivNodeFocus");
+
+		// Now set all events
+		// The palette itself is navigated to with the tab key on the keyboard
+		// Keyboard navigation within the Palette is with the arrow keys
+		// Spacebar selects the color.
+		// For the up key the index is changed by negative the x dimension.		
+
+		var keyIncrementMap = {
+			UP_ARROW: -this._xDim,
+			// The down key the index is increase by the x dimension.	
+			DOWN_ARROW: this._xDim,
+			// Right and left move the index by 1.
+			RIGHT_ARROW: 1,
+			LEFT_ARROW: -1
+		};
+		for(var key in keyIncrementMap){
+			this._connects.push(dijit.typematic.addKeyListener(this.domNode,
+				{keyCode:dojo.keys[key], ctrlKey:false, altKey:false, shiftKey:false},
+				this,
+				function(){
+					var increment = keyIncrementMap[key];
+					return function(count){ this._navigateByKey(increment, count); };
+				}(),
+				this.timeoutChangeRate, this.defaultTimeout));
+		}
+	},
+
+	focus: function(){
+		// summary:
+		//		Focus this ColorPalette.  Puts focus on the first swatch.
+		this._focusFirst();
+	},
+
+	onChange: function(color){
+		// summary:
+		//		Callback when a color is selected.
+		// color: String
+		//		Hex value corresponding to color.
+//		console.debug("Color selected is: "+color);
+	},
+
+	_focusFirst: function(){
+		this._currentFocus = 0;
+		var cellNode = this._cellNodes[this._currentFocus];
+		window.setTimeout(function(){dijit.focus(cellNode)}, 0);
+	},
+
+	_onDivNodeFocus: function(evt){
+		// focus bubbles on Firefox 2, so just make sure that focus has really
+		// gone to the container
+		if(evt.target === this.divNode){
+			this._focusFirst();
+		}
+	},
+
+	_onFocus: function(){
+		// while focus is on the palette, set its tabindex to -1 so that on a
+		// shift-tab from a cell, the container is not in the tab order
+		dojo.attr(this.divNode, "tabindex", "-1");
+	},
+
+	_onBlur: function(){
+		this._removeCellHighlight(this._currentFocus);
+		// when focus leaves the palette, restore its tabindex, since it was
+		// modified by _onFocus().
+		dojo.attr(this.divNode, "tabindex", this.tabIndex);
+	},
+
+	_onCellDijitclick: function(/*Event*/ evt){
+		// summary:
+		//		Handler for click, enter key & space key. Selects the color.
+		// evt:
+		//		The event.
+		var target = evt.currentTarget;
+		if (this._currentFocus != target.index){
+			this._currentFocus = target.index;
+			window.setTimeout(function(){dijit.focus(target)}, 0);
+		}
+		this._selectColor(target);
+		dojo.stopEvent(evt);
+	},
+
+	_onCellMouseEnter: function(/*Event*/ evt){
+		// summary:
+		//		Handler for onMouseOver. Put focus on the color under the mouse.
+		// evt:
+		//		The mouse event.
+		var target = evt.currentTarget;
+		window.setTimeout(function(){dijit.focus(target)}, 0);
+	},
+
+	_onCellFocus: function(/*Event*/ evt){
+		// summary:
+		//		Handler for onFocus. Removes highlight of
+		//		the color that just lost focus, and highlights
+		//		the new color.
+		// evt:
+		//		The focus event.
+		this._removeCellHighlight(this._currentFocus);
+		this._currentFocus = evt.currentTarget.index;
+		dojo.addClass(evt.currentTarget, "dijitPaletteCellHighlight");
+	},
+
+	_onCellBlur: function(/*Event*/ evt){
+		// summary:
+		//		needed for Firefox 2 on Mac OS X
+		this._removeCellHighlight(this._currentFocus);
+	},
+
+	_removeCellHighlight: function(index){
+		dojo.removeClass(this._cellNodes[index], "dijitPaletteCellHighlight");
+	},
+
+	_selectColor: function(selectNode){	
+		// summary:
+		// 		This selects a color. It triggers the onChange event
+		// area:
+		//		The area node that covers the color being selected.
+		var img = selectNode.getElementsByTagName("img")[0];
+		this.onChange(this.value = img.color);
+	},
+
+	_navigateByKey: function(increment, typeCount){
+		// summary:
+		// 	  	This is the callback for typematic.
+		// 		It changes the focus and the highlighed color.
+		// increment:
+		// 		How much the key is navigated.
+		// typeCount:
+		//		How many times typematic has fired.
+
+		// typecount == -1 means the key is released.
+		if(typeCount == -1){ return; }
+
+		var newFocusIndex = this._currentFocus + increment;
+		if(newFocusIndex < this._cellNodes.length && newFocusIndex > -1)
+		{
+			var focusNode = this._cellNodes[newFocusIndex];
+			focusNode.focus();
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/Declaration.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/Declaration.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/Declaration.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,76 @@
+if(!dojo._hasResource["dijit.Declaration"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Declaration"] = true;
+dojo.provide("dijit.Declaration");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare(
+	"dijit.Declaration",
+	dijit._Widget,
+	{
+		// summary:
+		//		The Declaration widget allows a user to declare new widget
+		//		classes directly from a snippet of markup.
+
+		_noScript: true,
+		widgetClass: "",
+		replaceVars: true,
+		defaults: null,
+		mixins: [],
+		buildRendering: function(){
+			var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef);
+			var preambles = dojo.query("> script[type='dojo/method'][event='preamble']", src).orphan();
+			var scripts = dojo.query("> script[type^='dojo/']", src).orphan();
+			var srcType = src.nodeName;
+
+			var propList = this.defaults||{};
+
+			// map array of strings like [ "dijit.form.Button" ] to array of mixin objects
+			// (note that dojo.map(this.mixins, dojo.getObject) doesn't work because it passes
+			// a bogus third argument to getObject(), confusing it)
+			this.mixins = this.mixins.length ?
+				dojo.map(this.mixins, function(name){ return dojo.getObject(name); } ) :
+				[ dijit._Widget, dijit._Templated ];
+
+			if(preambles.length){
+				// we only support one preamble. So be it.
+				propList.preamble = dojo.parser._functionFromScript(preambles[0]);
+			}
+
+			var parsedScripts = dojo.map(scripts, function(s){
+				var evt = s.getAttribute("event")||"postscript";
+				return {
+					event: evt,
+					func: dojo.parser._functionFromScript(s)
+				};
+			});
+
+			// do the connects for each <script type="dojo/connect" event="foo"> block and make
+			// all <script type="dojo/method"> tags execute right after construction
+			this.mixins.push(function(){
+				dojo.forEach(parsedScripts, function(s){
+					dojo.connect(this, s.event, this, s.func);
+				}, this);
+			});
+
+			propList.widgetsInTemplate = true;
+			propList._skipNodeCache = true;
+			propList.templateString = "<"+srcType+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint")||'')+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent")||'')+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">";
+			// console.debug(propList.templateString);
+
+			// strip things so we don't create stuff under us in the initial setup phase
+			dojo.query("[dojoType]", src).forEach(function(node){
+				node.removeAttribute("dojoType");
+			});
+
+			// create the new widget class
+			dojo.declare(
+				this.widgetClass,
+				this.mixins,
+				propList
+			);
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/Dialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/Dialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/Dialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,480 @@
+if(!dojo._hasResource["dijit.Dialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Dialog"] = true;
+dojo.provide("dijit.Dialog");
+
+dojo.require("dojo.dnd.TimedMoveable");
+dojo.require("dojo.fx");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit.layout.ContentPane");
+dojo.require("dijit.form.Form");
+dojo.requireLocalization("dijit", "common", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,ROOT,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+	"dijit.DialogUnderlay",
+	[dijit._Widget, dijit._Templated],
+	{
+		// summary: The component that grays out the screen behind the dialog
+	
+		// Template has two divs; outer div is used for fade-in/fade-out, and also to hold background iframe.
+		// Inner div has opacity specified in CSS file.
+		templateString: "<div class='dijitDialogUnderlayWrapper' id='${id}_wrapper'><div class='dijitDialogUnderlay ${class}' id='${id}' dojoAttachPoint='node'></div></div>",
+
+		attributeMap: {},
+
+		postCreate: function(){
+			// summary: Append the underlay to the body
+			dojo.body().appendChild(this.domNode);
+			this.bgIframe = new dijit.BackgroundIframe(this.domNode);
+		},
+
+		layout: function(){
+			// summary: Sets the background to the size of the viewport
+			//
+			// description:
+			//	Sets the background to the size of the viewport (rather than the size
+			//	of the document) since we need to cover the whole browser window, even
+			//	if the document is only a few lines long.
+
+			var viewport = dijit.getViewport();
+			var is = this.node.style,
+				os = this.domNode.style;
+
+			os.top = viewport.t + "px";
+			os.left = viewport.l + "px";
+			is.width = viewport.w + "px";
+			is.height = viewport.h + "px";
+
+			// process twice since the scroll bar may have been removed
+			// by the previous resizing
+			var viewport2 = dijit.getViewport();
+			if(viewport.w != viewport2.w){ is.width = viewport2.w + "px"; }
+			if(viewport.h != viewport2.h){ is.height = viewport2.h + "px"; }
+		},
+
+		show: function(){
+			// summary: Show the dialog underlay
+			this.domNode.style.display = "block";
+			this.layout();
+			if(this.bgIframe.iframe){
+				this.bgIframe.iframe.style.display = "block";
+			}
+			this._resizeHandler = this.connect(window, "onresize", "layout");
+		},
+
+		hide: function(){
+			// summary: hides the dialog underlay
+			this.domNode.style.display = "none";
+			if(this.bgIframe.iframe){
+				this.bgIframe.iframe.style.display = "none";
+			}
+			this.disconnect(this._resizeHandler);
+		},
+
+		uninitialize: function(){
+			if(this.bgIframe){
+				this.bgIframe.destroy();
+			}
+		}
+	}
+);
+
+
+dojo.declare("dijit._DialogMixin", null,
+	{
+		attributeMap: dijit._Widget.prototype.attributeMap,
+
+		// execute: Function
+		//	User defined function to do stuff when the user hits the submit button
+		execute: function(/*Object*/ formContents){},
+
+		// onCancel: Function
+		//      Callback when user has canceled dialog, to notify container
+		//      (user shouldn't override)
+		onCancel: function(){},
+
+		// onExecute: Function
+		//	Callback when user is about to execute dialog, to notify container
+		//	(user shouldn't override)
+		onExecute: function(){},
+
+		_onSubmit: function(){
+			// summary: callback when user hits submit button
+			this.onExecute();	// notify container that we are about to execute
+			this.execute(this.getValues());
+		},
+
+		_getFocusItems: function(/*Node*/ dialogNode){
+			// find focusable Items each time a dialog is opened
+			var focusItem = dijit.getFirstInTabbingOrder(dialogNode);
+			this._firstFocusItem = focusItem ? focusItem : dialogNode;
+			focusItem = dijit.getLastInTabbingOrder(dialogNode);
+			this._lastFocusItem = focusItem ? focusItem : this._firstFocusItem;
+			if(dojo.isMoz && this._firstFocusItem.tagName.toLowerCase() == "input" && dojo.attr(this._firstFocusItem, "type").toLowerCase() == "file"){
+					//FF doesn't behave well when first element is input type=file, set first focusable to dialog container
+					dojo.attr(dialogNode, "tabindex", "0");
+					this._firstFocusItem = dialogNode;
+			}
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.Dialog",
+	[dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin],
+	{
+		// summary: A modal dialog Widget
+		//
+		// description:
+		//	Pops up a modal dialog window, blocking access to the screen
+		//	and also graying out the screen Dialog is extended from
+		//	ContentPane so it supports all the same parameters (href, etc.)
+		//
+		// example:
+		// |	<div dojoType="dijit.Dialog" href="test.html"></div>
+		//
+		// example:
+		// |	<div id="test">test content</div>
+		// |	...
+		// |	var foo = new dijit.Dialog({ title: "test dialog" },dojo.byId("test"));
+		// |	foo.startup();
+		
+		templateString: null,
+		templateString:"<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\">${title}</span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n",
+
+		// open: Boolean
+		//		is True or False depending on state of dialog
+		open: false,
+
+		// duration: Integer
+		//		The time in milliseconds it takes the dialog to fade in and out
+		duration: 400,
+
+		// refocus: Boolean
+		// 		A Toggle to modify the default focus behavior of a Dialog, which
+		// 		is to re-focus the element which had focus before being opened.
+		//		False will disable refocusing. Default: true
+		refocus: true,
+
+		// _firstFocusItem: DomNode
+		//		The pointer to the first focusable node in the dialog
+		_firstFocusItem:null,
+		
+		// _lastFocusItem: DomNode
+		//		The pointer to which node has focus prior to our dialog
+		_lastFocusItem:null,
+
+		// doLayout: Boolean
+		//		Don't change this parameter from the default value.
+		//		This ContentPane parameter doesn't make sense for Dialog, since Dialog
+		//		is never a child of a layout container, nor can you specify the size of
+		//		Dialog in order to control the size of an inner widget. 
+		doLayout: false,
+
+		attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+			{title: "titleBar"}),
+
+		postCreate: function(){
+			dojo.body().appendChild(this.domNode);
+			this.inherited(arguments);
+			var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+			if(this.closeButtonNode){
+				this.closeButtonNode.setAttribute("title", _nlsResources.buttonCancel);
+			}
+			if(this.closeText){
+				this.closeText.setAttribute("title", _nlsResources.buttonCancel);
+			}
+			var s = this.domNode.style;
+			s.visibility = "hidden";
+			s.position = "absolute";
+			s.display = "";
+			s.top = "-9999px";
+
+			this.connect(this, "onExecute", "hide");
+			this.connect(this, "onCancel", "hide");
+			this._modalconnects = [];
+		},
+
+		onLoad: function(){
+			// summary: when href is specified we need to reposition the dialog after the data is loaded
+			this._position();
+			this.inherited(arguments);
+		},
+
+		_setup: function(){
+			// summary: 
+			//		stuff we need to do before showing the Dialog for the first
+			//		time (but we defer it until right beforehand, for
+			//		performance reasons)
+
+			if(this.titleBar){
+				this._moveable = new dojo.dnd.TimedMoveable(this.domNode, { handle: this.titleBar, timeout: 0 });
+			}
+
+			this._underlay = new dijit.DialogUnderlay({
+				id: this.id+"_underlay",
+				"class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
+			});
+
+			var node = this.domNode;
+			this._fadeIn = dojo.fx.combine(
+				[dojo.fadeIn({
+					node: node,
+					duration: this.duration
+				 }),
+				 dojo.fadeIn({
+					node: this._underlay.domNode,
+					duration: this.duration,
+					onBegin: dojo.hitch(this._underlay, "show")
+				 })
+				]
+			);
+
+			this._fadeOut = dojo.fx.combine(
+				[dojo.fadeOut({
+					node: node,
+					duration: this.duration,
+					onEnd: function(){
+						node.style.visibility="hidden";
+						node.style.top = "-9999px";
+					}
+				 }),
+				 dojo.fadeOut({
+					node: this._underlay.domNode,
+					duration: this.duration,
+					onEnd: dojo.hitch(this._underlay, "hide")
+				 })
+				]
+			);
+		},
+
+		uninitialize: function(){
+			if(this._fadeIn && this._fadeIn.status() == "playing"){
+				this._fadeIn.stop();
+			}
+			if(this._fadeOut && this._fadeOut.status() == "playing"){
+				this._fadeOut.stop();
+			}
+			if(this._underlay){
+				this._underlay.destroy();
+			}
+		},
+
+		_position: function(){
+			// summary: position modal dialog in center of screen
+			
+			if(dojo.hasClass(dojo.body(),"dojoMove")){ return; }
+			var viewport = dijit.getViewport();
+			var mb = dojo.marginBox(this.domNode);
+
+			var style = this.domNode.style;
+			style.left = Math.floor((viewport.l + (viewport.w - mb.w)/2)) + "px";
+			style.top = Math.floor((viewport.t + (viewport.h - mb.h)/2)) + "px";
+		},
+
+		_onKey: function(/*Event*/ evt){
+			// summary: handles the keyboard events for accessibility reasons
+			if(evt.keyCode){
+				var node = evt.target;
+				if (evt.keyCode == dojo.keys.TAB){
+					this._getFocusItems(this.domNode);
+				}
+				var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+				// see if we are shift-tabbing from first focusable item on dialog
+				if(node == this._firstFocusItem && evt.shiftKey && evt.keyCode == dojo.keys.TAB){
+					if(!singleFocusItem){
+						dijit.focus(this._lastFocusItem); // send focus to last item in dialog
+					}
+					dojo.stopEvent(evt);
+				}else if(node == this._lastFocusItem && evt.keyCode == dojo.keys.TAB && !evt.shiftKey){
+					if (!singleFocusItem){
+						dijit.focus(this._firstFocusItem); // send focus to first item in dialog
+					}
+					dojo.stopEvent(evt);
+				}else{
+					// see if the key is for the dialog
+					while(node){
+						if(node == this.domNode){
+							if(evt.keyCode == dojo.keys.ESCAPE){
+								this.hide(); 
+							}else{
+								return; // just let it go
+							}
+						}
+						node = node.parentNode;
+					}
+					// this key is for the disabled document window
+					if(evt.keyCode != dojo.keys.TAB){ // allow tabbing into the dialog for a11y
+						dojo.stopEvent(evt);
+					// opera won't tab to a div
+					}else if(!dojo.isOpera){
+						try{
+							this._firstFocusItem.focus();
+						}catch(e){ /*squelch*/ }
+					}
+				}
+			}
+		},
+
+		show: function(){
+			// summary: display the dialog
+
+			if(this.open){ return; }
+			
+			// first time we show the dialog, there's some initialization stuff to do			
+			if(!this._alreadyInitialized){
+				this._setup();
+				this._alreadyInitialized=true;
+			}
+
+			if(this._fadeOut.status() == "playing"){
+				this._fadeOut.stop();
+			}
+
+			this._modalconnects.push(dojo.connect(window, "onscroll", this, "layout"));
+			this._modalconnects.push(dojo.connect(dojo.doc.documentElement, "onkeypress", this, "_onKey"));
+
+			dojo.style(this.domNode, "opacity", 0);
+			this.domNode.style.visibility="";
+			this.open = true;
+			this._loadCheck(); // lazy load trigger
+
+			this._position();
+
+			this._fadeIn.play();
+
+			this._savedFocus = dijit.getFocus(this);
+
+			// find focusable Items each time dialog is shown since if dialog contains a widget the 
+			// first focusable items can change
+			this._getFocusItems(this.domNode);
+
+			// set timeout to allow the browser to render dialog
+			setTimeout(dojo.hitch(this, function(){
+				dijit.focus(this._firstFocusItem);
+			}), 50);
+		},
+
+		hide: function(){
+			// summary: Hide the dialog
+
+			// if we haven't been initialized yet then we aren't showing and we can just return		
+			if(!this._alreadyInitialized){
+				return;
+			}
+
+			if(this._fadeIn.status() == "playing"){
+				this._fadeIn.stop();
+			}
+			this._fadeOut.play();
+
+			if (this._scrollConnected){
+				this._scrollConnected = false;
+			}
+			dojo.forEach(this._modalconnects, dojo.disconnect);
+			this._modalconnects = [];
+			if(this.refocus){
+				this.connect(this._fadeOut,"onEnd",dojo.hitch(dijit,"focus",this._savedFocus));
+			}
+			this.open = false;
+		},
+
+		layout: function() {
+			// summary: position the Dialog and the underlay
+			if(this.domNode.style.visibility != "hidden"){
+				this._underlay.layout();
+				this._position();
+			}
+		},
+		
+		destroy: function(){
+			dojo.forEach(this._modalconnects, dojo.disconnect);
+			if(this.refocus && this.open){
+				var fo = this._savedFocus;
+				setTimeout(dojo.hitch(dijit,"focus",fo),25);
+			}
+			this.inherited(arguments);			
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.TooltipDialog",
+	[dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin],
+	{
+		// summary:
+		//		Pops up a dialog that appears like a Tooltip
+		//
+		// title: String
+		// 		Description of tooltip dialog (required for a11Y)
+		title: "",
+
+		// doLayout: Boolean
+		//		Don't change this parameter from the default value.
+		//		This ContentPane parameter doesn't make sense for TooltipDialog, since TooltipDialog
+		//		is never a child of a layout container, nor can you specify the size of
+		//		TooltipDialog in order to control the size of an inner widget. 
+		doLayout: false,
+
+		// _firstFocusItem: DomNode
+		//		The pointer to the first focusable node in the dialog
+		_firstFocusItem:null,
+		
+		// _lastFocusItem: DomNode
+		//		The domNode that had focus before we took it.
+		_lastFocusItem: null,
+
+		templateString: null,
+		templateString:"<div class=\"dijitTooltipDialog\" waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presenation\"></div>\n</div>\n",
+
+		postCreate: function(){
+			this.inherited(arguments);
+			this.connect(this.containerNode, "onkeypress", "_onKey");
+			this.containerNode.title = this.title;
+		},
+
+		orient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ corner){
+			// summary: configure widget to be displayed in given position relative to the button
+			this.domNode.className="dijitTooltipDialog " +" dijitTooltipAB"+(corner.charAt(1)=='L'?"Left":"Right")+" dijitTooltip"+(corner.charAt(0)=='T' ? "Below" : "Above");
+		},
+
+		onOpen: function(/*Object*/ pos){
+			// summary: called when dialog is displayed
+		
+			this._getFocusItems(this.containerNode);
+			this.orient(this.domNode,pos.aroundCorner, pos.corner);
+			this._loadCheck(); // lazy load trigger
+			dijit.focus(this._firstFocusItem);
+		},
+		
+		_onKey: function(/*Event*/ evt){
+			// summary: keep keyboard focus in dialog; close dialog on escape key
+			var node = evt.target;
+			if (evt.keyCode == dojo.keys.TAB){
+					this._getFocusItems(this.containerNode);
+			}
+			var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+			if(evt.keyCode == dojo.keys.ESCAPE){
+				this.onCancel();
+			}else if(node == this._firstFocusItem && evt.shiftKey && evt.keyCode == dojo.keys.TAB){
+				if(!singleFocusItem){
+					dijit.focus(this._lastFocusItem); // send focus to last item in dialog
+				}
+				dojo.stopEvent(evt);
+			}else if(node == this._lastFocusItem && evt.keyCode == dojo.keys.TAB && !evt.shiftKey){
+				if(!singleFocusItem){
+					dijit.focus(this._firstFocusItem); // send focus to first item in dialog
+				}
+				dojo.stopEvent(evt);
+			}else if(evt.keyCode == dojo.keys.TAB){
+				// we want the browser's default tab handling to move focus
+				// but we don't want the tab to propagate upwards
+				evt.stopPropagation();
+			}
+		}
+	}	
+);
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/Editor.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/Editor.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/Editor.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,373 @@
+if(!dojo._hasResource["dijit.Editor"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Editor"] = true;
+dojo.provide("dijit.Editor");
+dojo.require("dijit._editor.RichText");
+dojo.require("dijit.Toolbar");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit._Container");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit._editor", "commands", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu,ROOT");
+
+dojo.declare(
+	"dijit.Editor",
+	dijit._editor.RichText,
+	{
+	// summary: A rich-text Editing widget
+
+		// plugins: Array
+		//		a list of plugin names (as strings) or instances (as objects)
+		//		for this widget.
+		plugins: null,
+
+		// extraPlugins: Array
+		//		a list of extra plugin names which will be appended to plugins array
+		extraPlugins: null,
+
+		constructor: function(){
+			if(!dojo.isArray(this.plugins)){
+				this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|",
+				"insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull"/*"createLink"*/];
+			}
+
+			this._plugins=[];
+			this._editInterval = this.editActionInterval * 1000;
+		},
+
+		postCreate: function(){
+			//for custom undo/redo
+			if(this.customUndo){
+				dojo['require']("dijit._editor.range");
+				this._steps=this._steps.slice(0);
+				this._undoedSteps=this._undoedSteps.slice(0);
+//				this.addKeyHandler('z',this.KEY_CTRL,this.undo);
+//				this.addKeyHandler('y',this.KEY_CTRL,this.redo);
+			}
+			if(dojo.isArray(this.extraPlugins)){
+				this.plugins=this.plugins.concat(this.extraPlugins);
+			}
+
+//			try{
+			this.inherited(arguments);
+//			dijit.Editor.superclass.postCreate.apply(this, arguments);
+
+			this.commands = dojo.i18n.getLocalization("dijit._editor", "commands", this.lang);
+
+			if(!this.toolbar){
+				// if we haven't been assigned a toolbar, create one
+				this.toolbar = new dijit.Toolbar({});
+				dojo.place(this.toolbar.domNode, this.editingArea, "before");
+			}
+
+			dojo.forEach(this.plugins, this.addPlugin, this);
+			this.onNormalizedDisplayChanged(); //update toolbar button status
+//			}catch(e){ console.debug(e); }
+		},
+		destroy: function(){
+			dojo.forEach(this._plugins, function(p){
+				if(p && p.destroy){
+					p.destroy();
+				}
+			});
+			this._plugins=[];
+			this.toolbar.destroy(); delete this.toolbar;
+			this.inherited(arguments);
+		},
+		addPlugin: function(/*String||Object*/plugin, /*Integer?*/index){
+			//	summary:
+			//		takes a plugin name as a string or a plugin instance and
+			//		adds it to the toolbar and associates it with this editor
+			//		instance. The resulting plugin is added to the Editor's
+			//		plugins array. If index is passed, it's placed in the plugins
+			//		array at that index. No big magic, but a nice helper for
+			//		passing in plugin names via markup.
+			//	plugin: String, args object or plugin instance. Required.
+			//	args: This object will be passed to the plugin constructor.
+			//	index:	
+			//		Integer, optional. Used when creating an instance from
+			//		something already in this.plugins. Ensures that the new
+			//		instance is assigned to this.plugins at that index.
+			var args=dojo.isString(plugin)?{name:plugin}:plugin;
+			if(!args.setEditor){
+				var o={"args":args,"plugin":null,"editor":this};
+				dojo.publish(dijit._scopeName + ".Editor.getPlugin",[o]);
+				if(!o.plugin){
+					var pc = dojo.getObject(args.name);
+					if(pc){
+						o.plugin=new pc(args);
+					}
+				}
+				if(!o.plugin){
+					console.warn('Cannot find plugin',plugin);
+					return;
+				}
+				plugin=o.plugin;
+			}
+			if(arguments.length > 1){
+				this._plugins[index] = plugin;
+			}else{
+				this._plugins.push(plugin);
+			}
+			plugin.setEditor(this);
+			if(dojo.isFunction(plugin.setToolbar)){
+				plugin.setToolbar(this.toolbar);
+			}
+		},
+		/* beginning of custom undo/redo support */
+
+		// customUndo: Boolean
+		//		Whether we shall use custom undo/redo support instead of the native
+		//		browser support. By default, we only enable customUndo for IE, as it
+		//		has broken native undo/redo support. Note: the implementation does
+		//		support other browsers which have W3C DOM2 Range API.
+		customUndo: dojo.isIE,
+
+		//	editActionInterval: Integer
+		//		When using customUndo, not every keystroke will be saved as a step.
+		//		Instead typing (including delete) will be grouped together: after
+		//		a user stop typing for editActionInterval seconds, a step will be
+		//		saved; if a user resume typing within editActionInterval seconds,
+		//		the timeout will be restarted. By default, editActionInterval is 3
+		//		seconds.
+		editActionInterval: 3,
+		beginEditing: function(cmd){
+			if(!this._inEditing){
+				this._inEditing=true;
+				this._beginEditing(cmd);
+			}
+			if(this.editActionInterval>0){
+				if(this._editTimer){
+					clearTimeout(this._editTimer);
+				}
+				this._editTimer = setTimeout(dojo.hitch(this, this.endEditing), this._editInterval);
+			}
+		},
+		_steps:[],
+		_undoedSteps:[],
+		execCommand: function(cmd){
+			if(this.customUndo && (cmd=='undo' || cmd=='redo')){
+				return this[cmd]();
+			}else{
+				try{
+					if(this.customUndo){
+						this.endEditing();
+						this._beginEditing();
+					}
+					var r = this.inherited('execCommand',arguments);
+					if(this.customUndo){
+						this._endEditing();
+					}
+					return r;
+				}catch(e){
+					if(dojo.isMoz && /copy|cut|paste/.test(cmd)){
+						// Warn user of platform limitation.  Cannot programmatically access keyboard. See ticket #4136
+						var sub = dojo.string.substitute,
+							accel = {cut:'X', copy:'C', paste:'V'},
+							isMac = navigator.userAgent.indexOf("Macintosh") != -1;
+						alert(sub(this.commands.systemShortcutFF,
+							[this.commands[cmd], sub(this.commands[isMac ? 'appleKey' : 'ctrlKey'], [accel[cmd]])]));
+					}
+					return false;
+				}
+			}
+		},
+		queryCommandEnabled: function(cmd){
+			if(this.customUndo && (cmd=='undo' || cmd=='redo')){
+				return cmd=='undo'?(this._steps.length>1):(this._undoedSteps.length>0);
+			}else{
+				return this.inherited('queryCommandEnabled',arguments);
+			}
+		},
+		_moveToBookmark: function(b){
+			var bookmark=b;
+			if(dojo.isIE){
+				if(dojo.isArray(b)){//IE CONTROL
+					bookmark=[];
+					dojo.forEach(b,function(n){
+						bookmark.push(dijit.range.getNode(n,this.editNode));
+					},this);
+				}
+			}else{//w3c range
+				var r=dijit.range.create();
+				r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset);
+				r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset);
+				bookmark=r;
+			}
+			dojo.withGlobal(this.window,'moveToBookmark',dijit,[bookmark]);
+		},
+		_changeToStep: function(from,to){
+			this.setValue(to.text);
+			var b=to.bookmark;
+			if(!b){ return; }
+			this._moveToBookmark(b);
+		},
+		undo: function(){
+//			console.log('undo');
+			this.endEditing(true);
+			var s=this._steps.pop();
+			if(this._steps.length>0){
+				this.focus();
+				this._changeToStep(s,this._steps[this._steps.length-1]);
+				this._undoedSteps.push(s);
+				this.onDisplayChanged();
+				return true;
+			}
+			return false;
+		},
+		redo: function(){
+//			console.log('redo');
+			this.endEditing(true);
+			var s=this._undoedSteps.pop();
+			if(s && this._steps.length>0){
+				this.focus();
+				this._changeToStep(this._steps[this._steps.length-1],s);
+				this._steps.push(s);
+				this.onDisplayChanged();
+				return true;
+			}
+			return false;
+		},
+		endEditing: function(ignore_caret){
+			if(this._editTimer){
+				clearTimeout(this._editTimer);
+			}
+			if(this._inEditing){
+				this._endEditing(ignore_caret);
+				this._inEditing=false;
+			}
+		},
+		_getBookmark: function(){
+			var b=dojo.withGlobal(this.window,dijit.getBookmark);
+			var tmp=[];
+			if(dojo.isIE){
+				if(dojo.isArray(b)){//CONTROL
+					dojo.forEach(b,function(n){
+						tmp.push(dijit.range.getIndex(n,this.editNode).o);
+					},this);
+					b=tmp;
+				}
+			}else{//w3c range
+				tmp=dijit.range.getIndex(b.startContainer,this.editNode).o;
+				b={startContainer:tmp,
+					startOffset:b.startOffset,
+					endContainer:b.endContainer===b.startContainer?tmp:dijit.range.getIndex(b.endContainer,this.editNode).o,
+					endOffset:b.endOffset};
+			}
+			return b;
+		},
+		_beginEditing: function(cmd){
+			if(this._steps.length===0){
+				this._steps.push({'text':this.savedContent,'bookmark':this._getBookmark()});
+			}
+		},
+		_endEditing: function(ignore_caret){
+			var v=this.getValue(true);
+
+			this._undoedSteps=[];//clear undoed steps
+			this._steps.push({text: v, bookmark: this._getBookmark()});
+		},
+		onKeyDown: function(e){
+			if(!this.customUndo){
+				this.inherited('onKeyDown',arguments);
+				return;
+			}
+			var k = e.keyCode, ks = dojo.keys;
+			if(e.ctrlKey && !e.altKey){//undo and redo only if the special right Alt + z/y are not pressed #5892
+				if(k == 90 || k == 122){ //z
+					dojo.stopEvent(e);
+					this.undo();
+					return;
+				}else if(k == 89 || k == 121){ //y
+					dojo.stopEvent(e);
+					this.redo();
+					return;
+				}
+			}
+			this.inherited('onKeyDown',arguments);
+
+			switch(k){
+					case ks.ENTER:
+					case ks.BACKSPACE:
+					case ks.DELETE:
+						this.beginEditing();
+						break;
+					case 88: //x
+					case 86: //v
+						if(e.ctrlKey && !e.altKey && !e.metaKey){
+							this.endEditing();//end current typing step if any
+							if(e.keyCode == 88){
+								this.beginEditing('cut');
+								//use timeout to trigger after the cut is complete
+								setTimeout(dojo.hitch(this, this.endEditing), 1);
+							}else{
+								this.beginEditing('paste');
+								//use timeout to trigger after the paste is complete
+								setTimeout(dojo.hitch(this, this.endEditing), 1);
+							}
+							break;
+						}
+						//pass through
+					default:
+						if(!e.ctrlKey && !e.altKey && !e.metaKey && (e.keyCode<dojo.keys.F1 || e.keyCode>dojo.keys.F15)){
+							this.beginEditing();
+							break;
+						}
+						//pass through
+					case ks.ALT:
+						this.endEditing();
+						break;
+					case ks.UP_ARROW:
+					case ks.DOWN_ARROW:
+					case ks.LEFT_ARROW:
+					case ks.RIGHT_ARROW:
+					case ks.HOME:
+					case ks.END:
+					case ks.PAGE_UP:
+					case ks.PAGE_DOWN:
+						this.endEditing(true);
+						break;
+					//maybe ctrl+backspace/delete, so don't endEditing when ctrl is pressed
+					case ks.CTRL:
+					case ks.SHIFT:
+					case ks.TAB:
+						break;
+				}	
+		},
+		_onBlur: function(){
+			this.inherited('_onBlur',arguments);
+			this.endEditing(true);
+		},
+		onClick: function(){
+			this.endEditing(true);
+			this.inherited('onClick',arguments);
+		}
+		/* end of custom undo/redo support */
+	}
+);
+
+/* the following code is to registered a handler to get default plugins */
+dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+	if(o.plugin){ return; }
+	var args = o.args, p;
+	var _p = dijit._editor._Plugin;
+	var name = args.name;
+	switch(name){
+		case "undo": case "redo": case "cut": case "copy": case "paste": case "insertOrderedList":
+		case "insertUnorderedList": case "indent": case "outdent": case "justifyCenter":
+		case "justifyFull": case "justifyLeft": case "justifyRight": case "delete":
+		case "selectAll": case "removeFormat":
+		case "insertHorizontalRule":
+			p = new _p({ command: name });
+			break;
+
+		case "bold": case "italic": case "underline": case "strikethrough":
+		case "subscript": case "superscript":
+			p = new _p({ buttonClass: dijit.form.ToggleButton, command: name });
+			break;
+		case "|":
+			p = new _p({ button: new dijit.ToolbarSeparator() });
+	}
+//	console.log('name',name,p);
+	o.plugin=p;
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/InlineEditBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/InlineEditBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/InlineEditBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,422 @@
+if(!dojo._hasResource["dijit.InlineEditBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.InlineEditBox"] = true;
+dojo.provide("dijit.InlineEditBox");
+
+dojo.require("dojo.i18n");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Container");
+dojo.require("dijit.form.Button");
+dojo.require("dijit.form.TextBox");
+
+dojo.requireLocalization("dijit", "common", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,ROOT,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare("dijit.InlineEditBox",
+	dijit._Widget,
+	{
+	// summary: An element with in-line edit capabilitites
+	//
+	// description:
+	//		Behavior for an existing node (`<p>`, `<div>`, `<span>`, etc.) so that
+	// 		when you click it, an editor shows up in place of the original
+	//		text.  Optionally, Save and Cancel button are displayed below the edit widget.
+	//		When Save is clicked, the text is pulled from the edit
+	//		widget and redisplayed and the edit widget is again hidden.
+	//		By default a plain Textarea widget is used as the editor (or for
+	//		inline values a TextBox), but you can specify an editor such as
+	//		dijit.Editor (for editing HTML) or a Slider (for adjusting a number).
+	//		An edit widget must support the following API to be used:
+	//		String getDisplayedValue() OR String getValue()
+	//		void setDisplayedValue(String) OR void setValue(String)
+	//		void focus()
+	//
+	// editing: Boolean
+	//		Is the node currently in edit mode?
+	editing: false,
+
+	// autoSave: Boolean
+	//		Changing the value automatically saves it; don't have to push save button
+	//		(and save button isn't even displayed)
+	autoSave: true,
+
+	// buttonSave: String
+	//		Save button label
+	buttonSave: "",
+
+	// buttonCancel: String
+	//		Cancel button label
+	buttonCancel: "",
+
+	// renderAsHtml: Boolean
+	//		Set this to true if the specified Editor's value should be interpreted as HTML
+	//		rather than plain text (ie, dijit.Editor)
+	renderAsHtml: false,
+
+	// editor: String
+	//		Class name for Editor widget
+	editor: "dijit.form.TextBox",
+
+	// editorParams: Object
+	//		Set of parameters for editor, like {required: true}
+	editorParams: {},
+
+	onChange: function(value){
+		// summary: User should set this handler to be notified of changes to value
+	},
+
+	// width: String
+	//		Width of editor.  By default it's width=100% (ie, block mode)
+	width: "100%",
+
+	// value: String
+	//		The display value of the widget in read-only mode
+	value: "",
+
+	// noValueIndicator: String
+	//		The text that gets displayed when there is no value (so that the user has a place to click to edit)
+	noValueIndicator: "<span style='font-family: wingdings; text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>",
+
+	postMixInProperties: function(){
+		this.inherited('postMixInProperties', arguments);
+
+		// save pointer to original source node, since Widget nulls-out srcNodeRef
+		this.displayNode = this.srcNodeRef;
+
+		// connect handlers to the display node
+		var events = {
+			ondijitclick: "_onClick",
+			onmouseover: "_onMouseOver",
+			onmouseout: "_onMouseOut",
+			onfocus: "_onMouseOver",
+			onblur: "_onMouseOut"			
+		};
+		for(var name in events){
+			this.connect(this.displayNode, name, events[name]);
+		}
+		dijit.setWaiRole(this.displayNode, "button");
+		if(!this.displayNode.getAttribute("tabIndex")){
+			this.displayNode.setAttribute("tabIndex", 0);
+		}
+
+		this.setValue(this.value || this.displayNode.innerHTML);
+	},
+
+	setDisabled: function(/*Boolean*/ disabled){
+		// summary:
+		//		Set disabled state of widget.
+
+		this.disabled = disabled;
+		dijit.setWaiState(this.focusNode || this.domNode, "disabled", disabled);
+	},
+
+	_onMouseOver: function(){
+		dojo.addClass(this.displayNode, this.disabled ? "dijitDisabledClickableRegion" : "dijitClickableRegion");
+	},
+
+	_onMouseOut: function(){
+		dojo.removeClass(this.displayNode, this.disabled ? "dijitDisabledClickableRegion" : "dijitClickableRegion");
+	},
+
+	_onClick: function(/*Event*/ e){
+		if(this.disabled){ return; }
+		if(e){ dojo.stopEvent(e); }
+		this._onMouseOut();
+
+		// Since FF gets upset if you move a node while in an event handler for that node...
+		setTimeout(dojo.hitch(this, "_edit"), 0);
+	},
+
+	_edit: function(){
+		// summary: display the editor widget in place of the original (read only) markup
+
+		this.editing = true;
+
+		var editValue = 
+				(this.renderAsHtml ?
+				this.value :
+				this.value.replace(/\s*\r?\n\s*/g,"").replace(/<br\/?>/gi, "\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&"));
+
+		// Placeholder for edit widget
+		// Put place holder (and eventually editWidget) before the display node so that it's positioned correctly
+		// when Calendar dropdown appears, which happens automatically on focus.
+		var placeholder = dojo.doc.createElement("span");
+		dojo.place(placeholder, this.domNode, "before");
+
+		var ew = this.editWidget = new dijit._InlineEditor({
+			value: dojo.trim(editValue),
+			autoSave: this.autoSave,
+			buttonSave: this.buttonSave,
+			buttonCancel: this.buttonCancel,
+			renderAsHtml: this.renderAsHtml,
+			editor: this.editor,
+			editorParams: this.editorParams,
+			style: dojo.getComputedStyle(this.displayNode),
+			save: dojo.hitch(this, "save"),
+			cancel: dojo.hitch(this, "cancel"),
+			width: this.width
+		}, placeholder);
+
+		// to avoid screen jitter, we first create the editor with position:absolute, visibility:hidden,
+		// and then when it's finished rendering, we switch from display mode to editor
+		var ews = ew.domNode.style;
+		this.displayNode.style.display="none";
+		ews.position = "static";
+		ews.visibility = "visible";
+
+		// Replace the display widget with edit widget, leaving them both displayed for a brief time so that
+		// focus can be shifted without incident.  (browser may needs some time to render the editor.)
+		this.domNode = ew.domNode;
+		setTimeout(function(){
+			ew.focus();
+		}, 100);
+	},
+
+	_showText: function(/*Boolean*/ focus){
+		// summary: revert to display mode, and optionally focus on display node
+
+		// display the read-only text and then quickly hide the editor (to avoid screen jitter)
+		this.displayNode.style.display="";
+		var ew = this.editWidget;
+		var ews = ew.domNode.style;
+		ews.position="absolute";
+		ews.visibility="hidden";
+
+		this.domNode = this.displayNode;
+
+		if(focus){
+			dijit.focus(this.displayNode);
+		}
+		ews.display = "none";
+		// give the browser some time to render the display node and then shift focus to it
+		// and hide the edit widget before garbage collecting the edit widget
+		setTimeout(function(){
+			ew.destroy();
+			delete ew;
+			if(dojo.isIE){
+				// messing with the DOM tab order can cause IE to focus the body - so restore
+				dijit.focus(dijit.getFocus());
+			}
+		}, 1000); // no hurry - wait for things to quiesce
+	},
+
+	save: function(/*Boolean*/ focus){
+		// summary:
+		//		Save the contents of the editor and revert to display mode.
+		// focus: Boolean
+		//		Focus on the display mode text
+		this.editing = false;
+
+		var value = this.editWidget.getValue() + "";
+		if(!this.renderAsHtml){
+			value = value.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;")
+				.replace(/\n/g, "<br>");
+		}
+		this.setValue(value);
+
+		// tell the world that we have changed
+		this.onChange(value);
+
+		this._showText(focus);	
+	},
+
+	setValue: function(/*String*/ val){
+		// summary: inserts specified HTML value into this node, or an "input needed" character if node is blank
+		this.value = val;
+		this.displayNode.innerHTML = dojo.trim(val) || this.noValueIndicator;
+	},
+
+	getValue: function(){
+		return this.value;
+	},
+
+	cancel: function(/*Boolean*/ focus){
+		// summary:
+		//		Revert to display mode, discarding any changes made in the editor
+		this.editing = false;
+		this._showText(focus);
+	}
+});
+
+dojo.declare(
+	"dijit._InlineEditor",
+	 [dijit._Widget, dijit._Templated],
+{
+	// summary:
+	// 		internal widget used by InlineEditBox, displayed when in editing mode
+	//		to display the editor and maybe save/cancel buttons.  Calling code should
+	//		connect to save/cancel methods to detect when editing is finished
+	//
+	//		Has mainly the same parameters as InlineEditBox, plus these values:
+	//
+	// style: Object
+	//		Set of CSS attributes of display node, to replicate in editor
+	//
+	// value: String
+	//		Value as an HTML string or plain text string, depending on renderAsHTML flag
+
+	templateString:"<fieldset dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\" \n\t><input dojoAttachPoint=\"editorPlaceholder\"\n\t/><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" disabled=\"true\">${buttonSave}</button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\">${buttonCancel}</button\n\t></span\n></fieldset>\n",
+	widgetsInTemplate: true,
+
+	postMixInProperties: function(){
+		this.inherited('postMixInProperties', arguments);
+		this.messages = dojo.i18n.getLocalization("dijit", "common", this.lang);
+		dojo.forEach(["buttonSave", "buttonCancel"], function(prop){
+			if(!this[prop]){ this[prop] = this.messages[prop]; }
+		}, this);
+	},
+
+	postCreate: function(){
+		// Create edit widget in place in the template
+		var cls = dojo.getObject(this.editor);
+		var ew = this.editWidget = new cls(this.editorParams, this.editorPlaceholder);
+
+		// Copy the style from the source
+		// Don't copy ALL properties though, just the necessary/applicable ones
+		var srcStyle = this.style;
+		dojo.forEach(["fontWeight","fontFamily","fontSize","fontStyle"], function(prop){
+			ew.focusNode.style[prop]=srcStyle[prop];
+		}, this);
+		dojo.forEach(["marginTop","marginBottom","marginLeft", "marginRight"], function(prop){
+			this.domNode.style[prop]=srcStyle[prop];
+		}, this);
+		if(this.width=="100%"){
+			// block mode
+			ew.domNode.style.width = "100%";	// because display: block doesn't work for table widgets
+			this.domNode.style.display="block";
+		}else{
+			// inline-block mode
+			ew.domNode.style.width = this.width + (Number(this.width)==this.width ? "px" : "");			
+		}
+
+		this.connect(ew, "onChange", "_onChange");
+
+		// Monitor keypress on the edit widget.   Note that edit widgets do a stopEvent() on ESC key (to
+		// prevent Dialog from closing when the user just wants to revert the value in the edit widget),
+		// so this is the only way we can see the key press event.
+		this.connect(ew.focusNode || ew.domNode, "onkeypress", "_onKeyPress");
+
+		// priorityChange=false will prevent bogus onChange event
+		(this.editWidget.setDisplayedValue||this.editWidget.setValue).call(this.editWidget, this.value, false);
+
+		this._initialText = this.getValue();
+
+		if(this.autoSave){
+			this.buttonContainer.style.display="none";
+		}
+	},
+
+	destroy: function(){
+		this.editWidget.destroy();
+		this.inherited(arguments);
+	},
+
+	getValue: function(){
+		var ew = this.editWidget;
+		return ew.getDisplayedValue ? ew.getDisplayedValue() : ew.getValue();
+	},
+
+	_onKeyPress: function(e){
+		// summary: Callback when keypress in the edit box (see template).
+		// description:
+		//		For autoSave widgets, if Esc/Enter, call cancel/save.
+		//		For non-autoSave widgets, enable save button if the text value is
+		//		different than the original value.
+		if(this._exitInProgress){
+			return;
+		}
+		if(this.autoSave){
+			if(e.altKey || e.ctrlKey){ return; }
+			// If Enter/Esc pressed, treat as save/cancel.
+			if(e.keyCode == dojo.keys.ESCAPE){
+				dojo.stopEvent(e);
+				this._exitInProgress = true;
+				this.cancel(true);
+			}else if(e.keyCode == dojo.keys.ENTER){
+				dojo.stopEvent(e);
+				this._exitInProgress = true;
+				this.save(true);
+			}else if(e.keyCode == dojo.keys.TAB){
+				this._exitInProgress = true;
+				// allow the TAB to change focus before we mess with the DOM: #6227
+				// Expounding by request:
+				// 	The current focus is on the edit widget input field.
+				//	save() will hide and destroy this widget.
+				//	We want the focus to jump from the currently hidden
+				//	displayNode, but since it's hidden, it's impossible to
+				//	unhide it, focus it, and then have the browser focus
+				//	away from it to the next focusable element since each
+				//	of these events is asynchronous and the focus-to-next-element
+				//	is already queued.
+				//	So we allow the browser time to unqueue the move-focus event 
+				//	before we do all the hide/show stuff.
+				setTimeout(dojo.hitch(this, "save", false), 0);
+			}
+		}else{
+			var _this = this;
+			// Delay before calling getValue().
+			// The delay gives the browser a chance to update the Textarea.
+			setTimeout(
+				function(){
+					_this.saveButton.setAttribute("disabled", _this.getValue() == _this._initialText);
+				}, 100);
+		}
+	},
+
+	_onBlur: function(){
+		// summary:
+		//	Called when focus moves outside the editor
+		this.inherited(arguments);
+		if(this._exitInProgress){
+			// when user clicks the "save" button, focus is shifted back to display text, causing this
+			// function to be called, but in that case don't do anything
+			return;
+		}
+		if(this.autoSave){
+			this._exitInProgress = true;
+			if(this.getValue() == this._initialText){
+				this.cancel(false);
+			}else{
+				this.save(false);
+			}
+		}
+	},
+
+	enableSave: function(){
+		// summary: User replacable function returning a Boolean to indicate
+		// 	if the Save button should be enabled or not - usually due to invalid conditions
+		return this.editWidget.isValid ? this.editWidget.isValid() : true; // Boolean
+	},
+
+	_onChange: function(){
+		// summary:
+		//	Called when the underlying widget fires an onChange event,
+		//	which means that the user has finished entering the value
+		if(this._exitInProgress){
+			// TODO: the onChange event might happen after the return key for an async widget
+			// like FilteringSelect.  Shouldn't be deleting the edit widget on end-of-edit
+			return;
+		}
+		if(this.autoSave){
+			this._exitInProgress = true;
+			this.save(true);
+		}else{
+			// in case the keypress event didn't get through (old problem with Textarea that has been fixed
+			// in theory) or if the keypress event comes too quickly and the value inside the Textarea hasn't
+			// been updated yet)
+			this.saveButton.setAttribute("disabled", (this.getValue() == this._initialText) || !this.enableSave());
+		}
+	},
+	
+	enableSave: function(){
+		// summary: User replacable function returning a Boolean to indicate
+		// 	if the Save button should be enabled or not - usually due to invalid conditions
+		return this.editWidget.isValid ? this.editWidget.isValid() : true;
+	},
+
+	focus: function(){
+		this.editWidget.focus();
+		dijit.selectInputText(this.editWidget.focusNode);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.

Added: branches/vhffs-design/vhffs-panel/js/dijit/Menu.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/Menu.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/Menu.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,487 @@
+if(!dojo._hasResource["dijit.Menu"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Menu"] = true;
+dojo.provide("dijit.Menu");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Container");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.Menu",
+	[dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
+	{
+	// summary
+	//	A context menu you can assign to multiple elements
+
+	constructor: function(){
+		this._bindings = [];
+	},
+
+	templateString:
+			'<table class="dijit dijitMenu dijitReset dijitMenuTable" waiRole="menu" dojoAttachEvent="onkeypress:_onKeyPress">' +
+				'<tbody class="dijitReset" dojoAttachPoint="containerNode"></tbody>'+
+			'</table>',
+
+	// targetNodeIds: String[]
+	//	Array of dom node ids of nodes to attach to.
+	//	Fill this with nodeIds upon widget creation and it becomes context menu for those nodes.
+	targetNodeIds: [],
+
+	// contextMenuForWindow: Boolean
+	//	if true, right clicking anywhere on the window will cause this context menu to open;
+	//	if false, must specify targetNodeIds
+	contextMenuForWindow: false,
+
+	// leftClickToOpen: Boolean
+	//	If true, menu will open on left click instead of right click, similiar to a file menu.
+	leftClickToOpen: false,
+	
+	// parentMenu: Widget
+	// pointer to menu that displayed me
+	parentMenu: null,
+
+	// popupDelay: Integer
+	//	number of milliseconds before hovering (without clicking) causes the popup to automatically open
+	popupDelay: 500,
+
+	// _contextMenuWithMouse: Boolean
+	//	used to record mouse and keyboard events to determine if a context
+	//	menu is being opened with the keyboard or the mouse
+	_contextMenuWithMouse: false,
+
+	postCreate: function(){
+		if(this.contextMenuForWindow){
+			this.bindDomNode(dojo.body());
+		}else{
+			dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
+		}
+		this.connectKeyNavHandlers([dojo.keys.UP_ARROW], [dojo.keys.DOWN_ARROW]);
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+		this.startupKeyNavChildren();
+
+		this.inherited(arguments);
+	},
+
+	onExecute: function(){
+		// summary: attach point for notification about when a menu item has been executed
+	},
+
+	onCancel: function(/*Boolean*/ closeAll){
+		// summary: attach point for notification about when the user cancels the current menu
+	},
+
+	_moveToPopup: function(/*Event*/ evt){
+		if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){
+			this.focusedChild._onClick(evt);
+		}
+	},
+
+	_onKeyPress: function(/*Event*/ evt){
+		// summary: Handle keyboard based menu navigation.
+		if(evt.ctrlKey || evt.altKey){ return; }
+
+		switch(evt.keyCode){
+			case dojo.keys.RIGHT_ARROW:
+				this._moveToPopup(evt);
+				dojo.stopEvent(evt);
+				break;
+			case dojo.keys.LEFT_ARROW:
+				if(this.parentMenu){
+					this.onCancel(false);
+				}else{
+					dojo.stopEvent(evt);
+				}
+				break;
+		}
+	},
+
+	onItemHover: function(/*MenuItem*/ item){
+		// summary: Called when cursor is over a MenuItem
+		this.focusChild(item);
+
+		if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
+			this.hover_timer = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay);
+		}
+	},
+
+	_onChildBlur: function(item){
+		// summary: Close all popups that are open and descendants of this menu
+		dijit.popup.close(item.popup);
+		item._blur();
+		this._stopPopupTimer();
+	},
+
+	onItemUnhover: function(/*MenuItem*/ item){
+		// summary: Callback fires when mouse exits a MenuItem
+	},
+
+	_stopPopupTimer: function(){
+		if(this.hover_timer){
+			clearTimeout(this.hover_timer);
+			this.hover_timer = null;
+		}
+	},
+
+	_getTopMenu: function(){
+		for(var top=this; top.parentMenu; top=top.parentMenu);
+		return top;
+	},
+
+	onItemClick: function(/*Widget*/ item, /*Event*/ evt){
+		// summary: user defined function to handle clicks on an item
+		if(item.disabled){ return false; }
+
+		if(item.popup){
+			if(!this.is_open){
+				this._openPopup();
+			}
+		}else{
+			// before calling user defined handler, close hierarchy of menus
+			// and restore focus to place it was when menu was opened
+			this.onExecute();
+
+			// user defined handler for click
+			item.onClick(evt);
+		}
+	},
+
+	// thanks burstlib!
+	_iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
+		// summary:
+		//	Returns the window reference of the passed iframe
+		var win = dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(iframe_el)) ||
+			// Moz. TODO: is this available when defaultView isn't?
+			dijit.Menu._iframeContentDocument(iframe_el)['__parent__'] ||
+			(iframe_el.name && dojo.doc.frames[iframe_el.name]) || null;
+		return win;	//	Window
+	},
+
+	_iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){
+		// summary:
+		//	Returns a reference to the document object inside iframe_el
+		var doc = iframe_el.contentDocument // W3
+			|| (iframe_el.contentWindow && iframe_el.contentWindow.document) // IE
+			|| (iframe_el.name && dojo.doc.frames[iframe_el.name] && dojo.doc.frames[iframe_el.name].document)
+			|| null;
+		return doc;	//	HTMLDocument
+	},
+
+	bindDomNode: function(/*String|DomNode*/ node){
+		// summary: attach menu to given node
+		node = dojo.byId(node);
+
+		//TODO: this is to support context popups in Editor.  Maybe this shouldn't be in dijit.Menu
+		var win = dijit.getDocumentWindow(node.ownerDocument);
+		if(node.tagName.toLowerCase()=="iframe"){
+			win = this._iframeContentWindow(node);
+			node = dojo.withGlobal(win, dojo.body);
+		}
+
+		// to capture these events at the top level,
+		// attach to document, not body
+		var cn = (node == dojo.body() ? dojo.doc : node);
+
+		node[this.id] = this._bindings.push([
+			dojo.connect(cn, (this.leftClickToOpen)?"onclick":"oncontextmenu", this, "_openMyself"),
+			dojo.connect(cn, "onkeydown", this, "_contextKey"),
+			dojo.connect(cn, "onmousedown", this, "_contextMouse")
+		]);
+	},
+
+	unBindDomNode: function(/*String|DomNode*/ nodeName){
+		// summary: detach menu from given node
+		var node = dojo.byId(nodeName);
+		if(node){
+			var bid = node[this.id]-1, b = this._bindings[bid];
+			dojo.forEach(b, dojo.disconnect);
+			delete this._bindings[bid];
+		}
+	},
+
+	_contextKey: function(e){
+		this._contextMenuWithMouse = false;
+		if(e.keyCode == dojo.keys.F10){
+			dojo.stopEvent(e);
+			if(e.shiftKey && e.type=="keydown"){
+				// FF: copying the wrong property from e will cause the system
+				// context menu to appear in spite of stopEvent. Don't know
+				// exactly which properties cause this effect.
+				var _e = { target: e.target, pageX: e.pageX, pageY: e.pageY };
+				_e.preventDefault = _e.stopPropagation = function(){};
+				// IE: without the delay, focus work in "open" causes the system
+				// context menu to appear in spite of stopEvent.
+				window.setTimeout(dojo.hitch(this, function(){ this._openMyself(_e); }), 1);
+			}
+		}
+	},
+
+	_contextMouse: function(e){
+		this._contextMenuWithMouse = true;
+	},
+
+	_openMyself: function(/*Event*/ e){
+		// summary:
+		//		Internal function for opening myself when the user
+		//		does a right-click or something similar
+
+		if(this.leftClickToOpen&&e.button>0){
+			return;
+		}
+		dojo.stopEvent(e);
+
+		// Get coordinates.
+		// if we are opening the menu with the mouse or on safari open
+		// the menu at the mouse cursor
+		// (Safari does not have a keyboard command to open the context menu
+		// and we don't currently have a reliable way to determine
+		// _contextMenuWithMouse on Safari)
+		var x,y;
+		if(dojo.isSafari || this._contextMenuWithMouse){
+			x=e.pageX;
+			y=e.pageY;
+		}else{
+			// otherwise open near e.target
+			var coords = dojo.coords(e.target, true);
+			x = coords.x + 10;
+			y = coords.y + 10;
+		}
+
+		var self=this;
+		var savedFocus = dijit.getFocus(this);
+		function closeAndRestoreFocus(){
+			// user has clicked on a menu or popup
+			dijit.focus(savedFocus);
+			dijit.popup.close(self);
+		}
+		dijit.popup.open({
+			popup: this,
+			x: x,
+			y: y,
+			onExecute: closeAndRestoreFocus,
+			onCancel: closeAndRestoreFocus,
+			orient: this.isLeftToRight() ? 'L' : 'R'
+		});
+		this.focus();
+
+		this._onBlur = function(){
+			this.inherited('_onBlur', arguments);
+			// Usually the parent closes the child widget but if this is a context
+			// menu then there is no parent
+			dijit.popup.close(this);
+			// don't try to restore focus; user has clicked another part of the screen
+			// and set focus there
+		}
+	},
+
+	onOpen: function(/*Event*/ e){
+		// summary: Open menu relative to the mouse
+		this.isShowingNow = true;
+	},
+
+	onClose: function(){
+		// summary: callback when this menu is closed
+		this._stopPopupTimer();
+		this.parentMenu = null;
+		this.isShowingNow = false;
+		this.currentPopup = null;
+		if(this.focusedChild){
+			this._onChildBlur(this.focusedChild);
+			this.focusedChild = null;
+		}
+	},
+
+	_openPopup: function(){
+		// summary: open the popup to the side of the current menu item
+		this._stopPopupTimer();
+		var from_item = this.focusedChild;
+		var popup = from_item.popup;
+
+		if(popup.isShowingNow){ return; }
+		popup.parentMenu = this;
+		var self = this;
+		dijit.popup.open({
+			parent: this,
+			popup: popup,
+			around: from_item.arrowCell,
+			orient: this.isLeftToRight() ? {'TR': 'TL', 'TL': 'TR'} : {'TL': 'TR', 'TR': 'TL'},
+			onCancel: function(){
+				// called when the child menu is canceled
+				dijit.popup.close(popup);
+				from_item.focus();	// put focus back on my node
+				self.currentPopup = null;
+			}
+		});
+
+		this.currentPopup = popup;
+
+		if(popup.focus){
+			popup.focus();
+		}
+	},
+	
+	uninitialize: function(){
+ 		dojo.forEach(this.targetNodeIds, this.unBindDomNode, this);
+ 		this.inherited(arguments);
+	}
+}
+);
+
+dojo.declare("dijit.MenuItem",
+	[dijit._Widget, dijit._Templated, dijit._Contained],
+	{
+	// summary: A line item in a Menu Widget
+
+	// Make 3 columns
+	//   icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
+	templateString:
+		 '<tr class="dijitReset dijitMenuItem" '
+		+'dojoAttachEvent="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">'
+		+'<td class="dijitReset"><div class="dijitMenuItemIcon ${iconClass}" dojoAttachPoint="iconNode"></div></td>'
+		+'<td tabIndex="-1" class="dijitReset dijitMenuItemLabel" dojoAttachPoint="containerNode,focusNode" waiRole="menuitem"></td>'
+		+'<td class="dijitReset" dojoAttachPoint="arrowCell">'
+			+'<div class="dijitMenuExpand" dojoAttachPoint="expand" style="display:none">'
+			+'<span class="dijitInline dijitArrowNode dijitMenuExpandInner">+</span>'
+			+'</div>'
+		+'</td>'
+		+'</tr>',
+
+	// label: String
+	//	menu text
+	label: '',
+
+	// iconClass: String
+	//	class to apply to div in button to make it display an icon
+	iconClass: "",
+
+	// disabled: Boolean
+	//  if true, the menu item is disabled
+	//  if false, the menu item is enabled
+	disabled: false,
+
+	postCreate: function(){
+		dojo.setSelectable(this.domNode, false);
+		this.setDisabled(this.disabled);
+		if(this.label){
+			this.setLabel(this.label);
+		}
+	},
+
+	_onHover: function(){
+		// summary: callback when mouse is moved onto menu item
+		this.getParent().onItemHover(this);
+	},
+
+	_onUnhover: function(){
+		// summary: callback when mouse is moved off of menu item
+
+		// if we are unhovering the currently selected item
+		// then unselect it
+		this.getParent().onItemUnhover(this);
+	},
+
+	_onClick: function(evt){
+		this.getParent().onItemClick(this, evt);
+		dojo.stopEvent(evt);
+	},
+
+	onClick: function(/*Event*/ evt){
+		// summary: User defined function to handle clicks
+	},
+
+	focus: function(){
+		dojo.addClass(this.domNode, 'dijitMenuItemHover');
+		try{
+			dijit.focus(this.containerNode);
+		}catch(e){
+			// this throws on IE (at least) in some scenarios
+		}
+	},
+
+	_blur: function(){
+		dojo.removeClass(this.domNode, 'dijitMenuItemHover');
+	},
+	
+	setLabel: function(/*String*/ value){
+		this.containerNode.innerHTML=this.label=value;
+	},
+
+	setDisabled: function(/*Boolean*/ value){
+		// summary: enable or disable this menu item
+		this.disabled = value;
+		dojo[value ? "addClass" : "removeClass"](this.domNode, 'dijitMenuItemDisabled');
+		dijit.setWaiState(this.containerNode, 'disabled', value ? 'true' : 'false');
+	}
+});
+
+dojo.declare("dijit.PopupMenuItem",
+	dijit.MenuItem,
+	{
+	_fillContent: function(){
+		// summary: The innerHTML contains both the menu item text and a popup widget
+		// description: the first part holds the menu item text and the second part is the popup
+		// example: 
+		// |	<div dojoType="dijit.PopupMenuItem">
+		// |		<span>pick me</span>
+		// |		<popup> ... </popup>
+		// |	</div>
+		if(this.srcNodeRef){
+			var nodes = dojo.query("*", this.srcNodeRef);
+			dijit.PopupMenuItem.superclass._fillContent.call(this, nodes[0]);
+
+			// save pointer to srcNode so we can grab the drop down widget after it's instantiated
+			this.dropDownContainer = this.srcNodeRef;
+		}
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+		this.inherited(arguments);
+
+		// we didn't copy the dropdown widget from the this.srcNodeRef, so it's in no-man's
+		// land now.  move it to dojo.doc.body.
+		if(!this.popup){
+			var node = dojo.query("[widgetId]", this.dropDownContainer)[0];
+			this.popup = dijit.byNode(node);
+		}
+		dojo.body().appendChild(this.popup.domNode);
+
+		this.popup.domNode.style.display="none";
+		dojo.addClass(this.expand, "dijitMenuExpandEnabled");
+		dojo.style(this.expand, "display", "");
+		dijit.setWaiState(this.containerNode, "haspopup", "true");
+	},
+	
+	destroyDescendants: function(){
+		if(this.popup){
+			this.popup.destroyRecursive();
+			delete this.popup;
+		}
+		this.inherited(arguments);
+	}
+});
+
+dojo.declare("dijit.MenuSeparator",
+	[dijit._Widget, dijit._Templated, dijit._Contained],
+	{
+	// summary: A line between two menu items
+
+	templateString: '<tr class="dijitMenuSeparator"><td colspan=3>'
+			+'<div class="dijitMenuSeparatorTop"></div>'
+			+'<div class="dijitMenuSeparatorBottom"></div>'
+			+'</td></tr>',
+
+	postCreate: function(){
+		dojo.setSelectable(this.domNode, false);
+	},
+	
+	isFocusable: function(){
+		// summary: over ride to always return false
+		return false; // Boolean
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/ProgressBar.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/ProgressBar.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/ProgressBar.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,95 @@
+if(!dojo._hasResource["dijit.ProgressBar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.ProgressBar"] = true;
+dojo.provide("dijit.ProgressBar");
+
+dojo.require("dojo.fx");
+dojo.require("dojo.number");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
+	// summary: A progress indication widget
+	//
+	// example:
+	// |	<div dojoType="ProgressBar"
+	// |		 places="0"
+	// |		 progress="..." maximum="...">
+	// |	</div>
+	//
+	// progress: String (Percentage or Number)
+	// 	initial progress value.
+	// 	with "%": percentage value, 0% <= progress <= 100%
+	// 	or without "%": absolute value, 0 <= progress <= maximum
+	progress: "0",
+
+	// maximum: Float
+	// 	max sample number
+	maximum: 100,
+
+	// places: Number
+	// 	number of places to show in values; 0 by default
+	places: 0,
+
+	// indeterminate: Boolean
+	// 	If false: show progress.
+	// 	If true: show that a process is underway but that the progress is unknown
+	indeterminate: false,
+
+	templateString:"<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" tabindex=\"0\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</div\n\t><img dojoAttachPoint=\"inteterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\"\n\t></img\n></div>\n",
+
+	_indeterminateHighContrastImagePath:
+		dojo.moduleUrl("dijit", "themes/a11y/indeterminate_progress.gif"),
+
+	// public functions
+	postCreate: function(){
+		this.inherited("postCreate",arguments);
+		this.inteterminateHighContrastImage.setAttribute("src",
+			this._indeterminateHighContrastImagePath);
+		this.update();
+	},
+
+	update: function(/*Object?*/attributes){
+		// summary: update progress information
+		//
+		// attributes: may provide progress and/or maximum properties on this parameter,
+		//	see attribute specs for details.
+		dojo.mixin(this, attributes||{});
+		var percent = 1, classFunc;
+		if(this.indeterminate){
+			classFunc = "addClass";
+			dijit.removeWaiState(this.internalProgress, "valuenow");
+			dijit.removeWaiState(this.internalProgress, "valuemin");
+			dijit.removeWaiState(this.internalProgress, "valuemax");
+		}else{
+			classFunc = "removeClass";
+			if(String(this.progress).indexOf("%") != -1){
+				percent = Math.min(parseFloat(this.progress)/100, 1);
+				this.progress = percent * this.maximum;
+			}else{
+				this.progress = Math.min(this.progress, this.maximum);
+				percent = this.progress / this.maximum;
+			}
+			var text = this.report(percent);
+			this.label.firstChild.nodeValue = text;
+			dijit.setWaiState(this.internalProgress, "describedby", this.label.id);
+			dijit.setWaiState(this.internalProgress, "valuenow", this.progress);
+			dijit.setWaiState(this.internalProgress, "valuemin", 0);
+			dijit.setWaiState(this.internalProgress, "valuemax", this.maximum);
+		}
+		dojo[classFunc](this.domNode, "dijitProgressBarIndeterminate");
+		this.internalProgress.style.width = (percent * 100) + "%";
+		this.onChange();
+	},
+
+	report: function(/*float*/percent){
+		// Generates message to show; may be overridden by user
+		return dojo.number.format(percent, {type: "percent", places: this.places, locale: this.lang});
+	},
+
+	onChange: function(){
+		// summary: User definable function fired when progress updates.
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/TitlePane.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/TitlePane.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/TitlePane.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,157 @@
+if(!dojo._hasResource["dijit.TitlePane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.TitlePane"] = true;
+dojo.provide("dijit.TitlePane");
+
+dojo.require("dojo.fx");
+
+dojo.require("dijit._Templated");
+dojo.require("dijit.layout.ContentPane");
+
+dojo.declare(
+	"dijit.TitlePane",
+	[dijit.layout.ContentPane, dijit._Templated],
+{
+	// summary: A pane with a title on top, that can be opened or collapsed.
+	//
+	// description: An accessible container with a Title Heading, and a content
+	//	section that slides open and closed. TitlePane is an extension to 
+	//	ContentPane, providing all the usesful content-control aspects from.
+	//
+	// example:
+	// | 	// load a TitlePane from remote file:
+	// |	var foo = new dijit.TitlePane({ href: "foobar.html", title:"Title" });
+	// |	foo.startup();
+	//
+	// example:
+	// |	<!-- markup href example: -->
+	// |	<div dojoType="dijit.TitlePane" href="foobar.html" title="Title"></div>
+	// 
+	// example:
+	// |	<!-- markup with inline data -->
+	// | 	<div dojoType="dijit.TitlePane" title="Title">
+	// |		<p>I am content</p>
+	// |	</div>
+	//
+	// title: String
+	//		Title of the pane
+	title: "",
+
+	// open: Boolean
+	//		Whether pane is opened or closed.
+	open: true,
+
+	// duration: Integer
+	//		Time in milliseconds to fade in/fade out
+	duration: 250,
+
+	// baseClass: String
+	//	The root className to use for the various states of this widget
+	baseClass: "dijitTitlePane",
+
+	templateString:"<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus\" tabindex=\"0\"\n\t\t\twaiRole=\"button\" class=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<div dojoAttachPoint=\"arrowNode\" class=\"dijitInline dijitArrowNode\"><span dojoAttachPoint=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span></div>\n\t\t<div dojoAttachPoint=\"titleNode\" class=\"dijitTitlePaneTextNode\"></div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" dojoAttachPoint=\"hideNode\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\">\n\t\t\t\t<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc.  Put padding on inner div. -->\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n",
+
+	postCreate: function(){
+		this.setTitle(this.title);
+		if(!this.open){
+			this.hideNode.style.display = this.wipeNode.style.display = "none";
+		}
+		this._setCss();
+		dojo.setSelectable(this.titleNode, false);
+		this.inherited(arguments);
+		dijit.setWaiState(this.containerNode, "labelledby", this.titleNode.id);
+		dijit.setWaiState(this.focusNode, "haspopup", "true");
+
+		// setup open/close animations
+		var hideNode = this.hideNode, wipeNode = this.wipeNode;
+		this._wipeIn = dojo.fx.wipeIn({
+			node: this.wipeNode,
+			duration: this.duration,
+			beforeBegin: function(){
+				hideNode.style.display="";
+			}
+		});
+		this._wipeOut = dojo.fx.wipeOut({
+			node: this.wipeNode,
+			duration: this.duration,
+			onEnd: function(){
+				hideNode.style.display="none";
+			}
+		});
+	},
+
+	setContent: function(content){
+		// summary:
+		// 		Typically called when an href is loaded.  Our job is to make the animation smooth
+		if(!this.open || this._wipeOut.status() == "playing"){
+			// we are currently *closing* the pane (or the pane is closed), so just let that continue
+			this.inherited(arguments);
+		}else{
+			if(this._wipeIn.status() == "playing"){
+				this._wipeIn.stop();
+			}
+
+			// freeze container at current height so that adding new content doesn't make it jump
+			dojo.marginBox(this.wipeNode, { h: dojo.marginBox(this.wipeNode).h });
+
+			// add the new content (erasing the old content, if any)
+			this.inherited(arguments);
+
+			// call _wipeIn.play() to animate from current height to new height
+			this._wipeIn.play();
+		}
+	},
+
+	toggle: function(){
+		// summary: switches between opened and closed state
+		dojo.forEach([this._wipeIn, this._wipeOut], function(animation){
+			if(animation.status() == "playing"){
+				animation.stop();
+			}
+		});
+
+		this[this.open ? "_wipeOut" : "_wipeIn"].play();
+		this.open =! this.open;
+
+		// load content (if this is the first time we are opening the TitlePane
+		// and content is specified as an href, or we have setHref when hidden)
+		this._loadCheck();
+
+		this._setCss();
+	},
+
+	_setCss: function(){
+		// summary: set the open/close css state for the TitlePane
+		var classes = ["dijitClosed", "dijitOpen"];
+		var boolIndex = this.open;
+		var node = this.titleBarNode || this.focusNode
+		dojo.removeClass(node, classes[!boolIndex+0]);
+		node.className += " " + classes[boolIndex+0];
+
+		// provide a character based indicator for images-off mode
+		this.arrowNodeInner.innerHTML = this.open ? "-" : "+";
+	},
+
+	_onTitleKey: function(/*Event*/ e){
+		// summary: callback when user hits a key
+		if(e.keyCode == dojo.keys.ENTER || e.charCode == dojo.keys.SPACE){
+			this.toggle();
+		}else if(e.keyCode == dojo.keys.DOWN_ARROW && this.open){
+			this.containerNode.focus();
+			e.preventDefault();
+	 	}
+	},
+	
+	_handleFocus: function(/*Event*/ e){
+		// summary: handle blur and focus for this widget
+		
+		// add/removeClass is safe to call without hasClass in this case
+		dojo[(e.type == "focus" ? "addClass" : "removeClass")](this.focusNode, this.baseClass + "Focused");
+	},
+
+	setTitle: function(/*String*/ title){
+		// summary: sets the text of the title
+		this.titleNode.innerHTML = title;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/Toolbar.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/Toolbar.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/Toolbar.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,54 @@
+if(!dojo._hasResource["dijit.Toolbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Toolbar"] = true;
+dojo.provide("dijit.Toolbar");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Container");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.Toolbar",
+	[dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
+	{
+	// summary: A Toolbar widget, used to hold things like dijit.Editor buttons
+
+	templateString:
+		'<div class="dijit dijitToolbar" waiRole="toolbar" tabIndex="${tabIndex}" dojoAttachPoint="containerNode">' +
+		//	'<table style="table-layout: fixed" class="dijitReset dijitToolbarTable">' + // factor out style
+		//		'<tr class="dijitReset" dojoAttachPoint="containerNode"></tr>'+
+		//	'</table>' +
+		'</div>',
+
+	tabIndex: "0",
+
+	postCreate: function(){
+		this.connectKeyNavHandlers(
+			this.isLeftToRight() ? [dojo.keys.LEFT_ARROW] : [dojo.keys.RIGHT_ARROW],
+			this.isLeftToRight() ? [dojo.keys.RIGHT_ARROW] : [dojo.keys.LEFT_ARROW]
+		);
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		this.startupKeyNavChildren();
+
+		this.inherited(arguments);
+	}
+}
+);
+
+// Combine with dijit.MenuSeparator??
+dojo.declare("dijit.ToolbarSeparator",
+	[ dijit._Widget, dijit._Templated ],
+	{
+	// summary: A spacer between two Toolbar items
+	templateString: '<div class="dijitToolbarSeparator dijitInline"></div>',
+	postCreate: function(){ dojo.setSelectable(this.domNode, false); },
+	isFocusable: function(){ 
+		// summary: This widget isn't focusable, so pass along that fact.
+		return false; 
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/Tooltip.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/Tooltip.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/Tooltip.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,292 @@
+if(!dojo._hasResource["dijit.Tooltip"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Tooltip"] = true;
+dojo.provide("dijit.Tooltip");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare(
+	"dijit._MasterTooltip",
+	[dijit._Widget, dijit._Templated],
+	{
+		// summary
+		//		Internal widget that holds the actual tooltip markup,
+		//		which occurs once per page.
+		//		Called by Tooltip widgets which are just containers to hold
+		//		the markup
+
+		// duration: Integer
+		//		Milliseconds to fade in/fade out
+		duration: 200,
+
+		templateString:"<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\">\n\t<div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></div>\n</div>\n",
+
+		postCreate: function(){
+			dojo.body().appendChild(this.domNode);
+
+			this.bgIframe = new dijit.BackgroundIframe(this.domNode);
+
+			// Setup fade-in and fade-out functions.
+			this.fadeIn = dojo.fadeIn({ node: this.domNode, duration: this.duration, onEnd: dojo.hitch(this, "_onShow") });
+			this.fadeOut = dojo.fadeOut({ node: this.domNode, duration: this.duration, onEnd: dojo.hitch(this, "_onHide") });
+
+		},
+
+		show: function(/*String*/ innerHTML, /*DomNode*/ aroundNode, /*String[]?*/ position){
+			// summary:
+			//	Display tooltip w/specified contents to right specified node
+			//	(To left if there's no space on the right, or if LTR==right)
+
+			if(this.aroundNode && this.aroundNode === aroundNode){
+				return;
+			}
+
+			if(this.fadeOut.status() == "playing"){
+				// previous tooltip is being hidden; wait until the hide completes then show new one
+				this._onDeck=arguments;
+				return;
+			}
+			this.containerNode.innerHTML=innerHTML;
+
+			// Firefox bug. when innerHTML changes to be shorter than previous
+			// one, the node size will not be updated until it moves.
+			this.domNode.style.top = (this.domNode.offsetTop + 1) + "px";
+
+			// position the element and change CSS according to position[] (a list of positions to try)
+			var align = {};
+			var ltr = this.isLeftToRight();
+			dojo.forEach( (position && position.length) ? position : dijit.Tooltip.defaultPosition, function(pos){
+				switch(pos){
+					case "after":				
+						align[ltr ? "BR" : "BL"] = ltr ? "BL" : "BR";
+						break;
+					case "before":
+						align[ltr ? "BL" : "BR"] = ltr ? "BR" : "BL";
+						break;
+					case "below":
+						// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+						align[ltr ? "BL" : "BR"] = ltr ? "TL" : "TR";
+						align[ltr ? "BR" : "BL"] = ltr ? "TR" : "TL";
+						break;
+					case "above":
+					default:
+						// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+						align[ltr ? "TL" : "TR"] = ltr ? "BL" : "BR";
+						align[ltr ? "TR" : "TL"] = ltr ? "BR" : "BL";
+						break;
+				}
+			});
+			var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, align, dojo.hitch(this, "orient"));
+
+			// show it
+			dojo.style(this.domNode, "opacity", 0);
+			this.fadeIn.play();
+			this.isShowingNow = true;
+			this.aroundNode = aroundNode;
+		},
+
+		orient: function(/* DomNode */ node, /* String */ aroundCorner, /* String */ tooltipCorner){
+			// summary: private function to set CSS for tooltip node based on which position it's in
+			node.className = "dijitTooltip " +
+				{
+					"BL-TL": "dijitTooltipBelow dijitTooltipABLeft",
+					"TL-BL": "dijitTooltipAbove dijitTooltipABLeft",
+					"BR-TR": "dijitTooltipBelow dijitTooltipABRight",
+					"TR-BR": "dijitTooltipAbove dijitTooltipABRight",
+					"BR-BL": "dijitTooltipRight",
+					"BL-BR": "dijitTooltipLeft"
+				}[aroundCorner + "-" + tooltipCorner];
+		},
+
+		_onShow: function(){
+			if(dojo.isIE){
+				// the arrow won't show up on a node w/an opacity filter
+				this.domNode.style.filter="";
+			}
+		},
+
+		hide: function(aroundNode){
+			// summary: hide the tooltip
+			if(!this.aroundNode || this.aroundNode !== aroundNode){
+				return;
+			}
+			if(this._onDeck){
+				// this hide request is for a show() that hasn't even started yet;
+				// just cancel the pending show()
+				this._onDeck=null;
+				return;
+			}
+			this.fadeIn.stop();
+			this.isShowingNow = false;
+			this.aroundNode = null;
+			this.fadeOut.play();
+		},
+
+		_onHide: function(){
+			this.domNode.style.cssText="";	// to position offscreen again
+			if(this._onDeck){
+				// a show request has been queued up; do it now
+				this.show.apply(this, this._onDeck);
+				this._onDeck=null;
+			}
+		}
+
+	}
+);
+
+dijit.showTooltip = function(/*String*/ innerHTML, /*DomNode*/ aroundNode, /*String[]?*/ position){
+	// summary:
+	//	Display tooltip w/specified contents in specified position.
+	//	See description of dijit.Tooltip.defaultPosition for details on position parameter.
+	//	If position is not specified then dijit.Tooltip.defaultPosition is used.
+	if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
+	return dijit._masterTT.show(innerHTML, aroundNode, position);
+};
+
+dijit.hideTooltip = function(aroundNode){
+	// summary: hide the tooltip
+	if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
+	return dijit._masterTT.hide(aroundNode);
+};
+
+dojo.declare(
+	"dijit.Tooltip",
+	dijit._Widget,
+	{
+		// summary
+		//		Pops up a tooltip (a help message) when you hover over a node.
+
+		// label: String
+		//		Text to display in the tooltip.
+		//		Specified as innerHTML when creating the widget from markup.
+		label: "",
+
+		// showDelay: Integer
+		//		Number of milliseconds to wait after hovering over/focusing on the object, before
+		//		the tooltip is displayed.
+		showDelay: 400,
+
+		// connectId: String[]
+		//		Id(s) of domNodes to attach the tooltip to.
+		//		When user hovers over any of the specified dom nodes, the tooltip will appear.
+		connectId: [],
+
+		//	position: String[]
+		//		See description of dijit.Tooltip.defaultPosition for details on position parameter.
+		position: [],
+
+		postCreate: function(){
+			if(this.srcNodeRef){
+				this.srcNodeRef.style.display = "none";
+			}
+
+			this._connectNodes = [];
+			
+			dojo.forEach(this.connectId, function(id) {
+				var node = dojo.byId(id);
+				if (node) {
+					this._connectNodes.push(node);
+					dojo.forEach(["onMouseOver", "onMouseOut", "onFocus", "onBlur", "onHover", "onUnHover"], function(event){
+						this.connect(node, event.toLowerCase(), "_"+event);
+					}, this);
+					if(dojo.isIE){
+						// BiDi workaround
+						node.style.zoom = 1;
+					}
+				}
+			}, this);
+		},
+
+		_onMouseOver: function(/*Event*/ e){
+			this._onHover(e);
+		},
+
+		_onMouseOut: function(/*Event*/ e){
+			if(dojo.isDescendant(e.relatedTarget, e.target)){
+				// false event; just moved from target to target child; ignore.
+				return;
+			}
+			this._onUnHover(e);
+		},
+
+		_onFocus: function(/*Event*/ e){
+			this._focus = true;
+			this._onHover(e);
+			this.inherited(arguments);
+		},
+		
+		_onBlur: function(/*Event*/ e){
+			this._focus = false;
+			this._onUnHover(e);
+			this.inherited(arguments);
+		},
+
+		_onHover: function(/*Event*/ e){
+			if(!this._showTimer){
+				var target = e.target;
+				this._showTimer = setTimeout(dojo.hitch(this, function(){this.open(target)}), this.showDelay);
+			}
+		},
+
+		_onUnHover: function(/*Event*/ e){
+			// keep a tooltip open if the associated element has focus
+			if(this._focus){ return; }
+			if(this._showTimer){
+				clearTimeout(this._showTimer);
+				delete this._showTimer;
+			}
+			this.close();
+		},
+
+		open: function(/*DomNode*/ target){
+ 			// summary: display the tooltip; usually not called directly.
+			target = target || this._connectNodes[0];
+			if(!target){ return; }
+
+			if(this._showTimer){
+				clearTimeout(this._showTimer);
+				delete this._showTimer;
+			}
+			dijit.showTooltip(this.label || this.domNode.innerHTML, target, this.position);
+			
+			this._connectNode = target;
+		},
+
+		close: function(){
+			// summary: hide the tooltip; usually not called directly.
+			dijit.hideTooltip(this._connectNode);
+			delete this._connectNode;
+			if(this._showTimer){
+				clearTimeout(this._showTimer);
+				delete this._showTimer;
+			}
+		},
+
+		uninitialize: function(){
+			this.close();
+		}
+	}
+);
+
+// dijit.Tooltip.defaultPosition: String[]
+//		This variable controls the position of tooltips, if the position is not specified to
+//		the Tooltip widget or *TextBox widget itself.  It's an array of strings with the following values:
+//
+//			* before: places tooltip to the left of the target node/widget, or to the right in
+//			  the case of RTL scripts like Hebrew and Arabic
+//			* after: places tooltip to the right of the target node/widget, or to the left in
+//			  the case of RTL scripts like Hebrew and Arabic
+//			* above: tooltip goes above target node
+//			* below: tooltip goes below target node
+//
+//		The list is positions is tried, in order, until a position is found where the tooltip fits
+//		within the viewport.
+//
+//		Be careful setting this parameter.  A value of "above" may work fine until the user scrolls
+//		the screen so that there's no room above the target node.   Nodes with drop downs, like
+//		DropDownButton or FilteringSelect, are especially problematic, in that you need to be sure
+//		that the drop down and tooltip don't overlap, even when the viewport is scrolled so that there
+//		is only room below (or above) the target node, but not both.
+dijit.Tooltip.defaultPosition = ["after", "before"];
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/Tree.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/Tree.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/Tree.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,1336 @@
+if(!dojo._hasResource["dijit.Tree"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Tree"] = true;
+dojo.provide("dijit.Tree");
+
+dojo.require("dojo.fx");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Container");
+dojo.require("dojo.cookie");
+
+dojo.declare(
+	"dijit._TreeNode",
+	[dijit._Widget, dijit._Templated, dijit._Container, dijit._Contained],
+{
+	// summary
+	//		Single node within a tree
+
+	// item: dojo.data.Item
+	//		the dojo.data entry this tree represents
+	item: null,	
+
+	isTreeNode: true,
+
+	// label: String
+	//		Text of this tree node
+	label: "",
+	
+	isExpandable: null, // show expando node
+	
+	isExpanded: false,
+
+	// state: String
+	//		dynamic loading-related stuff.
+	//		When an empty folder node appears, it is "UNCHECKED" first,
+	//		then after dojo.data query it becomes "LOADING" and, finally "LOADED"	
+	state: "UNCHECKED",
+	
+	templateString:"<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><div dojoAttachPoint=\"contentNode\" class=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"iconNode\" class=\"dijitInline dijitTreeIcon\" waiRole=\"presentation\"></div>\n\t\t\t<span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onNodeFocus\"></span>\n\t\t</div\n\t></div>\n</div>\n",		
+
+	postCreate: function(){
+		// set label, escaping special characters
+		this.setLabelNode(this.label);
+
+		// set expand icon for leaf
+		this._setExpando();
+
+		// set icon and label class based on item
+		this._updateItemClasses(this.item);
+
+		if(this.isExpandable){
+			dijit.setWaiState(this.labelNode, "expanded", this.isExpanded);
+		}
+	},
+
+	markProcessing: function(){
+		// summary: visually denote that tree is loading data, etc.
+		this.state = "LOADING";
+		this._setExpando(true);	
+	},
+
+	unmarkProcessing: function(){
+		// summary: clear markup from markProcessing() call
+		this._setExpando(false);	
+	},
+
+	_updateItemClasses: function(item){
+		// summary: set appropriate CSS classes for icon and label dom node (used to allow for item updates to change respective CSS)
+		var tree = this.tree, model = tree.model;
+		if(tree._v10Compat && item === model.root){
+			// For back-compat with 1.0, need to use null to specify root item (TODO: remove in 2.0)
+			item = null;
+		}
+		this.iconNode.className = "dijitInline dijitTreeIcon " + tree.getIconClass(item, this.isExpanded);
+		this.labelNode.className = "dijitTreeLabel " + tree.getLabelClass(item, this.isExpanded);
+	},
+
+	_updateLayout: function(){
+		// summary: set appropriate CSS classes for this.domNode
+		var parent = this.getParent();
+		if(!parent || parent.rowNode.style.display == "none"){
+			/* if we are hiding the root node then make every first level child look like a root node */
+			dojo.addClass(this.domNode, "dijitTreeIsRoot");
+		}else{
+			dojo.toggleClass(this.domNode, "dijitTreeIsLast", !this.getNextSibling());
+		}
+	},
+
+	_setExpando: function(/*Boolean*/ processing){
+		// summary: set the right image for the expando node
+
+		// apply the appropriate class to the expando node
+		var styles = ["dijitTreeExpandoLoading", "dijitTreeExpandoOpened",
+			"dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"];
+		var idx = processing ? 0 : (this.isExpandable ?	(this.isExpanded ? 1 : 2) : 3);
+		dojo.forEach(styles,
+			function(s){
+				dojo.removeClass(this.expandoNode, s);
+			}, this
+		);
+		dojo.addClass(this.expandoNode, styles[idx]);
+
+		// provide a non-image based indicator for images-off mode
+		this.expandoNodeText.innerHTML =
+			processing ? "*" :
+				(this.isExpandable ?
+					(this.isExpanded ? "-" : "+") : "*");
+	},	
+
+	expand: function(){
+		// summary: show my children
+		if(this.isExpanded){ return; }
+		// cancel in progress collapse operation
+		if(this._wipeOut.status() == "playing"){
+			this._wipeOut.stop();
+		}
+
+		this.isExpanded = true;
+		dijit.setWaiState(this.labelNode, "expanded", "true");
+		dijit.setWaiRole(this.containerNode, "group");
+		this.contentNode.className = "dijitTreeContent dijitTreeContentExpanded";
+		this._setExpando();
+		this._updateItemClasses(this.item);
+
+		this._wipeIn.play();
+	},
+
+	collapse: function(){					
+		if(!this.isExpanded){ return; }
+
+		// cancel in progress expand operation
+		if(this._wipeIn.status() == "playing"){
+			this._wipeIn.stop();
+		}
+
+		this.isExpanded = false;
+		dijit.setWaiState(this.labelNode, "expanded", "false");
+		this.contentNode.className = "dijitTreeContent";
+		this._setExpando();
+		this._updateItemClasses(this.item);
+
+		this._wipeOut.play();
+	},
+
+	setLabelNode: function(label){
+		this.labelNode.innerHTML="";
+		this.labelNode.appendChild(dojo.doc.createTextNode(label));
+	},
+
+	setChildItems: function(/* Object[] */ items){
+		// summary:
+		//		Sets the child items of this node, removing/adding nodes
+		//		from current children to match specified items[] array.
+
+		var tree = this.tree,
+			model = tree.model;
+
+		// Orphan all my existing children.
+		// If items contains some of the same items as before then we will reattach them.
+		// Don't call this.removeChild() because that will collapse the tree etc.
+		this.getChildren().forEach(function(child){
+			dijit._Container.prototype.removeChild.call(this, child);
+		}, this);
+
+		this.state = "LOADED";
+
+		if(items && items.length > 0){
+			this.isExpandable = true;
+			if(!this.containerNode){ // maybe this node was unfolderized and still has container
+				this.containerNode = this.tree.containerNodeTemplate.cloneNode(true);
+				this.domNode.appendChild(this.containerNode);
+			}
+
+			// Create _TreeNode widget for each specified tree node, unless one already
+			// exists and isn't being used (presumably it's from a DnD move and was recently
+			// released
+			dojo.forEach(items, function(item){
+				var id = model.getIdentity(item),
+					existingNode = tree._itemNodeMap[id],
+					node = 
+						( existingNode && !existingNode.getParent() ) ?
+						existingNode :
+						new dijit._TreeNode({
+							item: item,
+							tree: tree,
+							isExpandable: model.mayHaveChildren(item),
+							label: tree.getLabel(item)
+						});
+				this.addChild(node);
+				// note: this won't work if there are two nodes for one item (multi-parented items); will be fixed later
+				tree._itemNodeMap[id] = node;
+				if(this.tree.persist){
+					if(tree._openedItemIds[id]){
+						tree._expandNode(node);
+					}
+				}
+			}, this);
+
+			// note that updateLayout() needs to be called on each child after
+			// _all_ the children exist
+			dojo.forEach(this.getChildren(), function(child, idx){
+				child._updateLayout();
+			});
+		}else{
+			this.isExpandable=false;
+		}
+
+		if(this._setExpando){
+			// change expando to/from dot or + icon, as appropriate
+			this._setExpando(false);
+		}
+
+		// On initial tree show, put focus on either the root node of the tree,
+		// or the first child, if the root node is hidden
+		if(!this.parent){
+			var fc = this.tree.showRoot ? this : this.getChildren()[0],
+				tabnode = fc ? fc.labelNode : this.domNode;
+			tabnode.setAttribute("tabIndex", "0");
+		}
+
+		// create animations for showing/hiding the children (if children exist)
+		if(this.containerNode && !this._wipeIn){
+			this._wipeIn = dojo.fx.wipeIn({node: this.containerNode, duration: 150});
+			this._wipeOut = dojo.fx.wipeOut({node: this.containerNode, duration: 150});
+		}
+	},
+
+	removeChild: function(/* treeNode */ node){
+		this.inherited(arguments);
+
+		var children = this.getChildren();		
+		if(children.length == 0){
+			this.isExpandable = false;
+			this.collapse();
+		}
+
+		dojo.forEach(children, function(child){
+				child._updateLayout();
+		});
+	},
+
+	makeExpandable: function(){
+		//summary
+		//		if this node wasn't already showing the expando node,
+		//		turn it into one and call _setExpando()
+		this.isExpandable = true;
+		this._setExpando(false);
+	},
+
+	_onNodeFocus: function(evt){
+		var node = dijit.getEnclosingWidget(evt.target);
+		this.tree._onTreeFocus(node);
+	}
+});
+
+dojo.declare(
+	"dijit.Tree",
+	[dijit._Widget, dijit._Templated],
+{
+	// summary
+	//	This widget displays hierarchical data from a store.  A query is specified
+	//	to get the "top level children" from a data store, and then those items are
+	//	queried for their children and so on (but lazily, as the user clicks the expand node).
+	//
+	//	Thus in the default mode of operation this widget is technically a forest, not a tree,
+	//	in that there can be multiple "top level children".  However, if you specify label,
+	//	then a special top level node (not corresponding to any item in the datastore) is
+	//	created, to father all the top level children.
+
+	// store: String||dojo.data.Store
+	//	The store to get data to display in the tree.
+	//	May remove for 2.0 in favor of "model".
+	store: null,
+
+	// model: dijit.Tree.model
+	//	Alternate interface from store to access data (and changes to data) in the tree
+	model: null,
+
+	// query: anything
+	//	Specifies datastore query to return the root item for the tree.
+	//
+	//	Deprecated functionality: if the query returns multiple items, the tree is given
+	//	a fake root node (not corresponding to any item in the data store), 
+	//	whose children are the items that match this query.
+	//
+	//	The root node is shown or hidden based on whether a label is specified.
+	//
+	//	Having a query return multiple items is deprecated.
+	//	If your store doesn't have a root item, wrap the store with
+	//	dijit.tree.ForestStoreModel, and specify model=myModel
+	//
+	// example:
+	//		{type:'continent'}
+	query: null,
+
+	// label: String
+	//	Deprecated.  Use dijit.tree.ForestStoreModel directly instead.
+	//	Used in conjunction with query parameter.
+	//	If a query is specified (rather than a root node id), and a label is also specified,
+	//	then a fake root node is created and displayed, with this label.
+	label: "",
+
+	// showRoot: Boolean
+	//	Should the root node be displayed, or hidden?
+	showRoot: true,
+
+	// childrenAttr: String[]
+	//		one ore more attributes that holds children of a tree node
+	childrenAttr: ["children"],
+
+	// openOnClick: Boolean
+	//		If true, clicking a folder node's label will open it, rather than calling onClick()
+	openOnClick: false,
+
+	templateString:"<div class=\"dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onclick:_onClick,onkeypress:_onKeyPress\">\n</div>\n",		
+
+	isExpandable: true,
+
+	isTree: true,
+
+	// persist: Boolean
+	//	enables/disables use of cookies for state saving.
+	persist: true,
+	
+	// dndController: String
+	//	class name to use as as the dnd controller
+	dndController: null,
+
+	//parameters to pull off of the tree and pass on to the dndController as its params
+	dndParams: ["onDndDrop","itemCreator","onDndCancel","checkAcceptance", "checkItemAcceptance"],
+
+	//declare the above items so they can be pulled from the tree's markup
+	onDndDrop:null,
+	itemCreator:null,
+	onDndCancel:null,
+	checkAcceptance:null,	
+	checkItemAcceptance:null,
+
+	_publish: function(/*String*/ topicName, /*Object*/ message){
+		// summary:
+		//		Publish a message for this widget/topic
+		dojo.publish(this.id, [dojo.mixin({tree: this, event: topicName}, message||{})]);
+	},
+
+	postMixInProperties: function(){
+		this.tree = this;
+
+		this._itemNodeMap={};
+
+		if(!this.cookieName){
+			this.cookieName = this.id + "SaveStateCookie";
+		}
+	},
+
+	postCreate: function(){
+		// load in which nodes should be opened automatically
+		if(this.persist){
+			var cookie = dojo.cookie(this.cookieName);
+			this._openedItemIds = {};
+			if(cookie){
+				dojo.forEach(cookie.split(','), function(item){
+					this._openedItemIds[item] = true;
+				}, this);
+			}
+		}
+		
+		// make template for container node (we will clone this and insert it into
+		// any nodes that have children)
+		var div = dojo.doc.createElement('div');
+		div.style.display = 'none';
+		div.className = "dijitTreeContainer";	
+		dijit.setWaiRole(div, "presentation");
+		this.containerNodeTemplate = div;
+
+		// Create glue between store and Tree, if not specified directly by user
+		if(!this.model){
+			this._store2model();
+		}
+
+		// monitor changes to items
+		this.connect(this.model, "onChange", "_onItemChange");
+		this.connect(this.model, "onChildrenChange", "_onItemChildrenChange");
+		// TODO: monitor item deletes so we don't end up w/orphaned nodes?
+
+		this._load();
+
+		this.inherited("postCreate", arguments);
+
+		if(this.dndController){
+			if(dojo.isString(this.dndController)){
+				this.dndController= dojo.getObject(this.dndController);
+			}	
+			var params={};
+			for (var i=0; i<this.dndParams.length;i++){
+				if(this[this.dndParams[i]]){
+					params[this.dndParams[i]]=this[this.dndParams[i]];
+				}
+			}
+			this.dndController= new this.dndController(this, params);
+		}
+	},
+
+	_store2model: function(){
+		// summary: user specified a store&query rather than model, so create model from store/query
+		this._v10Compat = true;
+		dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");
+
+		var modelParams = {
+			id: this.id + "_ForestStoreModel",
+			store: this.store,
+			query: this.query,
+			childrenAttrs: this.childrenAttr
+		};
+
+		// Only override the model's mayHaveChildren() method if the user has specified an override
+		if(this.params.mayHaveChildren){
+			modelParams.mayHaveChildren = dojo.hitch(this, "mayHaveChildren");
+		}
+					
+		if(this.params.getItemChildren){
+			modelParams.getChildren = dojo.hitch(this, function(item, onComplete, onError){
+				this.getItemChildren((this._v10Compat && item === this.model.root) ? null : item, onComplete, onError);
+			});
+		}
+		this.model = new dijit.tree.ForestStoreModel(modelParams);
+		
+		// For backwards compatibility, the visibility of the root node is controlled by
+		// whether or not the user has specified a label
+		this.showRoot = Boolean(this.label);
+	},
+
+	_load: function(){
+		// summary: initial load of the tree
+		// load root node (possibly hidden) and it's children
+		this.model.getRoot(
+			dojo.hitch(this, function(item){
+				var rn = this.rootNode = new dijit._TreeNode({
+					item: item,
+					tree: this,
+					isExpandable: true,
+					label: this.label || this.getLabel(item)
+				});
+				if(!this.showRoot){
+					rn.rowNode.style.display="none";
+				}
+				this.domNode.appendChild(rn.domNode);
+				this._itemNodeMap[this.model.getIdentity(item)] = rn;
+
+				rn._updateLayout();		// sets "dijitTreeIsRoot" CSS classname
+
+				// load top level children
+				this._expandNode(rn);
+			}),
+			function(err){
+				console.error(this, ": error loading root: ", err);
+			}
+		);
+	},
+
+	////////////// Data store related functions //////////////////////
+	// These just get passed to the model; they are here for back-compat
+
+	mayHaveChildren: function(/*dojo.data.Item*/ item){
+		// summary
+		//		User overridable function to tell if an item has or may have children.
+		//		Controls whether or not +/- expando icon is shown.
+		//		(For efficiency reasons we may not want to check if an element actually
+		//		has children until user clicks the expando node)
+	},
+
+	getItemChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete){
+		// summary
+		// 		User overridable function that return array of child items of given parent item,
+		//		or if parentItem==null then return top items in tree
+	},
+
+	///////////////////////////////////////////////////////
+	// Functions for converting an item to a TreeNode
+	getLabel: function(/*dojo.data.Item*/ item){
+		// summary: user overridable function to get the label for a tree node (given the item)
+		return this.model.getLabel(item);	// String
+	},
+
+	getIconClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+		// summary: user overridable function to return CSS class name to display icon
+		return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf"
+	},
+
+	getLabelClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+		// summary: user overridable function to return CSS class name to display label
+	},
+
+	/////////// Keyboard and Mouse handlers ////////////////////
+
+	_onKeyPress: function(/*Event*/ e){
+		// summary: translates keypress events into commands for the controller
+		if(e.altKey){ return; }
+		var treeNode = dijit.getEnclosingWidget(e.target);
+		if(!treeNode){ return; }
+
+		// Note: On IE e.keyCode is not 0 for printables so check e.charCode.
+		// In dojo charCode is universally 0 for non-printables.
+		if(e.charCode){  // handle printables (letter navigation)
+			// Check for key navigation.
+			var navKey = e.charCode;
+			if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
+				navKey = (String.fromCharCode(navKey)).toLowerCase();
+				this._onLetterKeyNav( { node: treeNode, key: navKey } );
+				dojo.stopEvent(e);
+			}
+		}else{  // handle non-printables (arrow keys)
+			var map = this._keyHandlerMap;
+			if(!map){
+				// setup table mapping keys to events
+				map = {};
+				map[dojo.keys.ENTER]="_onEnterKey";
+				map[this.isLeftToRight() ? dojo.keys.LEFT_ARROW : dojo.keys.RIGHT_ARROW]="_onLeftArrow";
+				map[this.isLeftToRight() ? dojo.keys.RIGHT_ARROW : dojo.keys.LEFT_ARROW]="_onRightArrow";
+				map[dojo.keys.UP_ARROW]="_onUpArrow";
+				map[dojo.keys.DOWN_ARROW]="_onDownArrow";
+				map[dojo.keys.HOME]="_onHomeKey";
+				map[dojo.keys.END]="_onEndKey";
+				this._keyHandlerMap = map;
+			}
+			if(this._keyHandlerMap[e.keyCode]){
+				this[this._keyHandlerMap[e.keyCode]]( { node: treeNode, item: treeNode.item } );	
+				dojo.stopEvent(e);
+			}
+		}
+	},
+
+	_onEnterKey: function(/*Object*/ message){
+		this._publish("execute", { item: message.item, node: message.node} );
+		this.onClick(message.item, message.node);
+	},
+
+	_onDownArrow: function(/*Object*/ message){
+		// summary: down arrow pressed; get next visible node, set focus there
+		var node = this._getNextNode(message.node);
+		if(node && node.isTreeNode){
+			this.focusNode(node);
+		}	
+	},
+
+	_onUpArrow: function(/*Object*/ message){
+		// summary: up arrow pressed; move to previous visible node
+
+		var node = message.node;
+
+		// if younger siblings		
+		var previousSibling = node.getPreviousSibling();
+		if(previousSibling){
+			node = previousSibling;
+			// if the previous node is expanded, dive in deep
+			while(node.isExpandable && node.isExpanded && node.hasChildren()){
+				// move to the last child
+				var children = node.getChildren();
+				node = children[children.length-1];
+			}
+		}else{
+			// if this is the first child, return the parent
+			// unless the parent is the root of a tree with a hidden root
+			var parent = node.getParent();
+			if(!(!this.showRoot && parent === this.rootNode)){
+				node = parent;
+			}
+		}
+
+		if(node && node.isTreeNode){
+			this.focusNode(node);
+		}
+	},
+
+	_onRightArrow: function(/*Object*/ message){
+		// summary: right arrow pressed; go to child node
+		var node = message.node;
+
+		// if not expanded, expand, else move to 1st child
+		if(node.isExpandable && !node.isExpanded){
+			this._expandNode(node);
+		}else if(node.hasChildren()){
+			node = node.getChildren()[0];
+			if(node && node.isTreeNode){
+				this.focusNode(node);
+			}
+		}
+	},
+
+	_onLeftArrow: function(/*Object*/ message){
+		// summary:
+		//		Left arrow pressed.
+		//		If not collapsed, collapse, else move to parent.
+
+		var node = message.node;
+
+		if(node.isExpandable && node.isExpanded){
+			this._collapseNode(node);
+		}else{
+			node = node.getParent();
+			if(node && node.isTreeNode){
+				this.focusNode(node);
+			}
+		}
+	},
+
+	_onHomeKey: function(){
+		// summary: home pressed; get first visible node, set focus there
+		var node = this._getRootOrFirstNode();
+		if(node){
+			this.focusNode(node);
+		}
+	},
+
+	_onEndKey: function(/*Object*/ message){
+		// summary: end pressed; go to last visible node
+
+		var node = this;
+		while(node.isExpanded){
+			var c = node.getChildren();
+			node = c[c.length - 1];
+		}
+
+		if(node && node.isTreeNode){
+			this.focusNode(node);
+		}
+	},
+
+	_onLetterKeyNav: function(message){
+		// summary: letter key pressed; search for node starting with first char = key
+		var node = startNode = message.node,
+			key = message.key;
+		do{
+			node = this._getNextNode(node);
+			//check for last node, jump to first node if necessary
+			if(!node){
+				node = this._getRootOrFirstNode();
+			}
+		}while(node !== startNode && (node.label.charAt(0).toLowerCase() != key));
+		if(node && node.isTreeNode){
+			// no need to set focus if back where we started
+			if(node !== startNode){
+				this.focusNode(node);
+			}
+		}
+	},
+
+	_onClick: function(/*Event*/ e){
+		// summary: translates click events into commands for the controller to process
+		var domElement = e.target;
+
+		// find node
+		var nodeWidget = dijit.getEnclosingWidget(domElement);	
+		if(!nodeWidget || !nodeWidget.isTreeNode){
+			return;
+		}
+
+		if( (this.openOnClick && nodeWidget.isExpandable) ||
+			(domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText) ){
+			// expando node was clicked, or label of a folder node was clicked; open it
+			if(nodeWidget.isExpandable){
+				this._onExpandoClick({node:nodeWidget});
+			}
+		}else{
+			this._publish("execute", { item: nodeWidget.item, node: nodeWidget} );
+			this.onClick(nodeWidget.item, nodeWidget);
+			this.focusNode(nodeWidget);
+		}
+		dojo.stopEvent(e);
+	},
+
+	_onExpandoClick: function(/*Object*/ message){
+		// summary: user clicked the +/- icon; expand or collapse my children.
+		var node = message.node;
+		
+		// If we are collapsing, we might be hiding the currently focused node.
+		// Also, clicking the expando node might have erased focus from the current node.
+		// For simplicity's sake just focus on the node with the expando.
+		this.focusNode(node);
+
+		if(node.isExpanded){
+			this._collapseNode(node);
+		}else{
+			this._expandNode(node);
+		}
+	},
+
+	onClick: function(/* dojo.data */ item, /*TreeNode*/ node){
+		// summary: user overridable function for executing a tree item
+	},
+
+	_getNextNode: function(node){
+		// summary: get next visible node
+
+		if(node.isExpandable && node.isExpanded && node.hasChildren()){
+			// if this is an expanded node, get the first child
+			return node.getChildren()[0];		// _TreeNode	
+		}else{
+			// find a parent node with a sibling
+			while(node && node.isTreeNode){
+				var returnNode = node.getNextSibling();
+				if(returnNode){
+					return returnNode;		// _TreeNode
+				}
+				node = node.getParent();
+			}
+			return null;
+		}
+	},
+
+	_getRootOrFirstNode: function(){
+		// summary: get first visible node
+		return this.showRoot ? this.rootNode : this.rootNode.getChildren()[0];
+	},
+
+	_collapseNode: function(/*_TreeNode*/ node){
+		// summary: called when the user has requested to collapse the node
+
+		if(node.isExpandable){
+			if(node.state == "LOADING"){
+				// ignore clicks while we are in the process of loading data
+				return;
+			}
+
+			node.collapse();
+			if(this.persist && node.item){
+				delete this._openedItemIds[this.model.getIdentity(node.item)];
+				this._saveState();
+			}
+		}
+	},
+
+	_expandNode: function(/*_TreeNode*/ node){
+		// summary: called when the user has requested to expand the node
+
+		if(!node.isExpandable){
+			return;
+		}
+
+		var model = this.model,
+			item = node.item;
+
+		switch(node.state){
+			case "LOADING":
+				// ignore clicks while we are in the process of loading data
+				return;
+
+			case "UNCHECKED":
+				// need to load all the children, and then expand
+				node.markProcessing();
+				var _this = this;
+				model.getChildren(item, function(items){
+						node.unmarkProcessing();
+						node.setChildItems(items);
+						_this._expandNode(node);
+					},
+					function(err){
+						console.error(_this, ": error loading root children: ", err);
+					});
+				break;
+
+			default:
+				// data is already loaded; just proceed
+				node.expand();
+				if(this.persist && item){
+					this._openedItemIds[model.getIdentity(item)] = true;
+					this._saveState();
+				}
+		}
+	},
+
+	////////////////// Miscellaneous functions ////////////////
+
+	blurNode: function(){
+		// summary
+		//	Removes focus from the currently focused node (which must be visible).
+		//	Usually not called directly (just call focusNode() on another node instead)
+		var node = this.lastFocused;
+		if(!node){ return; }
+		var labelNode = node.labelNode;
+		dojo.removeClass(labelNode, "dijitTreeLabelFocused");
+		labelNode.setAttribute("tabIndex", "-1");
+		dijit.setWaiState(labelNode, "selected", false);
+		this.lastFocused = null;
+	},
+
+	focusNode: function(/* _tree.Node */ node){
+		// summary
+		//	Focus on the specified node (which must be visible)
+
+		// set focus so that the label will be voiced using screen readers
+		node.labelNode.focus();
+	},
+
+	_onBlur: function(){
+		// summary:
+		// 		We've moved away from the whole tree.  The currently "focused" node
+		//		(see focusNode above) should remain as the lastFocused node so we can
+		//		tab back into the tree.  Just change CSS to get rid of the dotted border
+		//		until that time
+
+		this.inherited(arguments);
+		if(this.lastFocused){
+			var labelNode = this.lastFocused.labelNode;
+			dojo.removeClass(labelNode, "dijitTreeLabelFocused");	
+		}
+	},
+
+	_onTreeFocus: function(/*Widget*/ node){
+		// summary:
+		//		called from onFocus handler of treeitem labelNode to set styles, wai state and tabindex
+		//		for currently focused treeitem.
+		
+		if (node){
+			if(node != this.lastFocused){
+				this.blurNode();
+			}
+			var labelNode = node.labelNode;
+			// set tabIndex so that the tab key can find this node
+			labelNode.setAttribute("tabIndex", "0");
+			dijit.setWaiState(labelNode, "selected", true);
+			dojo.addClass(labelNode, "dijitTreeLabelFocused");
+			this.lastFocused = node;
+		}
+	},
+
+	//////////////// Events from the model //////////////////////////
+	
+	_onItemDelete: function(/*Object*/ item){
+		//summary: delete event from the store
+		// TODO: currently this isn't called, and technically doesn't need to be,
+		// but it would help with garbage collection
+
+		var identity = this.model.getIdentity(item);
+		var node = this._itemNodeMap[identity];
+
+		if(node){
+			var parent = node.getParent();
+			if(parent){
+				// if node has not already been orphaned from a _onSetItem(parent, "children", ..) call...
+				parent.removeChild(node);
+			}
+			delete this._itemNodeMap[identity];
+			node.destroyRecursive();
+		}
+	},
+
+	_onItemChange: function(/*Item*/ item){
+		//summary: set data event on an item in the store
+		var model = this.model,
+			identity = model.getIdentity(item),
+			node = this._itemNodeMap[identity];
+
+		if(node){
+			node.setLabelNode(this.getLabel(item));
+			node._updateItemClasses(item);
+		}
+	},
+
+	_onItemChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+		//summary: set data event on an item in the store
+		var model = this.model,
+			identity = model.getIdentity(parent),
+			parentNode = this._itemNodeMap[identity];
+
+		if(parentNode){
+			parentNode.setChildItems(newChildrenList);
+		}
+	},
+
+	/////////////// Miscellaneous funcs
+	
+	_saveState: function(){
+		//summary: create and save a cookie with the currently expanded nodes identifiers
+		if(!this.persist){
+			return;
+		}
+		var ary = [];
+		for(var id in this._openedItemIds){
+			ary.push(id);
+		}
+		dojo.cookie(this.cookieName, ary.join(","));
+	},
+
+	destroy: function(){
+		if(this.rootNode){
+			this.rootNode.destroyRecursive();
+		}
+		this.rootNode = null;
+		this.inherited(arguments);
+	},
+	
+	destroyRecursive: function(){
+		// A tree is treated as a leaf, not as a node with children (like a grid),
+		// but defining destroyRecursive for back-compat.
+		this.destroy();
+	}
+});
+
+
+dojo.declare(
+	"dijit.tree.TreeStoreModel",
+	null,
+{
+	// summary
+	//		Implements dijit.Tree.model connecting to a store with a single
+	//		root item.  Any methods passed into the constructor will override
+	//		the ones defined here.
+
+	// store: dojo.data.Store
+	//		Underlying store
+	store: null,
+
+	// childrenAttrs: String[]
+	//		one ore more attributes that holds children of a tree node
+	childrenAttrs: ["children"],
+	
+	// root: dojo.data.Item
+	//		Pointer to the root item (read only, not a parameter)
+	root: null,
+
+	// query: anything
+	//		Specifies datastore query to return the root item for the tree.
+	//		Must only return a single item.   Alternately can just pass in pointer
+	//		to root item.
+	// example:
+	//		{id:'ROOT'}
+	query: null,
+
+	constructor: function(/* Object */ args){
+		// summary: passed the arguments listed above (store, etc)
+		dojo.mixin(this, args);
+
+		this.connects = [];
+
+		var store = this.store;
+		if(!store.getFeatures()['dojo.data.api.Identity']){
+			throw new Error("dijit.Tree: store must support dojo.data.Identity");			
+		}
+
+		// if the store supports Notification, subscribe to the notification events
+		if(store.getFeatures()['dojo.data.api.Notification']){
+			this.connects = this.connects.concat([
+				dojo.connect(store, "onNew", this, "_onNewItem"),
+				dojo.connect(store, "onDelete", this, "_onDeleteItem"),
+				dojo.connect(store, "onSet", this, "_onSetItem")
+			]);
+		}
+	},
+
+	destroy: function(){
+		dojo.forEach(this.connects, dojo.disconnect);
+	},
+
+	// =======================================================================
+	// Methods for traversing hierarchy
+
+	getRoot: function(onItem, onError){
+		// summary:
+		//		Calls onItem with the root item for the tree, possibly a fabricated item.
+		//		Calls onError on error.
+		if(this.root){
+			onItem(this.root);
+		}else{
+			this.store.fetch({
+				query: this.query,
+				onComplete: dojo.hitch(this, function(items){
+					if(items.length != 1){
+						throw new Error(this.declaredClass + ": query " + query + " returned " + items.length +
+						 	" items, but must return exactly one item");
+					}
+					this.root = items[0];
+					onItem(this.root);
+				}),
+				onError: onError
+			});
+		}
+	},
+
+	mayHaveChildren: function(/*dojo.data.Item*/ item){
+		// summary
+		//		Tells if an item has or may have children.  Implementing logic here
+		//		avoids showing +/- expando icon for nodes that we know don't have children.
+		//		(For efficiency reasons we may not want to check if an element actually
+		//		has children until user clicks the expando node)
+		return dojo.some(this.childrenAttrs, function(attr){
+			return this.store.hasAttribute(item, attr);
+		}, this);
+	},
+
+	getChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete, /*function*/ onError){
+		// summary
+		// 		Calls onComplete() with array of child items of given parent item, all loaded.
+
+		var store = this.store;
+
+		// get children of specified item
+		var childItems = [];
+		for (var i=0; i<this.childrenAttrs.length; i++){
+			var vals = store.getValues(parentItem, this.childrenAttrs[i]);
+			childItems = childItems.concat(vals);
+		}
+
+		// count how many items need to be loaded
+		var _waitCount = 0;
+		dojo.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } });
+
+		if(_waitCount == 0){
+			// all items are already loaded.  proceed...
+			onComplete(childItems);
+		}else{
+			// still waiting for some or all of the items to load
+			var onItem = function onItem(item){
+				if(--_waitCount == 0){
+					// all nodes have been loaded, send them to the tree
+					onComplete(childItems);
+				}
+			}
+			dojo.forEach(childItems, function(item){
+				if(!store.isItemLoaded(item)){
+					store.loadItem({
+						item: item,
+						onItem: onItem,
+						onError: onError
+					});
+				}
+			});
+		}
+	},
+
+	// =======================================================================
+	// Inspecting items
+
+	getIdentity: function(/* item */ item){
+		return this.store.getIdentity(item);	// Object
+	},
+
+	getLabel: function(/*dojo.data.Item*/ item){
+		// summary: get the label for an item
+		return this.store.getLabel(item);	// String
+	},
+
+	// =======================================================================
+	// Write interface
+
+	newItem: function(/* Object? */ args, /*Item*/ parent){
+		// summary
+		//		Creates a new item.   See dojo.data.api.Write for details on args.
+		//		Used in drag & drop when item from external source dropped onto tree.
+		var pInfo = {parent: parent, attribute: this.childrenAttrs[0]};
+		return this.store.newItem(args, pInfo);
+	},
+
+	pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy){
+		// summary
+		//		Move or copy an item from one parent item to another.
+		//		Used in drag & drop
+		var store = this.store,
+			parentAttr = this.childrenAttrs[0];	// name of "children" attr in parent item
+
+		// remove child from source item, and record the attributee that child occurred in	
+		if(oldParentItem){
+			dojo.forEach(this.childrenAttrs, function(attr){
+				if(store.containsValue(oldParentItem, attr, childItem)){
+					if(!bCopy){
+						var values = dojo.filter(store.getValues(oldParentItem, attr), function(x){
+							return x != childItem;
+						});
+						store.setValues(oldParentItem, attr, values);
+					}
+					parentAttr = attr;
+				}
+			});
+		}
+
+		// modify target item's children attribute to include this item
+		if(newParentItem){
+			store.setValues(newParentItem, parentAttr,
+				store.getValues(newParentItem, parentAttr).concat(childItem));
+		}
+	},
+
+	// =======================================================================
+	// Callbacks
+	
+	onChange: function(/*dojo.data.Item*/ item){
+		// summary
+		//		Callback whenever an item has changed, so that Tree
+		//		can update the label, icon, etc.   Note that changes
+		//		to an item's children or parent(s) will trigger an
+		//		onChildrenChange() so you can ignore those changes here.
+	},
+
+	onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+		// summary
+		//		Callback to do notifications about new, updated, or deleted items.
+	},
+
+	// =======================================================================
+	///Events from data store
+
+	_onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+		// summary: handler for when new items appear in the store.
+
+		//	In this case there's no correspond onSet() call on the parent of this
+		//	item, so need to get the new children list of the parent manually somehow.
+		if(!parentInfo){
+			return;
+		}
+		this.getChildren(parentInfo.item, dojo.hitch(this, function(children){
+			// NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+			this.onChildrenChange(parentInfo.item, children);
+		}));
+	},
+	
+	_onDeleteItem: function(/*Object*/ item){
+		// summary: handler for delete notifications from underlying store
+	},
+
+	_onSetItem: function(/* item */ item, 
+					/* attribute-name-string */ attribute, 
+					/* object | array */ oldValue,
+					/* object | array */ newValue){
+		//summary: set data event on an item in the store
+	
+		if(dojo.indexOf(this.childrenAttrs, attribute) != -1){
+			// item's children list changed
+			this.getChildren(item, dojo.hitch(this, function(children){
+				// NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+				this.onChildrenChange(item, children);
+			}));
+		}else{
+			// item's label/icon/etc. changed.
+			this.onChange(item);
+		}
+	}
+});
+
+dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
+	// summary
+	//		Interface between Tree and a dojo.store that doesn't have a root item, ie,
+	//		has multiple "top level" items.
+	//
+	// description
+	//		Use this class to wrap a dojo.store, making all the items matching the specified query
+	//		appear as children of a fabricated "root item".  If no query is specified then all the
+	//		items returned by fetch() on the underlying store become children of the root item.
+	//		It allows dijit.Tree to assume a single root item, even if the store doesn't have one.
+
+	// Parameters to constructor
+
+	// rootId: String
+	//	ID of fabricated root item
+	rootId: "$root$",
+
+	// rootLabel: String
+	//	Label of fabricated root item
+	rootLabel: "ROOT",
+
+	// query: String
+	//	Specifies the set of children of the root item.
+	// example:
+	//		{type:'continent'}
+	query: null,
+
+	// End of parameters to constructor
+
+	constructor: function(params){
+		// Make dummy root item
+		this.root = {
+			store: this,
+			root: true,
+			id: params.rootId,
+			label: params.rootLabel,
+			children: params.rootChildren	// optional param
+		};
+	},
+
+	// =======================================================================
+	// Methods for traversing hierarchy
+
+	mayHaveChildren: function(/*dojo.data.Item*/ item){
+		// summary
+		//		Tells if an item has or may have children.  Implementing logic here
+		//		avoids showing +/- expando icon for nodes that we know don't have children.
+		//		(For efficiency reasons we may not want to check if an element actually
+		//		has children until user clicks the expando node)
+		return item === this.root || this.inherited(arguments);
+	},
+
+	getChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ callback, /*function*/ onError){
+		// summary
+		// 		Calls onComplete() with array of child items of given parent item, all loaded.
+		if(parentItem === this.root){
+			if(this.root.children){
+				// already loaded, just return
+				callback(this.root.children);
+			}else{
+				this.store.fetch({
+					query: this.query,
+					onComplete: dojo.hitch(this, function(items){
+						this.root.children = items;
+						callback(items);
+					}),
+					onError: onError
+				});
+			}
+		}else{
+			this.inherited(arguments);
+		}
+	},
+
+	// =======================================================================
+	// Inspecting items
+
+	getIdentity: function(/* item */ item){
+		return (item === this.root) ? this.root.id : this.inherited(arguments);
+	},
+
+	getLabel: function(/* item */ item){
+		return	(item === this.root) ? this.root.label : this.inherited(arguments);
+	},
+
+	// =======================================================================
+	// Write interface
+
+	newItem: function(/* Object? */ args, /*Item*/ parent){
+		// summary
+		//		Creates a new item.   See dojo.data.api.Write for details on args.
+		//		Used in drag & drop when item from external source dropped onto tree.
+		if(parent===this.root){
+			this.onNewRootItem(args);
+			return this.store.newItem(args);
+		}else{
+			return this.inherited(arguments);
+		}
+	},
+ 
+	onNewRootItem: function(args){
+		// summary:
+		//		User can override this method to modify a new element that's being
+		//		added to the root of the tree, for example to add a flag like root=true
+	},
+
+	pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy){
+		// summary
+		//		Move or copy an item from one parent item to another.
+		//		Used in drag & drop
+		if(oldParentItem === this.root){
+			if(!bCopy){
+				// It's onLeaveRoot()'s responsibility to modify the item so it no longer matches
+				// this.query... thus triggering an onChildrenChange() event to notify the Tree
+				// that this element is no longer a child of the root node
+				this.onLeaveRoot(childItem);
+			}
+		}
+		dijit.tree.TreeStoreModel.prototype.pasteItem.call(this, childItem,
+			oldParentItem === this.root ? null : oldParentItem,
+			newParentItem === this.root ? null : newParentItem
+		);
+		if(newParentItem === this.root){
+			// It's onAddToRoot()'s responsibility to modify the item so it matches
+			// this.query... thus triggering an onChildrenChange() event to notify the Tree
+			// that this element is now a child of the root node
+			this.onAddToRoot(childItem);
+		}
+	},
+
+	// =======================================================================
+	// Callbacks
+	
+	onAddToRoot: function(/* item */ item){
+		// summary
+		//		Called when item added to root of tree; user must override
+		//		to modify the item so that it matches the query for top level items
+		// example
+		//	|	store.setValue(item, "root", true);
+		console.log(this, ": item ", item, " added to root");
+	},
+
+	onLeaveRoot: function(/* item */ item){
+		// summary
+		//		Called when item removed from root of tree; user must override
+		//		to modify the item so it doesn't match the query for top level items
+		// example
+		// 	|	store.unsetAttribute(item, "root");
+		console.log(this, ": item ", item, " removed from root");
+	},
+	
+	// =======================================================================
+	// Events from data store
+
+	_requeryTop: function(){
+		// reruns the query for the children of the root node,
+		// sending out an onSet notification if those children have changed
+		var _this = this,
+			oldChildren = this.root.children;
+		this.store.fetch({
+			query: this.query,
+			onComplete: function(newChildren){
+				_this.root.children = newChildren;
+
+				// If the list of children or the order of children has changed...	
+				if(oldChildren.length != newChildren.length ||
+					dojo.some(oldChildren, function(item, idx){ return newChildren[idx] != item;})){
+					_this.onChildrenChange(_this.root, newChildren);
+				}
+			}
+		});
+	},
+
+	_onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+		// summary: handler for when new items appear in the store.
+
+		//		In theory, any new item could be a top level item.
+		//		Do the safe but inefficient thing by requerying the top
+		//		level items.   User can override this function to do something
+		//		more efficient.
+		this._requeryTop();
+
+		this.inherited(arguments);
+	},
+
+	_onDeleteItem: function(/*Object*/ item){
+		// summary: handler for delete notifications from underlying store
+
+		// check if this was a child of root, and if so send notification that root's children
+		// have changed
+		if(dojo.indexOf(this.root.children, item) != -1){
+			this._requeryTop();
+		}
+
+		this.inherited(arguments);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_Calendar.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_Calendar.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_Calendar.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,239 @@
+if(!dojo._hasResource["dijit._Calendar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Calendar"] = true;
+dojo.provide("dijit._Calendar");
+
+dojo.require("dojo.cldr.supplemental");
+dojo.require("dojo.date");
+dojo.require("dojo.date.locale");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare(
+	"dijit._Calendar",
+	[dijit._Widget, dijit._Templated],
+	{
+	//	
+	//	summary:
+	//		A simple GUI for choosing a date in the context of a monthly calendar.
+	//
+	//	description:
+	//		A simple GUI for choosing a date in the context of a monthly calendar.
+	//		This widget is used internally by other widgets and is not accessible
+	//		as a standalone widget.
+	//		This widget can't be used in a form because it doesn't serialize the date to an
+	//		`<input>` field.  For a form element, use dijit.form.DateTextBox instead.
+	//
+	//		Note that the parser takes all dates attributes passed in the
+	//		[RFC 3339 format](http://www.faqs.org/rfcs/rfc3339.html), e.g. `2005-06-30T08:05:00-07:00`
+	//		so that they are serializable and locale-independent.
+	//
+	//	example:
+	//	|	var calendar = new dijit._Calendar({}, dojo.byId("calendarNode"));
+	//
+	//	example:
+	//	|	<div dojoType="dijit._Calendar"></div>
+	//	
+		templateString:"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarDecrease\"><span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner\">-</span></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitCalendarMonthLabelSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel\"></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarIncrease\"><span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner\">+</span></div>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\"><span class=\"dijitCalendarDateLabel\"></span></td>\n\t\t</tr>\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\">\n\t\t\t\t<h3 class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span dojoAttachPoint=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\"></span>\n\t\t\t\t</h3>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\t\n",
+
+		// value: Date
+		// 	the currently selected Date
+		value: new Date(),
+
+		// dayWidth: String
+		// 	How to represent the days of the week in the calendar header. See dojo.date.locale
+		dayWidth: "narrow",
+
+		setValue: function(/*Date*/ value){
+			// summary: set the current date and update the UI.  If the date is disabled, the selection will
+			//	not change, but the display will change to the corresponding month.
+			if(!this.value || dojo.date.compare(value, this.value)){
+				value = new Date(value);
+				this.displayMonth = new Date(value);
+				if(!this.isDisabledDate(value, this.lang)){
+					this.value = value;
+					this.value.setHours(0,0,0,0);
+					this.onChange(this.value);
+				}
+				this._populateGrid();
+			}
+		},
+
+		_setText: function(node, text){
+			while(node.firstChild){
+				node.removeChild(node.firstChild);
+			}
+			node.appendChild(dojo.doc.createTextNode(text));
+		},
+
+		_populateGrid: function(){
+			var month = this.displayMonth;
+			month.setDate(1);
+			var firstDay = month.getDay();
+			var daysInMonth = dojo.date.getDaysInMonth(month);
+			var daysInPreviousMonth = dojo.date.getDaysInMonth(dojo.date.add(month, "month", -1));
+			var today = new Date();
+			var selected = this.value;
+
+			var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+			if(dayOffset > firstDay){ dayOffset -= 7; }
+
+			// Iterate through dates in the calendar and fill in date numbers and style info
+			dojo.query(".dijitCalendarDateTemplate", this.domNode).forEach(function(template, i){
+				i += dayOffset;
+				var date = new Date(month);
+				var number, clazz = "dijitCalendar", adj = 0;
+
+				if(i < firstDay){
+					number = daysInPreviousMonth - firstDay + i + 1;
+					adj = -1;
+					clazz += "Previous";
+				}else if(i >= (firstDay + daysInMonth)){
+					number = i - firstDay - daysInMonth + 1;
+					adj = 1;
+					clazz += "Next";
+				}else{
+					number = i - firstDay + 1;
+					clazz += "Current";
+				}
+
+				if(adj){
+					date = dojo.date.add(date, "month", adj);
+				}
+				date.setDate(number);
+
+				if(!dojo.date.compare(date, today, "date")){
+					clazz = "dijitCalendarCurrentDate " + clazz;
+				}
+
+				if(!dojo.date.compare(date, selected, "date")){
+					clazz = "dijitCalendarSelectedDate " + clazz;
+				}
+
+				if(this.isDisabledDate(date, this.lang)){
+					clazz = "dijitCalendarDisabledDate " + clazz;
+				}
+
+				var clazz2 = this.getClassForDate(date, this.lang);
+				if(clazz2){
+					clazz += clazz2 + " " + clazz;
+				}
+
+				template.className =  clazz + "Month dijitCalendarDateTemplate";
+				template.dijitDateValue = date.valueOf();
+				var label = dojo.query(".dijitCalendarDateLabel", template)[0];
+				this._setText(label, date.getDate());
+			}, this);
+
+			// Fill in localized month name
+			var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
+			this._setText(this.monthLabelNode, monthNames[month.getMonth()]);
+
+			// Fill in localized prev/current/next years
+			var y = month.getFullYear() - 1;
+			var d = new Date();
+			dojo.forEach(["previous", "current", "next"], function(name){
+				d.setFullYear(y++);
+				this._setText(this[name+"YearLabelNode"],
+					dojo.date.locale.format(d, {selector:'year', locale:this.lang}));
+			}, this);
+
+			// Set up repeating mouse behavior
+			var _this = this;
+			var typematic = function(nodeProp, dateProp, adj){
+				dijit.typematic.addMouseListener(_this[nodeProp], _this, function(count){
+					if(count >= 0){ _this._adjustDisplay(dateProp, adj); }
+				}, 0.8, 500);
+			};
+			typematic("incrementMonth", "month", 1);
+			typematic("decrementMonth", "month", -1);
+			typematic("nextYearLabelNode", "year", 1);
+			typematic("previousYearLabelNode", "year", -1);
+		},
+
+		goToToday: function(){
+			this.setValue(new Date());
+		},
+
+		postCreate: function(){
+			this.inherited(arguments);
+			
+			var cloneClass = dojo.hitch(this, function(clazz, n){
+				var template = dojo.query(clazz, this.domNode)[0];
+	 			for(var i=0; i<n; i++){
+					template.parentNode.appendChild(template.cloneNode(true));
+				}
+			});
+
+			// clone the day label and calendar day templates 6 times to make 7 columns
+			cloneClass(".dijitCalendarDayLabelTemplate", 6);
+			cloneClass(".dijitCalendarDateTemplate", 6);
+
+			// now make 6 week rows
+			cloneClass(".dijitCalendarWeekTemplate", 5);
+
+			// insert localized day names in the header
+			var dayNames = dojo.date.locale.getNames('days', this.dayWidth, 'standAlone', this.lang);
+			var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+			dojo.query(".dijitCalendarDayLabel", this.domNode).forEach(function(label, i){
+				this._setText(label, dayNames[(i + dayOffset) % 7]);
+			}, this);
+
+			// Fill in spacer element with all the month names (invisible) so that the maximum width will affect layout
+			var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
+			dojo.forEach(monthNames, function(name){
+				var monthSpacer = dojo.doc.createElement("div");
+				this._setText(monthSpacer, name);
+				this.monthLabelSpacer.appendChild(monthSpacer);
+			}, this);
+
+			this.value = null;
+			this.setValue(new Date());
+		},
+
+		_adjustDisplay: function(/*String*/part, /*int*/amount){
+			this.displayMonth = dojo.date.add(this.displayMonth, part, amount);
+			this._populateGrid();
+		},
+
+		_onDayClick: function(/*Event*/evt){
+			var node = evt.target;
+			dojo.stopEvent(evt);
+			while(!node.dijitDateValue){
+				node = node.parentNode;
+			}
+			if(!dojo.hasClass(node, "dijitCalendarDisabledDate")){
+				this.setValue(node.dijitDateValue);
+				this.onValueSelected(this.value);
+			}
+		},
+
+		onValueSelected: function(/*Date*/date){
+			// summary: a date cell was selected.  It may be the same as the previous value.
+		},
+
+		onChange: function(/*Date*/date){
+			// summary: called only when the selected date has changed
+		},
+
+		isDisabledDate: function(/*Date*/dateObject, /*String?*/locale){
+			// summary:
+			//	May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+/*=====
+			return false; // Boolean
+=====*/
+		},
+
+		getClassForDate: function(/*Date*/dateObject, /*String?*/locale){
+			// summary:
+			//  May be overridden to return CSS classes to associate with the date entry for the given dateObject,
+			//  for example to indicate a holiday in specified locale.
+
+/*=====
+			return ""; // String
+=====*/
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_Container.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_Container.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_Container.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,346 @@
+if(!dojo._hasResource["dijit._Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Container"] = true;
+dojo.provide("dijit._Container");
+
+dojo.declare("dijit._Contained",
+	null,
+	{
+		// summary
+		//		Mixin for widgets that are children of a container widget
+		//
+		// example:
+		// | 	// make a basic custom widget that knows about it's parents
+		// |	dojo.declare("my.customClass",[dijit._Widget,dijit._Contained],{});
+		// 
+		getParent: function(){
+			// summary:
+			//		Returns the parent widget of this widget, assuming the parent
+			//		implements dijit._Container
+			for(var p=this.domNode.parentNode; p; p=p.parentNode){
+				var id = p.getAttribute && p.getAttribute("widgetId");
+				if(id){
+					var parent = dijit.byId(id);
+					return parent.isContainer ? parent : null;
+				}
+			}
+			return null;
+		},
+
+		_getSibling: function(which){
+			var node = this.domNode;
+			do{
+				node = node[which+"Sibling"];
+			}while(node && node.nodeType != 1);
+			if(!node){ return null; } // null
+			var id = node.getAttribute("widgetId");
+			return dijit.byId(id);
+		},
+
+		getPreviousSibling: function(){
+			// summary:
+			//		Returns null if this is the first child of the parent,
+			//		otherwise returns the next element sibling to the "left".
+
+			return this._getSibling("previous"); // Mixed
+		},
+
+		getNextSibling: function(){
+			// summary:
+			//		Returns null if this is the last child of the parent,
+			//		otherwise returns the next element sibling to the "right".
+
+			return this._getSibling("next"); // Mixed
+		}
+	}
+);
+
+dojo.declare("dijit._Container",
+	null,
+	{
+		// summary:
+		//		Mixin for widgets that contain a list of children.
+		// description:
+		//		Use this mixin when the widget needs to know about and
+		//		keep track of it's widget children. Widgets like SplitContainer
+		//		and TabContainer.  
+
+		isContainer: true,
+
+		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+			// summary:
+			//		Process the given child widget, inserting it's dom node as
+			//		a child of our dom node
+
+			if(insertIndex === undefined){
+				insertIndex = "last";
+			}
+			var refNode = this.containerNode || this.domNode;
+			if(insertIndex && typeof insertIndex == "number"){
+				var children = dojo.query("> [widgetid]", refNode);
+				if(children && children.length >= insertIndex){
+					refNode = children[insertIndex-1]; insertIndex = "after";
+				}
+			}
+			dojo.place(widget.domNode, refNode, insertIndex);
+
+			// If I've been started but the child widget hasn't been started,
+			// start it now.  Make sure to do this after widget has been
+			// inserted into the DOM tree, so it can see that it's being controlled by me,
+			// so it doesn't try to size itself.
+			if(this._started && !widget._started){
+				widget.startup();
+			}
+		},
+
+		removeChild: function(/*Widget*/ widget){
+			// summary:
+			//		Removes the passed widget instance from this widget but does
+			//		not destroy it
+			var node = widget.domNode;
+			node.parentNode.removeChild(node);	// detach but don't destroy
+		},
+
+		_nextElement: function(node){
+			do{
+				node = node.nextSibling;
+			}while(node && node.nodeType != 1);
+			return node;
+		},
+
+		_firstElement: function(node){
+			node = node.firstChild;
+			if(node && node.nodeType != 1){
+				node = this._nextElement(node);
+			}
+			return node;
+		},
+
+		getChildren: function(){
+			// summary:
+			//		Returns array of children widgets
+			return dojo.query("> [widgetId]", this.containerNode || this.domNode).map(dijit.byNode); // Array
+		},
+
+		hasChildren: function(){
+			// summary:
+			//		Returns true if widget has children
+			var cn = this.containerNode || this.domNode;
+			return !!this._firstElement(cn); // Boolean
+		},
+
+		_getSiblingOfChild: function(/*Widget*/ child, /*int*/ dir){
+			// summary:
+			//		Get the next or previous widget sibling of child
+			// dir:
+			//		if 1, get the next sibling
+			//		if -1, get the previous sibling
+			var node = child.domNode;
+			var which = (dir>0 ? "nextSibling" : "previousSibling");
+			do{
+				node = node[which];
+			}while(node && (node.nodeType != 1 || !dijit.byNode(node)));
+			return node ? dijit.byNode(node) : null;
+		}
+	}
+);
+
+dojo.declare("dijit._KeyNavContainer",
+	[dijit._Container],
+	{
+
+		// summary: A _Container with keyboard navigation of its children.
+		// decscription:
+		//		To use this mixin, call connectKeyNavHandlers() in
+		//		postCreate() and call startupKeyNavChildren() in startup().
+		//		It provides normalized keyboard and focusing code for Container
+		//		widgets.
+/*=====
+		// focusedChild: Widget
+		//		The currently focused child widget, or null if there isn't one
+		focusedChild: null,
+=====*/
+
+		_keyNavCodes: {},
+
+		connectKeyNavHandlers: function(/*Array*/ prevKeyCodes, /*Array*/ nextKeyCodes){
+			// summary:
+			//		Call in postCreate() to attach the keyboard handlers
+			//		to the container.
+			// preKeyCodes: Array
+			//		Key codes for navigating to the previous child.
+			// nextKeyCodes: Array
+			//		Key codes for navigating to the next child.
+
+			var keyCodes = this._keyNavCodes = {};
+			var prev = dojo.hitch(this, this.focusPrev);
+			var next = dojo.hitch(this, this.focusNext);
+			dojo.forEach(prevKeyCodes, function(code){ keyCodes[code] = prev });
+			dojo.forEach(nextKeyCodes, function(code){ keyCodes[code] = next });
+			this.connect(this.domNode, "onkeypress", "_onContainerKeypress");
+			this.connect(this.domNode, "onfocus", "_onContainerFocus");
+		},
+
+		startupKeyNavChildren: function(){
+			// summary:
+			//		Call in startup() to set child tabindexes to -1
+			dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
+		},
+
+		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+			// summary: Add a child to our _Container
+			dijit._KeyNavContainer.superclass.addChild.apply(this, arguments);
+			this._startupChild(widget);
+		},
+
+		focus: function(){
+			// summary: Default focus() implementation: focus the first child.
+			this.focusFirstChild();
+		},
+
+		focusFirstChild: function(){
+			// summary: Focus the first focusable child in the container.
+			this.focusChild(this._getFirstFocusableChild());
+		},
+
+		focusNext: function(){
+			// summary: Focus the next widget or focal node (for widgets
+			//		with multiple focal nodes) within this container.
+			if(this.focusedChild && this.focusedChild.hasNextFocalNode
+					&& this.focusedChild.hasNextFocalNode()){
+				this.focusedChild.focusNext();
+				return;
+			}
+			var child = this._getNextFocusableChild(this.focusedChild, 1);
+			if(child.getFocalNodes){
+				this.focusChild(child, child.getFocalNodes()[0]);
+			}else{
+				this.focusChild(child);
+			}
+		},
+
+		focusPrev: function(){
+			// summary: Focus the previous widget or focal node (for widgets
+			//		with multiple focal nodes) within this container.
+			if(this.focusedChild && this.focusedChild.hasPrevFocalNode
+					&& this.focusedChild.hasPrevFocalNode()){
+				this.focusedChild.focusPrev();
+				return;
+			}
+			var child = this._getNextFocusableChild(this.focusedChild, -1);
+			if(child.getFocalNodes){
+				var nodes = child.getFocalNodes();
+				this.focusChild(child, nodes[nodes.length-1]);
+			}else{
+				this.focusChild(child);
+			}
+		},
+
+		focusChild: function(/*Widget*/ widget, /*Node?*/ node){
+			// summary: Focus widget. Optionally focus 'node' within widget.
+			if(widget){
+				if(this.focusedChild && widget !== this.focusedChild){
+					this._onChildBlur(this.focusedChild);
+				}
+				this.focusedChild = widget;
+				if(node && widget.focusFocalNode){
+					widget.focusFocalNode(node);
+				}else{
+					widget.focus();
+				}
+			}
+		},
+
+		_startupChild: function(/*Widget*/ widget){
+			// summary:
+			//		Set tabindex="-1" on focusable widgets so that we
+			// 		can focus them programmatically and by clicking.
+			//		Connect focus and blur handlers.
+			if(widget.getFocalNodes){
+				dojo.forEach(widget.getFocalNodes(), function(node){
+					dojo.attr(node, "tabindex", -1);
+					this._connectNode(node);
+				}, this);
+			}else{
+				var node = widget.focusNode || widget.domNode;
+				if(widget.isFocusable()){
+					dojo.attr(node, "tabindex", -1);
+				}
+				this._connectNode(node);
+			}
+		},
+
+		_connectNode: function(/*Element*/ node){
+			this.connect(node, "onfocus", "_onNodeFocus");
+			this.connect(node, "onblur", "_onNodeBlur");
+		},
+
+		_onContainerFocus: function(evt){
+			// focus bubbles on Firefox,
+			// so just make sure that focus has really gone to the container
+			if(evt.target === this.domNode){
+				this.focusFirstChild();
+			}
+		},
+
+		_onContainerKeypress: function(evt){
+			if(evt.ctrlKey || evt.altKey){ return; }
+			var func = this._keyNavCodes[evt.keyCode];
+			if(func){
+				func();
+				dojo.stopEvent(evt);
+			}
+		},
+
+		_onNodeFocus: function(evt){
+			// while focus is on a child,
+			// take the container out of the tab order so that
+			// we can shift-tab to the element before the container
+			dojo.attr(this.domNode, "tabindex", -1);
+			// record the child that has been focused
+			var widget = dijit.getEnclosingWidget(evt.target);
+			if(widget && widget.isFocusable()){
+				this.focusedChild = widget;
+			}
+			dojo.stopEvent(evt);
+		},
+
+		_onNodeBlur: function(evt){
+			// when focus leaves a child,
+			// reinstate the container's tabindex
+			if(this.tabIndex){
+				dojo.attr(this.domNode, "tabindex", this.tabIndex);
+			}
+			dojo.stopEvent(evt);
+		},
+
+		_onChildBlur: function(/*Widget*/ widget){
+			// summary:
+			//		Called when focus leaves a child widget to go
+			//		to a sibling widget.
+		},
+
+		_getFirstFocusableChild: function(){
+			return this._getNextFocusableChild(null, 1);
+		},
+
+		_getNextFocusableChild: function(child, dir){
+			if(child){
+				child = this._getSiblingOfChild(child, dir);
+			}
+			var children = this.getChildren();
+			for(var i=0; i < children.length; i++){
+				if(!child){
+					child = children[(dir>0) ? 0 : (children.length-1)];
+				}
+				if(child.isFocusable()){
+					return child;
+				}
+				child = this._getSiblingOfChild(child, dir);
+			}
+			// no focusable child found
+			return null;
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_Templated.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_Templated.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_Templated.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,329 @@
+if(!dojo._hasResource["dijit._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Templated"] = true;
+dojo.provide("dijit._Templated");
+
+dojo.require("dijit._Widget");
+dojo.require("dojo.string");
+dojo.require("dojo.parser");
+
+dojo.declare("dijit._Templated",
+	null,
+	{
+		//	summary:
+		//		Mixin for widgets that are instantiated from a template
+		// 
+		// templateNode: DomNode
+		//		a node that represents the widget template. Pre-empts both templateString and templatePath.
+		templateNode: null,
+
+		// templateString: String
+		//		a string that represents the widget template. Pre-empts the
+		//		templatePath. In builds that have their strings "interned", the
+		//		templatePath is converted to an inline templateString, thereby
+		//		preventing a synchronous network call.
+		templateString: null,
+
+		// templatePath: String
+		//	Path to template (HTML file) for this widget relative to dojo.baseUrl
+		templatePath: null,
+
+		// widgetsInTemplate: Boolean
+		//		should we parse the template to find widgets that might be
+		//		declared in markup inside it? false by default.
+		widgetsInTemplate: false,
+
+		// containerNode: DomNode
+		//		holds child elements. "containerNode" is generally set via a
+		//		dojoAttachPoint assignment and it designates where children of
+		//		the src dom node will be placed
+		containerNode: null,
+
+		// skipNodeCache: Boolean
+		//		if using a cached widget template node poses issues for a
+		//		particular widget class, it can set this property to ensure
+		//		that its template is always re-built from a string
+		_skipNodeCache: false,
+
+		_stringRepl: function(tmpl){
+			var className = this.declaredClass, _this = this;
+			// Cache contains a string because we need to do property replacement
+			// do the property replacement
+			return dojo.string.substitute(tmpl, this, function(value, key){
+				if(key.charAt(0) == '!'){ value = _this[key.substr(1)]; }
+				if(typeof value == "undefined"){ throw new Error(className+" template:"+key); } // a debugging aide
+				if(!value){ return ""; }
+
+				// Substitution keys beginning with ! will skip the transform step,
+				// in case a user wishes to insert unescaped markup, e.g. ${!foo}
+				return key.charAt(0) == "!" ? value :
+					// Safer substitution, see heading "Attribute values" in
+					// http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2
+					value.toString().replace(/"/g,"&quot;"); //TODO: add &amp? use encodeXML method?
+			}, this);
+		},
+
+		// method over-ride
+		buildRendering: function(){
+			// summary:
+			//		Construct the UI for this widget from a template, setting this.domNode.
+
+			// Lookup cached version of template, and download to cache if it
+			// isn't there already.  Returns either a DomNode or a string, depending on
+			// whether or not the template contains ${foo} replacement parameters.
+			var cached = dijit._Templated.getCachedTemplate(this.templatePath, this.templateString, this._skipNodeCache);
+
+			var node;
+			if(dojo.isString(cached)){
+				node = dijit._Templated._createNodesFromText(this._stringRepl(cached))[0];
+			}else{
+				// if it's a node, all we have to do is clone it
+				node = cached.cloneNode(true);
+			}
+
+			// recurse through the node, looking for, and attaching to, our
+			// attachment points which should be defined on the template node.
+			this._attachTemplateNodes(node);
+
+			var source = this.srcNodeRef;
+			if(source && source.parentNode){
+				source.parentNode.replaceChild(node, source);
+			}
+
+			this.domNode = node;
+			if(this.widgetsInTemplate){
+				var cw = this._supportingWidgets  = dojo.parser.parse(node);
+				this._attachTemplateNodes(cw, function(n,p){
+					return n[p];
+				});
+			}
+
+			this._fillContent(source);
+		},
+
+		_fillContent: function(/*DomNode*/ source){
+			// summary:
+			//		relocate source contents to templated container node
+			//		this.containerNode must be able to receive children, or exceptions will be thrown
+			var dest = this.containerNode;
+			if(source && dest){
+				while(source.hasChildNodes()){
+					dest.appendChild(source.firstChild);
+				}
+			}
+		},
+
+		_attachTemplateNodes: function(rootNode, getAttrFunc){
+			// summary: Iterate through the template and attach functions and nodes accordingly.	
+			// description:		
+			//		Map widget properties and functions to the handlers specified in
+			//		the dom node and it's descendants. This function iterates over all
+			//		nodes and looks for these properties:
+			//			* dojoAttachPoint
+			//			* dojoAttachEvent	
+			//			* waiRole
+			//			* waiState
+			// rootNode: DomNode|Array[Widgets]
+			//		the node to search for properties. All children will be searched.
+			// getAttrFunc: function?
+			//		a function which will be used to obtain property for a given
+			//		DomNode/Widget
+
+			getAttrFunc = getAttrFunc || function(n,p){ return n.getAttribute(p); };
+
+			var nodes = dojo.isArray(rootNode) ? rootNode : (rootNode.all || rootNode.getElementsByTagName("*"));
+			var x=dojo.isArray(rootNode)?0:-1;
+			for(; x<nodes.length; x++){
+				var baseNode = (x == -1) ? rootNode : nodes[x];
+				if(this.widgetsInTemplate && getAttrFunc(baseNode,'dojoType')){
+					continue;
+				}
+				// Process dojoAttachPoint
+				var attachPoint = getAttrFunc(baseNode, "dojoAttachPoint");
+				if(attachPoint){
+					var point, points = attachPoint.split(/\s*,\s*/);
+					while((point = points.shift())){
+						if(dojo.isArray(this[point])){
+							this[point].push(baseNode);
+						}else{
+							this[point]=baseNode;
+						}
+					}
+				}
+
+				// Process dojoAttachEvent
+				var attachEvent = getAttrFunc(baseNode, "dojoAttachEvent");
+				if(attachEvent){
+					// NOTE: we want to support attributes that have the form
+					// "domEvent: nativeEvent; ..."
+					var event, events = attachEvent.split(/\s*,\s*/);
+					var trim = dojo.trim;
+					while((event = events.shift())){
+						if(event){
+							var thisFunc = null;
+							if(event.indexOf(":") != -1){
+								// oh, if only JS had tuple assignment
+								var funcNameArr = event.split(":");
+								event = trim(funcNameArr[0]);
+								thisFunc = trim(funcNameArr[1]);
+							}else{
+								event = trim(event);
+							}
+							if(!thisFunc){
+								thisFunc = event;
+							}
+							this.connect(baseNode, event, thisFunc);
+						}
+					}
+				}
+
+				// waiRole, waiState
+				var role = getAttrFunc(baseNode, "waiRole");
+				if(role){
+					dijit.setWaiRole(baseNode, role);
+				}
+				var values = getAttrFunc(baseNode, "waiState");
+				if(values){
+					dojo.forEach(values.split(/\s*,\s*/), function(stateValue){
+						if(stateValue.indexOf('-') != -1){
+							var pair = stateValue.split('-');
+							dijit.setWaiState(baseNode, pair[0], pair[1]);
+						}
+					});
+				}
+
+			}
+		}
+	}
+);
+
+// key is either templatePath or templateString; object is either string or DOM tree
+dijit._Templated._templateCache = {};
+
+dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwaysUseString){
+	// summary:
+	//		Static method to get a template based on the templatePath or
+	//		templateString key
+	// templatePath: String
+	//		The URL to get the template from. dojo.uri.Uri is often passed as well.
+	// templateString: String?
+	//		a string to use in lieu of fetching the template from a URL. Takes precedence
+	//		over templatePath
+	// Returns: Mixed
+	//	Either string (if there are ${} variables that need to be replaced) or just
+	//	a DOM tree (if the node can be cloned directly)
+
+	// is it already cached?
+	var tmplts = dijit._Templated._templateCache;
+	var key = templateString || templatePath;
+	var cached = tmplts[key];
+	if(cached){
+		return cached;
+	}
+
+	// If necessary, load template string from template path
+	if(!templateString){
+		templateString = dijit._Templated._sanitizeTemplateString(dojo._getText(templatePath));
+	}
+
+	templateString = dojo.string.trim(templateString);
+
+	if(alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g)){
+		// there are variables in the template so all we can do is cache the string
+		return (tmplts[key] = templateString); //String
+	}else{
+		// there are no variables in the template so we can cache the DOM tree
+		return (tmplts[key] = dijit._Templated._createNodesFromText(templateString)[0]); //Node
+	}
+};
+
+dijit._Templated._sanitizeTemplateString = function(/*String*/tString){
+	// summary: 
+	//		Strips <?xml ...?> declarations so that external SVG and XML
+	// 		documents can be added to a document without worry. Also, if the string
+	//		is an HTML document, only the part inside the body tag is returned.
+	if(tString){
+		tString = tString.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+		var matches = tString.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+		if(matches){
+			tString = matches[1];
+		}
+	}else{
+		tString = "";
+	}
+	return tString; //String
+};
+
+
+if(dojo.isIE){
+	dojo.addOnUnload(function(){
+		var cache = dijit._Templated._templateCache;
+		for(var key in cache){
+			var value = cache[key];
+			if(!isNaN(value.nodeType)){ // isNode equivalent
+				dojo._destroyElement(value);
+			}
+			delete cache[key];
+		}
+	});
+}
+
+(function(){
+	var tagMap = {
+		cell: {re: /^<t[dh][\s\r\n>]/i, pre: "<table><tbody><tr>", post: "</tr></tbody></table>"},
+		row: {re: /^<tr[\s\r\n>]/i, pre: "<table><tbody>", post: "</tbody></table>"},
+		section: {re: /^<(thead|tbody|tfoot)[\s\r\n>]/i, pre: "<table>", post: "</table>"}
+	};
+
+	// dummy container node used temporarily to hold nodes being created
+	var tn;
+
+	dijit._Templated._createNodesFromText = function(/*String*/text){
+		// summary:
+		//	Attempts to create a set of nodes based on the structure of the passed text.
+
+		if(!tn){
+			tn = dojo.doc.createElement("div");
+			tn.style.display="none";
+			dojo.body().appendChild(tn);
+		}
+		var tableType = "none";
+		var rtext = text.replace(/^\s+/, "");
+		for(var type in tagMap){
+			var map = tagMap[type];
+			if(map.re.test(rtext)){
+				tableType = type;
+				text = map.pre + text + map.post;
+				break;
+			}
+		}
+
+		tn.innerHTML = text;
+		if(tn.normalize){
+			tn.normalize();
+		}
+
+		var tag = { cell: "tr", row: "tbody", section: "table" }[tableType];
+		var _parent = (typeof tag != "undefined") ?
+						tn.getElementsByTagName(tag)[0] :
+						tn;
+
+		var nodes = [];
+		while(_parent.firstChild){
+			nodes.push(_parent.removeChild(_parent.firstChild));
+		}
+		tn.innerHTML="";
+		return nodes;	//	Array
+	}
+})();
+
+// These arguments can be specified for widgets which are used in templates.
+// Since any widget can be specified as sub widgets in template, mix it
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget,{
+	dojoAttachEvent: "",
+	dojoAttachPoint: "",
+	waiRole: "",
+	waiState:""
+})
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_TimePicker.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_TimePicker.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_TimePicker.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,249 @@
+if(!dojo._hasResource["dijit._TimePicker"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._TimePicker"] = true;
+dojo.provide("dijit._TimePicker");
+
+dojo.require("dijit.form._FormWidget");
+dojo.require("dojo.date.locale");
+
+/*=====
+dojo.declare(
+	"dijit._TimePicker.__Constraints",
+	[dojo.date.locale.__FormatOptions],
+	{
+		// clickableIncrement: String
+		//		see dijit._TimePicker.clickableIncrement
+		clickableIncrement: "T00:15:00",
+
+		// visibleIncrement: String
+		//		see dijit._TimePicker.visibleIncrement
+		visibleIncrement: "T01:00:00",
+
+		// visibleRange: String
+		//		see dijit._TimePicker.visibleRange
+		visibleRange: "T05:00:00"
+	}
+);
+=====*/
+
+dojo.declare("dijit._TimePicker",
+	[dijit._Widget, dijit._Templated],
+	{
+		//	summary:
+		//		A graphical time picker.
+		//		This widget is used internally by other widgets and is not accessible
+		//		as a standalone widget.
+
+		templateString:"<div id=\"widget_${id}\" class=\"dijitMenu\"\n    ><div dojoAttachPoint=\"upArrow\" class=\"dijitButtonNode\"><span class=\"dijitTimePickerA11yText\">&#9650;</span></div\n    ><div dojoAttachPoint=\"timeMenu,focusNode\" dojoAttachEvent=\"onclick:_onOptionSelected,onmouseover,onmouseout\"></div\n    ><div dojoAttachPoint=\"downArrow\" class=\"dijitButtonNode\"><span class=\"dijitTimePickerA11yText\">&#9660;</span></div\n></div>\n",
+		baseClass: "dijitTimePicker",
+
+		// clickableIncrement: String
+		//		ISO-8601 string representing the amount by which
+		//		every clickable element in the time picker increases.
+		//		Set in local time, without a time zone.
+		//		Example: `T00:15:00` creates 15 minute increments
+		//		Must divide dijit._TimePicker.visibleIncrement evenly
+		clickableIncrement: "T00:15:00",
+
+		// visibleIncrement: String
+		//		ISO-8601 string representing the amount by which
+		//		every element with a visible time in the time picker increases.
+		//		Set in local time, without a time zone.
+		//		Example: `T01:00:00` creates text in every 1 hour increment
+		visibleIncrement: "T01:00:00",
+
+		// visibleRange: String
+		//		ISO-8601 string representing the range of this TimePicker.
+		//		The TimePicker will only display times in this range.
+		//		Example: `T05:00:00` displays 5 hours of options
+		visibleRange: "T05:00:00",
+
+		// value: String
+		//		Date to display.
+		//		Defaults to current time and date.
+		//		Can be a Date object or an ISO-8601 string.
+		//		If you specify the GMT time zone (`-01:00`),
+		//		the time will be converted to the local time in the local time zone.
+		//		Otherwise, the time is considered to be in the local time zone.
+		//		If you specify the date and isDate is true, the date is used.
+		//		Example: if your local time zone is `GMT -05:00`,
+		//		`T10:00:00` becomes `T10:00:00-05:00` (considered to be local time),
+		//		`T10:00:00-01:00` becomes `T06:00:00-05:00` (4 hour difference),
+		//		`T10:00:00Z` becomes `T05:00:00-05:00` (5 hour difference between Zulu and local time)
+		//		`yyyy-mm-ddThh:mm:ss` is the format to set the date and time
+		//		Example: `2007-06-01T09:00:00`
+		value: new Date(),
+
+		_visibleIncrement:2,
+		_clickableIncrement:1,
+		_totalIncrements:10,
+
+		// constraints: dijit._TimePicker.__Constraints 
+		constraints:{},
+
+		serialize: dojo.date.stamp.toISOString,
+
+//TODOC: what is priority?
+		setValue:function(/*Date*/ date, /*Boolean*/ priority){
+			// summary:
+			//	Set the value of the TimePicker
+			//	Redraws the TimePicker around the new date
+
+			//dijit._TimePicker.superclass.setValue.apply(this, arguments);
+			this.value=date;
+			this._showText();
+		},
+
+		isDisabledDate: function(/*Date*/dateObject, /*String?*/locale){
+			// summary:
+			//	May be overridden to disable certain dates in the TimePicker e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+			return false; // Boolean
+		},
+
+		_showText:function(){
+			this.timeMenu.innerHTML = "";
+			var fromIso = dojo.date.stamp.fromISOString;
+			this._clickableIncrementDate=fromIso(this.clickableIncrement);
+			this._visibleIncrementDate=fromIso(this.visibleIncrement);
+			this._visibleRangeDate=fromIso(this.visibleRange);
+			// get the value of the increments and the range in seconds (since 00:00:00) to find out how many divs to create
+			var sinceMidnight = function(/*Date*/ date){
+				return date.getHours() * 60 * 60 + date.getMinutes() * 60 + date.getSeconds();
+			};
+
+			var clickableIncrementSeconds = sinceMidnight(this._clickableIncrementDate);
+			var visibleIncrementSeconds = sinceMidnight(this._visibleIncrementDate);
+			var visibleRangeSeconds = sinceMidnight(this._visibleRangeDate);
+
+			// round reference date to previous visible increment
+			var time = this.value.getTime();
+			this._refDate = new Date(time - time % (visibleIncrementSeconds*1000));
+			this._refDate.setFullYear(1970,0,1); // match parse defaults
+
+			// assume clickable increment is the smallest unit
+			this._clickableIncrement = 1;
+			// divide the visible range by the clickable increment to get the number of divs to create
+			// example: 10:00:00/00:15:00 -> display 40 divs
+			this._totalIncrements = visibleRangeSeconds / clickableIncrementSeconds;
+			// divide the visible increments by the clickable increments to get how often to display the time inline
+			// example: 01:00:00/00:15:00 -> display the time every 4 divs
+			this._visibleIncrement = visibleIncrementSeconds / clickableIncrementSeconds;
+			for(var i = -(this._totalIncrements >> 1); i < (this._totalIncrements >> 1); i += this._clickableIncrement){
+				this.timeMenu.appendChild(this._createOption(i));
+			}
+			
+			// TODO:
+			// I commented this out because it
+			// causes problems for a TimeTextBox in a Dialog, or as the editor of an InlineEditBox,
+			// because the timeMenu node isn't visible yet. -- Bill (Bug #????)
+			// dijit.focus(this.timeMenu);
+		},
+
+		postCreate:function(){
+			// instantiate constraints
+			if(this.constraints===dijit._TimePicker.prototype.constraints){
+				this.constraints={};
+			}
+
+			// brings in visibleRange, increments, etc.
+			dojo.mixin(this, this.constraints);
+
+			// dojo.date.locale needs the lang in the constraints as locale
+			if(!this.constraints.locale){
+				this.constraints.locale=this.lang;
+			}
+
+			// assign typematic mouse listeners to the arrow buttons
+			this.connect(this.timeMenu, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+			var typematic = dijit.typematic.addMouseListener;
+			typematic(this.upArrow,this,this._onArrowUp, 0.8, 500);
+			typematic(this.downArrow,this,this._onArrowDown, 0.8, 500);
+			//dijit.typematic.addListener(this.upArrow,this.timeMenu, {keyCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_onArrowUp", 0.8, 500);
+			//dijit.typematic.addListener(this.downArrow, this.timeMenu, {keyCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_onArrowDown", 0.8,500);
+
+			this.inherited(arguments);
+			this.setValue(this.value);
+		},
+
+		_createOption:function(/*Number*/ index){
+			// summary: creates a clickable time option
+			var div = dojo.doc.createElement("div");
+			var date = (div.date = new Date(this._refDate));
+			div.index = index;
+			var incrementDate = this._clickableIncrementDate;
+			date.setHours(date.getHours() + incrementDate.getHours() * index,
+				date.getMinutes() + incrementDate.getMinutes() * index,
+				date.getSeconds() + incrementDate.getSeconds() * index);
+
+			var innerDiv = dojo.doc.createElement('div');
+			dojo.addClass(div,this.baseClass+"Item");
+			dojo.addClass(innerDiv,this.baseClass+"ItemInner");
+			innerDiv.innerHTML = dojo.date.locale.format(date, this.constraints);				
+			div.appendChild(innerDiv);
+
+			if(index%this._visibleIncrement<1 && index%this._visibleIncrement>-1){
+				dojo.addClass(div, this.baseClass+"Marker");
+			}else if(!(index%this._clickableIncrement)){
+				dojo.addClass(div, this.baseClass+"Tick");
+			}
+						
+			if(this.isDisabledDate(date)){
+				// set disabled
+				dojo.addClass(div, this.baseClass+"ItemDisabled");
+			}
+			if(!dojo.date.compare(this.value, date, this.constraints.selector)){
+				div.selected = true;
+				dojo.addClass(div, this.baseClass+"ItemSelected");
+			}
+			return div;
+		},
+
+		_onOptionSelected:function(/*Object*/ tgt){
+			var tdate = tgt.target.date || tgt.target.parentNode.date;			
+			if(!tdate || this.isDisabledDate(tdate)){ return; }
+			this.setValue(tdate);
+			this.onValueSelected(tdate);
+		},
+
+		onValueSelected:function(value){
+		},
+
+		onmouseover:function(/*Event*/ e){
+			var tgr = (e.target.parentNode === this.timeMenu) ? e.target : e.target.parentNode;			
+			this._highlighted_option=tgr;
+			dojo.addClass(tgr, this.baseClass+"ItemHover");
+		},
+
+		onmouseout:function(/*Event*/ e){
+			var tgr = (e.target.parentNode === this.timeMenu) ? e.target : e.target.parentNode;
+			if(this._highlighted_option===tgr){			
+				dojo.removeClass(tgr, this.baseClass+"ItemHover");
+			}
+		},
+
+		_mouseWheeled:function(/*Event*/e){
+			// summary: handle the mouse wheel listener
+			dojo.stopEvent(e);
+			// we're not _measuring_ the scroll amount, just direction
+			var scrollAmount = (dojo.isIE ? e.wheelDelta : -e.detail);
+			this[(scrollAmount>0 ? "_onArrowUp" : "_onArrowDown")](); // yes, we're making a new dom node every time you mousewheel, or click
+		},
+
+		_onArrowUp:function(){
+			// summary: remove the bottom time and add one to the top
+			var index = this.timeMenu.childNodes[0].index - 1;
+			var div = this._createOption(index);
+			this.timeMenu.removeChild(this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1]);
+			this.timeMenu.insertBefore(div, this.timeMenu.childNodes[0]);
+		},
+
+		_onArrowDown:function(){
+			// summary: remove the top time and add one to the bottom
+			var index = this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1].index + 1;
+			var div = this._createOption(index);
+			this.timeMenu.removeChild(this.timeMenu.childNodes[0]);
+			this.timeMenu.appendChild(div);
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_Widget.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_Widget.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_Widget.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,407 @@
+if(!dojo._hasResource["dijit._Widget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Widget"] = true;
+dojo.provide("dijit._Widget");
+
+dojo.require( "dijit._base" );
+
+dojo.declare("dijit._Widget", null, {
+	//	summary:
+	//		The foundation of dijit widgets. 	
+	//
+	//	id: String
+	//		a unique, opaque ID string that can be assigned by users or by the
+	//		system. If the developer passes an ID which is known not to be
+	//		unique, the specified ID is ignored and the system-generated ID is
+	//		used instead.
+	id: "",
+
+	//	lang: String
+	//		Rarely used.  Overrides the default Dojo locale used to render this widget,
+	//		as defined by the [HTML LANG](http://www.w3.org/TR/html401/struct/dirlang.html#adef-lang) attribute.
+	//		Value must be among the list of locales specified during by the Dojo bootstrap,
+	//		formatted according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt) (like en-us).
+	lang: "",
+
+	//	dir: String
+	//		Unsupported by Dijit, but here for completeness.  Dijit only supports setting text direction on the
+	//		entire document.
+	//		Bi-directional support, as defined by the [HTML DIR](http://www.w3.org/TR/html401/struct/dirlang.html#adef-dir)
+	//		attribute. Either left-to-right "ltr" or right-to-left "rtl".
+	dir: "",
+
+	// class: String
+	//		HTML class attribute
+	"class": "",
+
+	// style: String
+	//		HTML style attribute
+	style: "",
+
+	// title: String
+	//		HTML title attribute
+	title: "",
+
+	// srcNodeRef: DomNode
+	//		pointer to original dom node
+	srcNodeRef: null,
+
+	// domNode: DomNode
+	//		this is our visible representation of the widget! Other DOM
+	//		Nodes may by assigned to other properties, usually through the
+	//		template system's dojoAttachPonit syntax, but the domNode
+	//		property is the canonical "top level" node in widget UI.
+	domNode: null,
+
+	// attributeMap: Object
+	//		A map of attributes and attachpoints -- typically standard HTML attributes -- to set
+	//		on the widget's dom, at the "domNode" attach point, by default.
+	//		Other node references can be specified as properties of 'this'
+	attributeMap: {id:"", dir:"", lang:"", "class":"", style:"", title:""},  // TODO: add on* handlers?
+
+	//////////// INITIALIZATION METHODS ///////////////////////////////////////
+//TODOC: params and srcNodeRef need docs.  Is srcNodeRef optional?
+//TODOC: summary needed for postscript
+	postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+		this.create(params, srcNodeRef);
+	},
+
+	create: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+		//	summary:
+		//		Kick off the life-cycle of a widget
+		//	description:
+		//		To understand the process by which widgets are instantiated, it
+		//		is critical to understand what other methods create calls and
+		//		which of them you'll want to override. Of course, adventurous
+		//		developers could override create entirely, but this should
+		//		only be done as a last resort.
+		//
+		//		Below is a list of the methods that are called, in the order
+		//		they are fired, along with notes about what they do and if/when
+		//		you should over-ride them in your widget:
+		//
+		// * postMixInProperties:
+		//	|	* a stub function that you can over-ride to modify
+		//		variables that may have been naively assigned by
+		//		mixInProperties
+		// * widget is added to manager object here
+		// * buildRendering:
+		//	|	* Subclasses use this method to handle all UI initialization
+		//		Sets this.domNode.  Templated widgets do this automatically
+		//		and otherwise it just uses the source dom node.
+		// * postCreate:
+		//	|	* a stub function that you can over-ride to modify take
+		//		actions once the widget has been placed in the UI
+
+		// store pointer to original dom tree
+		this.srcNodeRef = dojo.byId(srcNodeRef);
+
+		// For garbage collection.  An array of handles returned by Widget.connect()
+		// Each handle returned from Widget.connect() is an array of handles from dojo.connect()
+		this._connects=[];
+
+		// _attaches: String[]
+		// 		names of all our dojoAttachPoint variables
+		this._attaches=[];
+
+		//mixin our passed parameters
+		if(this.srcNodeRef && (typeof this.srcNodeRef.id == "string")){ this.id = this.srcNodeRef.id; }
+		if(params){
+			this.params = params;
+			dojo.mixin(this,params);
+		}
+		this.postMixInProperties();
+
+		// generate an id for the widget if one wasn't specified
+		// (be sure to do this before buildRendering() because that function might
+		// expect the id to be there.
+		if(!this.id){
+			this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+		}
+		dijit.registry.add(this);
+
+		this.buildRendering();
+
+		// Copy attributes listed in attributeMap into the [newly created] DOM for the widget.
+		// The placement of these attributes is according to the property mapping in attributeMap.
+		// Note special handling for 'style' and 'class' attributes which are lists and can
+		// have elements from both old and new structures, and some attributes like "type"
+		// cannot be processed this way as they are not mutable.
+		if(this.domNode){
+			for(var attr in this.attributeMap){
+				var value = this[attr];
+				if(typeof value != "object" && ((value !== "" && value !== false) || (params && params[attr]))){
+					this.setAttribute(attr, value);
+				}
+			}
+		}
+
+		if(this.domNode){
+			this.domNode.setAttribute("widgetId", this.id);
+		}
+		this.postCreate();
+
+		// If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC.
+		if(this.srcNodeRef && !this.srcNodeRef.parentNode){
+			delete this.srcNodeRef;
+		}	
+	},
+
+	postMixInProperties: function(){
+		// summary
+		//	Called after the parameters to the widget have been read-in,
+		//	but before the widget template is instantiated.
+		//	Especially useful to set properties that are referenced in the widget template.
+	},
+
+	buildRendering: function(){
+		// summary:
+		//		Construct the UI for this widget, setting this.domNode.
+		//		Most widgets will mixin TemplatedWidget, which overrides this method.
+		this.domNode = this.srcNodeRef || dojo.doc.createElement('div');
+	},
+
+	postCreate: function(){
+		// summary:
+		//		Called after a widget's dom has been setup
+	},
+
+	startup: function(){
+		// summary:
+		//		Called after a widget's children, and other widgets on the page, have been created.
+		//		Provides an opportunity to manipulate any children before they are displayed.
+		//		This is useful for composite widgets that need to control or layout sub-widgets.
+		//		Many layout widgets can use this as a wiring phase.
+		this._started = true;
+	},
+
+	//////////// DESTROY FUNCTIONS ////////////////////////////////
+
+	destroyRecursive: function(/*Boolean*/ finalize){
+		// summary:
+		// 		Destroy this widget and it's descendants. This is the generic
+		// 		"destructor" function that all widget users should call to
+		// 		cleanly discard with a widget. Once a widget is destroyed, it's
+		// 		removed from the manager object.
+		// finalize: Boolean
+		//		is this function being called part of global environment
+		//		tear-down?
+
+		this.destroyDescendants();
+		this.destroy();
+	},
+
+	destroy: function(/*Boolean*/ finalize){
+		// summary:
+		// 		Destroy this widget, but not its descendants
+		// finalize: Boolean
+		//		is this function being called part of global environment
+		//		tear-down?
+
+		this.uninitialize();
+		dojo.forEach(this._connects, function(array){
+			dojo.forEach(array, dojo.disconnect);
+		});
+
+		// destroy widgets created as part of template, etc.
+		dojo.forEach(this._supportingWidgets || [], function(w){ w.destroy(); });
+		
+		this.destroyRendering(finalize);
+		dijit.registry.remove(this.id);
+	},
+
+	destroyRendering: function(/*Boolean*/ finalize){
+		// summary:
+		//		Destroys the DOM nodes associated with this widget
+		// finalize: Boolean
+		//		is this function being called part of global environment
+		//		tear-down?
+
+		if(this.bgIframe){
+			this.bgIframe.destroy();
+			delete this.bgIframe;
+		}
+
+		if(this.domNode){
+			dojo._destroyElement(this.domNode);
+			delete this.domNode;
+		}
+
+		if(this.srcNodeRef){
+			dojo._destroyElement(this.srcNodeRef);
+			delete this.srcNodeRef;
+		}
+	},
+
+	destroyDescendants: function(){
+		// summary:
+		//		Recursively destroy the children of this widget and their
+		//		descendants.
+
+		// TODO: should I destroy in the reverse order, to go bottom up?
+		dojo.forEach(this.getDescendants(), function(widget){ widget.destroy(); });
+	},
+
+	uninitialize: function(){
+		// summary:
+		//		stub function. Override to implement custom widget tear-down
+		//		behavior.
+		return false;
+	},
+
+	////////////////// MISCELLANEOUS METHODS ///////////////////
+
+	onFocus: function(){
+		// summary:
+		//		stub function. Override or connect to this method to receive
+		//		notifications for when the widget moves into focus.
+	},
+
+	onBlur: function(){
+		// summary:
+		//		stub function. Override or connect to this method to receive
+		//		notifications for when the widget moves out of focus.
+	},
+
+	_onFocus: function(e){
+		this.onFocus();
+	},
+
+	_onBlur: function(){
+		this.onBlur();
+	},
+
+	setAttribute: function(/*String*/ attr, /*anything*/ value){
+		// summary
+		//		Set native HTML attributes reflected in the widget,
+		//		such as readOnly, disabled, and maxLength in TextBox widgets.
+		// description
+		//		In general, a widget's "value" is controlled via setValue()/getValue(), 
+		//		rather than this method.  The exception is for widgets where the
+		//		end user can't adjust the value, such as Button and CheckBox;
+		//		in the unusual case that you want to change the value attribute of
+		//		those widgets, use setAttribute().
+		var mapNode = this[this.attributeMap[attr]||'domNode'];
+		this[attr] = value;
+		switch(attr){
+			case "class":
+				dojo.addClass(mapNode, value);
+				break;
+			case "style":
+				if(mapNode.style.cssText){
+					mapNode.style.cssText += "; " + value;// FIXME: Opera
+				}else{
+					mapNode.style.cssText = value;
+				}
+				break;
+			default:
+				if(/^on[A-Z]/.test(attr)){ // eg. onSubmit needs to be onsubmit
+					attr = attr.toLowerCase();
+				}
+				if(typeof value == "function"){ // functions execute in the context of the widget
+					value = dojo.hitch(this, value);
+				}
+				dojo.attr(mapNode, attr, value);
+		}
+	},
+
+	toString: function(){
+		// summary:
+		//		returns a string that represents the widget. When a widget is
+		//		cast to a string, this method will be used to generate the
+		//		output. Currently, it does not implement any sort of reversable
+		//		serialization.
+		return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String
+	},
+
+	getDescendants: function(){
+		// summary:
+		//	Returns all the widgets that contained by this, i.e., all widgets underneath this.containerNode.
+		if(this.containerNode){
+			var list= dojo.query('[widgetId]', this.containerNode);
+			return list.map(dijit.byNode);		// Array
+		}else{
+			return [];
+		}
+	},
+
+//TODOC
+	nodesWithKeyClick: ["input", "button"],
+
+	connect: function(
+			/*Object|null*/ obj,
+			/*String*/ event,
+			/*String|Function*/ method){
+		//	summary:
+		//		Connects specified obj/event to specified method of this object
+		//		and registers for disconnect() on widget destroy.
+		//		Special event: "ondijitclick" triggers on a click or enter-down or space-up
+		//		Similar to dojo.connect() but takes three arguments rather than four.
+		var handles =[];
+		if(event == "ondijitclick"){
+			// add key based click activation for unsupported nodes.
+			if(!this.nodesWithKeyClick[obj.nodeName]){
+				handles.push(dojo.connect(obj, "onkeydown", this,
+					function(e){
+						if(e.keyCode == dojo.keys.ENTER){
+							return (dojo.isString(method))?
+								this[method](e) : method.call(this, e);
+						}else if(e.keyCode == dojo.keys.SPACE){
+							// stop space down as it causes IE to scroll
+							// the browser window
+							dojo.stopEvent(e);
+						}
+			 		}));
+				handles.push(dojo.connect(obj, "onkeyup", this,
+					function(e){
+						if(e.keyCode == dojo.keys.SPACE){
+							return dojo.isString(method) ?
+								this[method](e) : method.call(this, e);
+						}
+			 		}));
+			}
+			event = "onclick";
+		}
+		handles.push(dojo.connect(obj, event, this, method));
+
+		// return handles for FormElement and ComboBox
+		this._connects.push(handles);
+		return handles;
+	},
+
+	disconnect: function(/*Object*/ handles){
+		// summary:
+		//		Disconnects handle created by this.connect.
+		//		Also removes handle from this widget's list of connects
+		for(var i=0; i<this._connects.length; i++){
+			if(this._connects[i]==handles){
+				dojo.forEach(handles, dojo.disconnect);
+				this._connects.splice(i, 1);
+				return;
+			}
+		}
+	},
+
+	isLeftToRight: function(){
+		// summary:
+		//		Checks the DOM to for the text direction for bi-directional support
+		// description:
+		//		This method cannot be used during widget construction because the widget
+		//		must first be connected to the DOM tree.  Parent nodes are searched for the
+		//		'dir' attribute until one is found, otherwise left to right mode is assumed.
+		//		See HTML spec, DIR attribute for more information.
+
+		if(!("_ltr" in this)){
+			this._ltr = dojo.getComputedStyle(this.domNode).direction != "rtl";
+		}
+		return this._ltr; //Boolean
+	},
+
+	isFocusable: function(){
+		// summary:
+		//		Return true if this widget can currently be focused
+		//		and false if not
+		return this.focus && (dojo.style(this.domNode, "display") != "none");
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/bidi.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/bidi.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/bidi.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,13 @@
+if(!dojo._hasResource["dijit._base.bidi"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.bidi"] = true;
+dojo.provide("dijit._base.bidi");
+
+// summary: applies a class to the top of the document for right-to-left stylesheet rules
+
+dojo.addOnLoad(function(){
+	if(!dojo._isBodyLtr()){
+		dojo.addClass(dojo.body(), "dijitRtl");
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/focus.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/focus.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/focus.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,342 @@
+if(!dojo._hasResource["dijit._base.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.focus"] = true;
+dojo.provide("dijit._base.focus");
+
+// summary:
+//		These functions are used to query or set the focus and selection.
+//
+//		Also, they trace when widgets become actived/deactivated,
+//		so that the widget can fire _onFocus/_onBlur events.
+//		"Active" here means something similar to "focused", but
+//		"focus" isn't quite the right word because we keep track of
+//		a whole stack of "active" widgets.  Example:  Combobutton --> Menu -->
+//		MenuItem.   The onBlur event for Combobutton doesn't fire due to focusing
+//		on the Menu or a MenuItem, since they are considered part of the
+//		Combobutton widget.  It only happens when focus is shifted
+//		somewhere completely different.
+
+dojo.mixin(dijit,
+{
+	// _curFocus: DomNode
+	//		Currently focused item on screen
+	_curFocus: null,
+
+	// _prevFocus: DomNode
+	//		Previously focused item on screen
+	_prevFocus: null,
+
+	isCollapsed: function(){
+		// summary: tests whether the current selection is empty
+		var _window = dojo.global;
+		var _document = dojo.doc;
+		if(_document.selection){ // IE
+			return !_document.selection.createRange().text; // Boolean
+		}else{
+			var selection = _window.getSelection();
+			if(dojo.isString(selection)){ // Safari
+				return !selection; // Boolean
+			}else{ // Mozilla/W3
+				return selection.isCollapsed || !selection.toString(); // Boolean
+			}
+		}
+	},
+
+	getBookmark: function(){
+		// summary: Retrieves a bookmark that can be used with moveToBookmark to return to the same range
+		var bookmark, selection = dojo.doc.selection;
+		if(selection){ // IE
+			var range = selection.createRange();
+			if(selection.type.toUpperCase()=='CONTROL'){
+				if(range.length){
+					bookmark=[];
+					var i=0,len=range.length;
+					while(i<len){
+						bookmark.push(range.item(i++));
+					}
+				}else{
+					bookmark=null;
+				}
+			}else{
+				bookmark = range.getBookmark();
+			}
+		}else{
+			if(window.getSelection){
+				selection = dojo.global.getSelection();
+				if(selection){
+					range = selection.getRangeAt(0);
+					bookmark = range.cloneRange();
+				}
+			}else{
+				console.warn("No idea how to store the current selection for this browser!");
+			}
+		}
+		return bookmark; // Array
+	},
+
+	moveToBookmark: function(/*Object*/bookmark){
+		// summary: Moves current selection to a bookmark
+		// bookmark: This should be a returned object from dojo.html.selection.getBookmark()
+		var _document = dojo.doc;
+		if(_document.selection){ // IE
+			var range;
+			if(dojo.isArray(bookmark)){
+				range = _document.body.createControlRange();
+				dojo.forEach(bookmark, "range.addElement(item)"); //range.addElement does not have call/apply method, so can not call it directly
+			}else{
+				range = _document.selection.createRange();
+				range.moveToBookmark(bookmark);
+			}
+			range.select();
+		}else{ //Moz/W3C
+			var selection = dojo.global.getSelection && dojo.global.getSelection();
+			if(selection && selection.removeAllRanges){
+				selection.removeAllRanges();
+				selection.addRange(bookmark);
+			}else{
+				console.warn("No idea how to restore selection for this browser!");
+			}
+		}
+	},
+
+	getFocus: function(/*Widget?*/menu, /*Window?*/openedForWindow){
+		// summary:
+		//	Returns the current focus and selection.
+		//	Called when a popup appears (either a top level menu or a dialog),
+		//	or when a toolbar/menubar receives focus
+		//
+		// menu:
+		//	The menu that's being opened
+		//
+		// openedForWindow:
+		//	iframe in which menu was opened
+		//
+		// returns:
+		//	A handle to restore focus/selection
+
+		return {
+			// Node to return focus to
+			node: menu && dojo.isDescendant(dijit._curFocus, menu.domNode) ? dijit._prevFocus : dijit._curFocus,
+
+			// Previously selected text
+			bookmark:
+				!dojo.withGlobal(openedForWindow||dojo.global, dijit.isCollapsed) ?
+				dojo.withGlobal(openedForWindow||dojo.global, dijit.getBookmark) :
+				null,
+
+			openedForWindow: openedForWindow
+		}; // Object
+	},
+
+	focus: function(/*Object || DomNode */ handle){
+		// summary:
+		//		Sets the focused node and the selection according to argument.
+		//		To set focus to an iframe's content, pass in the iframe itself.
+		// handle:
+		//		object returned by get(), or a DomNode
+
+		if(!handle){ return; }
+
+		var node = "node" in handle ? handle.node : handle,		// because handle is either DomNode or a composite object
+			bookmark = handle.bookmark,
+			openedForWindow = handle.openedForWindow;
+
+		// Set the focus
+		// Note that for iframe's we need to use the <iframe> to follow the parentNode chain,
+		// but we need to set focus to iframe.contentWindow
+		if(node){
+			var focusNode = (node.tagName.toLowerCase()=="iframe") ? node.contentWindow : node;
+			if(focusNode && focusNode.focus){
+				try{
+					// Gecko throws sometimes if setting focus is impossible,
+					// node not displayed or something like that
+					focusNode.focus();
+				}catch(e){/*quiet*/}
+			}			
+			dijit._onFocusNode(node);
+		}
+
+		// set the selection
+		// do not need to restore if current selection is not empty
+		// (use keyboard to select a menu item)
+		if(bookmark && dojo.withGlobal(openedForWindow||dojo.global, dijit.isCollapsed)){
+			if(openedForWindow){
+				openedForWindow.focus();
+			}
+			try{
+				dojo.withGlobal(openedForWindow||dojo.global, dijit.moveToBookmark, null, [bookmark]);
+			}catch(e){
+				/*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
+			}
+		}
+	},
+
+	// _activeStack: Array
+	//		List of currently active widgets (focused widget and it's ancestors)
+	_activeStack: [],
+
+	registerWin: function(/*Window?*/targetWindow){
+		// summary:
+		//		Registers listeners on the specified window (either the main
+		//		window or an iframe) to detect when the user has clicked somewhere.
+		//		Anyone that creates an iframe should call this function.
+
+		if(!targetWindow){
+			targetWindow = window;
+		}
+
+		dojo.connect(targetWindow.document, "onmousedown", function(evt){
+			dijit._justMouseDowned = true;
+			setTimeout(function(){ dijit._justMouseDowned = false; }, 0);
+			dijit._onTouchNode(evt.target||evt.srcElement);
+		});
+		//dojo.connect(targetWindow, "onscroll", ???);
+
+		// Listen for blur and focus events on targetWindow's body
+		var body = targetWindow.document.body || targetWindow.document.getElementsByTagName("body")[0];
+		if(body){
+			if(dojo.isIE){
+				body.attachEvent('onactivate', function(evt){
+					if(evt.srcElement.tagName.toLowerCase() != "body"){
+						dijit._onFocusNode(evt.srcElement);
+					}
+				});
+				body.attachEvent('ondeactivate', function(evt){ dijit._onBlurNode(evt.srcElement); });
+			}else{
+				body.addEventListener('focus', function(evt){ dijit._onFocusNode(evt.target); }, true);
+				body.addEventListener('blur', function(evt){ dijit._onBlurNode(evt.target); }, true);
+			}
+		}
+		body = null;	// prevent memory leak (apparent circular reference via closure)
+	},
+
+	_onBlurNode: function(/*DomNode*/ node){
+		// summary:
+		// 		Called when focus leaves a node.
+		//		Usually ignored, _unless_ it *isn't* follwed by touching another node,
+		//		which indicates that we tabbed off the last field on the page,
+		//		in which case every widget is marked inactive
+		dijit._prevFocus = dijit._curFocus;
+		dijit._curFocus = null;
+
+		if(dijit._justMouseDowned){
+			// the mouse down caused a new widget to be marked as active; this blur event
+			// is coming late, so ignore it.
+			return;
+		}
+
+		// if the blur event isn't followed by a focus event then mark all widgets as inactive.
+		if(dijit._clearActiveWidgetsTimer){
+			clearTimeout(dijit._clearActiveWidgetsTimer);
+		}
+		dijit._clearActiveWidgetsTimer = setTimeout(function(){
+			delete dijit._clearActiveWidgetsTimer;
+			dijit._setStack([]);
+			dijit._prevFocus = null;
+		}, 100);
+	},
+
+	_onTouchNode: function(/*DomNode*/ node){
+		// summary:
+		//		Callback when node is focused or mouse-downed
+
+		// ignore the recent blurNode event
+		if(dijit._clearActiveWidgetsTimer){
+			clearTimeout(dijit._clearActiveWidgetsTimer);
+			delete dijit._clearActiveWidgetsTimer;
+		}
+
+		// compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem)
+		var newStack=[];
+		try{
+			while(node){
+				if(node.dijitPopupParent){
+					node=dijit.byId(node.dijitPopupParent).domNode;
+				}else if(node.tagName && node.tagName.toLowerCase()=="body"){
+					// is this the root of the document or just the root of an iframe?
+					if(node===dojo.body()){
+						// node is the root of the main document
+						break;
+					}
+					// otherwise, find the iframe this node refers to (can't access it via parentNode,
+					// need to do this trick instead). window.frameElement is supported in IE/FF/Webkit
+					node=dijit.getDocumentWindow(node.ownerDocument).frameElement;
+				}else{
+					var id = node.getAttribute && node.getAttribute("widgetId");
+					if(id){
+						newStack.unshift(id);
+					}
+					node=node.parentNode;
+				}
+			}
+		}catch(e){ /* squelch */ }
+
+		dijit._setStack(newStack);
+	},
+
+	_onFocusNode: function(/*DomNode*/ node){
+		// summary
+		//		Callback when node is focused
+		if(node && node.tagName && node.tagName.toLowerCase() == "body"){
+			return;
+		}
+		dijit._onTouchNode(node);
+
+		if(node==dijit._curFocus){ return; }
+		if(dijit._curFocus){
+			dijit._prevFocus = dijit._curFocus;
+		}
+		dijit._curFocus = node;
+		dojo.publish("focusNode", [node]);
+	},
+
+	_setStack: function(newStack){
+		// summary
+		//	The stack of active widgets has changed.  Send out appropriate events and record new stack
+
+		var oldStack = dijit._activeStack;		
+		dijit._activeStack = newStack;
+
+		// compare old stack to new stack to see how many elements they have in common
+		for(var nCommon=0; nCommon<Math.min(oldStack.length, newStack.length); nCommon++){
+			if(oldStack[nCommon] != newStack[nCommon]){
+				break;
+			}
+		}
+
+		// for all elements that have gone out of focus, send blur event
+		for(var i=oldStack.length-1; i>=nCommon; i--){
+			var widget = dijit.byId(oldStack[i]);
+			if(widget){
+				widget._focused = false;
+				widget._hasBeenBlurred = true;
+				if(widget._onBlur){
+					widget._onBlur();
+				}
+				if (widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetBlur", [widget]);
+			}
+		}
+
+		// for all element that have come into focus, send focus event
+		for(i=nCommon; i<newStack.length; i++){
+			widget = dijit.byId(newStack[i]);
+			if(widget){
+				widget._focused = true;
+				if(widget._onFocus){
+					widget._onFocus();
+				}
+				if (widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetFocus", [widget]);
+			}
+		}
+	}
+});
+
+// register top window and all the iframes it contains
+dojo.addOnLoad(dijit.registerWin);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/manager.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/manager.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/manager.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,194 @@
+if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.manager"] = true;
+dojo.provide("dijit._base.manager");
+
+dojo.declare("dijit.WidgetSet", null, {
+	// summary:
+	//	A set of widgets indexed by id
+
+	constructor: function(){
+		this._hash={};
+	},
+
+	add: function(/*Widget*/ widget){
+		if(this._hash[widget.id]){
+			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
+		}
+		this._hash[widget.id]=widget;
+	},
+
+	remove: function(/*String*/ id){
+		delete this._hash[id];
+	},
+
+	forEach: function(/*Function*/ func){
+		for(var id in this._hash){
+			func(this._hash[id]);
+		}
+	},
+
+	filter: function(/*Function*/ filter){
+		var res = new dijit.WidgetSet();
+		this.forEach(function(widget){
+			if(filter(widget)){ res.add(widget); }
+		});
+		return res;		// dijit.WidgetSet
+	},
+
+	byId: function(/*String*/ id){
+		return this._hash[id];
+	},
+
+	byClass: function(/*String*/ cls){
+		return this.filter(function(widget){ return widget.declaredClass==cls; });	// dijit.WidgetSet
+	}
+	});
+
+/*=====
+dijit.registry = {
+	// summary: A list of widgets on a page.
+	// description: Is an instance of dijit.WidgetSet
+};
+=====*/
+dijit.registry = new dijit.WidgetSet();
+
+dijit._widgetTypeCtr = {};
+
+dijit.getUniqueId = function(/*String*/widgetType){
+	// summary
+	//	Generates a unique id for a given widgetType
+
+	var id;
+	do{
+		id = widgetType + "_" +
+			(widgetType in dijit._widgetTypeCtr ?
+				++dijit._widgetTypeCtr[widgetType] : dijit._widgetTypeCtr[widgetType] = 0);
+	}while(dijit.byId(id));
+	return id; // String
+};
+
+
+if(dojo.isIE){
+	// Only run this for IE because we think it's only necessary in that case,
+	// and because it causes problems on FF.  See bug #3531 for details.
+	dojo.addOnUnload(function(){
+		dijit.registry.forEach(function(widget){ widget.destroy(); });
+	});
+}
+
+dijit.byId = function(/*String|Widget*/id){
+	// summary:
+	//		Returns a widget by its id, or if passed a widget, no-op (like dojo.byId())
+	return (dojo.isString(id)) ? dijit.registry.byId(id) : id; // Widget
+};
+
+dijit.byNode = function(/* DOMNode */ node){
+	// summary:
+	//		Returns the widget as referenced by node
+	return dijit.registry.byId(node.getAttribute("widgetId")); // Widget
+};
+
+dijit.getEnclosingWidget = function(/* DOMNode */ node){
+	// summary:
+	//		Returns the widget whose dom tree contains node or null if
+	//		the node is not contained within the dom tree of any widget
+	while(node){
+		if(node.getAttribute && node.getAttribute("widgetId")){
+			return dijit.registry.byId(node.getAttribute("widgetId"));
+		}
+		node = node.parentNode;
+	}
+	return null;
+};
+
+// elements that are tab-navigable if they have no tabindex value set
+// (except for "a", which must have an href attribute)
+dijit._tabElements = {
+	area: true,
+	button: true,
+	input: true,
+	object: true,
+	select: true,
+	textarea: true
+};
+
+dijit._isElementShown = function(/*Element*/elem){
+	var style = dojo.style(elem);
+	return (style.visibility != "hidden")
+		&& (style.visibility != "collapsed")
+		&& (style.display != "none");
+}
+
+dijit.isTabNavigable = function(/*Element*/elem){
+	// summary:
+	//		Tests if an element is tab-navigable
+	if(dojo.hasAttr(elem, "disabled")){ return false; }
+	var hasTabindex = dojo.hasAttr(elem, "tabindex");
+	var tabindex = dojo.attr(elem, "tabindex");
+	if(hasTabindex && tabindex >= 0) {
+		return true; // boolean
+	}
+	var name = elem.nodeName.toLowerCase();
+	if(((name == "a" && dojo.hasAttr(elem, "href"))
+			|| dijit._tabElements[name])
+		&& (!hasTabindex || tabindex >= 0)){
+		return true; // boolean
+	}
+	return false; // boolean
+};
+
+dijit._getTabNavigable = function(/*DOMNode*/root){
+	// summary:
+	//		Finds the following descendants of the specified root node:
+	//		* the first tab-navigable element in document order
+	//		  without a tabindex or with tabindex="0"
+	//		* the last tab-navigable element in document order
+	//		  without a tabindex or with tabindex="0"
+	//		* the first element in document order with the lowest
+	//		  positive tabindex value
+	//		* the last element in document order with the highest
+	//		  positive tabindex value
+	var first, last, lowest, lowestTabindex, highest, highestTabindex;
+	var walkTree = function(/*DOMNode*/parent){
+		dojo.query("> *", parent).forEach(function(child){
+			var isShown = dijit._isElementShown(child);
+			if(isShown && dijit.isTabNavigable(child)){
+				var tabindex = dojo.attr(child, "tabindex");
+				if(!dojo.hasAttr(child, "tabindex") || tabindex == 0){
+					if(!first){ first = child; }
+					last = child;
+				}else if(tabindex > 0){
+					if(!lowest || tabindex < lowestTabindex){
+						lowestTabindex = tabindex;
+						lowest = child;
+					}
+					if(!highest || tabindex >= highestTabindex){
+						highestTabindex = tabindex;
+						highest = child;
+					}
+				}
+			}
+			if(isShown){ walkTree(child) }
+		});
+	};
+	if(dijit._isElementShown(root)){ walkTree(root) }
+	return { first: first, last: last, lowest: lowest, highest: highest };
+}
+
+dijit.getFirstInTabbingOrder = function(/*String|DOMNode*/root){
+	// summary:
+	//		Finds the descendant of the specified root node
+	//		that is first in the tabbing order
+	var elems = dijit._getTabNavigable(dojo.byId(root));
+	return elems.lowest ? elems.lowest : elems.first; // Element
+};
+
+dijit.getLastInTabbingOrder = function(/*String|DOMNode*/root){
+	// summary:
+	//		Finds the descendant of the specified root node
+	//		that is last in the tabbing order
+	var elems = dijit._getTabNavigable(dojo.byId(root));
+	return elems.last ? elems.last : elems.highest; // Element
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/place.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/place.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/place.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,213 @@
+if(!dojo._hasResource["dijit._base.place"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.place"] = true;
+dojo.provide("dijit._base.place");
+
+// ported from dojo.html.util
+
+dijit.getViewport = function(){
+	//	summary
+	//	Returns the dimensions and scroll position of the viewable area of a browser window
+
+	var _window = dojo.global;
+	var _document = dojo.doc;
+
+	// get viewport size
+	var w = 0, h = 0;
+	var de = _document.documentElement;
+	var dew = de.clientWidth, deh = de.clientHeight;
+	if(dojo.isMozilla){
+		// mozilla
+		// _window.innerHeight includes the height taken by the scroll bar
+		// clientHeight is ideal but has DTD issues:
+		// #4539: FF reverses the roles of body.clientHeight/Width and documentElement.clientHeight/Width based on the DTD!
+		// check DTD to see whether body or documentElement returns the viewport dimensions using this algorithm:
+		var minw, minh, maxw, maxh;
+		var dbw = _document.body.clientWidth;
+		if(dbw > dew){
+			minw = dew;
+			maxw = dbw;
+		}else{
+			maxw = dew;
+			minw = dbw;
+		}
+		var dbh = _document.body.clientHeight;
+		if(dbh > deh){
+			minh = deh;
+			maxh = dbh;
+		}else{
+			maxh = deh;
+			minh = dbh;
+		}
+		w = (maxw > _window.innerWidth) ? minw : maxw;
+		h = (maxh > _window.innerHeight) ? minh : maxh;
+	}else if(!dojo.isOpera && _window.innerWidth){
+		//in opera9, dojo.body().clientWidth should be used, instead
+		//of window.innerWidth/document.documentElement.clientWidth
+		//so we have to check whether it is opera
+		w = _window.innerWidth;
+		h = _window.innerHeight;
+	}else if(dojo.isIE && de && deh){
+		w = dew;
+		h = deh;
+	}else if(dojo.body().clientWidth){
+		// IE5, Opera
+		w = dojo.body().clientWidth;
+		h = dojo.body().clientHeight;
+	}
+
+	// get scroll position
+	var scroll = dojo._docScroll();
+
+	return { w: w, h: h, l: scroll.x, t: scroll.y };	//	object
+};
+
+dijit.placeOnScreen = function(
+	/* DomNode */	node,
+	/* Object */		pos,
+	/* Object */		corners,
+	/* boolean? */		tryOnly){
+	//	summary:
+	//		Keeps 'node' in the visible area of the screen while trying to
+	//		place closest to pos.x, pos.y. The input coordinates are
+	//		expected to be the desired document position.
+	//
+	//		Set which corner(s) you want to bind to, such as
+	//		
+	//			placeOnScreen(node, {x: 10, y: 20}, ["TR", "BL"])
+	//		
+	//		The desired x/y will be treated as the topleft(TL)/topright(TR) or
+	//		BottomLeft(BL)/BottomRight(BR) corner of the node. Each corner is tested
+	//		and if a perfect match is found, it will be used. Otherwise, it goes through
+	//		all of the specified corners, and choose the most appropriate one.
+	//		
+	//		NOTE: node is assumed to be absolutely or relatively positioned.
+
+	var choices = dojo.map(corners, function(corner){ return { corner: corner, pos: pos }; });
+
+	return dijit._place(node, choices);
+}
+
+dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ layoutNode){
+	// summary:
+	//		Given a list of spots to put node, put it at the first spot where it fits,
+	//		of if it doesn't fit anywhere then the place with the least overflow
+	// choices: Array
+	//		Array of elements like: {corner: 'TL', pos: {x: 10, y: 20} }
+	//		Above example says to put the top-left corner of the node at (10,20)
+	//	layoutNode: Function(node, aroundNodeCorner, nodeCorner)
+	//		for things like tooltip, they are displayed differently (and have different dimensions)
+	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
+
+	// get {x: 10, y: 10, w: 100, h:100} type obj representing position of
+	// viewport over document
+	var view = dijit.getViewport();
+
+	// This won't work if the node is inside a <div style="position: relative">,
+	// so reattach it to dojo.doc.body.   (Otherwise, the positioning will be wrong
+	// and also it might get cutoff)
+	if(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != "body"){
+		dojo.body().appendChild(node);
+	}
+
+	var best = null;
+	dojo.some(choices, function(choice){
+		var corner = choice.corner;
+		var pos = choice.pos;
+
+		// configure node to be displayed in given position relative to button
+		// (need to do this in order to get an accurate size for the node, because
+		// a tooltips size changes based on position, due to triangle)
+		if(layoutNode){
+			layoutNode(node, choice.aroundCorner, corner);
+		}
+
+		// get node's size
+		var style = node.style;
+		var oldDisplay = style.display;
+		var oldVis = style.visibility;
+		style.visibility = "hidden";
+		style.display = "";
+		var mb = dojo.marginBox(node);
+		style.display = oldDisplay;
+		style.visibility = oldVis;
+
+		// coordinates and size of node with specified corner placed at pos,
+		// and clipped by viewport
+		var startX = (corner.charAt(1) == 'L' ? pos.x : Math.max(view.l, pos.x - mb.w)),
+			startY = (corner.charAt(0) == 'T' ? pos.y : Math.max(view.t, pos.y -  mb.h)),
+			endX = (corner.charAt(1) == 'L' ? Math.min(view.l + view.w, startX + mb.w) : pos.x),
+			endY = (corner.charAt(0) == 'T' ? Math.min(view.t + view.h, startY + mb.h) : pos.y),
+			width = endX - startX,
+			height = endY - startY,
+			overflow = (mb.w - width) + (mb.h - height);
+
+		if(best == null || overflow < best.overflow){
+			best = {
+				corner: corner,
+				aroundCorner: choice.aroundCorner,
+				x: startX,
+				y: startY,
+				w: width,
+				h: height,
+				overflow: overflow
+			};
+		}
+		return !overflow;
+	});
+
+	node.style.left = best.x + "px";
+	node.style.top = best.y + "px";
+	if(best.overflow && layoutNode){
+		layoutNode(node, best.aroundCorner, best.corner);
+	}
+	return best;
+}
+
+dijit.placeOnScreenAroundElement = function(
+	/* DomNode */		node,
+	/* DomNode */		aroundNode,
+	/* Object */		aroundCorners,
+	/* Function */		layoutNode){
+
+	//	summary
+	//	Like placeOnScreen, except it accepts aroundNode instead of x,y
+	//	and attempts to place node around it.  Uses margin box dimensions.
+	//
+	//	aroundCorners
+	//		specify Which corner of aroundNode should be
+	//		used to place the node => which corner(s) of node to use (see the
+	//		corners parameter in dijit.placeOnScreen)
+	//		e.g. {'TL': 'BL', 'BL': 'TL'}
+	//
+	//	layoutNode: Function(node, aroundNodeCorner, nodeCorner)
+	//		for things like tooltip, they are displayed differently (and have different dimensions)
+	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
+
+
+	// get coordinates of aroundNode
+	aroundNode = dojo.byId(aroundNode);
+	var oldDisplay = aroundNode.style.display;
+	aroundNode.style.display="";
+	// #3172: use the slightly tighter border box instead of marginBox
+	var aroundNodeW = aroundNode.offsetWidth; //mb.w;
+	var aroundNodeH = aroundNode.offsetHeight; //mb.h;
+	var aroundNodePos = dojo.coords(aroundNode, true);
+	aroundNode.style.display=oldDisplay;
+
+	// Generate list of possible positions for node
+	var choices = [];
+	for(var nodeCorner in aroundCorners){
+		choices.push( {
+			aroundCorner: nodeCorner,
+			corner: aroundCorners[nodeCorner],
+			pos: {
+				x: aroundNodePos.x + (nodeCorner.charAt(1) == 'L' ? 0 : aroundNodeW),
+				y: aroundNodePos.y + (nodeCorner.charAt(0) == 'T' ? 0 : aroundNodeH)
+			}
+		});
+	}
+
+	return dijit._place(node, choices, layoutNode);
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/popup.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/popup.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/popup.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,269 @@
+if(!dojo._hasResource["dijit._base.popup"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.popup"] = true;
+dojo.provide("dijit._base.popup");
+
+dojo.require("dijit._base.focus");
+dojo.require("dijit._base.place");
+dojo.require("dijit._base.window");
+
+dijit.popup = new function(){
+	// summary:
+	//		This class is used to show/hide widgets as popups.
+	//
+
+	var stack = [],
+		beginZIndex=1000,
+		idGen = 1;
+
+	this.prepare = function(/*DomNode*/ node){
+		// summary:
+		//		Prepares a node to be used as a popup
+		//
+		// description:
+		//		Attaches node to dojo.doc.body, and
+		//		positions it off screen, but not display:none, so that
+		//		the widget doesn't appear in the page flow and/or cause a blank
+		//		area at the bottom of the viewport (making scrollbar longer), but
+		//		initialization of contained widgets works correctly
+	
+		dojo.body().appendChild(node);
+		var s = node.style;
+		if(s.display == "none"){
+			s.display="";
+		}
+		s.visibility = "hidden";	// not needed for hiding, but used as flag that node is off-screen
+		s.position = "absolute";
+		s.top = "-9999px";
+	};
+
+	this.open = function(/*Object*/ args){
+		// summary:
+		//		Popup the widget at the specified position
+		//
+		// args: Object
+		//		popup: Widget
+		//			widget to display,
+		//		parent: Widget
+		//			the button etc. that is displaying this popup
+		//		around: DomNode
+		//			DOM node (typically a button); place popup relative to this node
+		//		orient: Object
+		//			structure specifying possible positions of popup relative to "around" node
+		//		onCancel: Function
+		//			callback when user has canceled the popup by
+		//				1. hitting ESC or
+		//				2. by using the popup widget's proprietary cancel mechanism (like a cancel button in a dialog);
+		//				   ie: whenever popupWidget.onCancel() is called, args.onCancel is called
+		//		onClose: Function
+		//			callback whenever this popup is closed
+		//		onExecute: Function
+		//			callback when user "executed" on the popup/sub-popup by selecting a menu choice, etc. (top menu only)
+		//
+		// examples:
+		//		1. opening at the mouse position
+		//			dijit.popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY});
+		//		2. opening the widget as a dropdown
+		//			dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}  });
+		//
+		//	Note that whatever widget called dijit.popup.open() should also listen to it's own _onBlur callback
+		//	(fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed.
+
+		var widget = args.popup,
+			orient = args.orient || {'BL':'TL', 'TL':'BL'},
+			around = args.around,
+			id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+idGen++);
+
+		// make wrapper div to hold widget and possibly hold iframe behind it.
+		// we can't attach the iframe as a child of the widget.domNode because
+		// widget.domNode might be a <table>, <ul>, etc.
+		var wrapper = dojo.doc.createElement("div");
+		dijit.setWaiRole(wrapper, "presentation");
+		wrapper.id = id;
+		wrapper.className="dijitPopup";
+		wrapper.style.zIndex = beginZIndex + stack.length;
+		wrapper.style.visibility = "hidden";
+		if(args.parent){
+			wrapper.dijitPopupParent=args.parent.id;
+		}
+		dojo.body().appendChild(wrapper);
+
+		var s = widget.domNode.style;
+		s.display = "";
+		s.visibility = "";
+		s.position = "";
+		wrapper.appendChild(widget.domNode);
+
+		var iframe = new dijit.BackgroundIframe(wrapper);
+
+		// position the wrapper node
+		var best = around ?
+			dijit.placeOnScreenAroundElement(wrapper, around, orient, widget.orient ? dojo.hitch(widget, "orient") : null) :
+			dijit.placeOnScreen(wrapper, args, orient == 'R' ? ['TR','BR','TL','BL'] : ['TL','BL','TR','BR']);
+
+		wrapper.style.visibility = "visible";
+		// TODO: use effects to fade in wrapper
+
+		var handlers = [];
+
+		// Compute the closest ancestor popup that's *not* a child of another popup.
+		// Ex: For a TooltipDialog with a button that spawns a tree of menus, find the popup of the button.
+		var getTopPopup = function(){
+			for(var pi=stack.length-1; pi > 0 && stack[pi].parent === stack[pi-1].widget; pi--){
+				/* do nothing, just trying to get right value for pi */
+			}
+			return stack[pi];
+		}
+
+		// provide default escape and tab key handling
+		// (this will work for any widget, not just menu)
+		handlers.push(dojo.connect(wrapper, "onkeypress", this, function(evt){
+			if(evt.keyCode == dojo.keys.ESCAPE && args.onCancel){
+				dojo.stopEvent(evt);
+				args.onCancel();
+			}else if(evt.keyCode == dojo.keys.TAB){
+				dojo.stopEvent(evt);
+				var topPopup = getTopPopup();
+				if(topPopup && topPopup.onCancel){
+					topPopup.onCancel();
+				}
+			}
+		}));
+
+		// watch for cancel/execute events on the popup and notify the caller
+		// (for a menu, "execute" means clicking an item)
+		if(widget.onCancel){
+			handlers.push(dojo.connect(widget, "onCancel", null, args.onCancel));
+		}
+
+		handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", null, function(){
+			var topPopup = getTopPopup();
+			if(topPopup && topPopup.onExecute){
+				topPopup.onExecute();
+			}
+		}));
+
+		stack.push({
+			wrapper: wrapper,
+			iframe: iframe,
+			widget: widget,
+			parent: args.parent,
+			onExecute: args.onExecute,
+			onCancel: args.onCancel,
+ 			onClose: args.onClose,
+			handlers: handlers
+		});
+
+		if(widget.onOpen){
+			widget.onOpen(best);
+		}
+
+		return best;
+	};
+
+	this.close = function(/*Widget*/ popup){
+		// summary:
+		//		Close specified popup and any popups that it parented
+		while(dojo.some(stack, function(elem){return elem.widget == popup;})){
+			var top = stack.pop(),
+				wrapper = top.wrapper,
+				iframe = top.iframe,
+				widget = top.widget,
+				onClose = top.onClose;
+	
+			if(widget.onClose){
+				widget.onClose();
+			}
+			dojo.forEach(top.handlers, dojo.disconnect);
+	
+			// #2685: check if the widget still has a domNode so ContentPane can change its URL without getting an error
+			if(!widget||!widget.domNode){ return; }
+			
+			this.prepare(widget.domNode);
+
+			iframe.destroy();
+			dojo._destroyElement(wrapper);
+	
+			if(onClose){
+				onClose();
+			}
+		}
+	};
+}();
+
+dijit._frames = new function(){
+	// summary: cache of iframes
+	var queue = [];
+
+	this.pop = function(){
+		var iframe;
+		if(queue.length){
+			iframe = queue.pop();
+			iframe.style.display="";
+		}else{
+			if(dojo.isIE){
+				var html="<iframe src='javascript:\"\"'"
+					+ " style='position: absolute; left: 0px; top: 0px;"
+					+ "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
+				iframe = dojo.doc.createElement(html);
+			}else{
+			 	iframe = dojo.doc.createElement("iframe");
+				iframe.src = 'javascript:""';
+				iframe.className = "dijitBackgroundIframe";
+			}
+			iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didnt work.
+			dojo.body().appendChild(iframe);
+		}
+		return iframe;
+	};
+
+	this.push = function(iframe){
+		iframe.style.display="";
+		if(dojo.isIE){
+			iframe.style.removeExpression("width");
+			iframe.style.removeExpression("height");
+		}
+		queue.push(iframe);
+	}
+}();
+
+// fill the queue
+if(dojo.isIE && dojo.isIE < 7){
+	dojo.addOnLoad(function(){
+		var f = dijit._frames;
+		dojo.forEach([f.pop()], f.push);
+	});
+}
+
+
+dijit.BackgroundIframe = function(/* DomNode */node){
+	//	summary:
+	//		For IE z-index schenanigans. id attribute is required.
+	//
+	//	description:
+	//		new dijit.BackgroundIframe(node)
+	//			Makes a background iframe as a child of node, that fills
+	//			area (and position) of node
+
+	if(!node.id){ throw new Error("no id"); }
+	if((dojo.isIE && dojo.isIE < 7) || (dojo.isFF && dojo.isFF < 3 && dojo.hasClass(dojo.body(), "dijit_a11y"))){
+		var iframe = dijit._frames.pop();
+		node.appendChild(iframe);
+		if(dojo.isIE){
+			iframe.style.setExpression("width", dojo._scopeName + ".doc.getElementById('" + node.id + "').offsetWidth");
+			iframe.style.setExpression("height", dojo._scopeName + ".doc.getElementById('" + node.id + "').offsetHeight");
+		}
+		this.iframe = iframe;
+	}
+};
+
+dojo.extend(dijit.BackgroundIframe, {
+	destroy: function(){
+		//	summary: destroy the iframe
+		if(this.iframe){
+			dijit._frames.push(this.iframe);
+			delete this.iframe;
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/scroll.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/scroll.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/scroll.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,29 @@
+if(!dojo._hasResource["dijit._base.scroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.scroll"] = true;
+dojo.provide("dijit._base.scroll");
+
+dijit.scrollIntoView = function(/* DomNode */node){
+	//	summary
+	//	Scroll the passed node into view, if it is not.
+
+	// don't rely on that node.scrollIntoView works just because the function is there
+	// it doesnt work in Konqueror or Opera even though the function is there and probably
+	//	not safari either
+	// native scrollIntoView() causes FF3's whole window to scroll if there is no scroll bar 
+	//	on the immediate parent
+	// dont like browser sniffs implementations but sometimes you have to use it
+	// #6146: IE scrollIntoView is broken
+	// It's not enough just to scroll the menu node into view if
+	// node.scrollIntoView hides part of the parent's scrollbar,
+	// so just manage the parent scrollbar ourselves
+	var parent = node.parentNode;
+	var parentBottom = parent.scrollTop + dojo.marginBox(parent).h; //PORT was getBorderBox
+	var nodeBottom = node.offsetTop + dojo.marginBox(node).h;
+	if(parentBottom < nodeBottom){
+		parent.scrollTop += (nodeBottom - parentBottom);
+	}else if(parent.scrollTop > node.offsetTop){
+		parent.scrollTop -= (parent.scrollTop - node.offsetTop);
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/sniff.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/sniff.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/sniff.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,45 @@
+if(!dojo._hasResource["dijit._base.sniff"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.sniff"] = true;
+dojo.provide("dijit._base.sniff");
+
+// ported from dojo.html.applyBrowserClass (style.js)
+
+//	summary:
+//		Applies pre-set class names based on browser & version to the
+//		top-level HTML node.  Simply doing a require on this module will
+//		establish this CSS.  Modified version of Morris' CSS hack.
+(function(){
+	var d = dojo;
+	var ie = d.isIE;
+	var opera = d.isOpera;
+	var maj = Math.floor;
+	var ff = d.isFF;
+	var classes = {
+		dj_ie: ie,
+//		dj_ie55: ie == 5.5,
+		dj_ie6: maj(ie) == 6,
+		dj_ie7: maj(ie) == 7,
+		dj_iequirks: ie && d.isQuirks,
+// NOTE: Opera not supported by dijit
+		dj_opera: opera,
+		dj_opera8: maj(opera) == 8,
+		dj_opera9: maj(opera) == 9,
+		dj_khtml: d.isKhtml,
+		dj_safari: d.isSafari,
+		dj_gecko: d.isMozilla,
+		dj_ff2: maj(ff) == 2
+	}; // no dojo unsupported browsers
+
+	for(var p in classes){
+		if(classes[p]){
+			var html = dojo.doc.documentElement; //TODO browser-specific DOM magic needed?
+			if(html.className){
+				html.className += " " + p;
+			}else{
+				html.className = p;
+			}
+		}
+	}
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/typematic.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/typematic.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/typematic.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,139 @@
+if(!dojo._hasResource["dijit._base.typematic"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.typematic"] = true;
+dojo.provide("dijit._base.typematic");
+
+dijit.typematic = {
+	// summary:
+	//	These functions are used to repetitively call a user specified callback
+	//	method when a specific key or mouse click over a specific DOM node is
+	//	held down for a specific amount of time.
+	//	Only 1 such event is allowed to occur on the browser page at 1 time.
+
+	_fireEventAndReload: function(){
+		this._timer = null;
+		this._callback(++this._count, this._node, this._evt);
+		this._currentTimeout = (this._currentTimeout < 0) ? this._initialDelay : ((this._subsequentDelay > 1) ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay));
+		this._timer = setTimeout(dojo.hitch(this, "_fireEventAndReload"), this._currentTimeout);
+	},
+
+	trigger: function(/*Event*/ evt, /* Object */ _this, /*DOMNode*/ node, /* Function */ callback, /* Object */ obj, /* Number */ subsequentDelay, /* Number */ initialDelay){
+		// summary:
+		//      Start a timed, repeating callback sequence.
+		//      If already started, the function call is ignored.
+		//      This method is not normally called by the user but can be
+		//      when the normal listener code is insufficient.
+		//	Parameters:
+		//	evt: key or mouse event object to pass to the user callback
+		//	_this: pointer to the user's widget space.
+		//	node: the DOM node object to pass the the callback function
+		//	callback: function to call until the sequence is stopped called with 3 parameters:
+		//		count: integer representing number of repeated calls (0..n) with -1 indicating the iteration has stopped
+		//		node: the DOM node object passed in
+		//		evt: key or mouse event object
+		//	obj: user space object used to uniquely identify each typematic sequence
+		//	subsequentDelay: if > 1, the number of milliseconds until the 3->n events occur
+		//		or else the fractional time multiplier for the next event's delay, default=0.9
+		//	initialDelay: the number of milliseconds until the 2nd event occurs, default=500ms
+		if(obj != this._obj){
+			this.stop();
+			this._initialDelay = initialDelay || 500;
+			this._subsequentDelay = subsequentDelay || 0.90;
+			this._obj = obj;
+			this._evt = evt;
+			this._node = node;
+			this._currentTimeout = -1;
+			this._count = -1;
+			this._callback = dojo.hitch(_this, callback);
+			this._fireEventAndReload();
+		}
+	},
+
+	stop: function(){
+		// summary:
+		//	  Stop an ongoing timed, repeating callback sequence.
+		if(this._timer){
+			clearTimeout(this._timer);
+			this._timer = null;
+		}
+		if(this._obj){
+			this._callback(-1, this._node, this._evt);
+			this._obj = null;
+		}
+	},
+
+	addKeyListener: function(/*DOMNode*/ node, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+		// summary: Start listening for a specific typematic key.
+		//	keyObject: an object defining the key to listen for.
+		//		key: (mandatory) the keyCode (number) or character (string) to listen for.
+		//		ctrlKey: desired ctrl key state to initiate the calback sequence:
+		//			pressed (true)
+		//			released (false)
+		//			either (unspecified)
+		//		altKey: same as ctrlKey but for the alt key
+		//		shiftKey: same as ctrlKey but for the shift key
+		//	See the trigger method for other parameters.
+		//	Returns an array of dojo.connect handles
+		return [
+			dojo.connect(node, "onkeypress", this, function(evt){
+				if(evt.keyCode == keyObject.keyCode && (!keyObject.charCode || keyObject.charCode == evt.charCode) &&
+				(keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) &&
+				(keyObject.altKey === undefined || keyObject.altKey == evt.ctrlKey) &&
+				(keyObject.shiftKey === undefined || keyObject.shiftKey == evt.ctrlKey)){
+					dojo.stopEvent(evt);
+					dijit.typematic.trigger(keyObject, _this, node, callback, keyObject, subsequentDelay, initialDelay);
+				}else if(dijit.typematic._obj == keyObject){
+					dijit.typematic.stop();
+				}
+			}),
+			dojo.connect(node, "onkeyup", this, function(evt){
+				if(dijit.typematic._obj == keyObject){
+					dijit.typematic.stop();
+				}
+			})
+		];
+	},
+
+	addMouseListener: function(/*DOMNode*/ node, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+		// summary: Start listening for a typematic mouse click.
+		//	See the trigger method for other parameters.
+		//	Returns an array of dojo.connect handles
+		var dc = dojo.connect;
+		return [
+			dc(node, "mousedown", this, function(evt){
+				dojo.stopEvent(evt);
+				dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay);
+			}),
+			dc(node, "mouseup", this, function(evt){
+				dojo.stopEvent(evt);
+				dijit.typematic.stop();
+			}),
+			dc(node, "mouseout", this, function(evt){
+				dojo.stopEvent(evt);
+				dijit.typematic.stop();
+			}),
+			dc(node, "mousemove", this, function(evt){
+				dojo.stopEvent(evt);
+			}),
+			dc(node, "dblclick", this, function(evt){
+				dojo.stopEvent(evt);
+				if(dojo.isIE){
+					dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay);
+					setTimeout(dojo.hitch(this, dijit.typematic.stop), 50);
+				}
+			})
+		];
+	},
+
+	addListener: function(/*Node*/ mouseNode, /*Node*/ keyNode, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+		// summary: Start listening for a specific typematic key and mouseclick.
+		//	This is a thin wrapper to addKeyListener and addMouseListener.
+		//	mouseNode: the DOM node object to listen on for mouse events.
+		//	keyNode: the DOM node object to listen on for key events.
+		//	See the addMouseListener and addKeyListener methods for other parameters.
+		//	Returns an array of dojo.connect handles
+		return this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay).concat(
+			this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay));
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/wai.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/wai.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/wai.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,143 @@
+if(!dojo._hasResource["dijit._base.wai"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.wai"] = true;
+dojo.provide("dijit._base.wai");
+
+dijit.wai = {
+	onload: function(){
+		// summary:
+		//		Detects if we are in high-contrast mode or not
+
+		// This must be a named function and not an anonymous
+		// function, so that the widget parsing code can make sure it
+		// registers its onload function after this function.
+		// DO NOT USE "this" within this function.
+
+		// create div for testing if high contrast mode is on or images are turned off
+		var div = dojo.doc.createElement("div");
+		div.id = "a11yTestNode";
+		div.style.cssText = 'border: 1px solid;'
+			+ 'border-color:red green;'
+			+ 'position: absolute;'
+			+ 'height: 5px;'
+			+ 'top: -999px;'
+			+ 'background-image: url("' + dojo.moduleUrl("dojo", "resources/blank.gif") + '");';
+		dojo.body().appendChild(div);
+
+		// test it
+		var cs = dojo.getComputedStyle(div);
+		if(cs){
+			var bkImg = cs.backgroundImage;
+			var needsA11y = (cs.borderTopColor==cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" ));
+			dojo[needsA11y ? "addClass" : "removeClass"](dojo.body(), "dijit_a11y");
+			dojo.body().removeChild(div);
+		}
+	}
+};
+
+// Test if computer is in high contrast mode.
+// Make sure the a11y test runs first, before widgets are instantiated.
+if(dojo.isIE || dojo.isMoz){	// NOTE: checking in Safari messes things up
+	dojo._loaders.unshift(dijit.wai.onload);
+}
+
+dojo.mixin(dijit,
+{
+	hasWaiRole: function(/*Element*/ elem){
+		// summary: Determines if an element has a role.
+		// returns: true if elem has a role attribute and false if not.
+		return elem.hasAttribute ? elem.hasAttribute("role") : !!elem.getAttribute("role");
+	},
+
+	getWaiRole: function(/*Element*/ elem){
+		// summary: Gets the role for an element.
+		// returns:
+		//		The role of elem or an empty string if elem
+		//		does not have a role.
+		var value = elem.getAttribute("role");
+		if(value){
+			var prefixEnd = value.indexOf(":");
+			return prefixEnd == -1 ? value : value.substring(prefixEnd+1);
+		}else{
+			return "";
+		}
+	},
+
+	setWaiRole: function(/*Element*/ elem, /*String*/ role){
+		// summary: Sets the role on an element.
+		// description:
+		//		On Firefox 2 and below, "wairole:" is
+		//		prepended to the provided role value.
+		elem.setAttribute("role", (dojo.isFF && dojo.isFF < 3) ? "wairole:" + role : role);
+	},
+
+	removeWaiRole: function(/*Element*/ elem){
+		// summary: Removes the role from an element.
+		elem.removeAttribute("role");
+	},
+
+	hasWaiState: function(/*Element*/ elem, /*String*/ state){
+		// summary: Determines if an element has a given state.
+		// description:
+		//		On Firefox 2 and below, we check for an attribute in namespace
+		//		"http://www.w3.org/2005/07/aaa"; with a name of the given state.
+		//		On all other browsers, we check for an attribute
+		//		called "aria-"+state.
+		// returns:
+		//		true if elem has a value for the given state and
+		//		false if it does not.
+		if(dojo.isFF && dojo.isFF < 3){
+			return elem.hasAttributeNS("http://www.w3.org/2005/07/aaa";, state);
+		}else{
+			return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state);
+		}
+	},
+
+	getWaiState: function(/*Element*/ elem, /*String*/ state){
+		// summary: Gets the value of a state on an element.
+		// description:
+		//		On Firefox 2 and below, we check for an attribute in namespace
+		//		"http://www.w3.org/2005/07/aaa"; with a name of the given state.
+		//		On all other browsers, we check for an attribute called
+		//		"aria-"+state.
+		// returns:
+		//		The value of the requested state on elem
+		//		or an empty string if elem has no value for state.
+		if(dojo.isFF && dojo.isFF < 3){
+			return elem.getAttributeNS("http://www.w3.org/2005/07/aaa";, state);
+		}else{
+			var value = elem.getAttribute("aria-"+state);
+			return value ? value : "";
+		}
+	},
+
+	setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){
+		// summary: Sets a state on an element.
+		// description:
+		//		On Firefox 2 and below, we set an attribute in namespace
+		//		"http://www.w3.org/2005/07/aaa"; with a name of the given state.
+		//		On all other browsers, we set an attribute called
+		//		"aria-"+state.
+		if(dojo.isFF && dojo.isFF < 3){
+			elem.setAttributeNS("http://www.w3.org/2005/07/aaa";,
+				"aaa:"+state, value);
+		}else{
+			elem.setAttribute("aria-"+state, value);
+		}
+	},
+
+	removeWaiState: function(/*Element*/ elem, /*String*/ state){
+		// summary: Removes a state from an element.
+		// description:
+		//		On Firefox 2 and below, we remove the attribute in namespace
+		//		"http://www.w3.org/2005/07/aaa"; with a name of the given state.
+		//		On all other browsers, we remove the attribute called
+		//		"aria-"+state.
+		if(dojo.isFF && dojo.isFF < 3){
+			elem.removeAttributeNS("http://www.w3.org/2005/07/aaa";, state);
+		}else{
+			elem.removeAttribute("aria-"+state);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base/window.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base/window.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base/window.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,47 @@
+if(!dojo._hasResource["dijit._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.window"] = true;
+dojo.provide("dijit._base.window");
+
+dijit.getDocumentWindow = function(doc){
+	//	summary
+	// 	Get window object associated with document doc
+
+	// With Safari, there is not way to retrieve the window from the document, so we must fix it.
+	if(dojo.isSafari && !doc._parentWindow){
+		/*
+			This is a Safari specific function that fix the reference to the parent
+			window from the document object.
+			TODO: #5711: should the use of document below reference dojo.doc instead
+			in case they're not the same?
+		*/
+		var fix=function(win){
+			win.document._parentWindow=win;
+			for(var i=0; i<win.frames.length; i++){
+				fix(win.frames[i]);
+			}
+		}
+		fix(window.top);
+	}
+
+	//In some IE versions (at least 6.0), document.parentWindow does not return a
+	//reference to the real window object (maybe a copy), so we must fix it as well
+	//We use IE specific execScript to attach the real window reference to
+	//document._parentWindow for later use
+	//TODO: #5711: should the use of document below reference dojo.doc instead in case they're not the same?
+	if(dojo.isIE && window !== document.parentWindow && !doc._parentWindow){
+		/*
+		In IE 6, only the variable "window" can be used to connect events (others
+		may be only copies).
+		*/
+		doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
+		//to prevent memory leak, unset it after use
+		//another possibility is to add an onUnload handler which seems overkill to me (liucougar)
+		var win = doc._parentWindow;
+		doc._parentWindow = null;
+		return win;	//	Window
+	}
+
+	return doc._parentWindow || doc.parentWindow || doc.defaultView;	//	Window
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,27 @@
+if(!dojo._hasResource["dijit._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base"] = true;
+dojo.provide("dijit._base");
+
+dojo.require("dijit._base.focus");
+dojo.require("dijit._base.manager");
+dojo.require("dijit._base.place");
+dojo.require("dijit._base.popup");
+dojo.require("dijit._base.scroll");
+dojo.require("dijit._base.sniff");
+dojo.require("dijit._base.bidi");
+dojo.require("dijit._base.typematic");
+dojo.require("dijit._base.wai");
+dojo.require("dijit._base.window");
+
+//	FIXME: Find a better way of solving this bug!
+if(dojo.isSafari){
+	//	Ugly-ass hack to solve bug #5626 for 1.1; basically force Safari to re-layout.
+	//	Note that we can't reliably use dojo.addOnLoad here because this bug is basically
+	//		a timing / race condition; so instead we use window.onload.
+	dojo.connect(window, "load", function(){
+		window.resizeBy(1,0);
+		setTimeout(function(){ window.resizeBy(-1,0); }, 10);
+	});
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/RichText.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/RichText.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/RichText.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,1449 @@
+if(!dojo._hasResource["dijit._editor.RichText"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.RichText"] = true;
+dojo.provide("dijit._editor.RichText");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._editor.selection");
+dojo.require("dijit._editor.html");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit.form", "Textarea", null, "zh,pt,da,tr,ru,de,ROOT,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+// used to restore content when user leaves this page then comes back
+// but do not try doing dojo.doc.write if we are using xd loading.
+// dojo.doc.write will only work if RichText.js is included in the dojo.js
+// file. If it is included in dojo.js and you want to allow rich text saving
+// for back/forward actions, then set dojo.config.allowXdRichTextSave = true.
+if(!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"]){
+	if(dojo._postLoad){
+		(function(){
+			var savetextarea = dojo.doc.createElement('textarea');
+			savetextarea.id = dijit._scopeName + "._editor.RichText.savedContent";
+			var s = savetextarea.style;
+			s.display='none';
+			s.position='absolute';
+			s.top="-100px";
+			s.left="-100px";
+			s.height="3px";
+			s.width="3px";
+			dojo.body().appendChild(savetextarea);
+		})();
+	}else{
+		//dojo.body() is not available before onLoad is fired
+		try{
+			dojo.doc.write('<textarea id="' + dijit._scopeName + '._editor.RichText.savedContent" ' +
+				'style="display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;"></textarea>');
+		}catch(e){ }
+	}
+}
+dojo.declare("dijit._editor.RichText", dijit._Widget, {
+	constructor: function(){
+		// summary:
+		//		dijit._editor.RichText is the core of the WYSIWYG editor in dojo, which
+		//		provides the basic editing features. It also encapsulates the differences
+		//		of different js engines for various browsers
+		//
+		// contentPreFilters: Array
+		//		pre content filter function register array.
+		//		these filters will be executed before the actual
+		//		editing area get the html content
+		this.contentPreFilters = [];
+
+		// contentPostFilters: Array
+		//		post content filter function register array.
+		//		these will be used on the resulting html
+		//		from contentDomPostFilters. The resuling
+		//		content is the final html (returned by getValue())
+		this.contentPostFilters = [];
+
+		// contentDomPreFilters: Array
+		//		pre content dom filter function register array.
+		//		these filters are applied after the result from
+		//		contentPreFilters are set to the editing area
+		this.contentDomPreFilters = [];
+
+		// contentDomPostFilters: Array
+		//		post content dom filter function register array.
+		//		these filters are executed on the editing area dom
+		//		the result from these will be passed to contentPostFilters
+		this.contentDomPostFilters = [];
+
+		// editingAreaStyleSheets: Array
+		//		array to store all the stylesheets applied to the editing area
+		this.editingAreaStyleSheets=[];
+
+		this._keyHandlers = {};
+		this.contentPreFilters.push(dojo.hitch(this, "_preFixUrlAttributes"));
+		if(dojo.isMoz){
+			this.contentPreFilters.push(this._fixContentForMoz);
+			this.contentPostFilters.push(this._removeMozBogus);
+		}else if(dojo.isSafari){
+			this.contentPostFilters.push(this._removeSafariBogus);
+		}
+		//this.contentDomPostFilters.push(this._postDomFixUrlAttributes);
+
+		this.onLoadDeferred = new dojo.Deferred();
+	},
+
+	// inheritWidth: Boolean
+	//		whether to inherit the parent's width or simply use 100%
+	inheritWidth: false,
+
+	// focusOnLoad: Boolean
+	//		whether focusing into this instance of richtext when page onload
+	focusOnLoad: false,
+
+	// name: String
+	//		If a save name is specified the content is saved and restored when the user
+	//		leave this page can come back, or if the editor is not properly closed after
+	//		editing has started.
+	name: "",
+
+	// styleSheets: String
+	//		semicolon (";") separated list of css files for the editing area
+	styleSheets: "",
+
+	// _content: String
+	//		temporary content storage
+	_content: "",
+
+	// height: String
+	//		set height to fix the editor at a specific height, with scrolling.
+	//		By default, this is 300px. If you want to have the editor always
+	//		resizes to accommodate the content, use AlwaysShowToolbar plugin
+	//		and set height=""
+	height: "300px",
+
+	// minHeight: String
+	//		The minimum height that the editor should have
+	minHeight: "1em",
+	
+	// isClosed: Boolean
+	isClosed: true,
+
+	// isLoaded: Boolean
+	isLoaded: false,
+
+	// _SEPARATOR: String
+	//		used to concat contents from multiple textareas into a single string
+	_SEPARATOR: "@@**%%__RICHTEXTBOUNDRY__%%**@@",
+
+	// onLoadDeferred: dojo.Deferred
+	//		deferred which is fired when the editor finishes loading
+	onLoadDeferred: null,
+
+	postCreate: function(){
+		// summary: init
+		dojo.publish(dijit._scopeName + "._editor.RichText::init", [this]);
+		this.open();
+		this.setupDefaultShortcuts();
+	},
+
+	setupDefaultShortcuts: function(){
+		// summary: add some default key handlers
+		// description:
+		// 		Overwrite this to setup your own handlers. The default
+		// 		implementation does not use Editor commands, but directly
+		//		executes the builtin commands within the underlying browser
+		//		support.
+		var exec = function(cmd, arg){
+			return arguments.length == 1 ? function(){ this.execCommand(cmd); } :
+				function(){ this.execCommand(cmd, arg); };
+		};
+
+		var ctrlKeyHandlers = { b: exec("bold"),
+			i: exec("italic"),
+			u: exec("underline"),
+			a: exec("selectall"),
+			s: function(){ this.save(true); },
+
+			"1": exec("formatblock", "h1"),
+			"2": exec("formatblock", "h2"),
+			"3": exec("formatblock", "h3"),
+			"4": exec("formatblock", "h4"),
+
+			"\\": exec("insertunorderedlist") };
+
+		if(!dojo.isIE){
+			ctrlKeyHandlers.Z = exec("redo"); //FIXME: undo?
+		}
+
+		for(var key in ctrlKeyHandlers){
+			this.addKeyHandler(key, this.KEY_CTRL, ctrlKeyHandlers[key]);
+		}
+	},
+
+	// events: Array
+	//		 events which should be connected to the underlying editing area
+	events: ["onKeyPress", "onKeyDown", "onKeyUp", "onClick"],
+
+	// events: Array
+	//		 events which should be connected to the underlying editing
+	//		 area, events in this array will be addListener with
+	//		 capture=true
+	captureEvents: [],
+
+	_editorCommandsLocalized: false,
+	_localizeEditorCommands: function(){
+		if(this._editorCommandsLocalized){
+			return;
+		}
+		this._editorCommandsLocalized = true;
+
+		//in IE, names for blockformat is locale dependent, so we cache the values here
+
+		//if the normal way fails, we try the hard way to get the list
+
+		//do not use _cacheLocalBlockFormatNames here, as it will
+		//trigger security warning in IE7
+
+		//in the array below, ul can not come directly after ol,
+		//otherwise the queryCommandValue returns Normal for it
+		var formats = ['p', 'pre', 'address', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'div', 'ul'];
+		var localhtml = "", format, i=0;
+		while((format=formats[i++])){
+			if(format.charAt(1) != 'l'){
+				localhtml += "<"+format+"><span>content</span></"+format+">";
+			}else{
+				localhtml += "<"+format+"><li>content</li></"+format+">";
+			}
+		}
+		//queryCommandValue returns empty if we hide editNode, so move it out of screen temporary
+		var div=dojo.doc.createElement('div');
+		div.style.position = "absolute";
+		div.style.left = "-2000px";
+		div.style.top = "-2000px";
+		dojo.doc.body.appendChild(div);
+		div.innerHTML = localhtml;
+		var node = div.firstChild;
+		while(node){
+			dijit._editor.selection.selectElement(node.firstChild);
+			dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [node.firstChild]);
+			var nativename = node.tagName.toLowerCase();
+			this._local2NativeFormatNames[nativename] = dojo.doc.queryCommandValue("formatblock");//this.queryCommandValue("formatblock");
+			this._native2LocalFormatNames[this._local2NativeFormatNames[nativename]] = nativename;
+			node = node.nextSibling;
+		}
+		dojo.doc.body.removeChild(div);
+	},
+
+	open: function(/*DomNode?*/element){
+		// summary:
+		//		Transforms the node referenced in this.domNode into a rich text editing
+		//		node. This will result in the creation and replacement with an <iframe>
+		//		if designMode(FF)/contentEditable(IE) is used.
+
+		if((!this.onLoadDeferred)||(this.onLoadDeferred.fired >= 0)){
+			this.onLoadDeferred = new dojo.Deferred();
+		}
+
+		if(!this.isClosed){ this.close(); }
+		dojo.publish(dijit._scopeName + "._editor.RichText::open", [ this ]);
+
+		this._content = "";
+		if((arguments.length == 1)&&(element["nodeName"])){ this.domNode = element; } // else unchanged
+
+		var html;
+		if(	(this.domNode["nodeName"])&&
+			(this.domNode.nodeName.toLowerCase() == "textarea")){
+			// if we were created from a textarea, then we need to create a
+			// new editing harness node.
+			this.textarea = this.domNode;
+			this.name=this.textarea.name;
+			html = this._preFilterContent(this.textarea.value);
+			this.domNode = dojo.doc.createElement("div");
+			this.domNode.setAttribute('widgetId',this.id);
+			this.textarea.removeAttribute('widgetId');
+			this.domNode.cssText = this.textarea.cssText;
+			this.domNode.className += " "+this.textarea.className;
+			dojo.place(this.domNode, this.textarea, "before");
+			var tmpFunc = dojo.hitch(this, function(){
+				//some browsers refuse to submit display=none textarea, so
+				//move the textarea out of screen instead
+				dojo.attr(this.textarea, 'tabIndex', '-1');
+				with(this.textarea.style){
+					display = "block";
+					position = "absolute";
+					left = top = "-1000px";
+
+					if(dojo.isIE){ //nasty IE bug: abnormal formatting if overflow is not hidden
+						this.__overflow = overflow;
+						overflow = "hidden";
+					}
+				}
+			});
+			if(dojo.isIE){
+				setTimeout(tmpFunc, 10);
+			}else{
+				tmpFunc();
+			}
+
+			// this.domNode.innerHTML = html;
+
+//				if(this.textarea.form){
+//					// FIXME: port: this used to be before advice!!!
+//					dojo.connect(this.textarea.form, "onsubmit", this, function(){
+//						// FIXME: should we be calling close() here instead?
+//						this.textarea.value = this.getValue();
+//					});
+//				}
+		}else{
+			html = this._preFilterContent(dijit._editor.getChildrenHtml(this.domNode));
+			this.domNode.innerHTML = '';
+		}
+		if(html == ""){ html = "&nbsp;"; }
+
+		var content = dojo.contentBox(this.domNode);
+		// var content = dojo.contentBox(this.srcNodeRef);
+		this._oldHeight = content.h;
+		this._oldWidth = content.w;
+
+		// If we're a list item we have to put in a blank line to force the
+		// bullet to nicely align at the top of text
+		if(	(this.domNode["nodeName"]) &&
+			(this.domNode.nodeName == "LI") ){
+			this.domNode.innerHTML = " <br>";
+		}
+
+		this.editingArea = dojo.doc.createElement("div");
+		this.domNode.appendChild(this.editingArea);
+
+		if(this.name != "" && (!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"])){
+			var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.savedContent");
+			if(saveTextarea.value != ""){
+				var datas = saveTextarea.value.split(this._SEPARATOR), i=0, dat;
+				while((dat=datas[i++])){
+					var data = dat.split(":");
+					if(data[0] == this.name){
+						html = data[1];
+						datas.splice(i, 1);
+						break;
+					}
+				}
+			}
+
+			// FIXME: need to do something different for Opera/Safari
+			this.connect(window, "onbeforeunload", "_saveContent");
+			// dojo.connect(window, "onunload", this, "_saveContent");
+		}
+
+		this.isClosed = false;
+		// Safari's selections go all out of whack if we do it inline,
+		// so for now IE is our only hero
+		//if(typeof dojo.doc.body.contentEditable != "undefined"){
+		if(dojo.isIE || dojo.isSafari || dojo.isOpera){ // contentEditable, easy		
+
+			if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){
+				console.debug("dijit._editor.RichText: When using cross-domain Dojo builds,"
+				+ " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"
+				+ " to the path on your domain to blank.html");
+			}
+
+			var burl = dojo.config["dojoBlankHtmlUrl"] || (dojo.moduleUrl("dojo", "resources/blank.html")+"");
+			var ifr = this.editorObject = this.iframe = dojo.doc.createElement('iframe');
+			ifr.id = this.id+"_iframe";
+			ifr.src = burl;
+			ifr.style.border = "none";
+			ifr.style.width = "100%";
+			ifr.frameBorder = 0;
+			// ifr.style.scrolling = this.height ? "auto" : "vertical";
+			this.editingArea.appendChild(ifr);
+			var h = null; // set later in non-ie6 branch
+			var loadFunc = dojo.hitch( this, function(){
+				if(h){ dojo.disconnect(h); h = null; }
+				this.window = ifr.contentWindow;
+				var d = this.document = this.window.document;
+				d.open();
+				d.write(this._getIframeDocTxt(html));
+				d.close();
+
+				if(dojo.isIE >= 7){
+					if(this.height){
+						ifr.style.height = this.height;
+					}
+					if(this.minHeight){
+						ifr.style.minHeight = this.minHeight;
+					}
+				}else{
+					ifr.style.height = this.height ? this.height : this.minHeight;
+				}
+
+				if(dojo.isIE){
+					this._localizeEditorCommands();
+				}
+
+				this.onLoad();
+				this.savedContent = this.getValue(true);
+			});
+			if(dojo.isIE && dojo.isIE < 7){ // IE 6 is a steaming pile...
+				var t = setInterval(function(){
+					if(ifr.contentWindow.isLoaded){
+						clearInterval(t);
+						loadFunc();
+					}
+				}, 100);
+			}else{ // blissful sanity!
+				h = dojo.connect(
+					((dojo.isIE) ? ifr.contentWindow : ifr), "onload", loadFunc
+				);
+			}
+		}else{ // designMode in iframe
+			this._drawIframe(html);
+			this.savedContent = this.getValue(true);
+		}
+
+		// TODO: this is a guess at the default line-height, kinda works
+		if(this.domNode.nodeName == "LI"){ this.domNode.lastChild.style.marginTop = "-1.2em"; }
+		this.domNode.className += " RichTextEditable";
+	},
+
+	//static cache variables shared among all instance of this class
+	_local2NativeFormatNames: {},
+	_native2LocalFormatNames: {},
+	_localizedIframeTitles: null,
+
+	_getIframeDocTxt: function(/* String */ html){
+		var _cs = dojo.getComputedStyle(this.domNode);
+		if(dojo.isIE || (!this.height && !dojo.isMoz)){
+			html="<div>"+html+"</div>";
+		}
+		var font = [ _cs.fontWeight, _cs.fontSize, _cs.fontFamily ].join(" ");
+
+		// line height is tricky - applying a units value will mess things up.
+		// if we can't get a non-units value, bail out.
+		var lineHeight = _cs.lineHeight;
+		if(lineHeight.indexOf("px") >= 0){
+			lineHeight = parseFloat(lineHeight)/parseFloat(_cs.fontSize);
+			// console.debug(lineHeight);
+		}else if(lineHeight.indexOf("em")>=0){
+			lineHeight = parseFloat(lineHeight);
+		}else{
+			lineHeight = "1.0";
+		}
+		return [
+			this.isLeftToRight() ? "<html><head>" : "<html dir='rtl'><head>",
+			(dojo.isMoz ? "<title>" + this._localizedIframeTitles.iframeEditTitle + "</title>" : ""),
+			"<style>",
+			"body,html {",
+			"	background:transparent;",
+			"	font:", font, ";",
+			"	padding: 1em 0 0 0;",
+			"	margin: -1em 0 0 0;", // remove extraneous vertical scrollbar on safari and firefox
+			"	height: 100%;",
+			"}",
+			// TODO: left positioning will cause contents to disappear out of view
+			//	   if it gets too wide for the visible area
+			"body{",
+			"	top:0px; left:0px; right:0px;",
+				((this.height||dojo.isOpera) ? "" : "position: fixed;"),
+			// FIXME: IE 6 won't understand min-height?
+			"	min-height:", this.minHeight, ";",
+			"	line-height:", lineHeight,
+			"}",
+			"p{ margin: 1em 0 !important; }",
+			(this.height ? // height:auto undoes the height:100%
+				"" : "body,html{height:auto;overflow-y:hidden;/*for IE*/} body > div {overflow-x:auto;/*for FF to show vertical scrollbar*/}"
+			),
+			"li > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; } ",
+			"li{ min-height:1.2em; }",
+			"</style>",
+			this._applyEditingAreaStyleSheets(),
+			"</head><body>"+html+"</body></html>"
+		].join(""); // String
+	},
+
+	_drawIframe: function(/*String*/html){
+		// summary:
+		//		Draws an iFrame using the existing one if one exists.
+		//		Used by Mozilla, Safari, and Opera
+
+		if(!this.iframe){
+			var ifr = this.iframe = dojo.doc.createElement("iframe");
+			ifr.id=this.id;
+			// this.iframe.src = "about:blank";
+			// dojo.doc.body.appendChild(this.iframe);
+			// console.debug(this.iframe.contentDocument.open());
+			// dojo.body().appendChild(this.iframe);
+			var ifrs = ifr.style;
+			// ifrs.border = "1px solid black";
+			ifrs.border = "none";
+			ifrs.lineHeight = "0"; // squash line height
+			ifrs.verticalAlign = "bottom";
+//			ifrs.scrolling = this.height ? "auto" : "vertical";
+			this.editorObject = this.iframe;
+			// get screen reader text for mozilla here, too
+			this._localizedIframeTitles = dojo.i18n.getLocalization("dijit.form", "Textarea");
+			// need to find any associated label element and update iframe document title
+			var label=dojo.query('label[for="'+this.id+'"]');
+			if(label.length){
+				this._localizedIframeTitles.iframeEditTitle = label[0].innerHTML + " " + this._localizedIframeTitles.iframeEditTitle;
+			}
+		}
+		// opera likes this to be outside the with block
+		//	this.iframe.src = "javascript:void(0)";//dojo.uri.dojoUri("src/widget/templates/richtextframe.html") + ((dojo.doc.domain != currentDomain) ? ("#"+dojo.doc.domain) : "");
+		this.iframe.style.width = this.inheritWidth ? this._oldWidth : "100%";
+
+		if(this.height){
+			this.iframe.style.height = this.height;
+		}else{
+			this.iframe.height = this._oldHeight;
+		}
+
+		var tmpContent;
+		if(this.textarea){
+			tmpContent = this.srcNodeRef;
+		}else{
+			tmpContent = dojo.doc.createElement('div');
+			tmpContent.style.display="none";
+			tmpContent.innerHTML = html;
+			//append tmpContent to under the current domNode so that the margin
+			//calculation below is correct
+			this.editingArea.appendChild(tmpContent);
+		}
+
+		this.editingArea.appendChild(this.iframe);
+
+		//do we want to show the content before the editing area finish loading here?
+		//if external style sheets are used for the editing area, the appearance now
+		//and after loading of the editing area won't be the same (and padding/margin
+		//calculation above may not be accurate)
+		//	tmpContent.style.display = "none";
+		//	this.editingArea.appendChild(this.iframe);
+
+		var _iframeInitialized = false;
+		// console.debug(this.iframe);
+		// var contentDoc = this.iframe.contentWindow.document;
+
+
+		// note that on Safari lower than 420+, we have to get the iframe
+		// by ID in order to get something w/ a contentDocument property
+
+		var contentDoc = this.iframe.contentDocument;
+		contentDoc.open();
+		if(dojo.isAIR){
+			contentDoc.body.innerHTML = html;
+		}else{
+			contentDoc.write(this._getIframeDocTxt(html));
+		}
+		contentDoc.close();
+
+		// now we wait for onload. Janky hack!
+		var ifrFunc = dojo.hitch(this, function(){
+			if(!_iframeInitialized){
+				_iframeInitialized = true;
+			}else{ return; }
+			if(!this.editNode){
+				try{
+					if(this.iframe.contentWindow){
+						this.window = this.iframe.contentWindow;
+						this.document = this.iframe.contentWindow.document
+					}else if(this.iframe.contentDocument){
+						// for opera
+						this.window = this.iframe.contentDocument.window;
+						this.document = this.iframe.contentDocument;
+					}
+					if(!this.document.body){
+						throw 'Error';
+					}
+				}catch(e){
+					setTimeout(ifrFunc,500);
+					_iframeInitialized = false;
+					return;
+				}
+
+				dojo._destroyElement(tmpContent);
+				this.onLoad();
+			}else{
+				dojo._destroyElement(tmpContent);
+				this.editNode.innerHTML = html;
+				this.onDisplayChanged();
+			}
+			this._preDomFilterContent(this.editNode);
+		});
+
+		ifrFunc();
+	},
+
+	_applyEditingAreaStyleSheets: function(){
+		// summary:
+		//		apply the specified css files in styleSheets
+		var files = [];
+		if(this.styleSheets){
+			files = this.styleSheets.split(';');
+			this.styleSheets = '';
+		}
+
+		//empty this.editingAreaStyleSheets here, as it will be filled in addStyleSheet
+		files = files.concat(this.editingAreaStyleSheets);
+		this.editingAreaStyleSheets = [];
+
+		var text='', i=0, url;
+		while((url=files[i++])){
+			var abstring = (new dojo._Url(dojo.global.location, url)).toString();
+			this.editingAreaStyleSheets.push(abstring);
+			text += '<link rel="stylesheet" type="text/css" href="'+abstring+'"/>'
+		}
+		return text;
+	},
+
+	addStyleSheet: function(/*dojo._Url*/uri){
+		// summary:
+		//		add an external stylesheet for the editing area
+		// uri:	a dojo.uri.Uri pointing to the url of the external css file
+		var url=uri.toString();
+
+		//if uri is relative, then convert it to absolute so that it can be resolved correctly in iframe
+		if(url.charAt(0) == '.' || (url.charAt(0) != '/' && !uri.host)){
+			url = (new dojo._Url(dojo.global.location, url)).toString();
+		}
+
+		if(dojo.indexOf(this.editingAreaStyleSheets, url) > -1){
+//			console.debug("dijit._editor.RichText.addStyleSheet: Style sheet "+url+" is already applied");
+			return;
+		}
+
+		this.editingAreaStyleSheets.push(url);
+		if(this.document.createStyleSheet){ //IE
+			this.document.createStyleSheet(url);
+		}else{ //other browser
+			var head = this.document.getElementsByTagName("head")[0];
+			var stylesheet = this.document.createElement("link");
+			with(stylesheet){
+				rel="stylesheet";
+				type="text/css";
+				href=url;
+			}
+			head.appendChild(stylesheet);
+		}
+	},
+
+	removeStyleSheet: function(/*dojo._Url*/uri){
+		// summary:
+		//		remove an external stylesheet for the editing area
+		var url=uri.toString();
+		//if uri is relative, then convert it to absolute so that it can be resolved correctly in iframe
+		if(url.charAt(0) == '.' || (url.charAt(0) != '/' && !uri.host)){
+			url = (new dojo._Url(dojo.global.location, url)).toString();
+		}
+		var index = dojo.indexOf(this.editingAreaStyleSheets, url);
+		if(index == -1){
+//			console.debug("dijit._editor.RichText.removeStyleSheet: Style sheet "+url+" has not been applied");
+			return;
+		}
+		delete this.editingAreaStyleSheets[index];
+		dojo.withGlobal(this.window,'query', dojo, ['link:[href="'+url+'"]']).orphan()
+	},
+
+	disabled: true,
+	_mozSettingProps: ['styleWithCSS','insertBrOnReturn'],
+	setDisabled: function(/*Boolean*/ disabled){
+		if(dojo.isIE || dojo.isSafari || dojo.isOpera){
+			if(dojo.isIE){ this.editNode.unselectable = "on"; } // prevent IE from setting focus
+			this.editNode.contentEditable = !disabled;
+			if(dojo.isIE){
+				var _this = this;
+				setTimeout(function(){ _this.editNode.unselectable = "off"; }, 0);
+			}
+		}else{ //moz
+			if(disabled){
+				//AP: why isn't this set in the constructor, or put in mozSettingProps as a hash?
+				this._mozSettings=[false,this.blockNodeForEnter==='BR'];
+			}
+			this.document.designMode=(disabled?'off':'on');
+			if(!disabled && this._mozSettings){
+				dojo.forEach(this._mozSettingProps, function(s,i){
+					this.document.execCommand(s,false,this._mozSettings[i]);
+				},this);
+			}
+//			this.document.execCommand('contentReadOnly', false, disabled);
+//				if(disabled){
+//					this.blur(); //to remove the blinking caret
+//				}
+		}
+		this.disabled = disabled;
+	},
+
+/* Event handlers
+ *****************/
+
+	_isResized: function(){ return false; },
+
+	onLoad: function(/* Event */ e){
+		// summary: handler after the content of the document finishes loading
+		this.isLoaded = true;
+		if(!this.window.__registeredWindow){
+			this.window.__registeredWindow=true;
+			dijit.registerWin(this.window);
+		}
+		if(!dojo.isIE && (this.height || dojo.isMoz)){
+			this.editNode=this.document.body;
+		}else{
+			this.editNode=this.document.body.firstChild;
+			var _this = this;
+			if(dojo.isIE){ // #4996 IE wants to focus the BODY tag
+				var tabStop = this.tabStop = dojo.doc.createElement('<div tabIndex=-1>');
+				this.editingArea.appendChild(tabStop);
+				this.iframe.onfocus = function(){ _this.editNode.setActive(); }
+			}
+		}
+
+		try{
+			this.setDisabled(false);
+		}catch(e){
+			// Firefox throws an exception if the editor is initially hidden
+			// so, if this fails, try again onClick by adding "once" advice
+			var handle = dojo.connect(this, "onClick", this, function(){
+				this.setDisabled(false);
+				dojo.disconnect(handle);
+			});
+		}
+
+		this._preDomFilterContent(this.editNode);
+
+		var events=this.events.concat(this.captureEvents),i=0,et;
+		while((et=events[i++])){
+			this.connect(this.document, et.toLowerCase(), et);
+		}
+		if(!dojo.isIE){
+			try{ // sanity check for Mozilla
+			//AP: what's the point of this?
+//					this.document.execCommand("useCSS", false, true); // old moz call
+				this.document.execCommand("styleWithCSS", false, false); // new moz call
+				//this.document.execCommand("insertBrOnReturn", false, false); // new moz call
+			}catch(e2){ }
+			// FIXME: when scrollbars appear/disappear this needs to be fired
+		}else{ // IE contentEditable
+			// give the node Layout on IE
+			this.connect(this.document, "onmousedown", "_onMouseDown"); // #4996 fix focus
+			this.editNode.style.zoom = 1.0;
+		}
+
+		if(this.focusOnLoad){
+			setTimeout(dojo.hitch(this, "focus"), 0); // have to wait for IE to set unselectable=off
+		}
+
+		this.onDisplayChanged(e);
+		if(this.onLoadDeferred){
+			this.onLoadDeferred.callback(true);
+		}
+	},
+
+	onKeyDown: function(/* Event */ e){
+		// summary: Fired on keydown
+
+		// we need this event at the moment to get the events from control keys
+		// such as the backspace. It might be possible to add this to Dojo, so that
+		// keyPress events can be emulated by the keyDown and keyUp detection.
+		if(dojo.isIE){
+			if(e.keyCode == dojo.keys.TAB && e.shiftKey && !e.ctrlKey && !e.altKey){
+				// focus the BODY so the browser will tab away from it instead
+				this.iframe.focus();
+			}else if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey){
+				// focus the BODY so the browser will tab away from it instead
+				this.tabStop.focus();
+			}else if(e.keyCode === dojo.keys.BACKSPACE && this.document.selection.type === "Control"){
+				// IE has a bug where if a non-text object is selected in the editor,
+		  // hitting backspace would act as if the browser's back button was
+		  // clicked instead of deleting the object. see #1069
+				dojo.stopEvent(e);
+				this.execCommand("delete");
+			}else if((65 <= e.keyCode&&e.keyCode <= 90) ||
+				(e.keyCode>=37&&e.keyCode<=40) // FIXME: get this from connect() instead!
+			){ //arrow keys
+				e.charCode = e.keyCode;
+				this.onKeyPress(e);
+			}
+		}else if(dojo.isMoz){
+			if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
+				// update iframe document title for screen reader
+				this.iframe.contentDocument.title = this._localizedIframeTitles.iframeFocusTitle;
+				
+				// Place focus on the iframe. A subsequent tab or shift tab will put focus
+				// on the correct control.
+				this.iframe.focus();  // this.focus(); won't work
+				dojo.stopEvent(e);
+			}else if(e.keyCode == dojo.keys.TAB && e.shiftKey){
+				// if there is a toolbar, set focus to it, otherwise ignore
+				if(this.toolbar){
+					this.toolbar.focus();
+				}
+				dojo.stopEvent(e);
+			}
+		}
+	},
+
+	onKeyUp: function(e){
+		// summary: Fired on keyup
+		return;
+	},
+
+	KEY_CTRL: 1,
+	KEY_SHIFT: 2,
+
+	onKeyPress: function(e){
+		// summary: Fired on keypress
+
+		// handle the various key events
+		var modifiers = (e.ctrlKey && !e.altKey) ? this.KEY_CTRL : 0 | e.shiftKey ? this.KEY_SHIFT : 0;
+
+		var key = e.keyChar || e.keyCode;
+		if(this._keyHandlers[key]){
+			// console.debug("char:", e.key);
+			var handlers = this._keyHandlers[key], i = 0, h;
+			while((h = handlers[i++])){
+				if(modifiers == h.modifiers){
+					if(!h.handler.apply(this,arguments)){
+						e.preventDefault();
+					}
+					break;
+				}
+			}
+		}
+
+		// function call after the character has been inserted
+		setTimeout(dojo.hitch(this, function(){
+			this.onKeyPressed(e);
+		}), 1);
+	},
+
+	addKeyHandler: function(/*String*/key, /*Int*/modifiers, /*Function*/handler){
+		// summary: add a handler for a keyboard shortcut
+		if(!dojo.isArray(this._keyHandlers[key])){ this._keyHandlers[key] = []; }
+		this._keyHandlers[key].push({
+			modifiers: modifiers || 0,
+			handler: handler
+		});
+	},
+
+	onKeyPressed: function(/*Event*/e){
+		this.onDisplayChanged(/*e*/); // can't pass in e
+	},
+
+	onClick: function(/*Event*/e){
+//		console.info('onClick',this._tryDesignModeOn);
+		this.onDisplayChanged(e);
+	},
+
+	_onMouseDown: function(/*Event*/e){ // IE only to prevent 2 clicks to focus
+		if(!this._focused && !this.disabled){
+			this.focus();
+		}
+	},
+
+	_onBlur: function(e){
+		this.inherited(arguments);
+		var _c=this.getValue(true);
+		if(_c!=this.savedContent){
+			this.onChange(_c);
+			this.savedContent=_c;
+		}
+		if(dojo.isMoz && this.iframe){
+			this.iframe.contentDocument.title = this._localizedIframeTitles.iframeEditTitle;
+		} 
+	},
+	_initialFocus: true,
+	_onFocus: function(/*Event*/e){
+		// summary: Fired on focus
+		this.inherited(arguments);
+		if(dojo.isMoz && this._initialFocus){
+			this._initialFocus = false;
+			if(this.editNode.innerHTML.replace(/^\s+|\s+$/g, "") == "&nbsp;"){
+				this.placeCursorAtStart();
+//					this.execCommand("selectall");
+//					this.window.getSelection().collapseToStart();
+			}
+		}
+	},
+
+	// TODO: why is this needed - should we deprecate this ?
+	blur: function(){
+		// summary: remove focus from this instance
+		if(!dojo.isIE && this.window.document.documentElement && this.window.document.documentElement.focus){
+			this.window.document.documentElement.focus();
+		}else if(dojo.doc.body.focus){
+			dojo.doc.body.focus();
+		}
+	},
+
+	focus: function(){
+		// summary: move focus to this instance
+		if(!dojo.isIE){
+			dijit.focus(this.iframe);
+		}else if(this.editNode && this.editNode.focus){
+			// editNode may be hidden in display:none div, lets just punt in this case
+			//this.editNode.focus(); -> causes IE to scroll always (strict and quirks mode) to the top the Iframe 
+			// if we fire the event manually and let the browser handle the focusing, the latest  
+			// cursor position is focused like in FF                         
+			this.iframe.fireEvent('onfocus', document.createEventObject()); // createEventObject only in IE 
+//		}else{
+// TODO: should we throw here?
+//			console.debug("Have no idea how to focus into the editor!");
+		}
+	},
+
+//		_lastUpdate: 0,
+	updateInterval: 200,
+	_updateTimer: null,
+	onDisplayChanged: function(/*Event*/e){
+		// summary:
+		//		This event will be fired everytime the display context
+		//		changes and the result needs to be reflected in the UI.
+		// description:
+		//		If you don't want to have update too often,
+		//		onNormalizedDisplayChanged should be used instead
+
+//			var _t=new Date();
+		if(!this._updateTimer){
+//				this._lastUpdate=_t;
+			if(this._updateTimer){
+				clearTimeout(this._updateTimer);
+			}
+			this._updateTimer=setTimeout(dojo.hitch(this,this.onNormalizedDisplayChanged),this.updateInterval);
+		}
+	},
+	onNormalizedDisplayChanged: function(){
+		// summary:
+		//		This event is fired every updateInterval ms or more
+		// description:
+		//		If something needs to happen immidiately after a
+		//		user change, please use onDisplayChanged instead
+		this._updateTimer=null;
+	},
+	onChange: function(newContent){
+		// summary:
+		//		this is fired if and only if the editor loses focus and
+		//		the content is changed
+
+//			console.log('onChange',newContent);
+	},
+	_normalizeCommand: function(/*String*/cmd){
+		// summary:
+		//		Used as the advice function by dojo.connect to map our
+		//		normalized set of commands to those supported by the target
+		//		browser
+
+		var command = cmd.toLowerCase();
+		if(command == "hilitecolor" && !dojo.isMoz){
+			command = "backcolor";
+		}
+
+		return command;
+	},
+
+	queryCommandAvailable: function(/*String*/command){
+		// summary:
+		//		Tests whether a command is supported by the host. Clients SHOULD check
+		//		whether a command is supported before attempting to use it, behaviour
+		//		for unsupported commands is undefined.
+		// command: The command to test for
+		var ie = 1;
+		var mozilla = 1 << 1;
+		var safari = 1 << 2;
+		var opera = 1 << 3;
+		var safari420 = 1 << 4;
+
+		var gt420 = dojo.isSafari;
+
+		function isSupportedBy(browsers){
+			return {
+				ie: Boolean(browsers & ie),
+				mozilla: Boolean(browsers & mozilla),
+				safari: Boolean(browsers & safari),
+				safari420: Boolean(browsers & safari420),
+				opera: Boolean(browsers & opera)
+			}
+		}
+
+		var supportedBy = null;
+
+		switch(command.toLowerCase()){
+			case "bold": case "italic": case "underline":
+			case "subscript": case "superscript":
+			case "fontname": case "fontsize":
+			case "forecolor": case "hilitecolor":
+			case "justifycenter": case "justifyfull": case "justifyleft":
+			case "justifyright": case "delete": case "selectall": case "toggledir":
+				supportedBy = isSupportedBy(mozilla | ie | safari | opera);
+				break;
+
+			case "createlink": case "unlink": case "removeformat":
+			case "inserthorizontalrule": case "insertimage":
+			case "insertorderedlist": case "insertunorderedlist":
+			case "indent": case "outdent": case "formatblock":
+			case "inserthtml": case "undo": case "redo": case "strikethrough":
+				supportedBy = isSupportedBy(mozilla | ie | opera | safari420);
+				break;
+
+			case "blockdirltr": case "blockdirrtl":
+			case "dirltr": case "dirrtl":
+			case "inlinedirltr": case "inlinedirrtl":
+				supportedBy = isSupportedBy(ie);
+				break;
+			case "cut": case "copy": case "paste":
+				supportedBy = isSupportedBy( ie | mozilla | safari420);
+				break;
+
+			case "inserttable":
+				supportedBy = isSupportedBy(mozilla | ie);
+				break;
+
+			case "insertcell": case "insertcol": case "insertrow":
+			case "deletecells": case "deletecols": case "deleterows":
+			case "mergecells": case "splitcell":
+				supportedBy = isSupportedBy(ie | mozilla);
+				break;
+
+			default: return false;
+		}
+
+		return (dojo.isIE && supportedBy.ie) ||
+			(dojo.isMoz && supportedBy.mozilla) ||
+			(dojo.isSafari && supportedBy.safari) ||
+			(gt420 && supportedBy.safari420) ||
+			(dojo.isOpera && supportedBy.opera);  // Boolean return true if the command is supported, false otherwise
+	},
+
+	execCommand: function(/*String*/command, argument){
+		// summary: Executes a command in the Rich Text area
+		// command: The command to execute
+		// argument: An optional argument to the command
+		var returnValue;
+
+		//focus() is required for IE to work
+		//In addition, focus() makes sure after the execution of
+		//the command, the editor receives the focus as expected
+		this.focus();
+
+		command = this._normalizeCommand(command);
+		if(argument != undefined){
+			if(command == "heading"){
+				throw new Error("unimplemented");
+			}else if((command == "formatblock") && dojo.isIE){
+				argument = '<'+argument+'>';
+			}
+		}
+		if(command == "inserthtml"){
+			argument=this._preFilterContent(argument);
+			if(dojo.isIE){
+				var insertRange = this.document.selection.createRange();
+				if(this.document.selection.type.toUpperCase()=='CONTROL'){
+					var n=insertRange.item(0);
+					while(insertRange.length){
+						insertRange.remove(insertRange.item(0));
+					}
+					n.outerHTML=argument;
+				}else{
+					insertRange.pasteHTML(argument);
+				}
+				insertRange.select();
+				//insertRange.collapse(true);
+				returnValue=true;
+			}else if(dojo.isMoz && !argument.length){
+				//mozilla can not inserthtml an empty html to delete current selection
+				//so we delete the selection instead in this case
+				dojo.withGlobal(this.window,'remove',dijit._editor.selection);
+				returnValue=true;
+			}else{
+				returnValue=this.document.execCommand(command, false, argument);
+			}
+		}else if(
+			(command == "unlink")&&
+			(this.queryCommandEnabled("unlink"))&&
+			(dojo.isMoz || dojo.isSafari)
+		){
+			// fix up unlink in Mozilla to unlink the link and not just the selection
+
+			// grab selection
+			// Mozilla gets upset if we just store the range so we have to
+			// get the basic properties and recreate to save the selection
+			var selection = this.window.getSelection();
+			//	var selectionRange = selection.getRangeAt(0);
+			//	var selectionStartContainer = selectionRange.startContainer;
+			//	var selectionStartOffset = selectionRange.startOffset;
+			//	var selectionEndContainer = selectionRange.endContainer;
+			//	var selectionEndOffset = selectionRange.endOffset;
+
+			// select our link and unlink
+			var a = dojo.withGlobal(this.window, "getAncestorElement",dijit._editor.selection, ['a']);
+			dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [a]);
+
+			returnValue=this.document.execCommand("unlink", false, null);
+		}else if((command == "hilitecolor")&&(dojo.isMoz)){
+//				// mozilla doesn't support hilitecolor properly when useCSS is
+//				// set to false (bugzilla #279330)
+
+			this.document.execCommand("styleWithCSS", false, true);
+			returnValue = this.document.execCommand(command, false, argument);
+			this.document.execCommand("styleWithCSS", false, false);
+
+		}else if((dojo.isIE)&&( (command == "backcolor")||(command == "forecolor") )){
+			// Tested under IE 6 XP2, no problem here, comment out
+			// IE weirdly collapses ranges when we exec these commands, so prevent it
+//				var tr = this.document.selection.createRange();
+			argument = arguments.length > 1 ? argument : null;
+			returnValue = this.document.execCommand(command, false, argument);
+
+			// timeout is workaround for weird IE behavior were the text
+			// selection gets correctly re-created, but subsequent input
+			// apparently isn't bound to it
+//				setTimeout(function(){tr.select();}, 1);
+		}else{
+			argument = arguments.length > 1 ? argument : null;
+//				if(dojo.isMoz){
+//					this.document = this.iframe.contentWindow.document
+//				}
+
+			if(argument || command!="createlink"){
+				returnValue = this.document.execCommand(command, false, argument);
+			}
+		}
+
+		this.onDisplayChanged();
+		return returnValue;
+	},
+
+	queryCommandEnabled: function(/*String*/command){
+		// summary: check whether a command is enabled or not
+
+		if(this.disabled){ return false; }
+		command = this._normalizeCommand(command);
+		if(dojo.isMoz || dojo.isSafari){
+			if(command == "unlink"){ // mozilla returns true always
+				// console.debug(dojo.withGlobal(this.window, "hasAncestorElement",dijit._editor.selection, ['a']));
+				return dojo.withGlobal(this.window, "hasAncestorElement",dijit._editor.selection, ['a']);
+			}else if(command == "inserttable"){
+				return true;
+			}
+		}
+		//see #4109
+		if(dojo.isSafari){
+			if(command == "copy"){
+				command = "cut";
+			}else if(command == "paste"){
+				return true;
+			}
+		}
+
+		// return this.document.queryCommandEnabled(command);
+		var elem = dojo.isIE ? this.document.selection.createRange() : this.document;
+		return elem.queryCommandEnabled(command);
+	},
+
+	queryCommandState: function(command){
+		// summary: check the state of a given command
+
+		if(this.disabled){ return false; }
+		command = this._normalizeCommand(command);
+		return this.document.queryCommandState(command);
+	},
+
+	queryCommandValue: function(command){
+		// summary: check the value of a given command
+
+		if(this.disabled){ return false; }
+		command = this._normalizeCommand(command);
+		if(dojo.isIE && command == "formatblock"){
+			return this._local2NativeFormatNames[this.document.queryCommandValue(command)];
+		}
+		return this.document.queryCommandValue(command);
+	},
+
+	// Misc.
+
+	placeCursorAtStart: function(){
+		// summary:
+		//		place the cursor at the start of the editing area
+		this.focus();
+
+		//see comments in placeCursorAtEnd
+		var isvalid=false;
+		if(dojo.isMoz){
+			var first=this.editNode.firstChild;
+			while(first){
+				if(first.nodeType == 3){
+					if(first.nodeValue.replace(/^\s+|\s+$/g, "").length>0){
+						isvalid=true;
+						dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [first]);
+						break;
+					}
+				}else if(first.nodeType == 1){
+					isvalid=true;
+					dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [first]);
+					break;
+				}
+				first = first.nextSibling;
+			}
+		}else{
+			isvalid=true;
+			dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [this.editNode]);
+		}
+		if(isvalid){
+			dojo.withGlobal(this.window, "collapse", dijit._editor.selection, [true]);
+		}
+	},
+
+	placeCursorAtEnd: function(){
+		// summary:
+		//		place the cursor at the end of the editing area
+		this.focus();
+
+		//In mozilla, if last child is not a text node, we have to use selectElementChildren on this.editNode.lastChild
+		//otherwise the cursor would be placed at the end of the closing tag of this.editNode.lastChild
+		var isvalid=false;
+		if(dojo.isMoz){
+			var last=this.editNode.lastChild;
+			while(last){
+				if(last.nodeType == 3){
+					if(last.nodeValue.replace(/^\s+|\s+$/g, "").length>0){
+						isvalid=true;
+						dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last]);
+						break;
+					}
+				}else if(last.nodeType == 1){
+					isvalid=true;
+					if(last.lastChild){
+						dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last.lastChild]);
+					}else{
+						dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last]);
+					}
+					break;
+				}
+				last = last.previousSibling;
+			}
+		}else{
+			isvalid=true;
+			dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [this.editNode]);
+		}
+		if(isvalid){
+			dojo.withGlobal(this.window, "collapse", dijit._editor.selection, [false]);
+		}
+	},
+
+	getValue: function(/*Boolean?*/nonDestructive){
+		// summary:
+		//		return the current content of the editing area (post filters are applied)
+		if(this.textarea){
+			if(this.isClosed || !this.isLoaded){
+				return this.textarea.value;
+			}
+		}
+
+		return this._postFilterContent(null, nonDestructive);
+	},
+
+	setValue: function(/*String*/html){
+		// summary:
+		//		this function set the content. No undo history is preserved
+
+		if(!this.isLoaded){
+			// try again after the editor is finished loading
+			this.onLoadDeferred.addCallback(dojo.hitch(this, function(){
+				this.setValue(html);
+			}));
+			return;
+		}
+
+		if(this.textarea && (this.isClosed || !this.isLoaded)){
+			this.textarea.value=html;
+		}else{
+			html = this._preFilterContent(html);
+			var node = this.isClosed ? this.domNode : this.editNode;
+			node.innerHTML = html;
+			this._preDomFilterContent(node);
+		}
+
+		this.onDisplayChanged();
+	},
+
+	replaceValue: function(/*String*/html){
+		// summary:
+		//		this function set the content while trying to maintain the undo stack
+		//		(now only works fine with Moz, this is identical to setValue in all
+		//		other browsers)
+		if(this.isClosed){
+			this.setValue(html);
+		}else if(this.window && this.window.getSelection && !dojo.isMoz){ // Safari
+			// look ma! it's a totally f'd browser!
+			this.setValue(html);
+		}else if(this.window && this.window.getSelection){ // Moz
+			html = this._preFilterContent(html);
+			this.execCommand("selectall");
+			if(dojo.isMoz && !html){ html = "&nbsp;" }
+			this.execCommand("inserthtml", html);
+			this._preDomFilterContent(this.editNode);
+		}else if(this.document && this.document.selection){//IE
+			//In IE, when the first element is not a text node, say
+			//an <a> tag, when replacing the content of the editing
+			//area, the <a> tag will be around all the content
+			//so for now, use setValue for IE too
+			this.setValue(html);
+		}
+	},
+
+	_preFilterContent: function(/*String*/html){
+		// summary:
+		//		filter the input before setting the content of the editing area
+		var ec = html;
+		dojo.forEach(this.contentPreFilters, function(ef){ if(ef){ ec = ef(ec); } });
+		return ec;
+	},
+	_preDomFilterContent: function(/*DomNode*/dom){
+		// summary:
+		//		filter the input
+		dom = dom || this.editNode;
+		dojo.forEach(this.contentDomPreFilters, function(ef){
+			if(ef && dojo.isFunction(ef)){
+				ef(dom);
+			}
+		}, this);
+	},
+
+	_postFilterContent: function(/*DomNode|DomNode[]|String?*/dom,/*Boolean?*/nonDestructive){
+		// summary:
+		//		filter the output after getting the content of the editing area
+		var ec;
+		if(!dojo.isString(dom)){
+			dom = dom || this.editNode;
+			if(this.contentDomPostFilters.length){
+				if(nonDestructive && dom['cloneNode']){
+					dom = dom.cloneNode(true);
+				}
+				dojo.forEach(this.contentDomPostFilters, function(ef){
+					dom = ef(dom);
+				});
+			}
+			ec = dijit._editor.getChildrenHtml(dom);
+		}else{
+			ec = dom;
+		}
+		
+		if(!ec.replace(/^(?:\s|\xA0)+/g, "").replace(/(?:\s|\xA0)+$/g,"").length){ ec = ""; }
+
+		//	if(dojo.isIE){
+		//		//removing appended <P>&nbsp;</P> for IE
+		//		ec = ec.replace(/(?:<p>&nbsp;</p>[\n\r]*)+$/i,"");
+		//	}
+		dojo.forEach(this.contentPostFilters, function(ef){
+			ec = ef(ec);
+		});
+
+		return ec;
+	},
+
+	_saveContent: function(/*Event*/e){
+		// summary:
+		//		Saves the content in an onunload event if the editor has not been closed
+		var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.savedContent");
+		saveTextarea.value += this._SEPARATOR + this.name + ":" + this.getValue();
+	},
+
+	escapeXml: function(/*String*/str, /*Boolean*/noSingleQuotes){
+		dojo.deprecated('dijit.Editor::escapeXml is deprecated','use dijit._editor.escapeXml instead', 2);
+		return dijit._editor.escapeXml(str,noSingleQuotes);
+	},
+
+	getNodeHtml: function(/* DomNode */node){
+		dojo.deprecated('dijit.Editor::getNodeHtml is deprecated','use dijit._editor.getNodeHtml instead', 2);
+		return dijit._editor.getNodeHtml(node);
+	},
+
+	getNodeChildrenHtml: function(/* DomNode */dom){
+		dojo.deprecated('dijit.Editor::getNodeChildrenHtml is deprecated','use dijit._editor.getChildrenHtml instead', 2);
+		return dijit._editor.getChildrenHtml(dom);
+	},
+
+	close: function(/*Boolean*/save, /*Boolean*/force){
+		// summary:
+		//		Kills the editor and optionally writes back the modified contents to the
+		//		element from which it originated.
+		// save:
+		//		Whether or not to save the changes. If false, the changes are discarded.
+		// force:
+		if(this.isClosed){return false; }
+
+		if(!arguments.length){ save = true; }
+		this._content = this.getValue();
+		var changed = (this.savedContent != this._content);
+
+		// line height is squashed for iframes
+		// FIXME: why was this here? if(this.iframe){ this.domNode.style.lineHeight = null; }
+
+		if(this.interval){ clearInterval(this.interval); }
+
+		if(this.textarea){
+			with(this.textarea.style){
+				position = "";
+				left = top = "";
+				if(dojo.isIE){
+					overflow = this.__overflow;
+					this.__overflow = null;
+				}
+			}
+			this.textarea.value = save ? this._content : this.savedContent;
+			dojo._destroyElement(this.domNode);
+			this.domNode = this.textarea;
+		}else{
+//			if(save){
+				//why we treat moz differently? comment out to fix #1061
+//					if(dojo.isMoz){
+//						var nc = dojo.doc.createElement("span");
+//						this.domNode.appendChild(nc);
+//						nc.innerHTML = this.editNode.innerHTML;
+//					}else{
+//						this.domNode.innerHTML = this._content;
+//					}
+//			}
+			this.domNode.innerHTML = save ? this._content : this.savedContent;
+		}
+
+		dojo.removeClass(this.domNode, "RichTextEditable");
+		this.isClosed = true;
+		this.isLoaded = false;
+		// FIXME: is this always the right thing to do?
+		delete this.editNode;
+
+		if(this.window && this.window._frameElement){
+			this.window._frameElement = null;
+		}
+
+		this.window = null;
+		this.document = null;
+		this.editingArea = null;
+		this.editorObject = null;
+
+		return changed; // Boolean: whether the content has been modified
+	},
+
+	destroyRendering: function(){
+		// summary: stub	
+	}, 
+
+	destroy: function(){
+		this.destroyRendering();
+		if(!this.isClosed){ this.close(false); }
+		this.inherited("destroy",arguments);
+		//dijit._editor.RichText.superclass.destroy.call(this);
+	},
+
+	_removeMozBogus: function(/* String */ html){
+		return html.replace(/\stype="_moz"/gi, '').replace(/\s_moz_dirty=""/gi, ''); // String
+	},
+	_removeSafariBogus: function(/* String */ html){
+		return html.replace(/\sclass="webkit-block-placeholder"/gi, ''); // String
+	},
+	_fixContentForMoz: function(/* String */ html){
+		// summary:
+		//		Moz can not handle strong/em tags correctly, convert them to b/i
+		return html.replace(/<(\/)?strong([ \>])/gi, '<$1b$2')
+			.replace(/<(\/)?em([ \>])/gi, '<$1i$2' ); // String
+	},
+
+	_srcInImgRegex	: /(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi ,
+	_hrefInARegex	: /(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi ,
+
+	_preFixUrlAttributes: function(/* String */ html){
+		return html.replace(this._hrefInARegex, '$1$4$2$3$5$2 _djrealurl=$2$3$5$2')
+			.replace(this._srcInImgRegex, '$1$4$2$3$5$2 _djrealurl=$2$3$5$2'); // String
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/_Plugin.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/_Plugin.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/_Plugin.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,101 @@
+if(!dojo._hasResource["dijit._editor._Plugin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor._Plugin"] = true;
+dojo.provide("dijit._editor._Plugin");
+dojo.require("dijit._Widget");
+dojo.require("dijit.Editor");
+dojo.require("dijit.form.Button");
+
+dojo.declare("dijit._editor._Plugin", null, {
+	// summary
+	//		This represents a "plugin" to the editor, which is basically
+	//		a single button on the Toolbar and some associated code
+	constructor: function(/*Object?*/args, /*DomNode?*/node){
+		if(args){
+			dojo.mixin(this, args);
+		}
+		this._connects=[];
+	},
+
+	editor: null,
+	iconClassPrefix: "dijitEditorIcon",
+	button: null,
+	queryCommand: null,
+	command: "",
+	commandArg: null,
+	useDefaultCommand: true,
+	buttonClass: dijit.form.Button,
+	getLabel: function(key){
+		return this.editor.commands[key];
+	},
+	_initButton: function(props){
+		if(this.command.length){
+			var label = this.getLabel(this.command);
+			var className = this.iconClassPrefix+" "+this.iconClassPrefix + this.command.charAt(0).toUpperCase() + this.command.substr(1);
+			if(!this.button){
+				props = dojo.mixin({
+					label: label,
+					showLabel: false,
+					iconClass: className,
+					dropDown: this.dropDown,
+					tabIndex: "-1"
+				}, props || {});
+				this.button = new this.buttonClass(props);
+			}
+		}
+	},
+	destroy: function(f){
+		dojo.forEach(this._connects, dojo.disconnect);
+	},
+	connect: function(o, f, tf){
+		this._connects.push(dojo.connect(o, f, this, tf));
+	},
+	updateState: function(){
+		var _e = this.editor;
+		var _c = this.command;
+		if(!_e){ return; }
+		if(!_e.isLoaded){ return; }
+		if(!_c.length){ return; }
+		if(this.button){
+			try{
+				var enabled = _e.queryCommandEnabled(_c);
+				this.button.setAttribute('disabled', !enabled);
+				if(typeof this.button.checked == 'boolean'){
+					this.button.setAttribute('checked', _e.queryCommandState(_c));
+				}
+			}catch(e){
+				console.debug(e);
+			}
+		}
+	},
+	setEditor: function(/*Widget*/editor){
+		// FIXME: detatch from previous editor!!
+		this.editor = editor;
+
+		// FIXME: prevent creating this if we don't need to (i.e., editor can't handle our command)
+		this._initButton();
+
+		// FIXME: wire up editor to button here!
+		if(this.command.length &&
+			!this.editor.queryCommandAvailable(this.command)
+		){
+			// console.debug("hiding:", this.command);
+			if(this.button){
+				this.button.domNode.style.display = "none";
+			}
+		}
+		if(this.button && this.useDefaultCommand){
+			this.connect(this.button, "onClick",
+				dojo.hitch(this.editor, "execCommand", this.command, this.commandArg)
+			);
+		}
+		this.connect(this.editor, "onNormalizedDisplayChanged", "updateState");
+	},
+	setToolbar: function(/*Widget*/toolbar){
+		if(this.button){
+			toolbar.addChild(this.button);
+		}
+		// console.debug("adding", this.button, "to:", toolbar);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/html.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/html.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/html.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,106 @@
+if(!dojo._hasResource["dijit._editor.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.html"] = true;
+dojo.provide("dijit._editor.html");
+
+dijit._editor.escapeXml=function(/*String*/str, /*Boolean*/noSingleQuotes){
+	//summary:
+	//		Adds escape sequences for special characters in XML: &<>"'
+	//		Optionally skips escapes for single quotes
+	str = str.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;");
+	if(!noSingleQuotes){
+		str = str.replace(/'/gm, "&#39;");
+	}
+	return str; // string
+};
+
+dijit._editor.getNodeHtml=function(/* DomNode */node){
+	var output;
+	switch(node.nodeType){
+		case 1: //element node
+			output = '<'+node.nodeName.toLowerCase();
+
+			//store the list of attributes and sort it to have the
+			//attributes appear in the dictionary order
+			var attrarray = [];
+			if(dojo.isIE && node.outerHTML){
+				var s = node.outerHTML;
+				s = s.substr(0,s.indexOf('>'));
+				s = s.replace(/(['"])[^"']*\1/g, '');//to make the following regexp safe
+				var reg = /([^\s=]+)=/g;
+				var m, key;
+				while((m = reg.exec(s))){
+					key=m[1];
+					if(key.substr(0,3) != '_dj'){
+						if(key == 'src' || key == 'href'){
+							if(node.getAttribute('_djrealurl')){
+								attrarray.push([key,node.getAttribute('_djrealurl')]);
+								continue;
+							}
+						}
+						if(key=='style'){
+							attrarray.push([key, node.style.cssText.toLowerCase()]);
+						}else{
+							attrarray.push([key, key=='class'?node.className:node.getAttribute(key)]);
+						}
+					}
+				}
+			}else{
+				var attr, i=0, attrs = node.attributes;
+				while((attr=attrs[i++])){
+					//ignore all attributes starting with _dj which are
+					//internal temporary attributes used by the editor
+					var n=attr.name;
+					if(n.substr(0,3) != '_dj' /*&&
+						(attr.specified == undefined || attr.specified)*/){
+						var v = attr.value;
+						if(n == 'src' || n == 'href'){
+							if(node.getAttribute('_djrealurl')){
+								v = node.getAttribute('_djrealurl');
+							}
+						}
+						attrarray.push([n,v]);
+					}
+				}
+			}
+			attrarray.sort(function(a,b){
+				return a[0]<b[0]?-1:(a[0]==b[0]?0:1);
+			});
+			i=0;
+			while((attr=attrarray[i++])){
+				output += ' '+attr[0]+'="'+
+					(dojo.isString(attr[1]) ? dijit._editor.escapeXml(attr[1],true) : attr[1])+'"';
+			}
+			if(node.childNodes.length){
+				output += '>' + dijit._editor.getChildrenHtml(node)+'</'+node.nodeName.toLowerCase()+'>';
+			}else{
+				output += ' />';
+			}
+			break;
+		case 3: //text
+			// FIXME:
+			output = dijit._editor.escapeXml(node.nodeValue,true);
+			break;
+		case 8: //comment
+			// FIXME:
+			output = '<!--'+dijit._editor.escapeXml(node.nodeValue,true)+'-->';
+			break;
+		default:
+			output = "Element not recognized - Type: " + node.nodeType + " Name: " + node.nodeName;
+	}
+	return output;
+};
+
+dijit._editor.getChildrenHtml = function(/* DomNode */dom){
+	// summary: Returns the html content of a DomNode and children
+	var out = "";
+	if(!dom){ return out; }
+	var nodes = dom["childNodes"]||dom;
+	var i=0;
+	var node;
+	while((node=nodes[i++])){
+		out += dijit._editor.getNodeHtml(node);
+	}
+	return out; // String
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Format","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Paragraph","pre":"Pre-formatted","sans-serif":"sans-serif","fontName":"Font","h1":"Heading","h2":"Subheading","h3":"Sub-subheading","monospace":"monospace","fontSize":"Size","cursive":"cursive"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Set","text":"Description:","insertImageTitle":"Image Properties","url":"URL:","createLinkTitle":"Link Properties"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"صغير جدا جدا ","2":"صغير جدا ","formatBlock":"النسق","monospaced":"خط أحادي المسافة ","3":"صغير ","4":"متوسط ","5":"كبير ","6":"كبير جدا ","7":"كبير جدا جدا ","fantasy":"خيالي ","serif":"serif","p":"فقرة ","pre":"منسق بصفة مسبقة ","sans-serif":"sans-serif","fontName":"طاقم طباعة","h1":"عنوان","h2":"عنوان فرعي ","h3":"فرعي-عنوان فرعي ","fontSize":"الحجم","cursive":"كتابة بحروف متصلة ","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"تحديد","text":"الوصف: ","insertImageTitle":"خصائص الصورة ","url":"عنوان URL:","createLinkTitle":"خصائص الوصلة "})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ar/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"ازالة النسق","copy":"نسخ","paste":"لصق","selectAll":"اختيار كل","insertOrderedList":"كشف مرقم","insertTable":"ادراج/تحرير جدول ","underline":"تسطير","foreColor":"لون الواجهة الأمامية","htmlToggle":"مصدر HTML","formatBlock":"نمط الفقرة","insertHorizontalRule":"مسطرة أفقية","delete":"حذف","insertUnorderedList":"كشف نقطي","tableProp":"خصائص الجدول ","insertImage":"ادراج صورة","superscript":"رمز علوي","subscript":"رمز سفلي","createLink":"تكوين وصلة","undo":"تراجع","italic":"مائل","fontName":"اسم طاقم الطباعة","justifyLeft":"محاذاة الى اليسار","unlink":"ازالة وصلة","toggleTableBorder":"تبديل حدود الجدول ","fontSize":"حجم طاقم الطباعة","indent":"ازاحة للداخل","redo":"اعادة","strikethrough":"تشطيب","justifyFull":"ضبط","justifyCenter":"محاذاة في الوسط","hiliteColor":"لون الخلفية","deleteTable":"حذف جدول ","outdent":"ازاحة للخارج","cut":"قص","plainFormatBlock":"نمط الفقرة","toggleDir":"تبديل الاتجاه ","bold":"عريض","systemShortcutFF":"يكون التصرف \"${0}\" متاحا فقط في برنامج Mozilla Firefox باستخدام اختصارات لوحة المفاتيح. استخدم ${1}.","justifyRight":"محاذاة الى اليمين","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Remove Format","copy":"Copy","paste":"Paste","selectAll":"Select All","insertOrderedList":"Numbered List","insertTable":"Insert/Edit Table","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","insertHorizontalRule":"Horizontal Rule","delete":"Delete","appleKey":"⌘${0}","insertUnorderedList":"Bullet List","tableProp":"Table Property","insertImage":"Insert Image","superscript":"Superscript","subscript":"Subscript","createLink":"Create Link","undo":"Undo","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","ctrlKey":"ctrl+${0}","fontSize":"Font Size","indent":"Indent","redo":"Redo","strikethrough":"Strikethrough","justifyFull":"Justify","justifyCenter":"Align Center","hiliteColor":"Background Color","deleteTable":"Delete Table","outdent":"Outdent","cut":"Cut","plainFormatBlock":"Paragraph Style","toggleDir":"Toggle Direction","bold":"Bold","systemShortcutFF":"The \"${0}\" action is only available in Mozilla Firefox using a keyboard shortcut. Use ${1}.","justifyRight":"Align Right"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"extra malé","2":"velmi malé","formatBlock":"Formát","monospaced":"monospaced","3":"malé","4":"střední","5":"velké","6":"velmi velké","7":"extra velké","fantasy":"fantasy","serif":"serif","p":"Odstavec","pre":"Předformátované","sans-serif":"sans-serif","fontName":"Písmo","h1":"Nadpis","h2":"Podnadpis","h3":"Podnadpis 2","fontSize":"Velikost","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Nastavit","text":"Popis:","insertImageTitle":"Vlastnosti obrázku","url":"Adresa URL:","createLinkTitle":"Vlastnosti odkazu"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/cs/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Odebrat formát","copy":"Kopírovat","paste":"Vložit","selectAll":"Vybrat vše","insertOrderedList":"Číslovaný seznam","insertTable":"Vložit/upravit tabulku","underline":"Podtržení","foreColor":"Barva popředí","htmlToggle":"Zdroj HTML","formatBlock":"Styl odstavce","insertHorizontalRule":"Vodorovné pravítko","delete":"Odstranit","insertUnorderedList":"Seznam s odrážkami","tableProp":"Vlastnost tabulky","insertImage":"Vložit obraz","superscript":"Horní index","subscript":"Dolní index","createLink":"Vytvořit odkaz","undo":"Zpět","italic":"Kurzíva","fontName":"Název písma","justifyLeft":"Zarovnat vlevo","unlink":"Odebrat odkaz","toggleTableBorder":"Přepnout ohraničení tabulky","ctrlKey":"Ctrl+${0}","fontSize":"Velikost písma","indent":"Odsadit","redo":"Opakovat","strikethrough":"Přeškrtnutí","justifyFull":"Do bloku","justifyCenter":"Zarovnat na střed","hiliteColor":"Barva pozadí","deleteTable":"Odstranit tabulku","outdent":"Předsadit","cut":"Vyjmout","plainFormatBlock":"Styl odstavce","toggleDir":"Přepnout směr","bold":"Tučné","systemShortcutFF":"Akce \"${0}\" je v prohlížeči Mozilla Firefox dostupná pouze prostřednictvím klávesové zkratky. Použijte klávesy ${1}.","justifyRight":"Zarovnat vpravo","appleKey":"⌘${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Format","monospaced":"monospaced","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Afsnit","pre":"Forudformateret","sans-serif":"sans-serif","fontName":"Skrifttype","h1":"Overskrift","h2":"Underoverskrift","h3":"Underunderoverskrift","fontSize":"Størrelse","cursive":"kursiv","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Definér","text":"Beskrivelse:","insertImageTitle":"Billedegenskaber","url":"URL:","createLinkTitle":"Linkegenskaber"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/da/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Fjern format","copy":"Kopiér","paste":"Sæt ind","selectAll":"Markér alle","insertOrderedList":"Nummereret liste","insertTable":"Indsæt/redigér tabel","underline":"Understreget","foreColor":"Forgrundsfarve","htmlToggle":"HTML-kilde","formatBlock":"Afsnitstypografi","insertHorizontalRule":"Vandret linje","delete":"Slet","insertUnorderedList":"Punktliste","tableProp":"Tabelegenskab","insertImage":"Indsæt billede","superscript":"Hævet skrift","subscript":"Sænket skrift","createLink":"Opret link","undo":"Fortryd","italic":"Kursiv","fontName":"Skriftnavn","justifyLeft":"Venstrejusteret","unlink":"Fjern link","toggleTableBorder":"Skift tabelramme","fontSize":"Skriftstørrelse","indent":"Indrykning","redo":"Annullér Fortryd","strikethrough":"Gennemstreget","justifyFull":"Lige margener","justifyCenter":"Centreret","hiliteColor":"Baggrundsfarve","deleteTable":"Slet tabel","outdent":"Udrykning","cut":"Klip","plainFormatBlock":"Afsnitstypografi","toggleDir":"Skift retning","bold":"Fed","systemShortcutFF":"Funktionen \"${0}\" kan kun bruges i Mozilla Firefox med en tastaturgenvej. Brug ${1}.","justifyRight":"Højrejusteret","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"XXS","2":"XS","formatBlock":"Format","monospaced":"Monospace","3":"S","4":"M","5":"L","6":"XL","7":"XXL","fantasy":"Fantasie","serif":"Serife","p":"Absatz","pre":"Vorformatiert","sans-serif":"Serifenlos","fontName":"Schriftart","h1":"Überschrift","h2":"Unterüberschrift","h3":"Unterunterüberschrift","fontSize":"Größe","cursive":"Kursiv","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Festlegen","text":"Beschreibung:","insertImageTitle":"Grafikeigenschaften","url":"URL:","createLinkTitle":"Linkeigenschaften"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/de/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Formatierung entfernen","copy":"Kopieren","paste":"Einfügen","selectAll":"Alles auswählen","insertOrderedList":"Nummerierung","insertTable":"Tabelle einfügen/bearbeiten","underline":"Unterstrichen","foreColor":"Vordergrundfarbe","htmlToggle":"HTML-Quelltext","formatBlock":"Absatzstil","insertHorizontalRule":"Horizontaler Strich","delete":"Löschen","insertUnorderedList":"Aufzählungszeichen","tableProp":"Tabelleneigenschaft","insertImage":"Grafik einfügen","superscript":"Hochgestellt","subscript":"Tiefgestellt","createLink":"Link erstellen","undo":"Rückgängig","italic":"Kursiv","fontName":"Schriftartname","justifyLeft":"Linksbündig","unlink":"Link entfernen","toggleTableBorder":"Tabellenumrandung ein-/ausschalten","ctrlKey":"Strg+${0}","fontSize":"Schriftgröße","indent":"Einrücken","redo":"Wiederherstellen","strikethrough":"Durchgestrichen","justifyFull":"Blocksatz","justifyCenter":"Zentriert","hiliteColor":"Hintergrundfarbe","deleteTable":"Tabelle löschen","outdent":"Ausrücken","cut":"Ausschneiden","plainFormatBlock":"Absatzstil","toggleDir":"Richtung wechseln","bold":"Fett","systemShortcutFF":"Die Aktion \"${0}\" ist in Mozilla Firefox nur über einen Tastaturkurzbefehl verfügbar. Verwenden Sie ${1}.","justifyRight":"Rechtsbündig","appleKey":"⌘${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-μικρά","2":"x-μικρά","formatBlock":"Μορφή","monospaced":"σταθερού πλάτους","3":"μικρά","4":"μεσαία","5":"μεγάλα","6":"x-μεγάλα","7":"xx-μεγάλα","fantasy":"φαντασίας","serif":"με πατούρες (serif)","p":"Παράγραφος","pre":"Προ-μορφοποιημένο","sans-serif":"χωρίς πατούρες (sans-serif)","fontName":"Γραμματοσειρά","h1":"Επικεφαλίδα","h2":"Δευτερεύουσα επικεφαλίδα","h3":"Δευτερεύουσα επικεφαλίδα τρίτου επιπέδου","fontSize":"Μέγεθος","cursive":"πλάγιοι","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Ορισμός","text":"Περιγραφή:","insertImageTitle":"Ιδιότητες εικόνας","url":"Διεύθυνση URL:","createLinkTitle":"Ιδιότητες διασύνδεσης"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/el/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Αφαίρεση μορφοποίησης","copy":"Αντιγραφή","paste":"Επικόλληση","selectAll":"Επιλογή όλων","insertOrderedList":"Αριθμημένη λίστα","insertTable":"Εισαγωγή/Τροποποίηση πίνακα","underline":"Υπογράμμιση","foreColor":"Χρώμα προσκηνίου","htmlToggle":"Πρωτογενής κώδικας HTML","formatBlock":"Στυλ παραγράφου","insertHorizontalRule":"Οριζόντια γραμμή","delete":"Διαγραφή","insertUnorderedList":"Λίστα με κουκίδες","tableProp":"Ιδιότητα πίνακα","insertImage":"Εισαγωγή εικόνας","superscript":"Εκθέτης","subscript":"Δείκτης","createLink":"Δημιουργία διασύνδεσης","undo":"Αναίρεση","italic":"Πλάγια","fontName":"Όνομα γραμματοσειράς","justifyLeft":"Στοίχιση αριστερά","unlink":"Αφαίρεση διασύνδεσης","toggleTableBorder":"Εναλλαγή εμφάνισης περιγράμματος πίνακα","fontSize":"Μέγεθος γραμματοσειράς","indent":"Εσοχή","redo":"Επανάληψη","strikethrough":"Διαγράμμιση","justifyFull":"Πλήρης στοίχιση","justifyCenter":"Στοίχιση στο κέντρο","hiliteColor":"Χρώμα φόντου","deleteTable":"Διαγραφή πίνακα","outdent":"Μείωση περιθωρίου","cut":"Αποκοπή","plainFormatBlock":"Στυλ παραγράφου","toggleDir":"Εναλλαγή κατεύθυνσης","bold":"Έντονα","systemShortcutFF":"Η ενέργεια \"${0}\" είναι διαθέσιμη μόνο στο Mozilla Firefox με τη χρήση συντόμευσης πληκτρολογίου. Χρησιμοποιήστε το ${1}.","justifyRight":"Στοίχιση δεξιά","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-pequeño","2":"x-pequeño","formatBlock":"Formato","monospaced":"monoespacio","3":"pequeño","4":"medio","5":"grande","6":"x-grande","7":"xx-grande","fantasy":"fantasía","serif":"serif","p":"Párrafo","pre":"Preformateado","sans-serif":"sans-serif","fontName":"Font","h1":"Cabecera","h2":"Subcabecera","h3":"Sub-subcabecera","fontSize":"Tamaño","cursive":"cursiva","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Establecer","text":"Descripción:","insertImageTitle":"Propiedades de la imagen","url":"URL:","createLinkTitle":"Propiedades del enlace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/es/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Eliminar formato","copy":"Copiar","paste":"Pegar","selectAll":"Seleccionar todo","insertOrderedList":"Lista numerada","insertTable":"Insertar/Editar tabla","underline":"Subrayado","foreColor":"Color de primer plano","htmlToggle":"Fuente HTML","formatBlock":"Estilo de párrafo","insertHorizontalRule":"Regla horizontal","delete":"Suprimir","insertUnorderedList":"Lista con viñetas","tableProp":"Propiedad de tabla","insertImage":"Insertar imagen","superscript":"Superíndice","subscript":"Subíndice","createLink":"Crear enlace","undo":"Deshacer","italic":"Cursiva","fontName":"Nombre de font","justifyLeft":"Alinear izquierda","unlink":"Eliminar enlace","toggleTableBorder":"Conmutar borde de tabla","ctrlKey":"Control+${0}","fontSize":"Tamaño de font","indent":"Sangría","redo":"Rehacer","strikethrough":"Tachado","justifyFull":"Justificar","justifyCenter":"Alinear centro","hiliteColor":"Color de segundo plano","deleteTable":"Suprimir tabla","outdent":"Anular sangría","cut":"Cortar","plainFormatBlock":"Estilo de párrafo","toggleDir":"Conmutar dirección","bold":"Negrita","systemShortcutFF":"La acción \"${0}\" sólo está disponible en Mozilla Firefox mediante un atajo de teclado. Utilice ${1}.","justifyRight":"Alinear derecha","appleKey":"⌘${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Muoto","monospaced":"monospaced","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Kappale","pre":"Esimuotoiltu","sans-serif":"sans-serif","fontName":"Fontti","h1":"Otsikko","h2":"Alatason otsikko","h3":"Alimman tason otsikko","fontSize":"Koko","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Aseta","text":"Kuvaus:","insertImageTitle":"Kuvan ominaisuudet","url":"URL-osoite:","createLinkTitle":"Linkin ominaisuudet"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fi/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Poista muotoilu","copy":"Kopioi","paste":"Liitä","selectAll":"Valitse kaikki","insertOrderedList":"Numeroitu luettelo","insertTable":"Lisää taulukko/muokkaa taulukkoa","underline":"Alleviivaus","foreColor":"Edustaväri","htmlToggle":"HTML-lähde","formatBlock":"Kappaletyyli","insertHorizontalRule":"Vaakasuuntainen viiva","delete":"Poista","insertUnorderedList":"Numeroimaton luettelo","tableProp":"Taulukon ominaisuudet","insertImage":"Lisää kuva","superscript":"Yläindeksi","subscript":"Alaindeksi","createLink":"Luo linkki","undo":"Kumoa","italic":"Kursivointi","fontName":"Fontin nimi","justifyLeft":"Tasaus vasemmalle","unlink":"Poista linkki","toggleTableBorder":"Ota taulukon kehys käyttöön/poista kehys käytöstä","fontSize":"Fontin koko","indent":"Sisennä","redo":"Tee uudelleen","strikethrough":"Yliviivaus","justifyFull":"Tasaus","justifyCenter":"Tasaus keskelle","hiliteColor":"Taustaväri","deleteTable":"Poista taulukko","outdent":"Ulonna","cut":"Leikkaa","plainFormatBlock":"Kappaletyyli","toggleDir":"Vaihda suuntaa","bold":"Lihavointi","systemShortcutFF":"Toiminto \"${0}\" on käytettävissä vain Mozilla Firefox -ohjelmassa, kun käytetään pikanäppäimiä. Käytä kohdetta ${1}.","justifyRight":"Tasaus oikealle","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xxs","2":"xs","formatBlock":"Mise en forme","monospaced":"espacement constant","3":"s","4":"m","5":"l","6":"xl","7":"xxl","fantasy":"fantaisie","serif":"serif","p":"Paragraphe","pre":"Pré-mise en forme","sans-serif":"sans serif","fontName":"Police","h1":"En-tête","h2":"Sous-en-tête","h3":"Sous-sous-en-tête","fontSize":"Taille","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Définir","text":"Description :","insertImageTitle":"Propriétés de l'image","url":"URL :","createLinkTitle":"Propriétés du lien"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/fr/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Supprimer la mise en forme","copy":"Copier","paste":"Coller","selectAll":"Sélectionner tout","insertOrderedList":"Liste numérotée","insertTable":"Insérer/Modifier un tableau","underline":"Souligner","foreColor":"Couleur d'avant-plan","htmlToggle":"Source HTML","formatBlock":"Style de paragraphe","insertHorizontalRule":"Règle horizontale","delete":"Supprimer","insertUnorderedList":"Liste à puces","tableProp":"Propriété du tableau","insertImage":"Insérer une image","superscript":"Exposant","subscript":"Indice","createLink":"Créer un lien","undo":"Annuler","italic":"Italique","fontName":"Nom de police","justifyLeft":"Aligner à gauche","unlink":"Supprimer le lien","toggleTableBorder":"Afficher/Masquer la bordure du tableau","fontSize":"Taille de police","indent":"Retrait","redo":"Rétablir","strikethrough":"Barrer","justifyFull":"Justifier","justifyCenter":"Aligner au centre","hiliteColor":"Couleur d'arrière-plan","deleteTable":"Supprimer le tableau","outdent":"Retrait négatif","cut":"Couper","plainFormatBlock":"Style de paragraphe","toggleDir":"Afficher/Masquer la direction","bold":"Gras","systemShortcutFF":"L'action \"${0}\" est disponible dans Mozilla Firefox uniquement, par le biais d'un raccourci-clavier. Utilisez ${1}.","justifyRight":"Aligner à droite","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"קטן ביות","2":"קטן מאוד","formatBlock":"עיצוב","monospaced":"monospaced","3":"קטן  ","4":"בינוני","5":"גדול","6":"גדול מאוד","7":"גדול ביותר","fantasy":"fantasy","serif":"serif","p":"פיסקה","pre":"מעוצב מראש","sans-serif":"sans-serif","fontName":"גופן","h1":"כותרת","h2":"תת-כותרת","h3":"תת-תת-כותרת","fontSize":"גודל","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"הגדרה","text":"תיאור:","insertImageTitle":"תכונות תמונה","url":"URL:","createLinkTitle":"תכונות קישור"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/he/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"סילוק עיצוב","copy":"העתקה","paste":"הדבקה","selectAll":"בחירת הכל","insertOrderedList":"רשימה ממוספרת","insertTable":"הוספת/עריכת טבלה","underline":"קו תחתי","foreColor":"צבע חזית ","htmlToggle":"מקור HTML","formatBlock":"סגנון פיסקה","insertHorizontalRule":"קו אופקי","delete":"מחיקה","insertUnorderedList":"רשימה עם תבליטים","tableProp":"תכונת טבלה","insertImage":"הוספת תמונה","superscript":"כתב עילי","subscript":"כתב תחתי","createLink":"יצירת קישור","undo":"ביטול פעולה","italic":"נטוי","fontName":"שם גופן","justifyLeft":"יישור לשמאל","unlink":"סילוק הקישור","toggleTableBorder":"מיתוג גבול טבלה","fontSize":"גופן יחסי","indent":"הגדלת כניסה","redo":"שחזור פעולה","strikethrough":"קו חוצה","justifyFull":"יישור דו-צדדי","justifyCenter":"יישור למרכז","hiliteColor":"צבע רקע","deleteTable":"מחיקת טבלה","outdent":"הקטנת כניסה","cut":"גזירה","plainFormatBlock":"סגנון פיסקה","toggleDir":"מיתוג כיוון  ","bold":"מודגש","systemShortcutFF":"הפעולה \"${0}\" זמינה בדפדפן Mozilla Firefox רק באמצעות קיצור דרך במקלדת. נא להשתמש ב-${1}.","justifyRight":"יישור לימין","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-kicsi","2":"x-kicsi","formatBlock":"Formátum","monospaced":"egyenközű","3":"kicsi","4":"közepes","5":"nagy","6":"x-nagy","7":"xx-nagy","fantasy":"fantázia","serif":"talpas","p":"Bekezdés","pre":"Előformázott","sans-serif":"talpatlan","fontName":"Betűtípus","h1":"Címsor","h2":"Alcím","h3":"Al-alcím","fontSize":"Méret","cursive":"kurzív","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Beállítás","text":"Leírás:","insertImageTitle":"Kép tulajdonságai","url":"URL:","createLinkTitle":"Hivatkozás tulajdonságai"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/hu/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Formázás eltávolítása","copy":"Másolás","paste":"Beillesztés","selectAll":"Összes kijelölése","insertOrderedList":"Számozott lista","insertTable":"Táblázat beszúrása/szerkesztése","underline":"Aláhúzott","foreColor":"Előtérszín","htmlToggle":"HTML forrás","formatBlock":"Bekezdés stílusa","insertHorizontalRule":"Vízszintes vonalzó","delete":"Törlés","insertUnorderedList":"Felsorolásjeles lista","tableProp":"Táblázat tulajdonságai","insertImage":"Kép beszúrása","superscript":"Felső index","subscript":"Alsó index","createLink":"Hivatkozás létrehozása","undo":"Visszavonás","italic":"Dőlt","fontName":"Betűtípus","justifyLeft":"Balra igazítás","unlink":"Hivatkozás eltávolítása","toggleTableBorder":"Táblázatszegély ki-/bekapcsolása","fontSize":"Betűméret","indent":"Behúzás","redo":"Újra","strikethrough":"Áthúzott","justifyFull":"Sorkizárás","justifyCenter":"Középre igazítás","hiliteColor":"Háttérszín","deleteTable":"Táblázat törlése","outdent":"Negatív behúzás","cut":"Kivágás","plainFormatBlock":"Bekezdés stílusa","toggleDir":"Irányváltás","bold":"Félkövér","systemShortcutFF":"A(z) \"${0}\" művelet csak Mozilla Firefox böngészőben érhető el billentyűparancs használatával. Használja a következőt: ${1}.","justifyRight":"Jobbra igazítás","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Formato","monospaced":"monospaced","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Paragrafo","pre":"Preformattato","sans-serif":"sans-serif","fontName":"Carattere","h1":"Intestazione","h2":"Sottointestazione","h3":"Sottointestazione secondaria","fontSize":"Dimensione","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Imposta","text":"Descrizione:","insertImageTitle":"Proprietà immagine","url":"URL:","createLinkTitle":"Proprietà collegamento"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/it/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Rimuovi formato","copy":"Copia","paste":"Incolla","selectAll":"Seleziona tutto","insertOrderedList":"Elenco numerato","insertTable":"Inserisci/Modifica tabella","underline":"Sottolineato","foreColor":"Colore primo piano","htmlToggle":"Origine HTML","formatBlock":"Stile paragrafo","insertHorizontalRule":"Righello orizzontale","delete":"Elimina","insertUnorderedList":"Elenco puntato","tableProp":"Proprietà tabella","insertImage":"Inserisci immagine","superscript":"Apice","subscript":"Pedice","createLink":"Crea collegamento","undo":"Annulla","italic":"Corsivo","fontName":"Nome carattere","justifyLeft":"Allinea a sinistra","unlink":"Rimuovi collegamento","toggleTableBorder":"Mostra/Nascondi margine tabella","fontSize":"Dimensione carattere","indent":"Rientra","redo":"Ripristina","strikethrough":"Barrato","justifyFull":"Giustifica","justifyCenter":"Allinea al centro","hiliteColor":"Colore sfondo","deleteTable":"Elimina tabella","outdent":"Rimuovi rientro","cut":"Taglia","plainFormatBlock":"Stile paragrafo","toggleDir":"Inverti direzione","bold":"Grassetto","systemShortcutFF":"L'azione \"${0}\" è disponibile solo in Mozilla Firefox tramite tasti di scelta rapida. Utilizzare ${1}.","justifyRight":"Allinea a destra","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"超極小","2":"極小","formatBlock":"フォーマット","monospaced":"monospace","3":"小","4":"標準","5":"大","6":"特大","7":"超特大","fantasy":"fantasy","serif":"serif","p":"段落","pre":"事前フォーマット済み","sans-serif":"sans-serif","fontName":"フォント","h1":"見出し","h2":"副見出し","h3":"副見出しの副見出し","fontSize":"サイズ","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"設定","text":"説明:","insertImageTitle":"イメージ・プロパティー","url":"URL:","createLinkTitle":"リンク・プロパティー"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ja/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"形式の除去","copy":"コピー","paste":"貼り付け","selectAll":"すべて選択","insertOrderedList":"番号付きリスト","insertTable":"テーブルの挿入/編集","underline":"下線","foreColor":"前景色","htmlToggle":"HTML ソース","formatBlock":"段落スタイル","insertHorizontalRule":"水平罫線","delete":"削除","insertUnorderedList":"黒丸付きリスト","tableProp":"テーブル・プロパティー","insertImage":"イメージの挿入","superscript":"上付き文字","subscript":"下付き文字","createLink":"リンクの作成","undo":"元に戻す","italic":"イタリック","fontName":"フォント名","justifyLeft":"左揃え","unlink":"リンクの除去","toggleTableBorder":"テーブル・ボーダーの切り替え","fontSize":"フォント・サイズ","indent":"インデント","redo":"やり直し","strikethrough":"取り消し線","justifyFull":"両端揃え","justifyCenter":"中央揃え","hiliteColor":"背景色","deleteTable":"テーブルの削除","outdent":"アウトデント","cut":"切り取り","plainFormatBlock":"段落スタイル","toggleDir":"方向の切り替え","bold":"太字","systemShortcutFF":"\"${0}\" アクションは、キーボード・ショートカットを使用して Mozilla Firefox でのみ使用できます。${1} を使用してください。","justifyRight":"右揃え","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"가장 작게","2":"조금 작게","formatBlock":"서식","monospaced":"monospaced","3":"작게","4":"중간","5":"크게","6":"조금 크게","7":"가장 크게","fantasy":"fantasy","serif":"serif","p":"단락","pre":"서식이 지정됨","sans-serif":"sans-serif","fontName":"글꼴","h1":"제목","h2":"부제목","h3":"하위 부제목","fontSize":"크기","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"설정","text":"설명:","insertImageTitle":"이미지 등록 정보","url":"URL:","createLinkTitle":"링크 등록 정보"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ko/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"형식 제거","copy":"복사","paste":"붙여넣기","selectAll":"모두 선택","insertOrderedList":"번호 목록","insertTable":"테이블 삽입/편집","underline":"밑줄","foreColor":"전경색","htmlToggle":"HTML 소스","formatBlock":"단락 양식","insertHorizontalRule":"수평 자","delete":"삭제","insertUnorderedList":"글머리표 목록","tableProp":"테이블 특성","insertImage":"이미지 삽입","superscript":"위첨자","subscript":"아래첨자","createLink":"링크 작성","undo":"실행 취소","italic":"이탤릭체","fontName":"글꼴 이름","justifyLeft":"왼쪽 맞춤","unlink":"링크 제거","toggleTableBorder":"토글 테이블 경계","fontSize":"글꼴 크기","indent":"들여쓰기","redo":"다시 실행","strikethrough":"취소선","justifyFull":"양쪽 맞춤","justifyCenter":"가운데 맞춤","hiliteColor":"배경색","deleteTable":"테이블 삭제","outdent":"내어쓰기","cut":"잘라내기","plainFormatBlock":"단락 양식","toggleDir":"토글 방향","bold":"굵은체","systemShortcutFF":"\"${0}\" 조치는 키보드 바로 가기를 사용하는 Mozilla Firefox에서만 사용 가능합니다. ${1} 사용.","justifyRight":"오른쪽 맞춤","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-liten","2":"x-liten","formatBlock":"Format","monospaced":"ikke-proporsjonal","3":"liten","4":"middels","5":"stor","6":"x-stor","7":"xx-stor","fantasy":"fantasi","serif":"serif","p":"Avsnitt","pre":"Forhåndsformatert","sans-serif":"sans-serif","fontName":"Skrift","h1":"Overskrift","h2":"Undertittel","h3":"Under-undertittel","fontSize":"Størrelse","cursive":"kursiv","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Definer","text":"Beskrivelse:","insertImageTitle":"Bildeegenskaper","url":"URL:","createLinkTitle":"Koblingsegenskaper"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nb/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Fjern format","copy":"Kopier","paste":"Lim inn","selectAll":"Velg alle","insertOrderedList":"Nummerert liste","insertTable":"Sett inn/rediger tabell","underline":"Understreking","foreColor":"Forgrunnsfarge","htmlToggle":"HTML-kilde","formatBlock":"Avsnittsstil","insertHorizontalRule":"Vannrett strek","delete":"Slett","insertUnorderedList":"Punktliste","tableProp":"Tabellegenskap","insertImage":"Sett inn bilde","superscript":"Hevet skrift","subscript":"Senket skrift","createLink":"Opprett kobling","undo":"Angre","italic":"Kursiv","fontName":"Skriftnavn","justifyLeft":"Venstrejuster","unlink":"Fjern kobling","toggleTableBorder":"Bytt tabellkant","fontSize":"Skriftstørrelse","indent":"Innrykk","redo":"Gjør om","strikethrough":"Gjennomstreking","justifyFull":"Juster","justifyCenter":"Midtstill","hiliteColor":"Bakgrunnsfarge","deleteTable":"Slett tabell","outdent":"Fjern innrykk","cut":"Klipp ut","plainFormatBlock":"Avsnittsstil","toggleDir":"Bytt retning","bold":"Fet","systemShortcutFF":"Handlingen \"${0}\" er bare tilgjengelig i Mozilla Firefox ved hjelp av en tastatursnarvei. Bruk ${1}.","justifyRight":"Høyrejuster","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-klein","2":"x-klein","formatBlock":"Opmaak","monospaced":"monospaced","3":"klein","4":"gemiddeld","5":"groot","6":"x-groot","7":"xx-groot","fantasy":"fantasy","serif":"serif","p":"Alinea","pre":"Vooraf opgemaakt","sans-serif":"sans-serif","fontName":"Lettertype","h1":"Kop","h2":"Subkop","h3":"Sub-subkop","fontSize":"Grootte","cursive":"cursief","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Instellen","text":"Beschrijving:","insertImageTitle":"Afbeeldingseigenschappen","url":"URL:","createLinkTitle":"Linkeigenschappen"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/nl/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Opmaak verwijderen","copy":"Kopiëren","paste":"Plakken","selectAll":"Alles selecteren","insertOrderedList":"Genummerde lijst","insertTable":"Tabel invoegen/bewerken","underline":"Onderstrepen","foreColor":"Voorgrondkleur","htmlToggle":"HTML-bron","formatBlock":"Alineastijl","insertHorizontalRule":"Horizontale liniaal","delete":"Wissen","insertUnorderedList":"Lijst met opsommingstekens","tableProp":"Tabeleigenschap","insertImage":"Afbeelding invoegen","superscript":"Superscript","subscript":"Subscript","createLink":"Link maken","undo":"Ongedaan maken","italic":"Cursief","fontName":"Lettertype","justifyLeft":"Links uitlijnen","unlink":"Link verwijderen","toggleTableBorder":"Tabelkader wijzigen","ctrlKey":"Ctrl+${0}","fontSize":"Lettergrootte","indent":"Inspringen","redo":"Opnieuw","strikethrough":"Doorhalen","justifyFull":"Uitvullen","justifyCenter":"Centreren","hiliteColor":"Achtergrondkleur","deleteTable":"Tabel wissen","outdent":"Uitspringen","cut":"Knippen","plainFormatBlock":"Alineastijl","toggleDir":"Schrijfrichting wijzigen","bold":"Vet","systemShortcutFF":"De actie \"${0}\" is alleen beschikbaar in Mozilla Firefox via een sneltoestcombinatie. Gebruik ${1}.","justifyRight":"Rechts uitlijnen","appleKey":"⌘${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"najmniejsza","2":"mniejsza","formatBlock":"Format","monospaced":"stałej szerokości","3":"mała","4":"średnia","5":"duża","6":"większa","7":"największa","fantasy":"fantazyjna","serif":"szeryfowa","p":"Akapit","pre":"Wstępnie sformatowane","sans-serif":"bezszeryfowa","fontName":"Czcionka","h1":"Nagłówek","h2":"Nagłówek 2-go poziomu","h3":"Nagłówek 3-go poziomu","fontSize":"Wielkość","cursive":"kursywa","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Ustaw","text":"Opis:","insertImageTitle":"Właściwości obrazu","url":"Adres URL:","createLinkTitle":"Właściwości odsyłacza"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pl/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Usuń formatowanie","copy":"Kopiuj","paste":"Wklej","selectAll":"Wybierz wszystko","insertOrderedList":"Lista numerowana","insertTable":"Wstaw/edytuj tabelę","underline":"Podkreślenie","foreColor":"Kolor pierwszego planu","htmlToggle":"Źródło HTML","formatBlock":"Styl akapitu","insertHorizontalRule":"Linia pozioma","delete":"Usuń","insertUnorderedList":"Lista wypunktowana","tableProp":"Właściwość tabeli","insertImage":"Wstaw obraz","superscript":"Indeks górny","subscript":"Indeks dolny","createLink":"Utwórz odsyłacz","undo":"Cofnij","italic":"Kursywa","fontName":"Nazwa czcionki","justifyLeft":"Wyrównaj do lewej","unlink":"Usuń odsyłacz","toggleTableBorder":"Przełącz ramkę tabeli","fontSize":"Wielkość czcionki","indent":"Wcięcie","redo":"Przywróć","strikethrough":"Przekreślenie","justifyFull":"Wyrównaj do lewej i prawej","justifyCenter":"Wyrównaj do środka","hiliteColor":"Kolor tła","deleteTable":"Usuń tabelę","outdent":"Usuń wcięcie","cut":"Wytnij","plainFormatBlock":"Styl akapitu","toggleDir":"Przełącz kierunek","bold":"Pogrubienie","systemShortcutFF":"Działanie ${0} jest dostępne w przeglądarce Mozilla Firefox wyłącznie za pomocą skrótu klawiaturowego. Użyj ${1}.","justifyRight":"Wyrównaj do prawej","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Formato","monospaced":"monospaced","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Parágrafo","pre":"Pré-formatado","sans-serif":"sans-serif","fontName":"Fonte","h1":"Título","h2":"Subtítulo","h3":"Sub-subtítulo","fontSize":"Tamanho","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Definir","text":"Descrição:","insertImageTitle":"Propriedades de Imagem","url":"URL:","createLinkTitle":"Propriedades de Link"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Remover Formato","copy":"Copiar","paste":"Colar","selectAll":"Selecionar Todos","insertOrderedList":"Lista Numerada","insertTable":"Inserir/Editar Tabela","underline":"Sublinhado","foreColor":"Cor do Primeiro Plano","htmlToggle":"Origem HTML","formatBlock":"Estilo de Parágrafo","insertHorizontalRule":"Régua Horizontal","delete":"Excluir ","insertUnorderedList":"Lista com Marcadores","tableProp":"Propriedade da Tabela","insertImage":"Inserir Imagem","superscript":"Sobrescrito","subscript":"Subscrito","createLink":"Criar Link","undo":"Desfazer","italic":"Itálico","fontName":"Nome da Fonte","justifyLeft":"Alinhar pela Esquerda","unlink":"Remover Link","toggleTableBorder":"Alternar Moldura da Tabela","fontSize":"Tamanho da Fonte","indent":"Recuar","redo":"Refazer","strikethrough":"Tachado","justifyFull":"Justificar","justifyCenter":"Alinhar pelo Centro","hiliteColor":"Cor de segundo plano","deleteTable":"Excluir Tabela","outdent":"Não-chanfrado","cut":"Recortar","plainFormatBlock":"Estilo de Parágrafo","toggleDir":"Alternar Direção","bold":"Negrito","systemShortcutFF":"A ação \"${0}\" está disponível apenas no Mozilla Firefox utilizando um atalho do teclado. Utilize ${1}.","justifyRight":"Alinhar pela Direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xxs","2":"xs","formatBlock":"Formato","monospaced":"monospaced","3":"small","4":"medium","5":"large","6":"xl","7":"xxl","fantasy":"fantasy","serif":"serif","p":"Parágrafo","pre":"Pré-formatado","sans-serif":"sans-serif","fontName":"Tipo de letra","h1":"Título","h2":"Sub-título","h3":"Sub-subtítulo","fontSize":"Tamanho","cursive":"cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Definir","text":"Descrição:","insertImageTitle":"Propriedades da imagem","url":"URL:","createLinkTitle":"Propriedade da ligação"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/pt-pt/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Remover formato","copy":"Copiar","paste":"Colar","selectAll":"Seleccionar tudo","insertOrderedList":"Lista numerada","insertTable":"Inserir/Editar tabela","underline":"Sublinhado","foreColor":"Cor de primeiro plano","htmlToggle":"Origem HTML","formatBlock":"Estilo de parágrafo","insertHorizontalRule":"Régua horizontal","delete":"Eliminar","insertUnorderedList":"Lista marcada","tableProp":"Propriedades da tabela","insertImage":"Inserir imagem","superscript":"Superior à linha","subscript":"Inferior à linha","createLink":"Criar ligação","undo":"Anular","italic":"Itálico","fontName":"Nome do tipo de letra","justifyLeft":"Alinhar à esquerda","unlink":"Remover ligação","toggleTableBorder":"Alternar limite da tabela","fontSize":"Tamanho do tipo de letra","indent":"Indentar","redo":"Repetir","strikethrough":"Rasurado","justifyFull":"Justificar","justifyCenter":"Alinhar ao centro","hiliteColor":"Cor de segundo plano","deleteTable":"Eliminar tabela","outdent":"Recuar","cut":"Cortar","plainFormatBlock":"Estilo de parágrafo","toggleDir":"Alternar direcção","bold":"Negrito","systemShortcutFF":"A acção \"${0}\" apenas está disponível no Mozilla Firefox utilizando um atalho de teclado. Utilize ${1}.","justifyRight":"Alinhar à direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"самый маленький","2":"очень маленький","formatBlock":"Формат","monospaced":"непропорциональный","3":"маленький","4":"средний","5":"большой","6":"очень большой","7":"самый большой","fantasy":"артистический","serif":"с засечками","p":"Абзац","pre":"Заранее отформатированный","sans-serif":"без засечек","fontName":"Шрифт","h1":"Заголовок","h2":"Подзаголовок","h3":"Вложенный подзаголовок","fontSize":"Размер","cursive":"курсив","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Задать","text":"Описание:","insertImageTitle":"Свойства изображения","url":"URL:","createLinkTitle":"Свойства ссылки"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/ru/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Удалить формат","copy":"Копировать","paste":"Вставить","selectAll":"Выбрать все","insertOrderedList":"Нумерованный список","insertTable":"Вставить/изменить таблицу","underline":"Подчеркивание","foreColor":"Цвет текста","htmlToggle":"Код HTML","formatBlock":"Стиль абзаца","insertHorizontalRule":"Горизонтальная линейка","delete":"Удалить","insertUnorderedList":"Список с маркерами","tableProp":"Свойства таблицы","insertImage":"Вставить изображение","superscript":"Верхний индекс","subscript":"Нижний индекс","createLink":"Создать ссылку","undo":"Отменить","italic":"Курсив","fontName":"Название шрифта","justifyLeft":"По левому краю","unlink":"Удалить ссылку","toggleTableBorder":"Переключить рамку таблицы","fontSize":"Размер шрифта","indent":"Отступ","redo":"Повторить","strikethrough":"Перечеркивание","justifyFull":"По ширине","justifyCenter":"По центру","hiliteColor":"Цвет фона","deleteTable":"Удалить таблицу","outdent":"Втяжка","cut":"Вырезать","plainFormatBlock":"Стиль абзаца","toggleDir":"Изменить направление","bold":"Полужирный","systemShortcutFF":"Действие \"${0}\" доступно в Mozilla Firefox только через сочетание клавиш. Используйте ${1}.","justifyRight":"По правому краю","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"mycket, mycket litet","2":"mycket litet","formatBlock":"Format","monospaced":"fast teckenavstånd","3":"litet","4":"medelstort","5":"stort","6":"extra stort","7":"extra extra stort","fantasy":"fantasy","serif":"serif","p":"Stycke","pre":"Förformaterat","sans-serif":"sans-serif","fontName":"Teckensnitt","h1":"Rubrik","h2":"Underrubrik","h3":"Underunderrubrik","fontSize":"Storlek","cursive":"kursivt","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Ange","text":"Beskrivning:","insertImageTitle":"Bildegenskaper","url":"URL-adress:","createLinkTitle":"Länkegenskaper"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/sv/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Ta bort format","copy":"Kopiera","paste":"Klistra in","selectAll":"Markera allt","insertOrderedList":"Numrerad lista","insertTable":"Infoga/redigera tabell","underline":"Understrykning","foreColor":"Förgrundsfärg","htmlToggle":"HTML-källkod","formatBlock":"Styckeformat","insertHorizontalRule":"Horisontell linjal","delete":"Ta bort","insertUnorderedList":"Punktlista","tableProp":"Tabellegenskap","insertImage":"Infoga bild","superscript":"Upphöjt","subscript":"Nedsänkt","createLink":"Skapa länk","undo":"Ångra","italic":"Kursiv","fontName":"Teckensnittsnamn","justifyLeft":"Vänsterjustera","unlink":"Ta bort länk","toggleTableBorder":"Aktivera/avaktivera tabellram","ctrlKey":"Ctrl+${0}","fontSize":"Teckenstorlek","indent":"Indrag","redo":"Gör om","strikethrough":"Genomstruken","justifyFull":"Marginaljustera","justifyCenter":"Centrera","hiliteColor":"Bakgrundsfärg","deleteTable":"Ta bort tabell","outdent":"Utdrag","cut":"Klipp ut","plainFormatBlock":"Styckeformat","toggleDir":"Växla riktning","bold":"Fetstil","systemShortcutFF":"Åtgärden \"${0}\" är endast tillgänglig i Mozilla Firefox med hjälp av ett kortkommando. Använd ${1}.","justifyRight":"Högerjustera","appleKey":"⌘${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"xx-küçük","2":"x-küçük","formatBlock":"Biçim","monospaced":"eşaralıklı","3":"küçük","4":"orta","5":"büyük","6":"x-büyük","7":"xx-büyük","fantasy":"fantazi","serif":"serif","p":"Paragraf","pre":"Önceden Biçimlendirilmiş","sans-serif":"sans-serif","fontName":"Yazı Tipi","h1":"Başlık","h2":"Alt Başlık","h3":"Alt Alt Başlık","fontSize":"Boyut","cursive":"el yazısı","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"Ayarla","text":"Açıklama:","insertImageTitle":"Resim Özellikleri","url":"URL:","createLinkTitle":"Bağlantı Özellikleri"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/tr/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"Biçimi Kaldır","copy":"Kopyala","paste":"Yapıştır","selectAll":"Tümünü Seç","insertOrderedList":"Numaralı Liste","insertTable":"Tablo Ekle/Düzenle","underline":"Altı Çizili","foreColor":"Ön Plan Rengi","htmlToggle":"HTML Kaynağı","formatBlock":"Paragraf Stili","insertHorizontalRule":"Yatay Kural","delete":"Sil","insertUnorderedList":"Madde İşaretli Liste","tableProp":"Tablo Özelliği","insertImage":"Resim Ekle","superscript":"Üst Simge","subscript":"Alt Simge","createLink":"Bağlantı Oluştur","undo":"Geri Al","italic":"İtalik","fontName":"Yazı Tipi Adı","justifyLeft":"Sola Hizala","unlink":"Bağlantıyı Kaldır","toggleTableBorder":"Tablo Kenarlığını Göster/Gizle","fontSize":"Yazı Tipi Boyutu","indent":"Girinti","redo":"Yinele","strikethrough":"Üstü Çizili","justifyFull":"Yasla","justifyCenter":"Ortaya Hizala","hiliteColor":"Arka Plan Rengi","deleteTable":"Tabloyu Sil","outdent":"Çıkıntı","cut":"Kes","plainFormatBlock":"Paragraf Stili","toggleDir":"Yönü Değiştir","bold":"Kalın","systemShortcutFF":"\"${0}\" işlemi yalnızca Mozilla Firefox'ta bir klavye kısayoluyla birlikte kullanılabilir. ${1} işlemini kullanın.","justifyRight":"Sağa Hizala","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"XXS 号","2":"XS 号","formatBlock":"格式","monospaced":"等宽","3":"S 号","4":"M 号","5":"L 号","6":"XL 号","7":"XXL 号","fantasy":"虚线","serif":"有衬线","p":"段落","pre":"预设有格式的","sans-serif":"无衬线","fontName":"字体","h1":"标题","h2":"子标题","h3":"二级子标题","fontSize":"大小","cursive":"草书","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"集合","text":"描述:","insertImageTitle":"图像属性","url":"URL:","createLinkTitle":"链接属性"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"除去格式","copy":"复制","paste":"粘贴","selectAll":"全选","insertOrderedList":"编号列表","insertTable":"插入/编辑表","underline":"下划线","foreColor":"前景色","htmlToggle":"HTML 源代码","formatBlock":"段落样式","insertHorizontalRule":"水平线","delete":"删除","insertUnorderedList":"符号列表","tableProp":"表属性","insertImage":"插入图像","superscript":"上标","subscript":"下标","createLink":"创建链接","undo":"撤销","italic":"斜体","fontName":"字体名称","justifyLeft":"左对齐","unlink":"除去链接","toggleTableBorder":"切换表边框","fontSize":"字体大小","indent":"增加缩进","redo":"重做","strikethrough":"删除线","justifyFull":"对齐","justifyCenter":"居中","hiliteColor":"背景色","deleteTable":"删除表","outdent":"减少缩进","cut":"剪切","plainFormatBlock":"段落样式","toggleDir":"固定方向","bold":"粗体","systemShortcutFF":"只能在 Mozilla Firefox 中通过键盘快捷方式执行“${0}”操作。请使用 ${1}。","justifyRight":"右对齐","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"1":"最小","2":"較小","formatBlock":"格式","monospaced":"單距","3":"小","4":"中","5":"大","6":"較大","7":"最大","fantasy":"Fantasy","serif":"新細明體","p":"段落","pre":"預先格式化","sans-serif":"新細明體","fontName":"字型","h1":"標題","h2":"子標題","h3":"次子標題","fontSize":"大小","cursive":"Cursive","monospace":"monospace"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"set":"設定","text":"說明:","insertImageTitle":"影像檔內容","url":"URL:","createLinkTitle":"鏈結內容"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/commands.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/commands.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/nls/zh-tw/commands.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"removeFormat":"移除格式","copy":"複製","paste":"貼上","selectAll":"全選","insertOrderedList":"編號清單","insertTable":"插入/編輯表格","underline":"底線","foreColor":"前景顏色","htmlToggle":"HTML 原始檔","formatBlock":"段落樣式","insertHorizontalRule":"水平尺規","delete":"刪除","insertUnorderedList":"項目符號清單","tableProp":"表格內容","insertImage":"插入影像","superscript":"上標","subscript":"下標","createLink":"建立鏈結","undo":"復原","italic":"斜體","fontName":"字型名稱","justifyLeft":"靠左對齊","unlink":"移除鏈結","toggleTableBorder":"切換表格邊框","fontSize":"字型大小","indent":"縮排","redo":"重做","strikethrough":"加刪除線","justifyFull":"對齊","justifyCenter":"置中對齊","hiliteColor":"背景顏色","deleteTable":"刪除表格","outdent":"凸排","cut":"剪下","plainFormatBlock":"段落樣式","toggleDir":"切換方向","bold":"粗體","systemShortcutFF":"\"${0}\" 動作在 Mozilla Firefox 中,只能使用鍵盤快速鍵。請使用 ${1}。","justifyRight":"靠右對齊","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/AlwaysShowToolbar.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/AlwaysShowToolbar.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/AlwaysShowToolbar.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,140 @@
+if(!dojo._hasResource["dijit._editor.plugins.AlwaysShowToolbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.plugins.AlwaysShowToolbar"] = true;
+dojo.provide("dijit._editor.plugins.AlwaysShowToolbar");
+
+dojo.declare("dijit._editor.plugins.AlwaysShowToolbar", dijit._editor._Plugin,
+	{
+	_handleScroll: true,
+	setEditor: function(e){
+		this.editor = e;
+//		setTimeout(dojo.hitch(this,this.enable), 10000);
+		e.onLoadDeferred.addCallback(dojo.hitch(this, this.enable));
+//		this.scrollInterval = setInterval(dojo.hitch(this, "globalOnScrollHandler"), 100);
+	},
+	enable: function(d){
+		this._updateHeight();
+		this.connect(window, 'onscroll', "globalOnScrollHandler");
+		this.connect(this.editor, 'onNormalizedDisplayChanged', "_updateHeight");
+		return d;
+	},
+	_updateHeight: function(){
+		// summary:
+		//		Updates the height of the editor area to fit the contents.
+		var e = this.editor;
+		if(!e.isLoaded){ return; }
+		if(e.height){ return; }
+
+		var height = dojo.marginBox(e.editNode).h;
+		if(dojo.isOpera){
+			height = e.editNode.scrollHeight;
+		}
+		// console.debug('height',height);
+		// alert(this.editNode);
+
+		//height maybe zero in some cases even though the content is not empty,
+		//we try the height of body instead
+		if(!height){
+			height = dojo.marginBox(e.document.body).h;
+		}
+
+		if(height == 0){
+			console.debug("Can not figure out the height of the editing area!");
+			return; //prevent setting height to 0
+		}
+		if(height != this._lastHeight){
+			this._lastHeight = height;
+			// this.editorObject.style.height = this._lastHeight + "px";
+			dojo.marginBox(e.iframe, { h: this._lastHeight });
+//			this.iframe.height=this._lastHeight+10+'px';
+//			this.iframe.style.height=this._lastHeight+'px';
+		}
+	},
+	_lastHeight: 0,
+	globalOnScrollHandler: function(){
+		var isIE = dojo.isIE && dojo.isIE<7;
+		if(!this._handleScroll){ return; }
+		var tdn = this.editor.toolbar.domNode;
+		var db = dojo.body;
+
+		if(!this._scrollSetUp){
+			this._scrollSetUp = true;
+			this._scrollThreshold = dojo._abs(tdn, true).y;
+//			console.log("threshold:", this._scrollThreshold);
+			//what's this for?? comment out for now
+//			if((isIE)&&(db)&&(dojo.style(db, "backgroundIimage")=="none")){
+//				db.style.backgroundImage = "url(" + dojo.uri.moduleUri("dijit", "templates/blank.gif") + ")";
+//				db.style.backgroundAttachment = "fixed";
+//			}
+		}
+
+		var scrollPos = dojo._docScroll().y;
+		var s = tdn.style;
+
+		if(scrollPos > this._scrollThreshold && scrollPos < this._scrollThreshold+this._lastHeight){
+			// dojo.debug(scrollPos);
+			if(!this._fixEnabled){
+				var tdnbox = dojo.marginBox(tdn);
+				this.editor.iframe.style.marginTop = tdnbox.h+"px";
+
+				if(isIE){
+					s.left = dojo._abs(tdn).x;
+					if(tdn.previousSibling){
+						this._IEOriginalPos = ['after',tdn.previousSibling];
+					}else if(tdn.nextSibling){
+						this._IEOriginalPos = ['before',tdn.nextSibling];
+					}else{
+						this._IEOriginalPos = ['last',tdn.parentNode];
+					}
+					dojo.body().appendChild(tdn);
+					dojo.addClass(tdn,'dijitIEFixedToolbar');
+				}else{
+					s.position = "fixed";
+					s.top = "0px";
+				}
+
+				dojo.marginBox(tdn, { w: tdnbox.w });
+				s.zIndex = 2000;
+				this._fixEnabled = true;
+			}
+			// if we're showing the floating toolbar, make sure that if
+			// we've scrolled past the bottom of the editor that we hide
+			// the toolbar for this instance of the editor.
+
+			// TODO: when we get multiple editor toolbar support working
+			// correctly, ensure that we check this against the scroll
+			// position of the bottom-most editor instance.
+			var eHeight = (this.height) ? parseInt(this.editor.height) : this.editor._lastHeight;
+			s.display = (scrollPos > this._scrollThreshold+eHeight) ? "none" : "";
+		}else if(this._fixEnabled){
+			this.editor.iframe.style.marginTop = '';
+			s.position = "";
+			s.top = "";
+			s.zIndex = "";
+			s.display = "";
+			if(isIE){
+				s.left = "";
+				dojo.removeClass(tdn,'dijitIEFixedToolbar');
+				if(this._IEOriginalPos){
+					dojo.place(tdn, this._IEOriginalPos[1], this._IEOriginalPos[0]);
+					this._IEOriginalPos = null;
+				}else{
+					dojo.place(tdn, this.editor.iframe, 'before');
+				}
+			}
+			s.width = "";
+			this._fixEnabled = false;
+		}
+	},
+	destroy: function(){
+		this._IEOriginalPos = null;
+		this._handleScroll = false;
+		dojo.forEach(this._connects, dojo.disconnect);
+//		clearInterval(this.scrollInterval);
+
+		if(dojo.isIE && dojo.isIE<7){
+			dojo.removeClass(this.editor.toolbar.domNode, 'dijitIEFixedToolbar');
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/EnterKeyHandling.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/EnterKeyHandling.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/EnterKeyHandling.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,416 @@
+if(!dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"] = true;
+dojo.provide("dijit._editor.plugins.EnterKeyHandling");
+
+dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
+	// summary: this plugin tries to handle enter key events to make all 
+	//		browsers have identical behaviors.
+
+	// blockNodeForEnter: String
+	//		this property decides the behavior of Enter key. It can be either P,
+	//		DIV, BR, or empty (which means disable this feature). Anything else
+	//		will trigger errors.
+	blockNodeForEnter: 'P',
+	constructor: function(args){
+		if(args){
+			dojo.mixin(this,args);
+		}
+	},
+	setEditor: function(editor){
+		this.editor = editor;
+		if(this.blockNodeForEnter == 'BR'){
+			if(dojo.isIE){
+				editor.contentDomPreFilters.push(dojo.hitch(this, "regularPsToSingleLinePs"));
+				editor.contentDomPostFilters.push(dojo.hitch(this, "singleLinePsToRegularPs"));
+				editor.onLoadDeferred.addCallback(dojo.hitch(this, "_fixNewLineBehaviorForIE"));
+			}else{
+				editor.onLoadDeferred.addCallback(dojo.hitch(this,function(d){
+					try{
+						this.editor.document.execCommand("insertBrOnReturn", false, true);
+					}catch(e){}
+					return d;
+				}));
+			}
+		}else if(this.blockNodeForEnter){
+			//add enter key handler
+			// FIXME: need to port to the new event code!!
+			dojo['require']('dijit._editor.range');
+			var h = dojo.hitch(this,this.handleEnterKey);
+			editor.addKeyHandler(13, 0, h); //enter
+			editor.addKeyHandler(13, 2, h); //shift+enter
+			this.connect(this.editor,'onKeyPressed','onKeyPressed');
+		}
+	},
+	connect: function(o,f,tf){
+		if(!this._connects){
+			this._connects=[];
+		}
+		this._connects.push(dojo.connect(o,f,this,tf));
+	},
+	destroy: function(){
+		dojo.forEach(this._connects,dojo.disconnect);
+		this._connects=[];
+	},
+	onKeyPressed: function(e){
+		if(this._checkListLater){
+			if(dojo.withGlobal(this.editor.window, 'isCollapsed', dijit)){
+				if(!dojo.withGlobal(this.editor.window, 'hasAncestorElement', dijit._editor.selection, ['LI'])){
+					//circulate the undo detection code by calling RichText::execCommand directly
+					dijit._editor.RichText.prototype.execCommand.apply(this.editor, ['formatblock',this.blockNodeForEnter]);
+					//set the innerHTML of the new block node
+					var block = dojo.withGlobal(this.editor.window, 'getAncestorElement', dijit._editor.selection, [this.blockNodeForEnter]);
+					if(block){
+						block.innerHTML=this.bogusHtmlContent;
+						if(dojo.isIE){
+							//the following won't work, it will move the caret to the last list item in the previous list
+//							var newrange = dijit.range.create();
+//							newrange.setStart(block.firstChild,0);
+//							var selection = dijit.range.getSelection(this.editor.window)
+//							selection.removeAllRanges();
+//							selection.addRange(newrange);
+							//move to the start by move backward one char
+							var r = this.editor.document.selection.createRange();
+							r.move('character',-1);
+							r.select();
+						}
+					}else{
+						alert('onKeyPressed: Can not find the new block node'); //FIXME
+					}
+				}
+			}
+			this._checkListLater = false;
+		}else if(this._pressedEnterInBlock){
+			//the new created is the original current P, so we have previousSibling below
+			this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);
+			delete this._pressedEnterInBlock;
+		}
+	},
+	bogusHtmlContent: '&nbsp;',
+	blockNodes: /^(?:H1|H2|H3|H4|H5|H6|LI)$/,
+	handleEnterKey: function(e){
+		// summary: manually handle enter key event to make the behavior consistant across
+		//	all supported browsers. See property blockNodeForEnter for available options
+		if(!this.blockNodeForEnter){ return true; } //let browser handle this
+		var selection, range, newrange;
+		if(e.shiftKey  //shift+enter always generates <br>
+			|| this.blockNodeForEnter=='BR'){
+			var parent = dojo.withGlobal(this.editor.window, "getParentElement", dijit._editor.selection);
+			var header = dijit.range.getAncestor(parent,this.editor.blockNodes);
+			if(header){
+				if(header.tagName=='LI'){
+					return true; //let brower handle
+				}
+				selection = dijit.range.getSelection(this.editor.window);
+				range = selection.getRangeAt(0);
+				if(!range.collapsed){
+					range.deleteContents();
+				}
+				if(dijit.range.atBeginningOfContainer(header, range.startContainer, range.startOffset)){
+					dojo.place(this.editor.document.createElement('br'), header, "before");
+				}else if(dijit.range.atEndOfContainer(header, range.startContainer, range.startOffset)){
+					dojo.place(this.editor.document.createElement('br'), header, "after");
+					newrange = dijit.range.create();
+					newrange.setStartAfter(header);
+
+					selection.removeAllRanges();
+					selection.addRange(newrange);
+				}else{
+					return true; //let brower handle
+				}
+			}else{
+				//don't change this: do not call this.execCommand, as that may have other logic in subclass
+				// FIXME
+				dijit._editor.RichText.prototype.execCommand.call(this.editor, 'inserthtml', '<br>');
+			}
+			return false;
+		}
+		var _letBrowserHandle = true;
+		//blockNodeForEnter is either P or DIV
+		//first remove selection
+		selection = dijit.range.getSelection(this.editor.window);
+		range = selection.getRangeAt(0);
+		if(!range.collapsed){
+			range.deleteContents();
+		}
+
+		var block = dijit.range.getBlockAncestor(range.endContainer, null, this.editor.editNode);
+
+		if((this._checkListLater = (block.blockNode && block.blockNode.tagName == 'LI'))){
+			return true;
+		}
+
+		//text node directly under body, let's wrap them in a node
+		if(!block.blockNode){
+			this.editor.document.execCommand('formatblock', false, this.blockNodeForEnter);
+			//get the newly created block node
+			// FIXME
+			block = {blockNode:dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [this.blockNodeForEnter]),
+					blockContainer: this.editor.editNode};
+			if(block.blockNode){
+				if(!(block.blockNode.textContent || block.blockNode.innerHTML).replace(/^\s+|\s+$/g, "").length){
+					this.removeTrailingBr(block.blockNode);
+					return false;
+				}
+			}else{
+				block.blockNode = this.editor.editNode;
+			}
+			selection = dijit.range.getSelection(this.editor.window);
+			range = selection.getRangeAt(0);
+		}
+		var newblock = this.editor.document.createElement(this.blockNodeForEnter);
+		newblock.innerHTML=this.bogusHtmlContent;
+		this.removeTrailingBr(block.blockNode);
+		if(dijit.range.atEndOfContainer(block.blockNode, range.endContainer, range.endOffset)){
+			if(block.blockNode === block.blockContainer){
+				block.blockNode.appendChild(newblock);
+			}else{
+				dojo.place(newblock, block.blockNode, "after");
+			}
+			_letBrowserHandle = false;
+			//lets move caret to the newly created block
+			newrange = dijit.range.create();
+			newrange.setStart(newblock,0);
+			selection.removeAllRanges();
+			selection.addRange(newrange);
+			if(this.editor.height){
+				newblock.scrollIntoView(false);
+			}
+		}else if(dijit.range.atBeginningOfContainer(block.blockNode,
+				range.startContainer, range.startOffset)){
+			dojo.place(newblock, block.blockNode, block.blockNode === block.blockContainer ? "first" : "before");
+			if(newblock.nextSibling && this.editor.height){
+				//browser does not scroll the caret position into view, do it manually
+				newblock.nextSibling.scrollIntoView(false);
+			}
+			_letBrowserHandle = false;
+		}else{ //press enter in the middle of P
+			if(dojo.isMoz){
+				//press enter in middle of P may leave a trailing <br/>, let's remove it later
+				this._pressedEnterInBlock = block.blockNode;
+			}
+		}
+		return _letBrowserHandle;
+	},
+	removeTrailingBr: function(container){
+		var para = /P|DIV|LI/i.test(container.tagName) ?
+			container : dijit._editor.selection.getParentOfType(container,['P','DIV','LI']);
+
+		if(!para){ return; }
+		if(para.lastChild){
+			if((para.childNodes.length > 1 && para.lastChild.nodeType == 3 && /^[\s\xAD]*$/.test(para.lastChild.nodeValue)) ||
+				(para.lastChild && para.lastChild.tagName=='BR')){
+
+				dojo._destroyElement(para.lastChild);
+			}
+		}
+		if(!para.childNodes.length){
+			para.innerHTML=this.bogusHtmlContent;
+		}
+	},
+	_fixNewLineBehaviorForIE: function(d){
+		if(this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS === undefined){
+			var lineFixingStyles = "p{margin:0 !important;}";
+			var insertCssText = function(
+				/*String*/ cssStr,
+				/*Document*/ doc,
+				/*String*/ URI)
+			{
+				//	summary:
+				//		Attempt to insert CSS rules into the document through inserting a
+				//		style element
+
+				// DomNode Style  = insertCssText(String ".dojoMenu {color: green;}"[, DomDoc document, dojo.uri.Uri Url ])
+				if(!cssStr){
+					return null; //	HTMLStyleElement
+				}
+				if(!doc){ doc = document; }
+//					if(URI){// fix paths in cssStr
+//						cssStr = dojo.html.fixPathsInCssText(cssStr, URI);
+//					}
+				var style = doc.createElement("style");
+				style.setAttribute("type", "text/css");
+				// IE is b0rken enough to require that we add the element to the doc
+				// before changing it's properties
+				var head = doc.getElementsByTagName("head")[0];
+				if(!head){ // must have a head tag
+					console.debug("No head tag in document, aborting styles");
+					return null;	//	HTMLStyleElement
+				}else{
+					head.appendChild(style);
+				}
+				if(style.styleSheet){// IE
+					var setFunc = function(){
+						try{
+							style.styleSheet.cssText = cssStr;
+						}catch(e){ console.debug(e); }
+					};
+					if(style.styleSheet.disabled){
+						setTimeout(setFunc, 10);
+					}else{
+						setFunc();
+					}
+				}else{ // w3c
+					var cssText = doc.createTextNode(cssStr);
+					style.appendChild(cssText);
+				}
+				return style;	//	HTMLStyleElement
+			}
+			insertCssText(lineFixingStyles, this.editor.document);
+			this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS = true;
+			// this.regularPsToSingleLinePs(this.editNode);
+			return d;
+		}
+		return null;
+	},
+	regularPsToSingleLinePs: function(element, noWhiteSpaceInEmptyP){
+		function wrapLinesInPs(el){
+		  // move "lines" of top-level text nodes into ps
+			function wrapNodes(nodes){
+				// nodes are assumed to all be siblings
+				var newP = nodes[0].ownerDocument.createElement('p'); // FIXME: not very idiomatic
+				nodes[0].parentNode.insertBefore(newP, nodes[0]);
+				dojo.forEach(nodes, function(node){
+					newP.appendChild(node);
+				});
+			}
+
+			var currentNodeIndex = 0;
+			var nodesInLine = [];
+			var currentNode;
+			while(currentNodeIndex < el.childNodes.length){
+				currentNode = el.childNodes[currentNodeIndex];
+				if( (currentNode.nodeName!='BR') &&
+					(currentNode.nodeType==1) &&
+					(dojo.style(currentNode, "display")!="block")
+				){
+					nodesInLine.push(currentNode);
+				}else{
+					// hit line delimiter; process nodesInLine if there are any
+					var nextCurrentNode = currentNode.nextSibling;
+					if(nodesInLine.length){
+						wrapNodes(nodesInLine);
+						currentNodeIndex = (currentNodeIndex+1)-nodesInLine.length;
+						if(currentNode.nodeName=="BR"){
+							dojo._destroyElement(currentNode);
+						}
+					}
+					nodesInLine = [];
+				}
+				currentNodeIndex++;
+			}
+			if(nodesInLine.length){ wrapNodes(nodesInLine); }
+		}
+
+		function splitP(el){
+			// split a paragraph into seperate paragraphs at BRs
+			var currentNode = null;
+			var trailingNodes = [];
+			var lastNodeIndex = el.childNodes.length-1;
+			for(var i=lastNodeIndex; i>=0; i--){
+				currentNode = el.childNodes[i];
+				if(currentNode.nodeName=="BR"){
+					var newP = currentNode.ownerDocument.createElement('p');
+					dojo.place(newP, el, "after");
+					if (trailingNodes.length==0 && i != lastNodeIndex) {
+						newP.innerHTML = "&nbsp;"
+					}
+					dojo.forEach(trailingNodes, function(node){
+						newP.appendChild(node);
+					});
+					dojo._destroyElement(currentNode);
+					trailingNodes = [];
+				}else{
+					trailingNodes.unshift(currentNode);
+				}
+			}
+		}
+
+		var pList = [];
+		var ps = element.getElementsByTagName('p');
+		dojo.forEach(ps, function(p){ pList.push(p); });
+		dojo.forEach(pList, function(p){
+			if(	(p.previousSibling) &&
+				(p.previousSibling.nodeName == 'P' || dojo.style(p.previousSibling, 'display') != 'block')
+			){
+				var newP = p.parentNode.insertBefore(this.document.createElement('p'), p);
+				// this is essential to prevent IE from losing the P.
+				// if it's going to be innerHTML'd later we need
+				// to add the &nbsp; to _really_ force the issue
+				newP.innerHTML = noWhiteSpaceInEmptyP ? "" : "&nbsp;";
+			}
+			splitP(p);
+	  },this.editor);
+		wrapLinesInPs(element);
+		return element;
+	},
+
+	singleLinePsToRegularPs: function(element){
+		function getParagraphParents(node){
+			var ps = node.getElementsByTagName('p');
+			var parents = [];
+			for(var i=0; i<ps.length; i++){
+				var p = ps[i];
+				var knownParent = false;
+				for(var k=0; k < parents.length; k++){
+					if(parents[k] === p.parentNode){
+						knownParent = true;
+						break;
+					}
+				}
+				if(!knownParent){
+					parents.push(p.parentNode);
+				}
+			}
+			return parents;
+		}
+
+		function isParagraphDelimiter(node){
+			if(node.nodeType != 1 || node.tagName != 'P'){
+				return dojo.style(node, 'display') == 'block';
+			}else{
+				if(!node.childNodes.length || node.innerHTML=="&nbsp;"){ return true; }
+				//return node.innerHTML.match(/^(<br\ ?\/?>| |\&nbsp\;)$/i);
+			}
+			return false;
+		}
+
+		var paragraphContainers = getParagraphParents(element);
+		for(var i=0; i<paragraphContainers.length; i++){
+			var container = paragraphContainers[i];
+			var firstPInBlock = null;
+			var node = container.firstChild;
+			var deleteNode = null;
+			while(node){
+				if(node.nodeType != "1" || node.tagName != 'P'){
+					firstPInBlock = null;
+				}else if (isParagraphDelimiter(node)){
+					deleteNode = node;
+					firstPInBlock = null;
+				}else{
+					if(firstPInBlock == null){
+						firstPInBlock = node;
+					}else{
+						if( (!firstPInBlock.lastChild || firstPInBlock.lastChild.nodeName != 'BR') &&
+							(node.firstChild) &&
+							(node.firstChild.nodeName != 'BR')
+						){
+							firstPInBlock.appendChild(this.editor.document.createElement('br'));
+						}
+						while(node.firstChild){
+							firstPInBlock.appendChild(node.firstChild);
+						}
+						deleteNode = node;
+					}
+				}
+				node = node.nextSibling;
+				if(deleteNode){
+					dojo._destroyElement(deleteNode);
+					deleteNode = null;
+				}
+			}
+		}
+		return element;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/FontChoice.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/FontChoice.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/FontChoice.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,167 @@
+if(!dojo._hasResource["dijit._editor.plugins.FontChoice"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.plugins.FontChoice"] = true;
+dojo.provide("dijit._editor.plugins.FontChoice");
+
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.FilteringSelect");
+dojo.require("dojo.data.ItemFileReadStore");
+dojo.require("dojo.i18n");
+
+dojo.requireLocalization("dijit._editor", "FontChoice", null, "zh,pt,da,tr,ru,de,sv,ja,he,ROOT,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare("dijit._editor.plugins.FontChoice",
+	dijit._editor._Plugin,
+	{
+		//	summary:
+		//		This plugin provides three dropdowns for setting font information in the editor
+		//
+		//	description:
+		//		The commands provided by this plugin are:
+		//
+		//		* fontName
+		//	|		Provides a dropdown to select from a list of generic font names
+		//		* fontSize
+		//	|		Provides a dropdown to select from a list of pre-defined font sizes
+		//		* formatBlock
+		//	|		Provides a dropdown to select from a list of styles
+		//  |
+		//
+		//		which can easily be added to an editor by including one or more of the above commands
+		//		in the `plugins` attribute as follows:
+		//
+		//	|	plugins="['fontName','fontSize',...]"
+		//
+		//		It is possible to override the default dropdown list by providing an Array for the `custom` property when
+		//		instantiating this plugin, e.g.
+		//
+		//	|	plugins="[{name:'dijit._editor.plugins.FontChoice', command:'fontName', custom:['Verdana','Myriad','Garamond']},...]"
+		//
+		//		Alternatively, for `fontName` only, `generic:true` may be specified to provide a dropdown with
+		//		[CSS generic font families](http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families)
+		//
+		//		Note that the editor is often unable to properly handle font styling information defined outside
+		//		the context of the current editor instance, such as pre-populated HTML.
+
+		_uniqueId: 0,
+
+		buttonClass: dijit.form.FilteringSelect,
+
+		_initButton: function(){
+			//TODO: would be nice to be able to handle comma-separated font lists and search within them
+			var cmd = this.command;
+			var names = this.custom ||
+			{
+				fontName: this.generic ? ["serif", "sans-serif", "monospace", "cursive", "fantasy"] : // CSS font-family generics
+					["Arial", "Times New Roman", "Comic Sans MS", "Courier New"],
+				fontSize: [1,2,3,4,5,6,7], // sizes according to the old HTML FONT SIZE
+				formatBlock: ["p", "h1", "h2", "h3", "pre"]
+			}[cmd];
+			var strings = dojo.i18n.getLocalization("dijit._editor", "FontChoice");
+			var items = dojo.map(names, function(value){
+				var name = strings[value] || value;
+				var label = name;
+				switch(cmd){
+				case "fontName":
+					label = "<div style='font-family: "+value+"'>" + name + "</div>";
+					break;
+				case "fontSize":
+					// we're stuck using the deprecated FONT tag to correspond with the size measurements used by the editor
+					label = "<font size="+value+"'>"+name+"</font>";
+					break;
+				case "formatBlock":
+					label = "<" + value + ">" + name + "</" + value + ">";
+				}
+				return { label: label, name: name, value: value };
+			});
+			items.push({label: "", name:"", value:""}); // FilteringSelect doesn't like unmatched blank strings
+
+			dijit._editor.plugins.FontChoice.superclass._initButton.apply(this,
+				[{ labelType: "html", labelAttr: "label", searchAttr: "name", store: new dojo.data.ItemFileReadStore(
+					{ data: { identifier: "value", items: items } })}]);
+
+			this.button.setValue("");
+
+			this.connect(this.button, "onChange", function(choice){
+				if(this.updating){ return; }
+				// FIXME: IE is really messed up here!!
+				if(dojo.isIE && "_savedSelection" in this){
+					var b = this._savedSelection;
+					delete this._savedSelection;
+					this.editor.focus();
+					this.editor._moveToBookmark(b);
+				}else{
+//					this.editor.focus();
+					dijit.focus(this._focusHandle);
+				}
+				if(this.command == "fontName" && choice.indexOf(" ") != -1){ choice = "'" + choice + "'"; }
+				this.editor.execCommand(this.editor._normalizeCommand(this.command), choice);
+			});
+		},
+
+		updateState: function(){
+			this.inherited(arguments);
+			var _e = this.editor;
+			var _c = this.command;
+			if(!_e || !_e.isLoaded || !_c.length){ return; }
+			if(this.button){
+				var value = _e.queryCommandValue(this.editor._normalizeCommand(_c)) || "";
+				// strip off single quotes, if any
+				var quoted = dojo.isString(value) && value.match(/'([^']*)'/);
+				if(quoted){ value = quoted[1]; }
+//console.log("selected " + value);
+				if(this.generic && _c == "fontName"){
+					var map = {
+						"Arial": "sans-serif",
+						"Helvetica": "sans-serif",
+						"Myriad": "sans-serif",
+						"Times": "serif",
+						"Times New Roman": "serif",
+						"Comic Sans MS": "cursive",
+						"Apple Chancery": "cursive",
+						"Courier": "monospace",
+						"Courier New": "monospace",
+						"Papyrus": "fantasy"
+// 						,"????": "fantasy" TODO: IE doesn't map fantasy font-family?
+					};
+//console.log("mapped to " + map[value]);
+					value = map[value] || value;
+				}else if(_c == "fontSize" && value.indexOf && value.indexOf("px") != -1){
+					var pixels = parseInt(value);
+					value = {10:1, 13:2, 16:3, 18:4, 24:5, 32:6, 48:7}[pixels] || value;
+				}
+				this.updating = true;
+				this.button.setValue(value);
+				delete this.updating;
+			}
+
+			// FIXME: IE is *really* b0rken
+			if(dojo.isIE){
+				this._savedSelection = this.editor._getBookmark();
+			}
+			this._focusHandle = dijit.getFocus(this.editor.iframe);
+		},
+
+		setToolbar: function(){
+			this.inherited(arguments);
+
+			var forRef = this.button;
+			if(!forRef.id){ forRef.id = dijit._scopeName+"EditorButton-"+this.command+(this._uniqueId++); } //TODO: is this necessary?  FilteringSelects always seem to have an id?
+			var label = dojo.doc.createElement("label");
+			dojo.addClass(label, "dijit dijitReset dijitLeft dijitInline");
+			label.setAttribute("for", forRef.id);
+			var strings = dojo.i18n.getLocalization("dijit._editor", "FontChoice");
+			label.appendChild(dojo.doc.createTextNode(strings[this.command]));
+			dojo.place(label, this.button.domNode, "before");
+		}
+	}
+);
+
+dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+	if(o.plugin){ return; }
+	switch(o.args.name){
+	case "fontName": case "fontSize": case "formatBlock":
+		o.plugin = new dijit._editor.plugins.FontChoice({command: o.args.name});
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/LinkDialog.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/LinkDialog.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/LinkDialog.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,147 @@
+if(!dojo._hasResource["dijit._editor.plugins.LinkDialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.plugins.LinkDialog"] = true;
+dojo.provide("dijit._editor.plugins.LinkDialog");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.Dialog");
+dojo.require("dijit.form.Button");
+dojo.require("dijit.form.ValidationTextBox");
+dojo.require("dojo.i18n");
+dojo.require("dojo.string");
+dojo.requireLocalization("dijit._editor", "LinkDialog", null, "zh,pt,da,tr,ru,de,ROOT,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare("dijit._editor.plugins.LinkDialog",
+	dijit._editor._Plugin,
+	{
+		//	summary:
+		//		This plugin provides dialogs for inserting links and images into the editor
+		//
+		//	description:
+		//		The commands provided by this plugin are:
+		//		* createLink
+		//		* insertImage
+
+		buttonClass: dijit.form.DropDownButton,
+		useDefaultCommand: false,
+		urlRegExp: "((https?|ftps?)\\://|)(([0-9a-zA-Z]([-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?\\.)+(arpa|aero|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|xxx|jobs|mobi|post|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|eu|es|et|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)|(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])|(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]|(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]|(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}|429[0-3]\\d{6}|4294[0-8]\\d{5}|42949[0-5]\\d{4}|429496[0-6]\\d{3}|4294967[01]\\d{2}|42949672[0-8]\\d|429496729[0-5])|0[xX]0*[\\da-fA-F]{1,8}|([\\da-fA-F]{1,4}\\:){7}[\\da-fA-F]{1,4}|([\\da-fA-F]{1,4}\\:){6}((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])))(\\:(0|[1-9]\\d*))?(/([^?#\\s/]+/)*)?([^?#\\s/]+(\\?[^?#\\s/]*)?(#[A-Za-z][\\w.:-]*)?)?",
+		linkDialogTemplate: [
+			"<table><tr><td>",
+			"<label for='${id}_urlInput'>${url}</label>",
+			"</td><td>",
+			"<input dojoType='dijit.form.ValidationTextBox' regExp='${urlRegExp}' required='true' id='${id}_urlInput' name='urlInput'>",
+			"</td></tr><tr><td>",
+			"<label for='${id}_textInput'>${text}</label>",
+			"</td><td>",
+			"<input dojoType='dijit.form.ValidationTextBox' required='true' id='${id}_textInput' name='textInput'>",
+			"</td></tr><tr><td colspan='2'>",
+			"<button dojoType='dijit.form.Button' type='submit'>${set}</button>",
+			"</td></tr></table>"
+		].join(""),
+
+		_initButton: function(){
+			var _this = this;
+			this.tag = this.command == 'insertImage' ? 'img' : 'a';
+			var messages = dojo.i18n.getLocalization("dijit._editor", "LinkDialog", this.lang);
+			var dropDown = (this.dropDown = new dijit.TooltipDialog({
+				title: messages[this.command + "Title"],
+				execute: dojo.hitch(this, "setValue"),
+				onOpen: function(){
+					_this._onOpenDialog();
+					dijit.TooltipDialog.prototype.onOpen.apply(this, arguments);
+				},
+				onCancel: function(){
+					setTimeout(dojo.hitch(_this, "_onCloseDialog"),0);
+				},
+				onClose: dojo.hitch(this, "_onCloseDialog")
+			}));
+			messages.urlRegExp = this.urlRegExp;
+			messages.id = dijit.getUniqueId(this.editor.id);
+			this._setContent(dropDown.title + "<div style='border-bottom: 1px black solid;padding-bottom:2pt;margin-bottom:4pt'></div>" + dojo.string.substitute(this.linkDialogTemplate, messages));
+			dropDown.startup();
+
+			this.inherited(arguments);
+		},
+
+		_setContent: function(staticPanel){
+			this.dropDown.setContent(staticPanel);
+		},
+
+		setValue: function(args){
+			// summary: callback from the dialog when user hits "set" button
+			//TODO: prevent closing popup if the text is empty
+			this._onCloseDialog();
+			if(dojo.isIE){ //see #4151
+				var a = dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [this.tag]);
+				if(a){
+					dojo.withGlobal(this.editor.window, "selectElement", dijit._editor.selection, [a]);
+				}
+			}
+			args.tag = this.tag;
+			args.refAttr = this.tag == 'img' ? 'src' : 'href';
+			//TODO: textInput should be formatted by escapeXml
+			var template = "<${tag} ${refAttr}='${urlInput}' _djrealurl='${urlInput}'" +
+				(args.tag == 'img' ? " alt='${textInput}'>" : ">${textInput}") +
+				"</${tag}>";
+			this.editor.execCommand('inserthtml', dojo.string.substitute(template, args));
+ 		},
+
+		_onCloseDialog: function(){
+			// FIXME: IE is really messed up here!!
+			if(dojo.isIE){
+				if("_savedSelection" in this){
+					var b = this._savedSelection;
+					delete this._savedSelection;
+					this.editor.focus();
+					this.editor._moveToBookmark(b);
+				}
+			}else{
+				this.editor.focus();
+			}
+		},
+
+		_onOpenDialog: function(){
+			var a = dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [this.tag]);
+			var url, text;
+			if(a){
+				url = a.getAttribute('_djrealurl');
+				text = this.tag == 'img' ? a.getAttribute('alt') : a.textContent || a.innerText;
+				dojo.withGlobal(this.editor.window, "selectElement", dijit._editor.selection, [a, true]);
+			}else{
+				text = dojo.withGlobal(this.editor.window, dijit._editor.selection.getSelectedText);
+			}
+			// FIXME: IE is *really* b0rken
+			if(dojo.isIE){
+				this._savedSelection = this.editor._getBookmark();
+			}
+			this.dropDown.reset();
+			this.dropDown.setValues({urlInput: url || '', textInput: text || ''});
+			//dijit.focus(this.urlInput);
+		}/*,
+
+//TODO we don't show this state anymore
+		updateState: function(){
+			// summary: change shading on button if we are over a link (or not)
+
+			var _e = this.editor;
+			if(!_e || !_e.isLoaded){ return; }
+			if(this.button){
+				// display button differently if there is an existing link associated with the current selection
+				var hasA = dojo.withGlobal(this.editor.window, "hasAncestorElement", dijit._editor.selection, [this.tag]);
+				this.button.setAttribute('checked', hasA);
+			}
+		}
+*/
+	}
+);
+
+dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+	if(o.plugin){ return; }
+	switch(o.args.name){
+	case "createLink": case "insertImage":
+		o.plugin = new dijit._editor.plugins.LinkDialog({command: o.args.name});
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/TextColor.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/TextColor.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/TextColor.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,40 @@
+if(!dojo._hasResource["dijit._editor.plugins.TextColor"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.plugins.TextColor"] = true;
+dojo.provide("dijit._editor.plugins.TextColor");
+
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.ColorPalette");
+
+dojo.declare("dijit._editor.plugins.TextColor",
+	dijit._editor._Plugin,
+	{
+		//	summary:
+		//		This plugin provides dropdown color pickers for setting text color and background color
+		//
+		//	description:
+		//		The commands provided by this plugin are:
+		//		* foreColor - sets the text color
+		//		* hiliteColor - sets the background color
+
+		buttonClass: dijit.form.DropDownButton,
+
+//TODO: set initial focus/selection state?
+
+		constructor: function(){
+			this.dropDown = new dijit.ColorPalette();
+			this.connect(this.dropDown, "onChange", function(color){
+				this.editor.execCommand(this.command, color);
+			});
+		}
+	}
+);
+
+dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+	if(o.plugin){ return; }
+	switch(o.args.name){
+	case "foreColor": case "hiliteColor":
+		o.plugin = new dijit._editor.plugins.TextColor({command: o.args.name});
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/ToggleDir.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/ToggleDir.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/plugins/ToggleDir.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,40 @@
+if(!dojo._hasResource["dijit._editor.plugins.ToggleDir"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.plugins.ToggleDir"] = true;
+dojo.provide("dijit._editor.plugins.ToggleDir");
+dojo.experimental("dijit._editor.plugins.ToggleDir");
+
+dojo.require("dijit._editor._Plugin");
+
+dojo.declare("dijit._editor.plugins.ToggleDir",
+	dijit._editor._Plugin,
+	{
+		//summary: This plugin is used to toggle direction of the edited document only,
+		//		   no matter what direction the whole page is.
+				
+		useDefaultCommand: false,
+		command: "toggleDir",
+
+		_initButton: function(){
+			this.inherited("_initButton", arguments);
+			this.connect(this.button, "onClick", this._toggleDir);		
+		},
+
+		updateState: function(){},//overwrite
+
+		_toggleDir: function(){
+			var editDoc = this.editor.editorObject.contentWindow.document.documentElement;
+			var isLtr = dojo.getComputedStyle(editDoc).direction == "ltr";
+			editDoc.dir/*html node*/ = isLtr ? "rtl" : "ltr";
+		}
+	}
+);
+
+dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+	if(o.plugin){ return; }
+	switch(o.args.name){
+	case "toggleDir":
+		o.plugin = new dijit._editor.plugins.ToggleDir({command: o.args.name});
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/range.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/range.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/range.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,570 @@
+if(!dojo._hasResource["dijit._editor.range"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.range"] = true;
+dojo.provide("dijit._editor.range");
+
+dijit.range={};
+
+dijit.range.getIndex=function(/*DomNode*/node, /*DomNode*/parent){
+//	dojo.profile.start("dijit.range.getIndex");
+	var ret=[], retR=[];
+	var stop = parent;
+	var onode = node;
+
+	var pnode, n;
+	while(node != stop){
+		var i = 0;
+		pnode = node.parentNode;
+		while((n=pnode.childNodes[i++])){
+			if(n===node){
+				--i;
+				break;
+			}
+		}
+		if(i>=pnode.childNodes.length){
+			dojo.debug("Error finding index of a node in dijit.range.getIndex");
+		}
+		ret.unshift(i);
+		retR.unshift(i-pnode.childNodes.length);
+		node = pnode;
+	}
+
+	//normalized() can not be called so often to prevent
+	//invalidating selection/range, so we have to detect
+	//here that any text nodes in a row
+	if(ret.length>0 && onode.nodeType==3){
+		n = onode.previousSibling;
+		while(n && n.nodeType==3){
+			ret[ret.length-1]--;
+			n = n.previousSibling;
+		}
+		n = onode.nextSibling;
+		while(n && n.nodeType==3){
+			retR[retR.length-1]++;
+			n = n.nextSibling;
+		}
+	}
+//	dojo.profile.end("dijit.range.getIndex");
+	return {o: ret, r:retR};
+}
+
+dijit.range.getNode = function(/*Array*/index, /*DomNode*/parent){
+	if(!dojo.isArray(index) || index.length==0){
+		return parent;
+	}
+	var node = parent;
+//	if(!node)debugger
+	dojo.every(index, function(i){
+		if(i>=0&&i< node.childNodes.length){
+			node = node.childNodes[i];
+		}else{
+			node = null;
+			console.debug('Error: can not find node with index',index,'under parent node',parent );
+			return false; //terminate dojo.every
+		}
+		return true; //carry on the every loop
+	});
+
+	return node;
+}
+
+dijit.range.getCommonAncestor = function(n1,n2,root){
+	var getAncestors = function(n,root){
+		var as=[];
+		while(n){
+			as.unshift(n);
+			if(n!=root && n.tagName!='BODY'){
+				n = n.parentNode;
+			}else{
+				break;
+			}
+		}
+		return as;
+	};
+	var n1as = getAncestors(n1,root);
+	var n2as = getAncestors(n2,root);
+
+	var m = Math.min(n1as.length,n2as.length);
+	var com = n1as[0]; //at least, one element should be in the array: the root (BODY by default)
+	for(var i=1;i<m;i++){
+		if(n1as[i]===n2as[i]){
+			com = n1as[i]
+		}else{
+			break;
+		}
+	}
+	return com;
+}
+
+dijit.range.getAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){
+	root = root || node.ownerDocument.body;
+	while(node && node !== root){
+		var name = node.nodeName.toUpperCase() ;
+		if(regex.test(name)){
+			return node;
+		}
+
+		node = node.parentNode;
+	}
+	return null;
+}
+
+dijit.range.BlockTagNames = /^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;
+dijit.range.getBlockAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){
+	root = root || node.ownerDocument.body;
+	regex = regex || dijit.range.BlockTagNames;
+	var block=null, blockContainer;
+	while(node && node !== root){
+		var name = node.nodeName.toUpperCase() ;
+		if(!block && regex.test(name)){
+			block = node;
+		}
+		if(!blockContainer && (/^(?:BODY|TD|TH|CAPTION)$/).test(name)){
+			blockContainer = node;
+		}
+
+		node = node.parentNode;
+	}
+	return {blockNode:block, blockContainer:blockContainer || node.ownerDocument.body};
+}
+
+dijit.range.atBeginningOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){
+	var atBeginning = false;
+	var offsetAtBeginning = (offset == 0);
+	if(!offsetAtBeginning && node.nodeType==3){ //if this is a text node, check whether the left part is all space
+		if(dojo.trim(node.nodeValue.substr(0,offset))==0){
+			offsetAtBeginning = true;
+		}
+	}
+	if(offsetAtBeginning){
+		var cnode = node;
+		atBeginning = true;
+		while(cnode && cnode !== container){
+			if(cnode.previousSibling){
+				atBeginning = false;
+				break;
+			}
+			cnode = cnode.parentNode;
+		}
+	}
+	return atBeginning;
+}
+
+dijit.range.atEndOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){
+	var atEnd = false;
+	var offsetAtEnd = (offset == (node.length || node.childNodes.length));
+	if(!offsetAtEnd && node.nodeType==3){ //if this is a text node, check whether the right part is all space
+		if(dojo.trim(node.nodeValue.substr(offset))==0){
+			offsetAtEnd = true;
+		}
+	}
+	if(offsetAtEnd){
+		var cnode = node;
+		atEnd = true;
+		while(cnode && cnode !== container){
+			if(cnode.nextSibling){
+				atEnd = false;
+				break;
+			}
+			cnode = cnode.parentNode;
+		}
+	}
+	return atEnd;
+}
+
+dijit.range.adjacentNoneTextNode=function(startnode, next){
+	var node = startnode;
+	var len = (0-startnode.length) || 0;
+	var prop = next?'nextSibling':'previousSibling';
+	while(node){
+		if(node.nodeType!=3){
+			break;
+		}
+		len += node.length
+		node = node[prop];
+	}
+	return [node,len];
+}
+
+dijit.range._w3c = Boolean(window['getSelection']);
+dijit.range.create = function(){
+	if(dijit.range._w3c){
+		return dojo.doc.createRange();
+	}else{//IE
+		return new dijit.range.W3CRange;
+	}
+}
+
+dijit.range.getSelection = function(win, /*Boolean?*/ignoreUpdate){
+	if(dijit.range._w3c){
+		return win.getSelection();
+	}else{//IE
+		var id=win.__W3CRange,s;
+		if(!id || !dijit.range.ie.cachedSelection[id]){
+			s = new dijit.range.ie.selection(win);
+			//use win as the key in an object is not reliable, which
+			//can leads to quite odd behaviors. thus we generate a
+			//string and use it as a key in the cache
+			id=(new Date).getTime();
+			while(id in dijit.range.ie.cachedSelection){
+				id=id+1;
+			}
+			id=String(id);
+			dijit.range.ie.cachedSelection[id] = s;
+		}else{
+			s = dijit.range.ie.cachedSelection[id];
+		}
+		if(!ignoreUpdate){
+			s._getCurrentSelection();
+		}
+		return s;
+	}
+}
+
+if(!dijit.range._w3c){
+	dijit.range.ie={
+		cachedSelection: {},
+		selection: function(win){
+			this._ranges = [];
+			this.addRange = function(r, /*boolean*/internal){
+				this._ranges.push(r);
+				if(!internal){
+					r._select();
+				}
+				this.rangeCount = this._ranges.length;
+			};
+			this.removeAllRanges = function(){
+				//don't detach, the range may be used later
+//				for(var i=0;i<this._ranges.length;i++){
+//					this._ranges[i].detach();
+//				}
+				this._ranges = [];
+				this.rangeCount = 0;
+			};
+			var _initCurrentRange = function(){
+				var r = win.document.selection.createRange();
+				var type=win.document.selection.type.toUpperCase();
+				if(type == "CONTROL"){
+					//TODO: multiple range selection(?)
+					return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r));
+				}else{
+					return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r));
+				}
+			};
+			this.getRangeAt = function(i){
+				return this._ranges[i];
+			};
+			this._getCurrentSelection = function(){
+				this.removeAllRanges();
+				var r=_initCurrentRange();
+				if(r){
+					this.addRange(r, true);
+				}
+			};
+		},
+		decomposeControlRange: function(range){
+			var firstnode = range.item(0), lastnode = range.item(range.length-1)
+			var startContainer = firstnode.parentNode, endContainer = lastnode.parentNode;
+			var startOffset = dijit.range.getIndex(firstnode, startContainer).o;
+			var endOffset = dijit.range.getIndex(lastnode, endContainer).o+1;
+			return [[startContainer, startOffset],[endContainer, endOffset]];
+		},
+		getEndPoint: function(range, end){
+			var atmrange = range.duplicate();
+			atmrange.collapse(!end);
+			var cmpstr = 'EndTo' + (end?'End':'Start');
+			var parentNode = atmrange.parentElement();
+
+			var startnode, startOffset, lastNode;
+			if(parentNode.childNodes.length>0){
+				dojo.every(parentNode.childNodes, function(node,i){
+					var calOffset;
+					if(node.nodeType != 3){
+						atmrange.moveToElementText(node);
+
+						if(atmrange.compareEndPoints(cmpstr,range) > 0){
+							startnode = node.previousSibling;
+							if(lastNode && lastNode.nodeType == 3){
+								//where share we put the start? in the text node or after?
+								startnode = lastNode;
+								calOffset = true;
+							}else{
+								startnode = parentNode;
+								startOffset = i;
+								return false;
+							}
+						}else{
+							if(i==parentNode.childNodes.length-1){
+								startnode = parentNode;
+								startOffset = parentNode.childNodes.length;
+								return false;
+							}
+						}
+					}else{
+						if(i==parentNode.childNodes.length-1){//at the end of this node
+							startnode = node;
+							calOffset = true;
+						}
+					}
+		//			try{
+						if(calOffset && startnode){
+							var prevnode = dijit.range.adjacentNoneTextNode(startnode)[0];
+							if(prevnode){
+								startnode = prevnode.nextSibling;
+							}else{
+								startnode = parentNode.firstChild; //firstChild must be a text node
+							}
+							var prevnodeobj = dijit.range.adjacentNoneTextNode(startnode);
+							prevnode = prevnodeobj[0];
+							var lenoffset = prevnodeobj[1];
+							if(prevnode){
+								atmrange.moveToElementText(prevnode);
+								atmrange.collapse(false);
+							}else{
+								atmrange.moveToElementText(parentNode);
+							}
+							atmrange.setEndPoint(cmpstr, range);
+							startOffset = atmrange.text.length-lenoffset;
+
+							return false;
+						}
+		//			}catch(e){ debugger }
+					lastNode = node;
+					return true;
+				});
+			}else{
+				startnode = parentNode;
+				startOffset = 0;
+			}
+
+			//if at the end of startnode and we are dealing with start container, then
+			//move the startnode to nextSibling if it is a text node
+			//TODO: do this for end container?
+			if(!end && startnode.nodeType!=3 && startOffset == startnode.childNodes.length){
+				if(startnode.nextSibling && startnode.nextSibling.nodeType==3){
+					startnode = startnode.nextSibling;
+					startOffset = 0;
+				}
+			}
+			return [startnode, startOffset];
+		},
+		setEndPoint: function(range, container, offset){
+			//text node
+			var atmrange = range.duplicate(), node, len;
+			if(container.nodeType!=3){ //normal node
+				atmrange.moveToElementText(container);
+				atmrange.collapse(true);
+				if(offset == container.childNodes.length){
+					if(offset > 0){
+						//a simple atmrange.collapse(false); won't work here:
+						//although moveToElementText(node) is supposed to encompass the content of the node,
+						//but when collapse to end, it is in fact after the ending tag of node (collapse to start
+						//is after the begining tag of node as expected)
+						node = container.lastChild;
+						len = 0;
+						while(node && node.nodeType == 3){
+							len += node.length;
+							container = node; //pass through
+							node = node.previousSibling;
+						}
+						if(node){
+							atmrange.moveToElementText(node);
+						}
+						atmrange.collapse(false);
+						offset = len; //pass through
+					}else{ //no childNodes
+						atmrange.moveToElementText(container);
+						atmrange.collapse(true);
+					}
+				}else{
+					if(offset > 0){
+						node = container.childNodes[offset-1];
+						if(node.nodeType==3){
+							container = node;
+							offset = node.length;
+							//pass through
+						}else{
+							atmrange.moveToElementText(node);
+							atmrange.collapse(false);
+						}
+					}
+				}
+			}
+			if(container.nodeType==3){
+				var prevnodeobj = dijit.range.adjacentNoneTextNode(container);
+				var prevnode = prevnodeobj[0];
+				len = prevnodeobj[1];
+				if(prevnode){
+					atmrange.moveToElementText(prevnode);
+					atmrange.collapse(false);
+					//if contentEditable is not inherit, the above collapse won't make the end point
+					//in the correctly position: it always has a -1 offset, so compensate it
+					if(prevnode.contentEditable!='inherit'){
+						len++;
+					}
+				}else{
+					atmrange.moveToElementText(container.parentNode);
+					atmrange.collapse(true);
+				}
+
+				offset += len;
+				if(offset>0){
+					if(atmrange.moveEnd('character',offset) != offset){
+						alert('Error when moving!');
+					}
+					atmrange.collapse(false);
+				}
+			}
+
+			return atmrange;
+		},
+		decomposeTextRange: function(range){
+			var tmpary = dijit.range.ie.getEndPoint(range);
+			var startContainter = tmpary[0], startOffset = tmpary[1];
+			var endContainter = tmpary[0], endOffset = tmpary[1];
+
+			if(range.htmlText.length){
+				if(range.htmlText == range.text){ //in the same text node
+					endOffset = startOffset+range.text.length;
+				}else{
+					tmpary = dijit.range.ie.getEndPoint(range,true);
+					endContainter = tmpary[0], endOffset = tmpary[1];
+				}
+			}
+			return [[startContainter, startOffset],[endContainter, endOffset], range.parentElement()];
+		},
+		setRange: function(range, startContainter,
+			startOffset, endContainter, endOffset, check){
+			var startrange = dijit.range.ie.setEndPoint(range, startContainter, startOffset);
+			range.setEndPoint('StartToStart', startrange);
+			if(!this.collapsed){
+				var endrange = dijit.range.ie.setEndPoint(range, endContainter, endOffset);
+				range.setEndPoint('EndToEnd', endrange);
+			}
+
+			return range;
+		}
+	}
+
+dojo.declare("dijit.range.W3CRange",null, {
+	constructor: function(){
+		if(arguments.length>0){
+			this.setStart(arguments[0][0][0],arguments[0][0][1]);
+			this.setEnd(arguments[0][1][0],arguments[0][1][1],arguments[0][2]);
+		}else{
+			this.commonAncestorContainer = null;
+			this.startContainer = null;
+			this.startOffset = 0;
+			this.endContainer = null;
+			this.endOffset = 0;
+			this.collapsed = true;
+		}
+	},
+	_simpleSetEndPoint: function(node, range, end){
+		var r = (this._body||node.ownerDocument.body).createTextRange();
+		if(node.nodeType!=1){
+			r.moveToElementText(node.parentNode);
+		}else{
+			r.moveToElementText(node);
+		}
+		r.collapse(true);
+		range.setEndPoint(end?'EndToEnd':'StartToStart',r);
+	},
+	_updateInternal: function(__internal_common){
+		if(this.startContainer !== this.endContainer){
+			if(!__internal_common){
+				var r = (this._body||this.startContainer.ownerDocument.body).createTextRange();
+				this._simpleSetEndPoint(this.startContainer,r);
+				this._simpleSetEndPoint(this.endContainer,r,true);
+				__internal_common = r.parentElement();
+			}
+			this.commonAncestorContainer = dijit.range.getCommonAncestor(this.startContainer, this.endContainer, __internal_common);
+		}else{
+			this.commonAncestorContainer = this.startContainer;
+		}
+		this.collapsed = (this.startContainer === this.endContainer) && (this.startOffset == this.endOffset);
+	},
+	setStart: function(node, offset, __internal_common){
+		offset=parseInt(offset);
+		if(this.startContainer === node && this.startOffset == offset){
+			return;
+		}
+		delete this._cachedBookmark;
+
+		this.startContainer = node;
+		this.startOffset = offset;
+		if(!this.endContainer){
+			this.setEnd(node, offset, __internal_common);
+		}else{
+			this._updateInternal(__internal_common);
+		}
+	},
+	setEnd: function(node, offset, __internal_common){
+		offset=parseInt(offset);
+		if(this.endContainer === node && this.endOffset == offset){
+			return;
+		}
+		delete this._cachedBookmark;
+
+		this.endContainer = node;
+		this.endOffset = offset;
+		if(!this.startContainer){
+			this.setStart(node, offset, __internal_common);
+		}else{
+			this._updateInternal(__internal_common);
+		}
+	},
+	setStartAfter: function(node, offset){
+		this._setPoint('setStart', node, offset, 1);
+	},
+	setStartBefore: function(node, offset){
+		this._setPoint('setStart', node, offset, 0);
+	},
+	setEndAfter: function(node, offset){
+		this._setPoint('setEnd', node, offset, 1);
+	},
+	setEndBefore: function(node, offset){
+		this._setPoint('setEnd', node, offset, 0);
+	},
+	_setPoint: function(what, node, offset, ext){
+		var index = dijit.range.getIndex(node, node.parentNode).o;
+		this[what](node.parentNode, index.pop()+ext);
+	},
+	_getIERange: function(){
+		var r=(this._body||this.endContainer.ownerDocument.body).createTextRange();
+		dijit.range.ie.setRange(r, this.startContainer, this.startOffset, this.endContainer, this.endOffset);
+		return r;
+	},
+	getBookmark: function(body){
+		this._getIERange();
+		return this._cachedBookmark;
+	},
+	_select: function(){
+		var r = this._getIERange();
+		r.select();
+	},
+	deleteContents: function(){
+		var r = this._getIERange();
+		r.pasteHTML('');
+		this.endContainer = this.startContainer;
+		this.endOffset = this.startOffset;
+		this.collapsed = true;
+	},
+	cloneRange: function(){
+		var r = new dijit.range.W3CRange([[this.startContainer,this.startOffset],
+			[this.endContainer,this.endOffset]]);
+		r._body = this._body;
+		return r;
+	},
+	detach: function(){
+		this._body = null;
+		this.commonAncestorContainer = null;
+		this.startContainer = null;
+		this.startOffset = 0;
+		this.endContainer = null;
+		this.endOffset = 0;
+		this.collapsed = true;
+}
+});
+} //if(!dijit.range._w3c)
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_editor/selection.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_editor/selection.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_editor/selection.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,246 @@
+if(!dojo._hasResource["dijit._editor.selection"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.selection"] = true;
+dojo.provide("dijit._editor.selection");
+
+// FIXME:
+//		all of these methods branch internally for IE. This is probably
+//		sub-optimal in terms of runtime performance. We should investigate the
+//		size difference for differentiating at definition time.
+
+dojo.mixin(dijit._editor.selection, {
+	getType: function(){
+		// summary: Get the selection type (like dojo.doc.select.type in IE).
+		if(dojo.doc.selection){ //IE
+			return dojo.doc.selection.type.toLowerCase();
+		}else{
+			var stype = "text";
+
+			// Check if the actual selection is a CONTROL (IMG, TABLE, HR, etc...).
+			var oSel;
+			try{
+				oSel = dojo.global.getSelection();
+			}catch(e){ /*squelch*/ }
+
+			if(oSel && oSel.rangeCount==1){
+				var oRange = oSel.getRangeAt(0);
+				if(	(oRange.startContainer == oRange.endContainer) &&
+					((oRange.endOffset - oRange.startOffset) == 1) &&
+					(oRange.startContainer.nodeType != 3 /* text node*/)
+				){
+					stype = "control";
+				}
+			}
+			return stype;
+		}
+	},
+
+	getSelectedText: function(){
+		// summary:
+		//		Return the text (no html tags) included in the current selection or null if no text is selected
+		if(dojo.doc.selection){ //IE
+			if(dijit._editor.selection.getType() == 'control'){
+				return null;
+			}
+			return dojo.doc.selection.createRange().text;
+		}else{
+			var selection = dojo.global.getSelection();
+			if(selection){
+				return selection.toString();
+			}
+		}
+		return ''
+	},
+
+	getSelectedHtml: function(){
+		// summary:
+		//		Return the html of the current selection or null if unavailable
+		if(dojo.doc.selection){ //IE
+			if(dijit._editor.selection.getType() == 'control'){
+				return null;
+			}
+			return dojo.doc.selection.createRange().htmlText;
+		}else{
+			var selection = dojo.global.getSelection();
+			if(selection && selection.rangeCount){
+				var frag = selection.getRangeAt(0).cloneContents();
+				var div = dojo.doc.createElement("div");
+				div.appendChild(frag);
+				return div.innerHTML;
+			}
+			return null;
+		}
+	},
+
+	getSelectedElement: function(){
+		// summary:
+		//		Retrieves the selected element (if any), just in the case that
+		//		a single element (object like and image or a table) is
+		//		selected.
+		if(this.getType() == "control"){
+			if(dojo.doc.selection){ //IE
+				var range = dojo.doc.selection.createRange();
+				if(range && range.item){
+					return dojo.doc.selection.createRange().item(0);
+				}
+			}else{
+				var selection = dojo.global.getSelection();
+				return selection.anchorNode.childNodes[ selection.anchorOffset ];
+			}
+		}
+		return null;
+	},
+
+	getParentElement: function(){
+		// summary:
+		//		Get the parent element of the current selection
+		if(this.getType() == "control"){
+			var p = this.getSelectedElement();
+			if(p){ return p.parentNode; }
+		}else{
+			if(dojo.doc.selection){ //IE
+				return dojo.doc.selection.createRange().parentElement();
+			}else{
+				var selection = dojo.global.getSelection();
+				if(selection){
+					var node = selection.anchorNode;
+
+					while(node && (node.nodeType != 1)){ // not an element
+						node = node.parentNode;
+					}
+
+					return node;
+				}
+			}
+		}
+		return null;
+	},
+
+	hasAncestorElement: function(/*String*/tagName /* ... */){
+		// summary:
+		// 		Check whether current selection has a  parent element which is
+		// 		of type tagName (or one of the other specified tagName)
+		return this.getAncestorElement.apply(this, arguments) != null;
+	},
+
+	getAncestorElement: function(/*String*/tagName /* ... */){
+		// summary:
+		//		Return the parent element of the current selection which is of
+		//		type tagName (or one of the other specified tagName)
+
+		var node = this.getSelectedElement() || this.getParentElement();
+		return this.getParentOfType(node, arguments);
+	},
+
+	isTag: function(/*DomNode*/node, /*Array*/tags){
+		if(node && node.tagName){
+			var _nlc = node.tagName.toLowerCase();
+			for(var i=0; i<tags.length; i++){
+				var _tlc = String(tags[i]).toLowerCase();
+				if(_nlc == _tlc){
+					return _tlc;
+				}
+			}
+		}
+		return "";
+	},
+
+	getParentOfType: function(/*DomNode*/node, /*Array*/tags){
+		while(node){
+			if(this.isTag(node, tags).length){
+				return node;
+			}
+			node = node.parentNode;
+		}
+		return null;
+	},
+
+	collapse: function(/*Boolean*/beginning) {
+		// summary: clear current selection
+	  if(window['getSelection']){
+	          var selection = dojo.global.getSelection();
+	          if(selection.removeAllRanges){ // Mozilla
+	                  if(beginning){
+	                          selection.collapseToStart();
+	                  }else{
+	                          selection.collapseToEnd();
+	                  }
+	          }else{ // Safari
+	                  // pulled from WebCore/ecma/kjs_window.cpp, line 2536
+	                   selection.collapse(beginning);
+	          }
+	  }else if(dojo.doc.selection){ // IE
+	          var range = dojo.doc.selection.createRange();
+	          range.collapse(beginning);
+	          range.select();
+	  }
+	},
+
+	remove: function(){
+		// summary: delete current selection
+		var _s = dojo.doc.selection;
+		if(_s){ //IE
+			if(_s.type.toLowerCase() != "none"){
+				_s.clear();
+			}
+			return _s;
+		}else{
+			_s = dojo.global.getSelection();
+			_s.deleteFromDocument();
+			return _s;
+		}
+	},
+
+	selectElementChildren: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
+		// summary:
+		//		clear previous selection and select the content of the node
+		//		(excluding the node itself)
+		var _window = dojo.global;
+		var _document = dojo.doc;
+		element = dojo.byId(element);
+		if(_document.selection && dojo.body().createTextRange){ // IE
+			var range = element.ownerDocument.body.createTextRange();
+			range.moveToElementText(element);
+			if(!nochangefocus){
+				try{
+					range.select(); // IE throws an exception here if the widget is hidden.  See #5439
+				}catch(e){ /* squelch */}
+			}
+		}else if(_window.getSelection){
+			var selection = _window.getSelection();
+			if(selection.setBaseAndExtent){ // Safari
+				selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
+			}else if(selection.selectAllChildren){ // Mozilla
+				selection.selectAllChildren(element);
+			}
+		}
+	},
+
+	selectElement: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
+		// summary:
+		//		clear previous selection and select element (including all its children)
+		var range, _document = dojo.doc;
+		element = dojo.byId(element);
+		if(_document.selection && dojo.body().createTextRange){ // IE
+			try{
+				range = dojo.body().createControlRange();
+				range.addElement(element);
+				if(!nochangefocus){
+					range.select();
+				}
+			}catch(e){
+				this.selectElementChildren(element,nochangefocus);
+			}
+		}else if(dojo.global.getSelection){
+			var selection = dojo.global.getSelection();
+			// FIXME: does this work on Safari?
+			if(selection.removeAllRanges){ // Mozilla
+				range = _document.createRange();
+				range.selectNode(element);
+				selection.removeAllRanges();
+				selection.addRange(range);
+			}
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_tree/Node.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_tree/Node.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_tree/Node.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+<div class="dijitTreeNode" waiRole="presentation"
+	><div dojoAttachPoint="rowNode" waiRole="presentation"
+		><span dojoAttachPoint="expandoNode" class="dijitTreeExpando" waiRole="presentation"
+		></span
+		><span dojoAttachPoint="expandoNodeText" class="dijitExpandoText" waiRole="presentation"
+		></span
+		><div dojoAttachPoint="contentNode" class="dijitTreeContent" waiRole="presentation">
+			<div dojoAttachPoint="iconNode" class="dijitInline dijitTreeIcon" waiRole="presentation"></div>
+			<span dojoAttachPoint="labelNode" class="dijitTreeLabel" wairole="treeitem" tabindex="-1" waiState="selected-false" dojoAttachEvent="onfocus:_onNodeFocus"></span>
+		</div
+	></div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/_tree/Tree.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_tree/Tree.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_tree/Tree.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+<div class="dijitTreeContainer" waiRole="tree"
+	dojoAttachEvent="onclick:_onClick,onkeypress:_onKeyPress">
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,150 @@
+if(!dojo._hasResource["dijit._tree.dndContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._tree.dndContainer"] = true;
+dojo.provide("dijit._tree.dndContainer");
+dojo.require("dojo.dnd.common");
+dojo.require("dojo.dnd.Container");
+
+dojo.declare("dijit._tree.dndContainer",
+	null, 
+	{
+		constructor: function(tree, params){
+			// summary: a constructor of the Container
+			// tree: Node: node or node's id to build the container on
+			// params: Object: a dict of parameters, which gets mixed into the object
+			this.tree = tree;
+			this.node = tree.domNode;	// TODO: rename; it's not a TreeNode but the whole Tree
+			dojo.mixin(this, params);
+	
+			// class-specific variables
+			this.map = {};
+			this.current = null;	// current TreeNode
+	
+			// states
+			this.containerState = "";
+			dojo.addClass(this.node, "dojoDndContainer");
+			
+			// mark up children
+			if(!(params && params._skipStartup)){
+				this.startup();
+			}
+
+			// set up events
+			this.events = [
+				dojo.connect(this.node, "onmouseover", this, "onMouseOver"),
+				dojo.connect(this.node, "onmouseout",  this, "onMouseOut"),
+
+				// cancel text selection and text dragging
+				dojo.connect(this.node, "ondragstart",   dojo, "stopEvent"),
+				dojo.connect(this.node, "onselectstart", dojo, "stopEvent")
+			];
+		},
+
+
+		// abstract access to the map
+		getItem: function(/*String*/ key){
+			// summary: returns a data item by its key (id)
+			//console.log("Container getItem()", arguments,this.map, this.map[key], this.selection[key]);
+			return this.selection[key];
+			//return this.map[key];	// Object
+		},
+
+		// mouse events
+		onMouseOver: function(e){
+			// summary: event processor for onmouseover
+			// e: Event: mouse event
+
+			// handle when mouse has just moved over the Tree itself (not a TreeNode, but the Tree)
+			var rt = e.relatedTarget;	// the previous location
+			while(rt){
+				if(rt == this.node){ break; }
+				try{
+					rt = rt.parentNode;
+				}catch(x){
+					rt = null;
+				}
+			}
+			if(!rt){
+				this._changeState("Container", "Over");
+				this.onOverEvent();
+			}
+
+			// code below is for handling depending on which TreeNode we are over
+			var n = this._getChildByEvent(e);	// the TreeNode
+			if(this.current == n){ return; }
+			if(this.current){ this._removeItemClass(this.current, "Over"); }
+			if(n){ this._addItemClass(n, "Over"); }
+			this.current = n;
+		},
+
+		onMouseOut: function(e){
+			// summary: event processor for onmouseout
+			// e: Event: mouse event
+			for(var n = e.relatedTarget; n;){
+				if(n == this.node){ return; }
+				try{
+					n = n.parentNode;
+				}catch(x){
+					n = null;
+				}
+			}
+			if(this.current){
+				this._removeItemClass(this.current, "Over");
+				this.current = null;
+			}
+			this._changeState("Container", "");
+			this.onOutEvent();
+		},
+
+		_changeState: function(type, newState){
+			// summary: changes a named state to new state value
+			// type: String: a name of the state to change
+			// newState: String: new state
+			var prefix = "dojoDnd" + type;
+			var state  = type.toLowerCase() + "State";
+			//dojo.replaceClass(this.node, prefix + newState, prefix + this[state]);
+			dojo.removeClass(this.node, prefix + this[state]);
+			dojo.addClass(this.node, prefix + newState);
+			this[state] = newState;
+		},
+
+		_getChildByEvent: function(e){
+			// summary: gets a child, which is under the mouse at the moment, or null
+			// e: Event: a mouse event
+			var node = e.target;
+			if(node){
+				for(var parent = node.parentNode; parent; node = parent, parent = node.parentNode){
+					if(dojo.hasClass(node, "dijitTreeContent")){ return node; }
+				}
+			}
+			return null;
+		},
+
+		markupFactory: function(tree, params){
+			params._skipStartup = true;
+			return new dijit._tree.dndContainer(tree, params);
+		},
+
+		_addItemClass: function(node, type){
+			// summary: adds a class with prefix "dojoDndItem"
+			// node: Node: a node
+			// type: String: a variable suffix for a class name
+			dojo.addClass(node, "dojoDndItem" + type);
+		},
+
+		_removeItemClass: function(node, type){
+			// summary: removes a class with prefix "dojoDndItem"
+			// node: Node: a node
+			// type: String: a variable suffix for a class name
+			dojo.removeClass(node, "dojoDndItem" + type);
+		},
+
+		onOverEvent: function(){
+			// summary: this function is called once, when mouse is over our container
+		},
+
+		onOutEvent: function(){
+			// summary: this function is called once, when mouse is out of our container
+		}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndSelector.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndSelector.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndSelector.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,171 @@
+if(!dojo._hasResource["dijit._tree.dndSelector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._tree.dndSelector"] = true;
+dojo.provide("dijit._tree.dndSelector");
+dojo.require("dojo.dnd.common");
+dojo.require("dijit._tree.dndContainer");
+
+dojo.declare("dijit._tree.dndSelector",
+	dijit._tree.dndContainer,
+	{
+		constructor: function(tree, params){
+			this.selection={};
+			this.anchor = null;
+			this.simpleSelection=false;
+		
+			this.events.push(
+				dojo.connect(this.tree.domNode, "onmousedown", this,"onMouseDown"),
+				dojo.connect(this.tree.domNode, "onmouseup", this,"onMouseUp")
+			);
+		},
+	
+		// object attributes (for markup)
+		singular: false,	// is singular property
+	
+		// methods
+		getSelectedItems: function(){
+			var selectedItems = []
+			for (var i in this.selection){
+				selectedItems.push(dijit.getEnclosingWidget(this.selection[i]).item);
+			}
+			return selectedItems;
+		},
+
+		getSelectedNodes: function(){
+			return this.selection;
+		},
+
+		selectNone: function(){
+			// summary: unselects all items
+			return this._removeSelection()._removeAnchor();	// self
+		},
+
+		insertItems: function(item, parent){
+			// summary: inserts new data items (see Container's insertNodes method for details)
+			
+			//we actually need to add things to the store here instead of adding noes to the tree directly		
+		},
+
+		destroy: function(){
+			// summary: prepares the object to be garbage-collected
+			dojo.dnd.Selector.superclass.destroy.call(this);
+			this.selection = this.anchor = null;
+		},
+
+		// mouse events
+		onMouseDown: function(e){
+			// summary: event processor for onmousedown
+			// e: Event: mouse event
+			if(!this.current){ return; }
+
+			var item = dijit.getEnclosingWidget(this.current).item
+			var id = this.tree.model.getIdentity(item);
+
+			if (!this.current.id) {
+				this.current.id=id;
+			}
+
+			if (!this.current.type) {
+				this.current.type="data";
+			}
+
+			if(!this.singular && !dojo.dnd.getCopyKeyState(e) && !e.shiftKey && (this.current.id in this.selection)){
+				this.simpleSelection = true;
+				dojo.stopEvent(e);
+				return;
+			}
+
+			if(this.singular){
+				if(this.anchor == this.current){
+					if(dojo.dnd.getCopyKeyState(e)){
+						this.selectNone();
+					}
+				}else{
+					this.selectNone();
+					this.anchor = this.current;
+					this._addItemClass(this.anchor, "Anchor");
+
+					this.selection[this.current.id] = this.current;
+				}
+			}else{
+				if(!this.singular && e.shiftKey){	
+					if (dojo.dnd.getCopyKeyState(e)){
+						//TODO add range to selection
+					}else{
+						//TODO select new range from anchor 
+					}
+				}else{
+					if(dojo.dnd.getCopyKeyState(e)){
+						if(this.anchor == this.current){
+							delete this.selection[this.anchor.id];
+							this._removeAnchor();
+						}else{
+							if(this.current.id in this.selection){
+								this._removeItemClass(this.current, "Selected");
+								delete this.selection[this.current.id];
+							}else{
+								if(this.anchor){
+									this._removeItemClass(this.anchor, "Anchor");
+									this._addItemClass(this.anchor, "Selected");
+								}
+								this.anchor = this.current;
+								this._addItemClass(this.current, "Anchor");
+								this.selection[this.current.id] = this.current;
+							}
+						}
+					}else{
+						var item = dijit.getEnclosingWidget(this.current).item
+						var id = this.tree.model.getIdentity(item);
+						if(!(id in this.selection)){
+							this.selectNone();
+							this.anchor = this.current;
+							this._addItemClass(this.current, "Anchor");
+							this.selection[id] = this.current;
+						}
+					}
+				}
+			}
+
+			dojo.stopEvent(e);
+		},
+
+		onMouseMove: function() {
+
+		},
+
+		onOverEvent: function() {
+			this.onmousemoveEvent = dojo.connect(this.node, "onmousemove", this, "onMouseMove");
+		},
+
+		onMouseUp: function(e){
+			// summary: event processor for onmouseup
+			// e: Event: mouse event
+			if(!this.simpleSelection){ return; }
+			this.simpleSelection = false;
+			this.selectNone();
+			if(this.current){
+				this.anchor = this.current;
+				this._addItemClass(this.anchor, "Anchor");
+				this.selection[this.current.id] = this.current;
+			}
+		},
+		_removeSelection: function(){
+			// summary: unselects all items
+			var e = dojo.dnd._empty;
+			for(var i in this.selection){
+				if(i in e){ continue; }
+				var node = dojo.byId(i);
+				if(node){ this._removeItemClass(node, "Selected"); }
+			}
+			this.selection = {};
+			return this;	// self
+		},
+		_removeAnchor: function(){
+			if(this.anchor){
+				this._removeItemClass(this.anchor, "Anchor");
+				this.anchor = null;
+			}
+			return this;	// self
+		}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndSource.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndSource.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_tree/dndSource.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,373 @@
+if(!dojo._hasResource["dijit._tree.dndSource"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._tree.dndSource"] = true;
+dojo.provide("dijit._tree.dndSource");
+
+dojo.require("dijit._tree.dndSelector");
+dojo.require("dojo.dnd.Manager");
+
+dojo.declare("dijit._tree.dndSource", dijit._tree.dndSelector, {
+	// summary: a Source object, which can be used as a DnD source, or a DnD target
+	
+	// object attributes (for markup)
+	isSource: true,
+	copyOnly: false,
+	skipForm: false,
+	accept: ["text"],
+	
+	constructor: function(tree, params){
+		// summary: a constructor of the Source
+		// tree: dijit.Tree: the tree widget to build the source on
+		// params: Object: a dict of parameters, recognized parameters are:
+		//	isSource: Boolean: can be used as a DnD source, if true; assumed to be "true" if omitted
+		//	accept: Array: list of accepted types (text strings) for a target; assumed to be ["text"] if omitted
+		//	horizontal: Boolean: a horizontal container, if true, vertical otherwise or when omitted
+		//	copyOnly: Boolean: always copy items, if true, use a state of Ctrl key otherwise
+		//	skipForm: Boolean: don't start the drag operation, if clicked on form elements
+		//	the rest of parameters are passed to the selector
+		if(!params){ params = {}; }
+		dojo.mixin(this, params);
+		this.isSource = typeof params.isSource == "undefined" ? true : params.isSource;
+		var type = params.accept instanceof Array ? params.accept : ["text"];
+		this.accept = null;
+		if(type.length){
+			this.accept = {};
+			for(var i = 0; i < type.length; ++i){
+				this.accept[type[i]] = 1;
+			}
+		}
+
+		// class-specific variables
+		this.isDragging = false;
+		this.mouseDown = false;
+		this.targetAnchor = null;
+		this.targetBox = null;
+		this.before = true;
+
+		// states
+		this.sourceState  = "";
+		if(this.isSource){
+			dojo.addClass(this.node, "dojoDndSource");
+		}
+		this.targetState  = "";
+		if(this.accept){
+			dojo.addClass(this.node, "dojoDndTarget");
+		}
+		if(this.horizontal){
+			dojo.addClass(this.node, "dojoDndHorizontal");
+		}
+		// set up events
+		this.topics = [
+			dojo.subscribe("/dnd/source/over", this, "onDndSourceOver"),
+			dojo.subscribe("/dnd/start",  this, "onDndStart"),
+			dojo.subscribe("/dnd/drop",   this, "onDndDrop"),
+			dojo.subscribe("/dnd/cancel", this, "onDndCancel")
+		];
+	},
+
+	startup: function(){
+	},
+	
+	// methods
+	checkAcceptance: function(source, nodes){
+		// summary: checks, if the target can accept nodes from this source
+		// source: Object: the source which provides items
+		// nodes: Array: the list of transferred items
+		return true;	// Boolean
+	},
+	copyState: function(keyPressed){
+		// summary: Returns true, if we need to copy items, false to move.
+		//		It is separated to be overwritten dynamically, if needed.
+		// keyPressed: Boolean: the "copy" was pressed
+		return this.copyOnly || keyPressed;	// Boolean
+	},
+	destroy: function(){
+		// summary: prepares the object to be garbage-collected
+		this.inherited("destroy",arguments);
+		dojo.forEach(this.topics, dojo.unsubscribe);
+		this.targetAnchor = null;
+	},
+
+	// markup methods
+	markupFactory: function(params, node){
+		params._skipStartup = true;
+		return new dijit._tree.dndSource(node, params);
+	},
+
+	// mouse event processors
+	onMouseMove: function(e){
+		// summary: event processor for onmousemove
+		// e: Event: mouse event
+		if(this.isDragging && this.targetState == "Disabled"){ return; }
+		this.inherited("onMouseMove", arguments);
+		var m = dojo.dnd.manager();
+		if(this.isDragging){
+			// calculate before/after
+
+			if (this.allowBetween){ // not implemented yet for tree since it has no concept of order
+				var before = false;
+				if(this.current){
+					if(!this.targetBox || this.targetAnchor != this.current){
+						this.targetBox = {
+							xy: dojo.coords(this.current, true),
+							w: this.current.offsetWidth,
+							h: this.current.offsetHeight
+						};
+					}
+					if(this.horizontal){
+						before = (e.pageX - this.targetBox.xy.x) < (this.targetBox.w / 2);
+					}else{
+						before = (e.pageY - this.targetBox.xy.y) < (this.targetBox.h / 2);
+					}
+				}
+				if(this.current != this.targetAnchor || before != this.before){
+					this._markTargetAnchor(before);
+					m.canDrop(!this.current || m.source != this || !(this.current.id in this.selection));
+				}
+			}
+		}else{
+			if(this.mouseDown && this.isSource){
+				var n = this.getSelectedNodes();
+				var nodes=[];
+				for (var i in n){
+					nodes.push(n[i]);
+				}
+				if(nodes.length){
+					m.startDrag(this, nodes, this.copyState(dojo.dnd.getCopyKeyState(e)));
+				}
+			}
+		}
+	},
+
+	onMouseDown: function(e){
+		// summary: event processor for onmousedown
+		// e: Event: mouse event
+		this.mouseDown = true;
+		this.mouseButton = e.button;
+		this.inherited("onMouseDown",arguments);
+	},
+
+	onMouseUp: function(e){
+		// summary: event processor for onmouseup
+		// e: Event: mouse event
+		if(this.mouseDown){
+			this.mouseDown = false;
+			this.inherited("onMouseUp",arguments);
+		}
+	},
+
+	onMouseOver: function(e){
+		// summary: event processor for onmouseover
+		// e: Event: mouse event
+
+		// handle when mouse has just moved over the Tree itself (not a TreeNode, but the Tree)
+		var rt = e.relatedTarget;	// the previous location
+		while(rt){
+			if(rt == this.node){ break; }
+			try{
+				rt = rt.parentNode;
+			}catch(x){
+				rt = null;
+			}
+		}
+		if(!rt){
+			this._changeState("Container", "Over");
+			this.onOverEvent();
+		}
+
+		// code below is for handling depending on which TreeNode we are over
+		var n = this._getChildByEvent(e);	// the TreeNode
+		if(this.current == n){ return; }
+		if(this.current){ this._removeItemClass(this.current, "Over"); }
+		var m = dojo.dnd.manager();
+		if(n){ 
+			this._addItemClass(n, "Over"); 
+			if(this.isDragging){
+				if(this.checkItemAcceptance(n,m.source)){
+					m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(n in this.selection)));
+				}else{
+					m.canDrop(false);
+				}
+			}
+		}else{
+			if(this.isDragging){
+				if (m.source && this.checkAcceptance(m.source,m.source.getSelectedNodes())){
+					m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(this.current.id in this.selection)));
+				}else{
+					m.canDrop(false);
+				}
+			}
+		}
+		this.current = n;
+	},
+
+	checkItemAcceptance: function(node, source){
+		// summary: stub funciton to be overridden if one wants to check for the ability to drop at the node/item level 
+		return true;	
+	},
+	
+	// topic event processors
+	onDndSourceOver: function(source){
+		// summary: topic event processor for /dnd/source/over, called when detected a current source
+		// source: Object: the source which has the mouse over it
+		if(this != source){
+			this.mouseDown = false;
+			if(this.targetAnchor){
+				this._unmarkTargetAnchor();
+			}
+		}else if(this.isDragging){
+			var m = dojo.dnd.manager();
+			m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(this.current.id in this.selection)));
+		}
+	},
+	onDndStart: function(source, nodes, copy){
+		// summary: topic event processor for /dnd/start, called to initiate the DnD operation
+		// source: Object: the source which provides items
+		// nodes: Array: the list of transferred items
+		// copy: Boolean: copy items, if true, move items otherwise
+
+		if(this.isSource){
+			this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
+		}
+		var accepted = this.checkAcceptance(source, nodes);
+
+		this._changeState("Target", accepted ? "" : "Disabled");
+
+		if(accepted){
+			dojo.dnd.manager().overSource(this);
+		}
+
+		this.isDragging = true;
+	},
+
+	itemCreator: function(nodes){
+		return dojo.map(nodes, function(node){
+			return {
+				"id": node.id,
+				"name": node.textContent || node.innerText || ""
+			};
+		});
+	},
+
+	onDndDrop: function(source, nodes, copy){
+		// summary:
+		//		Topic event processor for /dnd/drop, called to finish the DnD operation..
+		//		Updates data store items according to where node was dragged from and dropped
+		//		to.   The tree will then respond to those data store updates and redraw itself.
+		// source: Object: the source which provides items
+		// nodes: Array: the list of transferred items
+		// copy: Boolean: copy items, if true, move items otherwise
+
+		if(this.containerState == "Over"){
+			var tree = this.tree,
+				model = tree.model,
+				target = this.current,
+				requeryRoot = false;	// set to true iff top level items change
+
+			this.isDragging = false;
+
+			// Compute the new parent item
+			var targetWidget = dijit.getEnclosingWidget(target),
+				newParentItem = (targetWidget && targetWidget.item) || tree.item;
+
+			// If we are dragging from another source (or at least, another source
+			// that points to a different data store), then we need to make new data
+			// store items for each element in nodes[].  This call get the parameters
+			// to pass to store.newItem()
+			var newItemsParams;
+			if(source != this){
+				newItemsParams = this.itemCreator(nodes, target);
+			}
+
+			dojo.forEach(nodes, function(node, idx){
+				if(source == this){
+					// This is a node from my own tree, and we are moving it, not copying.
+					// Remove item from old parent's children attribute.
+					// TODO: dijit._tree.dndSelector should implement deleteSelectedNodes()
+					// and this code should go there.
+					var childTreeNode = dijit.getEnclosingWidget(node),
+						childItem = childTreeNode.item,
+						oldParentItem = childTreeNode.getParent().item;
+
+					model.pasteItem(childItem, oldParentItem, newParentItem, copy);
+				}else{
+					model.newItem(newItemsParams[idx], newParentItem);
+				}
+			}, this);
+
+			// Expand the target node (if it's currently collapsed) so the user can see
+			// where their node was dropped.   In particular since that node is still selected.
+			this.tree._expandNode(targetWidget);
+		}
+		this.onDndCancel();
+	},
+	onDndCancel: function(){
+		// summary: topic event processor for /dnd/cancel, called to cancel the DnD operation
+		if(this.targetAnchor){
+			this._unmarkTargetAnchor();
+			this.targetAnchor = null;
+		}
+		this.before = true;
+		this.isDragging = false;
+		this.mouseDown = false;
+		delete this.mouseButton;
+		this._changeState("Source", "");
+		this._changeState("Target", "");
+	},
+	
+	// utilities
+
+	onOverEvent: function(){
+		// summary: this function is called once, when mouse is over our container
+		this.inherited("onOverEvent",arguments);
+		dojo.dnd.manager().overSource(this);
+	},
+	onOutEvent: function(){
+		// summary: this function is called once, when mouse is out of our container
+		this.inherited("onOutEvent",arguments);	
+		dojo.dnd.manager().outSource(this);
+	},
+	_markTargetAnchor: function(before){
+		// summary: assigns a class to the current target anchor based on "before" status
+		// before: Boolean: insert before, if true, after otherwise
+		if(this.current == this.targetAnchor && this.before == before){ return; }
+		if(this.targetAnchor){
+			this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
+		}
+		this.targetAnchor = this.current;
+		this.targetBox = null;
+		this.before = before;
+		if(this.targetAnchor){
+			this._addItemClass(this.targetAnchor, this.before ? "Before" : "After");
+		}
+	},
+	_unmarkTargetAnchor: function(){
+		// summary: removes a class of the current target anchor based on "before" status
+		if(!this.targetAnchor){ return; }
+		this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
+		this.targetAnchor = null;
+		this.targetBox = null;
+		this.before = true;
+	},
+	_markDndStatus: function(copy){
+		// summary: changes source's state based on "copy" status
+		this._changeState("Source", copy ? "Copied" : "Moved");
+	}
+});
+
+dojo.declare("dijit._tree.dndTarget", dijit._tree.dndSource, {
+	// summary: a Target object, which can be used as a DnD target
+	
+	constructor: function(node, params){
+		// summary: a constructor of the Target --- see the Source constructor for details
+		this.isSource = false;
+		dojo.removeClass(this.node, "dojoDndSource");
+	},
+
+	// markup methods
+	markupFactory: function(params, node){
+		params._skipStartup = true;
+		return new dijit._tree.dndTarget(node, params);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/_tree/model.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/_tree/model.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/_tree/model.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,84 @@
+
+dojo.declare(
+	"dijit.tree.model",
+	null,
+{
+	// summary
+	//		Contract for any data provider object for the tree.  Tree 
+	//		passes in values to the constructor to specify the callbacks.
+	//		"item" is typically a dojo.data.Item but it's just a black box so
+	//		it could be anything.
+	//
+	//		This (like dojo.data.api.Read) is just documentation, and not meant to be used.
+	
+	destroy: function(){
+		// summary: destroys this object, releasing connections to the store
+	},
+	
+	// =======================================================================
+	// Methods for traversing hierarchy
+	
+	getRoot: function(onItem){
+		// summary:
+		//		Calls onItem with the root item for the tree, possibly a fabricated item.
+		//		Throws exception on error.
+	},
+	
+	mayHaveChildren: function(/*dojo.data.Item*/ item){
+		// summary
+		//		Tells if an item has or may have children.  Implementing logic here
+		//		avoids showing +/- expando icon for nodes that we know don't have children.
+		//		(For efficiency reasons we may not want to check if an element actually
+		//		has children until user clicks the expando node)
+	},
+	
+	getChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete){
+		// summary
+		// 		Calls onComplete() with array of child items of given parent item, all loaded.
+		//		Throws exception on error.
+	},
+	
+	// =======================================================================
+	// Inspecting items
+	
+	getIdentity: function(/* item */ item){
+		// summary: returns identity for an item
+	},
+	
+	getLabel: function(/*dojo.data.Item*/ item){
+		// summary: get the label for an item
+	},
+	
+	// =======================================================================
+	// Write interface
+	
+	newItem: function(/* Object? */ args, /*Item?*/ parent){
+		// summary
+		//		Creates a new item.   See dojo.data.api.Write for details on args.
+	},
+	
+	pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy){
+		// summary
+		//		Move or copy an item from one parent item to another.
+		//		Used in drag & drop.
+		//		If oldParentItem is specified and bCopy is false, childItem is removed from oldParentItem.
+		//		If newParentItem is specified, childItem is attached to newParentItem.
+	},
+	
+	// =======================================================================
+	// Callbacks
+	
+	onChange: function(/*dojo.data.Item*/ item){
+		// summary
+		//		Callback whenever an item has changed, so that Tree
+		//		can update the label, icon, etc.   Note that changes
+		//		to an item's children or parent(s) will trigger an
+		//		onChildrenChange() so you can ignore those changes here.
+	},
+	
+	onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+		// summary
+		//		Callback to do notifications about new, updated, or deleted items.
+	}
+});
+

Added: branches/vhffs-design/vhffs-panel/js/dijit/bench/benchReceive.php
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/bench/benchReceive.php	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/bench/benchReceive.php	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,129 @@
+<?php
+/*
+
+	benchReceive.php - example way to handle incoming benchmark data,
+	or how to use JSON php class to mangle data.  No benchmark data
+	is stored currently.
+
+-- 
+-- Table structure for table `benchmarks`
+-- 
+
+CREATE TABLE `benchmarks` (
+  `id` int(11) NOT NULL auto_increment,
+  `useragent` varchar(242) NOT NULL default '',
+  `dojover` varchar(96) NOT NULL default '',
+  `testNum` int(11) NOT NULL default '0',
+  `dijit` varchar(64) NOT NULL default '',
+  `testCount` int(11) NOT NULL default '0',
+  `testAverage` float NOT NULL default '0',
+  `testMethod` varchar(10) NOT NULL default '',
+  `testTime` bigint(20) NOT NULL default '0',
+  `dataSet` varchar(64) NOT NULL default '',
+  PRIMARY KEY  (`id`),
+  KEY `dijit` (`dijit`,`testAverage`),
+  KEY `dataSet` (`dataSet`)
+) TYPE=MyISAM;
+
+--
+-- [end table struct] --
+
+*/
+
+if (is_array($_POST)) {
+
+	$username = '';
+	$password = '';
+	$dataBase = '';
+	$table    = '';
+
+	mysql_connect("localhost",$username,$password);
+	mysql_select_db($dataBase); 
+
+	require("../../dojo/tests/resources/JSON.php");
+	$json = new Services_JSON();
+
+	// see "escape()" call in benchTest.html
+	$string = $json->decode(urldecode($_POST['key']));
+	// $string = $json->decode($_POST['key']);
+
+	print "<h1>Thank YOU!</h1>";
+	print "
+		<p>Your results have been added to our database. No 
+		personal information outside of what you see here 
+		has been stored.
+		</p>
+
+		<p>You can <a href= \"javascript:history.back()\">go back</a> 
+		and run more tests, or even better, load up another browser 
+		and the submit your tests again!
+		</p>
+
+		<p>again ... thanks for your time.</p>
+
+		";
+
+	print "<h3>Results Submitted:</h3>"; 
+	print "<pre style=\"font:6pt Terminal,sans-serif; border:1px solid #cecece; background-color:#ededed; padding:20px; \">";
+
+		$ua = $string->clientNavigator;
+		$dojov = $string->dojoVersion;
+
+		print "Client: ".$ua."\n";
+		print "Dojo v".$dojov."\n"; 
+
+		if (is_array($string->dataSet)) {
+			print "\nTest Results:";
+			// should client serialize a key, or is this safer?
+			$dataSet = md5(serialize($string)); 
+			foreach ($string->dataSet as $test) {
+				$data = array(
+					'dataSet' => $dataSet,
+					'useragent' => $ua,
+					'dojover' => $dojov,
+					'testNum' => $test->testNum,
+					'testMethod' => $test->testMethod,	
+					'testTime' => $test->testTime,
+					'testAverage' => $test->testAverage,
+					'testCount' => $test->testCount,
+					'dijit' => $test->dijit
+				);
+				print_r($data); 
+				add_rec($table,$data); 
+			}
+		}
+
+		if (is_array($string->errors)) {
+			// not saving errors at this point
+			print "\nErrors:";
+			foreach ($string->errors as $error) {
+				print_r($error); 
+			}
+		}
+	print "</pre>"; 
+}
+
+function add_rec($table, $data) {
+
+	if (!is_array($data)) { return FALSE; } 
+
+	$keys = array_keys($data);
+	$values = array_values($data);
+	$field=0;
+
+	for ($field;$field<sizeof($data);$field++) {
+		if (!ereg("^[0-9].*$",$keys[$field])) {
+			$sqlfields = $sqlfields.$keys[$field]."=\"".$values[$field]."\", ";
+       		}
+	}
+	$sqlfields = (substr($sqlfields,0,(strlen($sqlfields)-2)));
+
+	if ($query = mysql_query("insert into $table set $sqlfields")) {
+		$id = mysql_insert_id();
+		return ($id);
+	}else{
+		return FALSE;
+	}
+}
+
+?>

Added: branches/vhffs-design/vhffs-panel/js/dijit/bench/benchTool.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/bench/benchTool.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/bench/benchTool.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,189 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+        "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Dojo interactive benchmark tool</title>
+	<script type="text/javascript" src="../../dojo/dojo.js"></script>
+	<script type="text/javascript">
+		// FIXME:
+		// the url below points to dojo.inpdx.net/benchResults.php
+		// need to setup DB on dtk.org and change URL here to store
+		// results elsewhere ... work db structure in accompanying
+		// .php file 
+		// basic stats are located at http://dojo.inpdx.net/benchmarks.html
+		
+		dojo.require("dojo.fx"); 
+		// FIXME: this seems an excessive fix for IE6 issue ...
+		dojo.require("dijit.dijit"); 
+		// dojo.require("dijit.form.Button"); 
+		dojo.require("dijit.dijit-all"); 
+		dojo.require("dojo.parser");
+
+	
+		// setup global variables
+		var masterResults = { clientNavigator: navigator.userAgent, dataSet: [], errors: [] }
+		var isRunning = false; 
+		var theCount, theClass, runner = null;
+		var testCount = 0;
+		dojo.addOnLoad(function(){
+			theCount = dojo.byId('countNode');
+			theClass = dojo.byId('classNode');
+			runner = dojo.byId('runner'); 
+			masterResults.dojoVersion = dojo.version.toString(); 
+		});
+		
+
+		function _toggleRunMsg(){
+			var newMsg = (isRunning) ? " Run Test " : " Running ..."
+			dojo.fx.chain([
+				dojo.fadeOut({
+					node:runner,
+					duration:200,
+					onEnd: function(){
+						runner.innerHTML = newMsg;
+						isRunning=!isRunning;
+					}
+				}),
+				dojo.fadeIn({ node:runner, duration: 200 })
+			]).play();
+		}
+
+		function runTest(){
+			if(isRunning){ return; }
+			_toggleRunMsg();
+			setTimeout(function(){_runRealTest();},1000);
+		}
+
+		function _runRealTest(){
+
+			var _error = false; 
+			var count = theCount.value;
+			var aclass = theClass.value.toString(); 
+			var theMethod = (dojo.byId('parse').checked) ? "parse" : "create"; 
+
+			var tmpNode = document.createElement('div');
+
+			switch(theMethod){
+				case "parse" : 
+					var tmpString = []; 
+					for(var i=0; i<count; i++){
+						tmpString.push('<div dojoType="', aclass, '"></div>');
+					}
+					tmpNode.innerHTML = tmpString.join(""); 
+					var tmpTimer = new Date().getTime();
+					dojo.parser.parse(tmpNode); 
+					var endTime = new Date().getTime() - tmpTimer; 
+					break;
+				case "create" : 
+					var construction = dojo.getObject(aclass); 
+					var tmpTimer = new Date().getTime();
+					for(var i=0; i<count; i++){
+						var tmp = new construction({}); 
+						tmpNode.appendChild(tmp.domNode); 
+					}	
+					var endTime = new Date().getTime() - tmpTimer;
+				break;
+			}
+
+			var average = (endTime / count);
+			var msg = "It took: "+endTime+"ms to "+theMethod+" "+count+" "+aclass+" widgets"+
+				"<br>(average: "+average+" ms/widget)<br><br>"; 
+
+			masterResults.dataSet.push({
+				testNum: ++testCount,
+				dijit: aclass,
+				testCount: count,
+				testAverage: average,	
+				testMethod: theMethod,
+				testTime: endTime
+			});
+
+			dojo.byId("results").innerHTML += msg;
+			setTimeout(function(){_toggleRunMsg();},250); 
+			
+			// Nodes have to be in the document for IE7 to GC them.
+			// Do this after generating the widgets to dispel 
+			// notion that widget parents have to be in document 
+			// a-priori.
+			dojo.byId("limbo").appendChild(tmpNode);
+		}
+
+		function doDebug(){
+			var key = escape(dojo.toJson(masterResults));
+			dojo.byId('hiddenHolder').value = key;
+			return true;
+		}
+
+	</script>
+	<style>
+		@import "../../dijit/themes/tundra/tundra.css";
+		@import "../../dijit/themes/dijit.css";
+		@import "../../dojo/resources/dojo.css";
+		@import "../../dijit/tests/css/dijitTests.css";
+
+		#limbo {
+			display: none;
+		}
+		#theContainer {
+			float:left; 
+			display: block; padding:12px; padding-top:0; 
+			width:420px; margin-left:20px; 
+			background-color:#fff; -moz-border-radius:8pt 8pt;
+			border:2px solid #ededed; 
+		}	
+		#leftControl { float:left; width:300px; } 
+		#testControl, #submitControl { border:2px solid #ededed; padding:12px; -moz-border-radius:8pt 8pt;  background-color:#fff; }
+		#results {  overflow:auto; height:300px; border:1px solid #ccc; color:darkred; padding:8px;  }
+		#results li { list-style-type: none; } 
+		#results ul { margin:0; padding:0; } 
+		.runHolder, .submitButton { 
+			border:1px solid #ccc; padding:3px; -moz-border-radius:8pt 8pt; text-align:center; 
+			cursor:pointer; background-color:#ededed; display:block; width:125px; 
+		}
+
+	</style>
+</head>
+<body class="tundra">
+	<div id="limbo"></div>
+	<h1 class="testTitle">Dojo Benchmark Tool</h1>
+
+	<div id="leftControl">
+		<div id="testControl">
+
+		Class: <input type="text" name="dijit" id="classNode" value="dijit.form.Button"><br><br>
+		Count: <input type="text" name="count" id="countNode" value="100" size="4" ><br><br>
+		
+		Method: <label for="parse">
+				<input type="radio" name="theMethod" value="parse" id="parse" checked="on"> Parse 
+			</label>
+			<label for="create">
+				<input type="radio" name="theMethod" value="create" id="create"> Create
+			</label>
+
+		<br><br>
+		<span onclick="runTest()" class="runHolder"><span id="runner"> Run Test </span></span>
+
+		</div>
+		
+		<br>
+
+		<div id="submitControl">		
+		<p>
+		* The results of these tests are important to us.  Please feel free to submit your dataSet
+		to Dojotoolkit.org. Your privacy will be respected. 
+				
+		</p>
+			<div id="hiddenResults">
+				<form id="resultForm" action="http://dojo.inpdx.net/benchResults.php"; 
+					method="POST" onsubmit="doDebug()">
+					<input type="hidden" id="hiddenHolder" value="" name="key">	
+					<input type="submit" value=" Submit Data " class="submitButton">
+				</form>
+			</div>
+		</div>
+	</div>
+
+	<div id="theContainer"><h3>Results:</h3><div id="results"></div></div>
+	
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/bench/create_widgets.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/bench/create_widgets.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/bench/create_widgets.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+        "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+	<head>
+		<title>PROGRAMMATIC - Dojo Widget Creation Test</title>
+		<script type="text/javascript" src="../../dojo/dojo.js"></script>
+		<script type="text/javascript" src="../dijit.js"></script>
+		<script type="text/javascript">
+			var queryCount = location.search.match(/count=(\d*)/);
+			var count = (queryCount ? parseInt(queryCount[1]) : 100);
+			var queryClass = location.search.match(/class=([a-zA-z.]*)/);
+			var className = (queryClass ? queryClass[1] : "form.Button");
+
+			dojo.require("dijit." + className);
+			dojo.require("dojo.parser");
+			logMessage = window.alert;
+		</script>
+		<style type="text/css">
+			@import "../themes/tundra/tundra.css";
+			/* group multiple buttons in a row */
+			.box {
+				display: block;
+				text-align: center;
+			}
+			.box .dojoButton {
+				width: 80px;
+				margin-right: 10px;
+			}
+			.dojoButtonContents {
+				font-size: 1.6em;
+			}
+
+			#buttonContainer {
+				border: 1px solid black;
+				width: 100%;
+			}
+
+			#results {
+				color: darkred;
+			}
+		</style>
+	</head>
+	<body class=tundra>
+		<script language='javascript'>
+			document.write("<h2>Currently Creating "+count+" "+className+" instances</h2>");
+		</script>
+		Pass <code>?count=<i><b>100</b></i></code> in the query string to change the number of widgets.<br>
+		Pass <code>?class=<i><b>form.Button</b></i></code> in the query string to change the widget class.
+		<h3 id="results"></h3>
+
+		<div id="buttonContainer" class='box'></div>
+		<br>
+		<script type="text/javascript">
+			// See if we can make a widget in script and attach it to the DOM ourselves.
+			var constructor = dojo.getObject("dijit."+className);
+			function makeEm(){
+				var container = dojo.byId("buttonContainer");
+				var t0 = new Date().getTime();
+				for (var i = 1; i <= count; i++) {
+					var it =
+						new constructor(
+								{label:"Button "+i, onclick:'logMessage("clicked simple")'}
+							);
+					container.appendChild(it.domNode);
+					it.domNode.style.display = '';
+				}
+				var t1 = new Date().getTime();
+				dojo.byId("results").innerHTML = "It took " + (t1 - t0) + " msec to create " + count + " "+className+" instances programmatically.";
+			}
+			dojo.addOnLoad(makeEm);
+		</script>
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/bench/test_Button-programmatic.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/bench/test_Button-programmatic.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/bench/test_Button-programmatic.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+        "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+        <head>
+		<title>PROGRAMMATIC - Dojo Button 100 Test</title>
+	<script type="text/javascript" src="../../dojo/dojo.js" XdjConfig='isDebug: true, debugAtAllCosts: true'></script>
+	<script type="text/javascript">
+		dojo.require("dijit.form.Button");
+		dojo.require("dojo.parser");
+		logMessage = window.alert;
+	</script>
+
+<style>
+
+	@import "../themes/tundra/tundra.css";
+
+	/* group multiple buttons in a row */
+	.box {
+		display: block;
+		text-align: center;
+	}
+	.box .dojoButton {
+		width:80px;
+		margin-right: 10px;
+	}
+	.dojoButtonContents {
+		font-size: 1.6em;
+	}
+
+	#buttonContainer {
+		border:1px solid black;
+		width:100%;
+	}
+
+	#results {
+		color:darkred;
+	}
+
+</style>
+        </head>
+<body class=tundra>
+<h2>Creating dojot.form.buttons programmatically</h2>
+<h3 id="results"></h3>
+
+<div id="buttonContainer" class='box'></div>
+
+<br>
+Pass "?count=<i><b>n</b></i>" in the query string to change the number of buttons.
+
+<script type="text/javascript">
+// See if we can make a widget in script and attach it to the DOM ourselves.
+
+function makeEm() {
+	var queryCount = location.search.match(/count=(\d*)/);
+	var count = (queryCount ? parseInt(queryCount[1]) : 100);
+	var container = dojo.byId("buttonContainer");
+	var t0 = new Date().getTime();
+	for (var i = 1; i <= count; i++) {
+		var it =
+			new dijit.form.Button(
+					{label:"Button "+i, onclick:'logMessage("clicked simple")'}
+				);
+		container.appendChild(it.domNode);
+		it.domNode.style.display = '';
+	}
+	var t1 = new Date().getTime();
+	dojo.byId("results").innerHTML = "It took " + (t1 - t0) + " msec to create " + count + " Buttons programmatically.";
+}
+dojo.addOnLoad(makeEm);
+
+
+</script>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/bench/test_button-results.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/bench/test_button-results.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/bench/test_button-results.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,66 @@
+<html>
+<style>
+	th	{	vertical-align:bottom;	}
+	td {
+		padding:10px;
+		text-align:right;
+	}
+	.computer	{	vertical-align:top;	}
+</style>
+<body>
+<h3>Widget instantiation timing test results</h3>
+
+<table>
+
+<tr><th rowspan=2>Computer/OS</th><th rowspan=2>Browser</th><th colspan=3>Parsing</th><th colspan=3>Programmatic</th></tr>
+<tr>														<th>100</th><th>500</th><th>1000</th><th>100</th><th>500</th><th>1000</th></tr>
+<tr><td class='computer' rowspan=3>MacBook Pro 2.16<br> OS 10.4 2GB RAM</td>
+	<td>FF (2.0.0.3)</td>
+	<td>303</td><td>1724</td><td>3505</td>
+	<td>195</td><td>1006</td><td>2266</td>
+</tr>
+<tr><td>Safari (2.04)</td>
+	<td>192</td><td>1460</td><td>4463</td>
+	<td>142</td><td>895</td><td>2403</td>
+</tr>
+<tr><td>WebKit Nightly (21223)</td>
+	<td>110</td><td>540</td><td>1096</td>
+	<td>85</td><td>458</td><td>940</td>
+</tr>
+
+
+<tr><td class='computer' rowspan=2>Dell Precision 2.13 PPro<br> XP SP 2 - 2GB RAM</td>
+	<td>FF (2.0.0.3)</td>
+	<td>282</td><td>1266</td><td>2484</td>
+	<td>250</td><td>890</td><td>1766</td>
+</tr>
+
+<tr>
+	<td>IE7 (7.0.5730.11)</td>
+	<td>303</td><td>2079</td><td>5172</td>
+	<td>203</td><td>1140</td><td>2422</td>
+</tr>
+
+<tr><td><!--browser--></td>
+	<td><!--100 parse--></td><td><!--500 parse--></td><td><!--1000 parse--></td>
+	<td><!--100 code--></td><td><!--500 code--></td><td><!--1000 code--></td>
+</tr>
+</table>
+
+
+<H3>If you want to play:</H3>
+<p></p>
+<ol>
+	<li> Run the following tests:
+		<ul>
+			<li><a href='http://dojotoolkit.org/~owen/bench/dojo/dijit/bench/test_Button-parse.php?count=100'>http://dojotoolkit.org/~owen/bench/dojo/dijit/bench/test_Button-parse.php?count=100</a></li>
+			<li><a href='http://dojotoolkit.org/~owen/bench/dojo/dijit/bench/test_Button-programmatic.html?count=100'>http://dojotoolkit.org/~owen/bench/dojo/dijit/bench/test_Button-programmatic.html?count=100</a></li>
+		</ul>
+		<br>
+		Change the "count=" to 100, 500, 1000 for each.
+		<br><br>
+		Restart the browser between each test/count.  Run each test 3 times and record the smallest number.
+	</li>
+	<li>Record your tests in the copy of this file in SVN:  <code>dijit/bench/test_Button-results.html</code>  and check it in.  Reference ticket #2968.</li>
+</ol>
+</body>

Added: branches/vhffs-design/vhffs-panel/js/dijit/bench/widget_construction_test.php
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/bench/widget_construction_test.php	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/bench/widget_construction_test.php	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,186 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+        "http://www.w3.org/TR/html4/strict.dtd";>
+
+<html>
+	<head>
+		<title>test of various synchronous page searching methods</title>
+		<style type="text/css">
+			@import "../../dojo/resources/dojo.css";
+			@import "../themes/tundra/tundra.css";
+		</style>
+		<script type="text/javascript" src="../../dojo/dojo.js"
+			djConfig="parseOnLoad: true, isDebug: true"></script>
+		<script type="text/javascript">
+			dojo.require("dojo.parser");	// scan page for widgets and instantiate them
+			dojo.require("dijit._Widget");
+			dojo.require("dijit._Templated");
+
+			/* dummy widget for benchmarking purposes */
+			dojo.declare(
+				"SimpleButton",
+				[ dijit._Widget, dijit._Templated ],
+				function(){  },
+				{
+					label: "",
+			
+					templateString: "<button dojoAttachEvent='onclick:onClick'>${label}</button>",
+			
+					onClick: function(){
+						this.domNode.style.backgroundColor="green";
+					},
+					postCreate: function(){
+					}
+				}
+			);
+		</script>
+	</head>
+	<body>
+		<h1 style="font-size: 40px; line-height: 50px;">This page contains a huge number of nodes, most of which are "chaff".</h1>
+		<h3>Here's the relative timings for this page</h3>
+		<div id="profileOutputTable"></div>
+		<!--
+		<h3>And some comparison data</h3>
+		<table border=1>
+		<thead>
+			<tr>
+				<th>IE
+				<th>Safari
+				<th>Gecko (on PC)
+				<th>Gecko (on intel mac)
+			</tr>
+		</thead>
+		<tbody>
+			<tr>
+				<td>4890
+				<td>3242
+				<td>3094
+				<td>3782
+			</tr>
+		</tbody>
+		</table>
+		-->
+
+
+<?
+	$containerDepth = 30;
+	$leadingChaff = 100;
+	$trailingChaff = 100;
+	$items = 100;
+?>
+<? 
+	function generateChaff($iters){
+		for($i=0;$i<$iters;$i++){ ?>
+			<pre class="highlighted"><code><span class="hl-reserved">var </span><span class="hl-identifier">dlg</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-identifier">blah</span><span class="hl-default">.</span><span class="hl-identifier">ext</span><span class="hl-default">.</span><span class="hl-identifier">LayoutDialog</span><span class="hl-brackets">(</span><span class="hl-identifier">config</span><span class="hl-code">.</span><span class="hl-identifier">id</span><span class="hl-code"> || </span><span class="hl-identifier">blah</span><span class="hl-code">.</span><span class="hl-identifier">util</span><span class="hl-code">.</span><span class="hl-identifier">Dom</span><span class="hl-code">.</span><span class="hl-identifier">generateId</span><span class="hl-brackets">()</span><span class="hl-code">, </span><span class="hl-brackets">{
+				</span><span title="autoCreate" class="hl-identifier">autoCreate</span><span class="hl-code"> : </span><span class="hl-reserved">true</span><span class="hl-code">,
+				</span><span title="minWidth" class="hl-identifier">minWidth</span><span class="hl-code">:</span><span class="hl-number">400</span><span class="hl-code">,
+				</span><span title="minHeight" class="hl-identifier">minHeight</span><span class="hl-code">:</span><span class="hl-number">300</span><span class="hl-code">,
+				</span>
+				<span title="syncHeightBeforeShow" class="hl-identifier">syncHeightBeforeShow</span><span class="hl-code">: </span><span class="hl-reserved">true</span><span class="hl-code">,
+				</span><span title="shadow" class="hl-identifier">shadow</span><span class="hl-code">:</span><span class="hl-reserved">true</span><span class="hl-code">,
+				</span><span title="fixedcenter" class="hl-identifier">fixedcenter</span><span class="hl-code">: </span><span class="hl-reserved">true</span><span class="hl-code">,
+				</span><span title="center" class="hl-identifier">center</span><span class="hl-code">:</span><span class="hl-brackets">{</span><span class="hl-identifier">autoScroll</span><span class="hl-code">:</span><span class="hl-reserved">false</span><span class="hl-brackets">}</span><span class="hl-code">,
+				</span><span title="east"  class="hl-identifier">east</span><span class="hl-code">:</span><span class="hl-brackets">{</span><span class="hl-identifier">split</span><span class="hl-code">:</span><span class="hl-reserved">true</span><span class="hl-code">,</span><span class="hl-identifier">initialSize</span><span class="hl-code">:</span><span class="hl-number">150</span><span class="hl-code">,</span><span class="hl-identifier">minSize</span><span class="hl-code">:</span><span class="hl-number">150</span><span class="hl-code">,</span><span class="hl-identifier">maxSize</span><span class="hl-code">:</span><span class="hl-number">250</span><span class="hl-brackets">}
+			})</span><span class="hl-default">;
+			</span><span class="hl-identifier">dlg</span><span class="hl-default">.</span><span class="hl-identifier">setTitle</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">Choose an Image</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-default">;
+			</span><span class="hl-identifier">dlg</span><span class="hl-default">.</span><span class="hl-identifier">getEl</span><span class="hl-brackets">()</span><span class="hl-default">.</span><span class="hl-identifier">addClass</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">ychooser-dlg</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-default">;</span></code></pre><br />
+			<pre class="highlighted"><code><span class="hl-reserved">var </span><span class="hl-identifier">animated</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-identifier">blah</span><span class="hl-default">.</span><span class="hl-identifier">ext</span><span class="hl-default">.</span><span class="hl-identifier">Resizable</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">animated</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-brackets">{
+			    </span><span title="east" class="hl-identifier">width</span><span class="hl-code">: </span><span class="hl-number">200</span><span class="hl-code">,
+			    </span><span title="east" class="hl-identifier">height</span><span class="hl-code">: </span><span class="hl-number">100</span><span class="hl-code">,
+			    </span><span title="east" class="hl-identifier">minWidth</span><span class="hl-code">:</span><span class="hl-number">100</span><span class="hl-code">,
+			    </span><span class="hl-identifier">minHeight</span><span class="hl-code">:</span><span class="hl-number">50</span><span class="hl-code">,
+			    </span><span class="hl-identifier">animate</span><span class="hl-code">:</span><span class="hl-reserved">true</span><span class="hl-code">,
+			    </span><span class="hl-identifier">easing</span><span class="hl-code">: </span><span class="hl-identifier">YAHOO</span><span class="hl-code">.</span><span class="hl-identifier">util</span><span class="hl-code">.</span><span class="hl-identifier">Easing</span><span class="hl-code">.</span><span class="hl-identifier">backIn</span><span class="hl-code">,
+			    </span><span class="hl-identifier">duration</span><span class="hl-code">:</span><span class="hl-number">.6
+			</span><span class="hl-brackets">})</span><span class="hl-default">;</span></code></pre>
+			<h4>The standard Lorem Ipsum passage, used since the 1500s</h4>
+			<p>
+			"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+			eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
+			ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+			aliquip ex ea commodo consequat. Duis aute irure dolor in
+			reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+			pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
+			culpa qui officia deserunt mollit anim id est laborum."
+			</p>
+
+			<h4>Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC</h4>
+
+			<p>
+			"Sed ut perspiciatis unde omnis iste natus error sit voluptatem
+			accusantium doloremque laudantium, totam rem aperiam, eaque ipsa
+			quae ab illo inventore veritatis et quasi architecto beatae vitae
+			dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit
+			aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
+			eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam
+			est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+			velit, sed quia non numquam eius modi tempora incidunt ut labore et
+			dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam,
+			quis nostrum exercitationem ullam corporis suscipit laboriosam,
+			nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure
+			reprehenderit qui in ea voluptate velit esse quam nihil molestiae
+			consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla
+			pariatur?"
+			</p>
+
+			<h4>1914 translation by H. Rackham</h4>
+
+			<p>
+			"But I must explain to you how all this mistaken idea of denouncing
+			pleasure and praising pain was born and I will give you a complete
+			account of the system, and expound the actual teachings of the
+			great explorer of the truth, the master-builder of human happiness.
+			No one rejects, dislikes, or avoids pleasure itself, because it is
+			pleasure, but because those who do not know how to pursue pleasure
+			rationally encounter consequences that are extremely painful. Nor
+			again is there anyone who loves or pursues or desires to obtain
+			pain of itself, because it is pain, but because occasionally
+			circumstances occur in which toil and pain can procure him some
+			great pleasure. To take a trivial example, which of us ever
+			undertakes laborious physical exercise, except to obtain some
+			advantage from it? But who has any right to find fault with a man
+			who chooses to enjoy a pleasure that has no annoying consequences,
+			or one who avoids a pain that produces no resultant pleasure?" 
+			</p>
+		<? } 
+	} // end generateChaff
+	$widgetName = "SimpleButton";
+?>
+<? generateChaff($leadingChaff); ?>
+<hr>
+<? for($i=0;$i<$containerDepth;$i++){ ?>
+	<table border="1" cellpadding="0" cellspacing="0" width="100%">
+	<!--
+	<table>
+	-->
+		<tr>
+			<td>
+			<br>
+			chaff!
+			<br>
+<? } ?>
+<? for($i=0;$i<$items;$i++){ ?>
+			<div dojoType="<?= $widgetName ?>" label="item2 <?= $i ?>">item2 <?= $i ?></div>
+<? } ?>
+<? for($i=0;$i<$containerDepth;$i++){ ?>
+			</td>
+		</tr>
+	</table>
+<? } ?>
+<? generateChaff($trailingChaff);  ?>
+<? for($i=0;$i<$items;$i++){ ?>
+	<div dojoType="<?= $widgetName ?>" label="item2 <?= $i ?>"><span>item <?= $i ?></span></div>
+<? } ?>
+
+<script type="text/javascript">
+
+		oldTime = new Date();
+		dojo.addOnLoad(function(){
+			var time = new Date().getTime() - oldTime;
+			var p = document.createElement("p");
+			alert("Widgets loaded in " + time + "ms");
+		});
+
+</script>
+
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/changes.txt
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/changes.txt	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/changes.txt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,93 @@
+Changes from Dojo 0.4 dojo.widgets to new dijit project
+=======================================================
+
+The widgets and widget infrastructure have been separated into separate project,
+vastly streamlined and with a new directory structure.   There are many other changes.
+
+Markup
+------
+
+dojoType="button" replaced by dojoType="dijit.Button"  Must use fully qualified class name,
+and it's case-sensitive.
+
+Need to manually dojo.require("dojo.parser") to get parsing
+
+Widget namespaces and widget auto-loading are desupported.
+
+onClick="foo" now overrides (ie, replaces) the default onClick() function rather than attaching to it,
+so widget designers should make empty onClick() functions (when appropriate).
+
+Programmatic creation
+---------------------
+Create widgets via
+
+	new dijit.Button(params, srcNodeRef)
+
+createWidget() call removed since multiple renderers are no longer supported (see next section).
+
+At least for the dijit widgets, all widgets are guaranteed to work programmatically, which in
+effect means that all widgets must have templates, unless the default <div> works.
+
+Renderers
+---------
+Removed support for multiple renderers (svg & vml & a11y) for a single widget.
+If a widget wants to render differently on different platforms, there must be
+branching code inside the widget, or it needs to call a library that branches
+based on the browser type (like dojo.gfx or dojo.charting).
+
+
+Templates
+---------
+"this." is no longer used within ${} substitution notation.  See ticket #2905.
+dojoRoot,buildScriptBase,dojoModuleUrl are no longer supported, but
+any JavaScript properties on the widget's 'this' may be referenced with dotted notation.
+The attributes dojoOn* are desupported (including dojoOnBuild);
+also can't use id attribute to affect a dojoAttachPoint.
+
+dojoAttachEvent is case sensitive, so capitalization matters.   You will probably have
+to change
+
+dojoAttachEvent="onClick"
+
+to
+
+dojoAttachEvent="onclick: onClick"
+
+(given that the event name is lowercase, and assuming that the method name is camel case)
+
+lists within dojoAttachPoint, dojoAttachEvent, waiRole, and waiState are now comma-separated
+(not separated by semi-colons)
+
+Standard HTML attributes like 'id', 'name', 'lang', etc. are carried over programmatically
+by the _Widget constructor and do not need to be declared in the template (see _Widget.attributeMap)
+
+Parent/Child relationships
+--------------------------
+By default widgets exist as islands, not knowing about their parent widget or children widgets.
+The exception is the destroy() function which will also delete all descendant widgets.
+Some widgets like Tree and SplitContainer will know about their children, but those widgets
+will use the special mixins in Container.js / Layout.js. 
+
+Widget.js base class
+--------------------
+
+ - Widget.js, Domwidget.js, HtmlWidget.js combined into dijit.base.Widget, with TemplatedWidget mixin
+for widgets with templates
+
+ - on widget creation, postMixInProperties(), buildRendering() and postCreate() is called.
+ fillInTemplate() is no longer called.  In addition, those functions call signatures have changed.
+ No arguments are passed.  To get the source dom Node, just reference this.srcDomNode.
+When postCreate() is called the widget children don't yet exist.
+
+ - The TemplatedWidget mixin defines buildRendering().  widgetsInTemplate not ported yet.
+
+ - onResized() removed
+
+ - the whole parent/child relationship thing is gone
+
+ - extraArgs[] is gone
+
+ - postCreate() called but child widgets don't exist yet
+
+ - templateCssPath ignored.   User must manually include tundra.css file
+ 

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/chat.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/chat.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/chat.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; } 

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/chat.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/chat.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/chat.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; } 
+

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/client.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/client.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/client.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,65 @@
+<html>
+<head>
+    <title>Sample built in tech-support demonstration | The Dojo Toolkit </title>
+    <script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad:false"></script>
+    <script type="text/javascript" src="room.js"></script>
+    <script type="text/javascript">
+		dojo.require("dijit.TitlePane");
+		dojo.require("dojo.parser");
+		dojo.require("dijit.form.Button"); 
+
+		// this puts our help box in the top/right corner on scroll and show
+		function _positionIt(evt){
+			if (helpNode.domNode.style.display == "block"){
+				dojo.style(helpNode.domNode,"top",(dijit.getViewport().t + 4) + "px");
+			}
+		}
+
+		var helpNode; 
+		dojo.addOnLoad(function(){ 
+			dojo.parser.parse(dojo.body()); 
+			helpNode = dijit.byId('helpPane');
+			dojo.connect(window,"onscroll","_positionIt");
+			// this is not a public cometd server :)
+			dojox.cometd.init("http://comet.sitepen.com:9190/cometd";); 
+		}); 
+
+    </script>
+	<style type="text/css">
+		@import "chat.css";
+		@import "../../themes/tundra/tundra.css";
+		@import "../../tests/css/dijitTests.css"; 
+	</style>
+</head>
+<body class="tundra">
+
+<h1 class="testTitle">I am a <i>Sample</i> page</h1>
+	<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam facilisis enim. Pellentesque in elit et lacus euismod dignissim. Aliquam dolor pede, convallis eget, dictum a, blandit ac, urna. Pellentesque sed nunc ut justo volutpat egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. In erat. Suspendisse potenti. Fusce faucibus nibh sed nisi. Phasellus faucibus, dui a cursus dapibus, mauris nulla euismod velit, a lobortis turpis arcu vel dui. Pellentesque fermentum ultrices pede. Donec auctor lectus eu arcu. Curabitur non orci eget est porta gravida. Aliquam pretium orci id nisi. Duis faucibus, mi non adipiscing venenatis, erat urna aliquet elit, eu fringilla lacus tellus quis erat. Nam tempus ornare lorem. Nullam feugiat.</p>
+
+<h3>Need help?</h3>
+<button dojoType="dijit.form.Button">
+Show / Hide Tech Support Chat 
+	<script type="dojo/method" event="onClick">
+		// simple dojo/method example. this is like doing button onClick="javascript:" but more robust
+		var anim = dojo[(helpNode.open ? "fadeOut" : "fadeIn")]({ node: helpNode.domNode, duration: 400 });
+		dojo.connect(anim,(helpNode.open ? "onEnd" : "beforeBegin"),function(){
+			dojo.style(helpNode.domNode,"display",(helpNode.open ? "none" : "block"));	
+			helpNode.toggle();
+			_positionIt();
+		});
+		anim.play(); 
+	</script>
+</button>
+
+
+	<p>Sed congue. Aenean blandit sollicitudin mi. Maecenas pellentesque. Vivamus ac urna. Nunc consequat nisi vitae quam. Suspendisse sed nunc. Proin suscipit porta magna. Duis accumsan nunc in velit. Nam et nibh. Nulla facilisi. Cras venenatis urna et magna. Aenean magna mauris, bibendum sit amet, semper quis, aliquet nec, sapien. Aliquam aliquam odio quis erat. Etiam est nisi, condimentum non, lacinia ac, vehicula laoreet, elit. Sed interdum augue sit amet quam dapibus semper. Nulla facilisi. Pellentesque lobortis erat nec quam.</p>
+	<p>Sed arcu magna, molestie at, fringilla in, sodales eu, elit. Curabitur mattis lorem et est. Quisque et tortor. Integer bibendum vulputate odio. Nam nec ipsum. Vestibulum mollis eros feugiat augue. Integer fermentum odio lobortis odio. Nullam mollis nisl non metus. Maecenas nec nunc eget pede ultrices blandit. Ut non purus ut elit convallis eleifend. Fusce tincidunt, justo quis tempus euismod, magna nulla viverra libero, sit amet lacinia odio diam id risus. Ut varius viverra turpis. Morbi urna elit, imperdiet eu, porta ac, pharetra sed, nisi. Etiam ante libero, ultrices ac, faucibus ac, cursus sodales, nisl. Praesent nisl sem, fermentum eu, consequat quis, varius interdum, nulla. Donec neque tortor, sollicitudin sed, consequat nec, facilisis sit amet, orci. Aenean ut eros sit amet ante pharetra interdum.</p>
+	<p>Fusce rutrum pede eget quam. Praesent purus. Aenean at elit in sem volutpat facilisis. Nunc est augue, commodo at, pretium a, fermentum at, quam. Nam sit amet enim. Suspendisse potenti. Cras hendrerit rhoncus justo. Integer libero. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam erat volutpat. Sed adipiscing mi vel ipsum.</p>
+
+	<div title="Chat with Technical Support:" id="helpPane" dojoType="dijit.TitlePane" 
+		style="width:275px; height:400px; position:absolute; top:4px; right:4px; margin:0; padding:0; display:none;" open="false" >
+		<div dojoType="dijit.demos.chat.Room" id="chatroom" isPrivate="true"></div>
+	</div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/community.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/community.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/community.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,114 @@
+<html>
+<head>
+	<title>Cometd chat / Operator Page</title>
+
+	<style type="text/css">
+		@import "chat.css";
+		@import "../../tests/css/dijitTests.css"; 
+		@import "../../themes/tundra/tundra.css";
+		@import "../../../dojox/widget/SortList/SortList.css";
+
+		html, body { margin:0; padding:0; height:100%; width:100%; overflow:hidden; } 
+
+		#status { position:absolute; top:5px; right:25px; } 
+		#mainPane { background:#fff; } 		
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad:false"></script>
+	<script type="text/javascript" src="../../../dijit/tests/_testCommon.js"></script>
+	<script type="text/javascript" src="room.js"></script>
+	<script type="text/javascript">
+		dojo.require("dijit.Dialog"); 
+		dojo.require("dijit.layout.SplitContainer"); 		
+		dojo.require("dijit.layout.LayoutContainer");
+		dojo.require("dijit.layout.TabContainer");
+		dojo.require("dijit.layout.ContentPane"); 
+		dojo.require("dijit.form.Button");
+
+		// custom widget created for this demo: 
+		dojo.require("dojox.widget.SortList");
+		
+		dojo.require("dojo.parser");
+
+			// not for production use?	
+			//dojox.cometd.init("http://comet.sitepen.com:9000/cometd";); 
+
+			var control = {
+				_chats: [],
+				_getAlert: function(e){
+					console.log(e); 
+					if (!this._chats[(e.data.user)] && (operator != e.data.user)){
+						dojox.cometd.subscribe("/chat/demo/"+e.data.joined,this,"_privateChat");
+	
+						var tabNode = document.createElement('div');
+						tabNode.id = "chatWith" + e.data.user; 
+						var chatNode = document.createElement('div');
+						chatNode.id = e.data.user + "Widget";
+						tabNode.appendChild(chatNode);
+						var newTab = new dijit.layout.ContentPane({
+							title: e.data.user,
+							closable: true
+						},tabNode);
+						dijit.byId('tabView').addChild(newTab);
+						var chat = new dijit.demos.chat.Room({
+							roomId: e.data.joined,
+							registeredAs: operator
+						},chatNode);
+						chat.startup();
+						this._chats[(e.data.user)]=true;
+					}
+				},
+
+				_privateChat: function(e){
+					var thisChat = dijit.byId(e.data.user+"Widget") || false;
+					if (thisChat) { thisChat._chat(e); }
+				}
+			};
+
+			function registerOperator(){
+				dijit.byId('loginDialog').hide(); 
+
+			}
+
+			dojo.addOnLoad(function(){ 
+				dojo.parser.parse(dojo.body());
+				// dojox.cometd.subscribe("/chat/demo/poundDojo",control,"_getAlert");
+				var widget = dijit.byId('userList');
+				for (var i = 0; i<50; i++){
+					var node = document.createElement('li');
+					node.innerHTML = i+": list item sample";
+					widget.containerNode.appendChild(node);
+				}
+				widget.onSort();
+			});
+	</script>
+</head>
+<body>
+<div dojoType="dijit.layout.LayoutContainer" style="width:100%; height:100%;">
+	<div dojoType="dijit.layout.SplitContainer" orientation="vertical" style="height:100%" layoutAlign="client" sizerWidth="7">
+		<div dojoType="dijit.layout.SplitContainer" orientation="horizontal" sizerWidth="7" activeSizing="true" layoutAlign="top" sizeShare="80">
+			<div id="mainPane" dojoType="dijit.layout.ContentPane" title="Home" style="padding:8px;" sizeShare="80" layoutAlign="left" style="background:#fff;">
+				<h3>Dojo community chat demo</h3>
+				<h2>NON-WORKING PROTOTYPE</h2>
+
+				<button dojoType="dijit.form.Button">Login 
+					<script type="dojo/method" event="onClick">
+						console.log('foo?');
+						dijit.byId('loginDialog').show();
+					</script>
+				</button>
+
+			</div>
+			<div title="Users in #dojo" id="userList" dojoType="dojox.widget.SortList" sizeShare="20" sizeMin="15" layoutAlign="right"></div>
+		</div>
+		<div dojoType="dijit.layout.ContentPane" sizeShare="20" layoutAlign="bottom">
+				bottom. (input area)
+		</div>	
+	</div>
+</div>
+<div dojoType="dijit.Dialog" id="loginDialog" title="Select Username:">
+	Name: <input type="text" name="username" id="opName" value="" /> 
+	<input 	type="submit" value="login" onclick="registerOperator()"/>	
+</div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/operator.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/operator.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/operator.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,83 @@
+<html>
+<head>
+    <title>Cometd chat / Operator Page</title>
+    <script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad:false"></script>
+    <script type="text/javascript" src="room.js"></script>
+    <script type="text/javascript">
+		dojo.require("dijit.layout.TabContainer");
+		dojo.require("dijit.layout.ContentPane"); 
+		dojo.require("dojo.parser");
+			var control = {
+				_chats: {},
+				_getAlert: function(e){
+					console.log(e); 
+					if (!this._chats[(e.data.user)] && (operator != e.data.user)){
+						dojox.cometd.subscribe("/chat/demo/"+e.data.joined,this,"_privateChat");
+	
+						var tabNode = document.createElement('div');
+						tabNode.id = "chatWith" + e.data.user; 
+						var chatNode = document.createElement('div');
+						chatNode.id = e.data.user + "Widget";
+						tabNode.appendChild(chatNode);
+						var newTab = new dijit.layout.ContentPane({
+							title: e.data.user,
+							closable: true
+						},tabNode);
+						dijit.byId('tabView').addChild(newTab);
+						var chat = new dijit.demos.chat.Room({
+							roomId: e.data.joined,
+							registeredAs: operator
+						},chatNode);
+						chat.startup();
+						this._chats[(e.data.user)]=true;
+					}
+				},
+
+				_privateChat: function(e){
+					var thisChat = dijit.byId(e.data.user+"Widget") || false;
+					if (thisChat) { /* thisChat._chat(e); */}
+				}
+			};
+
+			dojo.addOnLoad(function(){ 
+				dojo.parser.parse(dojo.body());
+	
+				dojox.cometd.init("http://comet.sitepen.com:9190/cometd";); 
+				dojox.cometd.subscribe("/chat/demo",control,"_getAlert");
+
+			});
+
+			var operator; 
+			function registerOperator(){
+				operator = dojo.byId('opName').value;
+				dojo.byId('login').style.display = "none";
+				dojo.byId('status').innerHTML = "You are: <b>"+operator+"</b>"; 
+			}
+
+    </script>
+	<style type="text/css">
+		@import "chat.css";
+		@import "../../tests/css/dijitTests.css"; 
+		@import "../../themes/tundra/tundra.css";
+		#status { position:absolute; top:5px; right:25px; } 
+	</style>
+</head>
+<body class="tundra">
+
+<h1 class="testTitle">Tech Support Operator Page:</h1>
+
+<div id="tabView" dojoType="dijit.layout.TabContainer" style="width:100%; height:75%; ">
+
+	<div dojoType="dijit.layout.ContentPane" title="Home" style="padding:8px;" >
+		<h3>Welcome Operator</h3>
+		<p>It is your job to respond to incoming Support Requests. Sit here, and watch the screen.</p>
+		<p id="login">Please Login as an operator:
+		<br><br>
+		Name: <input type="text" name="username" id="opName" value="" /> <input type="submit" value="login" onclick="registerOperator()"/>	
+		</p>
+	</div><!-- home tab -->
+
+</div><!-- tabContainer -->
+<div id="status"></div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/room.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/room.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/chat/room.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,127 @@
+if(!dojo._hasResource["dijit.demos.chat.room"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.demos.chat.room"] = true;
+dojo.provide("dijit.demos.chat.room"); 
+
+dojo.require("dojox.cometd");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.demos.chat.Room",
+	[dijit._Widget,dijit._Templated],
+	{
+
+	_last: "",
+	_username: null,
+	roomId: "public",
+	isPrivate: false,
+	prompt: "Name:",
+
+	templateString: '<div id="${id}" class="chatroom">'
+				+'<div dojoAttachPoint="chatNode" class="chat"></div>'
+				+'<div dojoAttachPoint="input" class="input">'
+					+'<div dojoAttachPoint="joining">'
+						+'<span>${prompt}</span><input class="username" dojoAttachPoint="username" type="text" dojoAttachEvent="onkeyup: _join"> <input dojoAttachPoint="joinB" class="button" type="submit" name="join" value="Contact" dojoAttachEvent="onclick: _join"/>'
+					+'</div>'
+					+'<div dojoAttachPoint="joined" class="hidden">'
+						+'<input type="text" class="phrase" dojoAttachPoint="phrase" dojoAttachEvent="onkeyup: _cleanInput" />'
+						+'<input type="submit" class="button" value="Send" dojoAttachPoint="sendB" dojoAttachEvent="onclick: _sendPhrase"/>'
+					+'</div>'
+				+'</div>'
+			+'</div>',
+
+	join: function(name){
+		if(name == null || name.length==0){
+			alert('Please enter a username!');
+		}else{
+			if(this.isPrivate){ this.roomId = name; } 
+			this._username=name;
+			this.joining.className='hidden';
+			this.joined.className='';
+			this.phrase.focus();
+			console.log(this.roomId); 
+			dojox.cometd.subscribe("/chat/demo/" + this.roomId, this, "_chat");
+			dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, join: true, chat : this._username+" has joined the room."});
+			dojox.cometd.publish("/chat/demo", { user: this._username, joined: this.roomId });
+		}
+	},
+
+	_join: function(/* Event */e){
+		var key = (e.charCode == dojo.keys.SPACE ? dojo.keys.SPACE : e.keyCode);
+		if (key == dojo.keys.ENTER || e.type=="click"){
+			this.join(this.username.value); 
+		}
+	},
+
+	leave: function(){ 
+		dojox.cometd.unsubscribe("/chat/demo/" + this.roomId, this, "_chat");
+		dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, leave: true, chat : this._username+" has left the chat."});
+
+		// switch the input form back to login mode
+		this.joining.className='';
+		this.joined.className='hidden';
+		this.username.focus();
+		this._username=null;
+	},
+	
+	chat: function(text){
+		// summary: publish a text message to the room
+		if(text != null && text.length>0){
+			// lame attempt to prevent markup
+			text=text.replace(/</g,'&lt;');
+			text=text.replace(/>/g,'&gt;');
+			dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, chat: text});
+		}
+	},
+
+	_chat: function(message){
+		// summary: process an incoming message
+		if (!message.data){
+			console.warn("bad message format "+message);
+			return;
+		}
+		var from=message.data.user;
+		var special=message.data.join || message.data.leave;
+		var text=message.data.chat;
+		if(text!=null){
+			if(!special && from == this._last ){ from="...";
+			}else{
+				this._last=from;
+				from+=":";
+			}
+
+			if(special){
+				this.chatNode.innerHTML += "<span class=\"alert\"><span class=\"from\">"+from+"&nbsp;</span><span class=\"text\">"+text+"</span></span><br/>";	
+				this._last="";
+			}else{
+				this.chatNode.innerHTML += "<span class=\"from\">"+from+"&nbsp;</span><span class=\"text\">"+text+"</span><br/>";
+				this.chatNode.scrollTop = this.chatNode.scrollHeight - this.chatNode.clientHeight;    
+			}
+		}
+	},
+
+	startup: function(){ 
+		this.joining.className='';
+		this.joined.className='hidden';
+		//this.username.focus();
+		this.username.setAttribute("autocomplete","OFF");
+		if (this.registeredAs) { this.join(this.registeredAs); } 
+		this.inherited("startup",arguments); 
+	},
+
+	_cleanInput: function(/* Event */e){
+		var key = (e.charCode == dojo.keys.SPACE ? dojo.keys.SPACE : e.keyCode);
+		if(key == dojo.keys.ENTER || key == 13){
+			this.chat(this.phrase.value);
+          		this.phrase.value='';
+		}
+	},
+
+	_sendPhrase: function(/* Event */e){
+		if (this.phrase.value){
+			this.chat(this.phrase.value);
+			this.phrase.value='';
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/chat.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/chat.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/chat.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+	"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Chat Demo Starter</title>
+
+	<style type="text/css">
+		@import "../../dijit/tests/css/dijitTests.css";
+		@import "../themes/soria/soria.css";
+		@import "chat/chat.css";
+
+		.body { width:720px; margin:0 auto; } 
+
+		.picker {
+			margin:0 auto;
+			height:100px; 	
+		}		
+
+		.box a { color:#000; text-decoration:none; } 		
+
+		.box { 	border:1px solid #666;
+			background:#b7cdee url('../themes/soria/images/gradientTopBg.png') repeat-x top left;
+			background-position:0px -1px; 
+			padding:35px; 
+			padding-top:15px;
+			padding-bottom:15px; 
+			margin:5px; 
+			font-weight:bold;
+			-moz-border-radius:7pt; 
+			cursor:pointer;
+		}
+		.box:hover {
+			color:#fff; 
+			background-color:#54f767; 
+		}
+	</style>
+
+	<script type="text/javascript" src="../../dojo/dojo.js"
+		djConfig="isDebug: false, defaultTestTheme: 'soria'"></script>
+	<script type="text/javascript" src="../tests/_testCommon.js"></script>
+
+	<script type="text/javascript">
+		var _pass = function(/* Event */e){
+			var href = e.target.getAttribute("href")||null;
+			if(href){ window.location.href = href; }
+		}
+	
+		
+		dojo.addOnLoad(function(){
+			var links = dojo.query(".box");
+			dojo.forEach(links,function(node){
+				dojo.connect(node,"onclick","_pass");
+			});
+		});
+	</script>
+
+</head>
+<body class="soria">
+<div class="body">
+	<h1 class="testTitle">Dojo chat demo preabmle ...</h1>
+	<p>
+	There are two examples of chat, using <a 
+	href="http://cometd.org";>cometd</a> as a backend and Dojo's 
+	dojox.cometd client as a transport.
+	</p>
+	<p>
+	The first, a simple public chat room, that any live participants
+	that happen to be online will be able to communicate.
+	</p>
+	<div class="dijitInline box" href="chat/community.html">Join Group Chat</div>
+	<p>The other: the example from the Dojo Book - an example of a
+	client / operator relationship, where the client chats from an
+	'existing' page, and the operator has a TabContainer view of
+	open client chats, and can communicate privately and directly 
+	to the client. The client page demonstrates how this can be used in existing
+	pages for real-time support. You will need two people for this, or you
+	are welcome to talk to yourself ...  
+	</p>
+	<div class="dijitInline">
+		<div class="dijitInline box" href="chat/client.html">Client Page</div>
+		<div class="dijitInline box" href="chat/operator.html">Operator Page</div>	
+	</div>
+	<p>the Chatroom widget source can be found <a href="chat/room.js">here</a>.</p>
+</div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/form.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/form.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/form.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,243 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+		"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+	<head>
+		<title>Dojo Form Widgets Test</title>
+
+		<style type="text/css">
+			@import "../../dojo/resources/dojo.css";
+			@import "../themes/tundra/tundra.css";
+			@import "../themes/tundra/tundra_rtl.css";
+			@import "../tests/css/dijitTests.css";
+
+			.formQuestion {
+				background-color:#d0e3f5;
+				padding:0.3em;
+				font-weight:900;
+				font-family:Verdana, Arial, sans-serif;
+				font-size:0.8em;
+				color:#5a5a5a;
+			}
+			.formAnswer {
+				background-color:#f5eede;
+				padding:0.3em;
+				margin-bottom:1em;
+				width: 100%;
+			}
+			.pageSubContentTitle {
+					color:#8e8e8e;
+					font-size:1em;
+					font-family:Verdana, Arial, sans-serif;
+					margin-bottom:0.75em;
+			}
+			body .short {
+				width: 5em;
+			}
+			body .medium {
+				width: 10em;
+			}
+			body .long {
+				width: 20em;
+			}
+			.firstLabel {
+				display: inline-block;
+				display: -moz-inline-box;
+				width: 10em;
+				min-width: 10em;
+			}
+			.secondLabel {
+				width: auto;
+				margin-left: 5em;
+				margin-right: 1em;
+			}
+			fieldset label {
+				margin-right: 1em;
+			}
+			.noticeMessage {
+				display: block;
+				float: right;
+				font-weight: normal;
+				font-family:Arial, Verdana, sans-serif;
+				color:#663;
+				font-size:0.9em;
+			}
+			.dj_ie .dijitSlider .dijitRuleContainer {
+			        z-index: 1;
+			}
+		</style>
+		
+		<script type="text/javascript" src="../../dojo/dojo.js"
+			djConfig="isDebug: false, parseOnLoad: true"></script>
+		<script type="text/javascript">
+			dojo.require("dijit.form.Form");
+			dojo.require("dijit.form.ValidationTextBox");
+			dojo.require("dijit.form.ComboBox");
+			dojo.require("dijit.form.FilteringSelect");
+			dojo.require("dijit.form.CheckBox");
+			dojo.require("dijit.form.DateTextBox");
+			dojo.require("dijit.form.CurrencyTextBox");
+			dojo.require("dijit.form.NumberSpinner");
+			dojo.require("dijit.form.Slider");
+			dojo.require("dijit.form.Textarea");
+			dojo.require("dijit.Editor");
+			dojo.require("dijit.form.Button");
+			dojo.require("dojo.data.ItemFileReadStore");
+			dojo.require("dojo.parser");	// scan page for widgets and instantiate them
+
+			// make dojo.toJson() print dates correctly (this feels a bit dirty)
+			Date.prototype.json = function(){ return dojo.date.stamp.toISOString(this, {selector: 'date'});};
+		</script>
+	</head>
+	<body class="tundra">
+		<div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+			url="../tests/_data/states.json"></div>
+
+		<h2 class="pageSubContentTitle">Job Application Form</h2>
+		<p>This is just a little demo of dijit's form widgets</p>
+		<form dojoType="dijit.form.Form" id="myForm"
+			onsubmit="alert('Execute form w/values:\n'+dojo.toJson(this.getValues(),true));return confirm('Show form values in the URL?')">
+			<div class="formQuestion">
+				<span class="noticeMessage">
+					As you type in the text below, notice how your input is auto
+					corrected and also the auto completion on the state field.
+				</span>
+				<span>Name And Address</span>
+			</div>
+			<div class="formAnswer">
+				<label class="firstLabel" for="name">Name *</label>
+				<input type="text" id="name" name="name" class="medium"
+					dojoType="dijit.form.ValidationTextBox"
+					required="true" 
+					ucfirst="true" invalidMessage=""/>
+				<br>
+
+				<label class="firstLabel" for="address">Address *</label>
+				<input type="text" id="address" name="address" class="long"
+					dojoType="dijit.form.ValidationTextBox"
+					required="true"
+					trim="true" 
+					ucfirst="true" />
+				<br>
+
+				<label class="firstLabel" for="city">City *</label>
+			 	<select dojoType="dijit.form.ComboBox"
+			 			value=""
+						autocomplete="true"
+						hasDownArrow="false"
+				>
+					<option></option>
+					<option>Chicago</option>
+					<option>Los Angeles</option>
+					<option>New York</option>
+					<option>San Francisco</option>
+					<option>Seattle</option>
+				</select>
+
+				<label class="secondLabel" for="state">State</label>
+				<input dojoType="dijit.form.FilteringSelect"
+					store="stateStore" class="medium" id="state" name="state" />
+
+				<label class="secondLabel" for="zip">Zip *</label>
+				<input type="text" id="zip" name="zip" class="short"
+					dojoType="dijit.form.ValidationTextBox"
+					trim="true" 
+					required="true"
+					regExp="[0-9][0-9][0-9][0-9][0-9]"
+					invalidMessage="5 digit zipcode (ex: 23245)"/>
+				<br>
+
+				<label class="firstLabel" for="dob">DOB *</label>
+				<input id="dob" name="dateOfBirth" dojoType="dijit.form.DateTextBox" required=true/>
+				
+			</div>
+
+			<div class="formQuestion">
+				<span class="noticeMessage">Custom checkboxes and radio buttons...</span>
+				<span>Desired position</span>
+			</div>
+			<div class="formAnswer">
+				<label class="firstLabel" for="position">Position</label>
+				<fieldset id="position" class="dijitInline">
+					<input type="checkBox" name="position" id="it" value="it" dojoType="dijit.form.CheckBox" /> <label for="it">IT</label>
+					<input type="checkBox" name="position" id="marketing" value="marketing" dojoType="dijit.form.CheckBox" /> <label for="marketing">Marketing</label>
+					<input type="checkBox" name="position" id="business" value="business" dojoType="dijit.form.CheckBox" /> <label for="business" style="margin-right: 7em;">Business</label>
+				</fieldset>
+
+				<label class="secondLabel" for="hours">Hours</label>
+				<fieldset id="hours" class="dijitInline">
+					<input type="radio" name="hours" id="full" value="full" dojoType="dijit.form.RadioButton" /> <label for="full">Full time</label>
+					<input type="radio" name="hours" id="part" value="part" dojoType="dijit.form.RadioButton" /> <label for="part">Part time</label>
+				</fieldset>
+			</div>
+
+			<div class="formQuestion">
+				<span class="noticeMessage">slider and spinner ...</span>
+				<span>Education and Experience</span>
+			</div>
+			<div class="formAnswer">
+				<table class="dijitReset">
+					<tr>
+						<td>
+							<label class="firstLabel" for="school">Education level</label>
+						</td>
+						<td style="padding-left: 2em;">
+							<span dojoType="dijit.form.HorizontalSlider" id="school" name="school"
+								minimum="1"
+								value="2"
+								maximum="4"
+								discreteValues="4"
+								showButtons="false"
+								style="width:200px; height: 40px;"
+							>
+									<span dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=4 style="height:5px;"></span>
+									<ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration"style="height:1em;font-size:75%;color:gray;">
+										<li>high school</li>
+										<li>college</li>
+										<li>masters</li>
+										<li>PhD</li>
+									</ol>
+							</span>
+						</td>
+						<td>
+							<label class="secondLabel" for="experience">Work experience (years, 0-40)</label>
+						</td>
+						<td>
+							<input dojoType="dijit.form.NumberSpinner"
+								id="experience" name="experience" class="short"
+								value="1"
+								constraints="{min: 0, max:40, places:0}"
+								size=3>
+						</td>
+					</tr>
+				</table>
+			</div>
+
+			<div class="formQuestion">
+				<span class="noticeMessage">Rich text editor that expands as you type in text</span>
+				<label for="description">Self description</label>
+			</div>
+			<div class="formAnswer">
+				<textarea dojoType="dijit.Editor" minHeight="5em" id="description" name="description">
+				Write a brief summary of &lt;i&gt;your&lt;/i&gt; job skills... using &lt;b&gt;rich&lt;/b&gt; text.
+				</textarea>
+			</div>
+			
+			<div class="formQuestion">
+				<span class="noticeMessage">Text area that expands as you type in text</span>
+				<label for="references">References</label>
+			</div>
+			<div class="formAnswer">
+				<textarea dojoType="dijit.form.Textarea" id="references" name="references">
+					Write your references here (plain text)
+				</textarea>
+			</div>
+
+		  	<center>
+				<button dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconSave" type=submit>
+					OK
+				</button>
+			</center>
+		</form>
+	</body>
+</html>
+

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/continents.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/continents.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/continents.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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" }
+]

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/flags.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/generate.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/generate.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/generate.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,2353 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+	"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<script type="text/javascript" src="../../../dojo/dojo.js"
+		djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script>
+		dojo.require("dijit.layout.ContentPane");
+	</script>
+	<script>
+
+		function t(node){ return node.innerText || node.textContent; };
+
+		var languages, langCountryMap, continents, countries;
+
+		// Call this first, to load JSON data from files (have to wait for load to finish)
+		function load(){
+			// Load list of continents
+			var d = dojo.xhrGet({url: "continents.json", handleAs: "json-comment-optional"});
+			d.addCallback(function(data){
+				continents = data;
+			});
+
+			// Load mapping between countries and languages
+			var d = dojo.xhrGet({url: "langCountryMap.json", handleAs: "json-comment-optional"});
+			d.addCallback(function(data){
+				langCountryMap = data;
+				dojo.forEach(langCountryMap, function(entry){
+					entry.iso = entry.language + "_" + entry.country;
+				});
+			});
+
+			// Load list of languages		
+			var d2 = dojo.xhrGet({url: "languages.json", handleAs: "json-comment-optional"});
+			d2.addCallback(function(data){
+				data = dojo.filter(data, function(item){
+					return item.name && item.countries.length;
+				});
+
+				// each data item X now contains a list every language, as written in
+				// language X, but actually need to invert that for this demo
+				languages = dojo.map(data, function(l){
+					var item = {type: "language", iso: l.iso, name: l.name, countries: l.countries};
+					dojo.forEach(data, function(fl){
+						if(fl[l.iso]){
+							if(item.iso=="en") console.log("in " + fl.name + " the language " + l.name + "/" + l.iso + " is spelled as " + fl[l.iso]);
+							item[fl.iso]=fl[l.iso];
+						}
+					});
+					if(item.iso == "en") console.log(item);
+					return item;
+				});
+			});
+		}
+
+		function generate(){
+			// mapping from country to continent
+			var country2continent = {};
+			dojo.query("tr", "continents").forEach(function(row){
+				var continent = t(dojo.query("td", row)[0]);
+				var country = t(dojo.query("a", row)[1]);
+				country2continent[country] = continent;
+			});
+
+			// Generate country items
+			countries = dojo.query("tr", "source").
+				filter(function(row){ return dojo.query("a", row).length && dojo.query("td", row).length; } ).
+				map(function(row){
+					var iso = dojo.query("td", row)[3];
+					iso = t(iso);
+					var a = dojo.query("td:nth-child(1) a:nth-child(2)", row)[0];
+					var name = t(a);
+					var country = {
+						type: "country",
+						iso: iso,
+						name: name,
+						href: "http://en.wikipedia.org/wiki"; + a.href.replace(/.*\/wiki/, "")
+					};
+					if(country2continent[name]){
+						country.continent = country2continent[name];
+					}
+					country.languages = dojo.filter(langCountryMap, function(x){
+						return x.country==iso;
+					}).map(function(x){
+						return {_reference: x.language};
+					});
+					return country;
+				});
+
+			// generate json for data
+			var out = dojo.byId("json");
+			console.debug(countries);
+			var json = [].concat(languages, langCountryMap, continents, dojo.map(countries, function(x){return x;}));
+			out.value = dojo.toJson(json, true);
+		}
+	</script>
+</head>
+<body>
+<h1> Country / Language JSON Database Generator </h1>
+<p>push step #1 then wait, then step #2</p>
+<button onclick="load();">Step #1</button>
+<button onclick="generate();">Step #2</button>
+
+<h1>JSON</h1>
+<textarea id="json" cols=100 rows=20></textarea>
+
+
+<h1>Country names, flags, and ISO code</h1>
+<p>data taken from <a href="http://en.wikipedia.org/wiki/ISO_3166-1";>wikipedia ISO 3166-1 site</a></p>
+<table id="source" style="height: 300px; overflow: auto;">
+<tbody>
+
+<tr>
+<th width="300">Official country names used by the ISO 3166/MA</th>
+<th><a href="/wiki/ISO_3166-1_numeric" title="ISO 3166-1 numeric">Numeric</a></th>
+<th><a href="/wiki/ISO_3166-1_alpha-3" title="ISO 3166-1 alpha-3">Alpha-3</a></th>
+<th><a href="/wiki/ISO_3166-1_alpha-2" title="ISO 3166-1 alpha-2">Alpha-2</a></th>
+<th>Local ISO codes</th>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Afghanistan.svg" class="image" title="Flag of Afghanistan"></a>&nbsp;<a href="/wiki/Afghanistan" title="Afghanistan">Afghanistan</a></td>
+<td>004</td>
+
+<td>AFG</td>
+<td id="AF">AF</td>
+<td><a href="/wiki/ISO_3166-2:AF" title="ISO 3166-2:AF">ISO 3166-2:AF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Aaland.svg" class="image" title="Flag of Åland"></a>&nbsp;<a href="/wiki/%C3%85land" title="Åland">Åland Islands</a></td>
+<td>248</td>
+<td>ALA</td>
+<td id="AX">AX</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AX&amp;action=edit" class="new" title="ISO 3166-2:AX">ISO 3166-2:AX</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Albania.svg" class="image" title="Flag of Albania"></a>&nbsp;<a href="/wiki/Albania" title="Albania">Albania</a></td>
+<td>008</td>
+<td>ALB</td>
+<td id="AL">AL</td>
+<td><a href="/wiki/ISO_3166-2:AL" title="ISO 3166-2:AL">ISO 3166-2:AL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Algeria.svg" class="image" title="Flag of Algeria"></a>&nbsp;<a href="/wiki/Algeria" title="Algeria">Algeria</a></td>
+<td>012</td>
+
+<td>DZA</td>
+<td id="DZ">DZ</td>
+<td><a href="/wiki/ISO_3166-2:DZ" title="ISO 3166-2:DZ">ISO 3166-2:DZ</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_American_Samoa.svg" class="image" title="Flag of American Samoa"></a>&nbsp;<a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></td>
+<td>016</td>
+<td>ASM</td>
+<td id="AS">AS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AS&amp;action=edit" class="new" title="ISO 3166-2:AS">ISO 3166-2:AS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Andorra.svg" class="image" title="Flag of Andorra"></a>&nbsp;<a href="/wiki/Andorra" title="Andorra">Andorra</a></td>
+<td>020</td>
+<td>AND</td>
+<td id="AD">AD</td>
+<td><a href="/wiki/ISO_3166-2:AD" title="ISO 3166-2:AD">ISO 3166-2:AD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Angola.svg" class="image" title="Flag of Angola"></a>&nbsp;<a href="/wiki/Angola" title="Angola">Angola</a></td>
+<td>024</td>
+
+<td>AGO</td>
+<td id="AO">AO</td>
+<td><a href="/wiki/ISO_3166-2:AO" title="ISO 3166-2:AO">ISO 3166-2:AO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Anguilla.svg" class="image" title="Flag of Anguilla"></a>&nbsp;<a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></td>
+<td>660</td>
+<td>AIA</td>
+<td id="AI">AI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AI&amp;action=edit" class="new" title="ISO 3166-2:AI">ISO 3166-2:AI</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Antarctica.svg" class="image" title="Flag of Antarctica"></a>&nbsp;<a href="/wiki/Antarctica" title="Antarctica">Antarctica</a></td>
+<td>010</td>
+<td>ATA</td>
+<td id="AQ">AQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AQ&amp;action=edit" class="new" title="ISO 3166-2:AQ">ISO 3166-2:AQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="image" title="Flag of Antigua and Barbuda"></a>&nbsp;<a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a></td>
+<td>028</td>
+
+<td>ATG</td>
+<td id="AG">AG</td>
+<td><a href="/wiki/ISO_3166-2:AG" title="ISO 3166-2:AG">ISO 3166-2:AG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Argentina.svg" class="image" title="Flag of Argentina"></a>&nbsp;<a href="/wiki/Argentina" title="Argentina">Argentina</a></td>
+<td>032</td>
+<td>ARG</td>
+<td id="AR">AR</td>
+<td><a href="/wiki/ISO_3166-2:AR" title="ISO 3166-2:AR">ISO 3166-2:AR</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Armenia.svg" class="image" title="Flag of Armenia"></a>&nbsp;<a href="/wiki/Armenia" title="Armenia">Armenia</a></td>
+<td>051</td>
+<td>ARM</td>
+<td id="AM">AM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AM&amp;action=edit" class="new" title="ISO 3166-2:AM">ISO 3166-2:AM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Aruba.svg" class="image" title="Flag of Aruba"></a>&nbsp;<a href="/wiki/Aruba" title="Aruba">Aruba</a></td>
+<td>533</td>
+
+<td>ABW</td>
+<td id="AW">AW</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AW&amp;action=edit" class="new" title="ISO 3166-2:AW">ISO 3166-2:AW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Australia"></a>&nbsp;<a href="/wiki/Australia" title="Australia">Australia</a></td>
+<td>036</td>
+<td>AUS</td>
+<td id="AU">AU</td>
+<td><a href="/wiki/ISO_3166-2:AU" title="ISO 3166-2:AU">ISO 3166-2:AU</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Austria.svg" class="image" title="Flag of Austria"></a>&nbsp;<a href="/wiki/Austria" title="Austria">Austria</a></td>
+<td>040</td>
+<td>AUT</td>
+<td id="AT">AT</td>
+<td><a href="/wiki/ISO_3166-2:AT" title="ISO 3166-2:AT">ISO 3166-2:AT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Azerbaijan.svg" class="image" title="Flag of Azerbaijan"></a>&nbsp;<a href="/wiki/Azerbaijan" title="Azerbaijan">Azerbaijan</a></td>
+<td>031</td>
+
+<td>AZE</td>
+<td id="AZ">AZ</td>
+<td><a href="/wiki/ISO_3166-2:AZ" title="ISO 3166-2:AZ">ISO 3166-2:AZ</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Bahamas.svg" class="image" title="Flag of the Bahamas"></a>&nbsp;<a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a></td>
+<td>044</td>
+<td>BHS</td>
+
+<td id="BS">BS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BS&amp;action=edit" class="new" title="ISO 3166-2:BS">ISO 3166-2:BS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bahrain.svg" class="image" title="Flag of Bahrain"></a>&nbsp;<a href="/wiki/Bahrain" title="Bahrain">Bahrain</a></td>
+<td>048</td>
+<td>BHR</td>
+<td id="BH">BH</td>
+<td><a href="/wiki/ISO_3166-2:BH" title="ISO 3166-2:BH">ISO 3166-2:BH</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bangladesh.svg" class="image" title="Flag of Bangladesh"></a>&nbsp;<a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a></td>
+<td>050</td>
+<td>BGD</td>
+<td id="BD">BD</td>
+<td><a href="/wiki/ISO_3166-2:BD" title="ISO 3166-2:BD">ISO 3166-2:BD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Barbados.svg" class="image" title="Flag of Barbados"></a>&nbsp;<a href="/wiki/Barbados" title="Barbados">Barbados</a></td>
+<td>052</td>
+
+<td>BRB</td>
+<td id="BB">BB</td>
+<td><a href="/wiki/ISO_3166-2:BB" title="ISO 3166-2:BB">ISO 3166-2:BB</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belarus.svg" class="image" title="Flag of Belarus"></a>&nbsp;<a href="/wiki/Belarus" title="Belarus">Belarus</a></td>
+<td>112</td>
+<td>BLR</td>
+<td id="BY">BY</td>
+<td><a href="/wiki/ISO_3166-2:BY" title="ISO 3166-2:BY">ISO 3166-2:BY</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="image" title="Flag of Belgium"></a>&nbsp;<a href="/wiki/Belgium" title="Belgium">Belgium</a></td>
+<td>056</td>
+<td>BEL</td>
+<td id="BE">BE</td>
+<td><a href="/wiki/ISO_3166-2:BE" title="ISO 3166-2:BE">ISO 3166-2:BE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belize.svg" class="image" title="Flag of Belize"></a>&nbsp;<a href="/wiki/Belize" title="Belize">Belize</a></td>
+<td>084</td>
+
+<td>BLZ</td>
+<td id="BZ">BZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BZ&amp;action=edit" class="new" title="ISO 3166-2:BZ">ISO 3166-2:BZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Benin.svg" class="image" title="Flag of Benin"></a>&nbsp;<a href="/wiki/Benin" title="Benin">Benin</a></td>
+<td>204</td>
+<td>BEN</td>
+<td id="BJ">BJ</td>
+<td><a href="/wiki/ISO_3166-2:BJ" title="ISO 3166-2:BJ">ISO 3166-2:BJ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bermuda.svg" class="image" title="Flag of Bermuda"></a>&nbsp;<a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></td>
+<td>060</td>
+<td>BMU</td>
+<td id="BM">BM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BM&amp;action=edit" class="new" title="ISO 3166-2:BM">ISO 3166-2:BM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bhutan.svg" class="image" title="Flag of Bhutan"></a>&nbsp;<a href="/wiki/Bhutan" title="Bhutan">Bhutan</a></td>
+<td>064</td>
+
+<td>BTN</td>
+<td id="BT">BT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BT&amp;action=edit" class="new" title="ISO 3166-2:BT">ISO 3166-2:BT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bolivia.svg" class="image" title="Flag of Bolivia"></a>&nbsp;<a href="/wiki/Bolivia" title="Bolivia">Bolivia</a></td>
+<td>068</td>
+<td>BOL</td>
+<td id="BO">BO</td>
+<td><a href="/wiki/ISO_3166-2:BO" title="ISO 3166-2:BO">ISO 3166-2:BO</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="image" title="Flag of Bosnia and Herzegovina"></a>&nbsp;<a href="/wiki/Bosnia_and_Herzegovina" title="Bosnia and Herzegovina">Bosnia and Herzegovina</a></td>
+<td>070</td>
+<td>BIH</td>
+<td id="BA">BA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BA&amp;action=edit" class="new" title="ISO 3166-2:BA">ISO 3166-2:BA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Botswana.svg" class="image" title="Flag of Botswana"></a>&nbsp;<a href="/wiki/Botswana" title="Botswana">Botswana</a></td>
+<td>072</td>
+
+<td>BWA</td>
+<td id="BW">BW</td>
+<td><a href="/wiki/ISO_3166-2:BW" title="ISO 3166-2:BW">ISO 3166-2:BW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Bouvet Island"></a>&nbsp;<a href="/wiki/Bouvet_Island" title="Bouvet Island">Bouvet Island</a></td>
+<td>074</td>
+<td>BVT</td>
+<td id="BV">BV</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BV&amp;action=edit" class="new" title="ISO 3166-2:BV">ISO 3166-2:BV</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Brazil.svg" class="image" title="Flag of Brazil"></a>&nbsp;<a href="/wiki/Brazil" title="Brazil">Brazil</a></td>
+<td>076</td>
+<td>BRA</td>
+<td id="BR">BR</td>
+<td><a href="/wiki/ISO_3166-2:BR" title="ISO 3166-2:BR">ISO 3166-2:BR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="image" title="Flag of British Indian Ocean Territory"></a>&nbsp;<a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a></td>
+<td>086</td>
+
+<td>IOT</td>
+<td id="IO">IO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:IO&amp;action=edit" class="new" title="ISO 3166-2:IO">ISO 3166-2:IO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Brunei.svg" class="image" title="Flag of Brunei"></a>&nbsp;<a href="/wiki/Brunei" title="Brunei">Brunei Darussalam</a></td>
+<td>096</td>
+<td>BRN</td>
+<td id="BN">BN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BN&amp;action=edit" class="new" title="ISO 3166-2:BN">ISO 3166-2:BN</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bulgaria.svg" class="image" title="Flag of Bulgaria"></a>&nbsp;<a href="/wiki/Bulgaria" title="Bulgaria">Bulgaria</a></td>
+<td>100</td>
+<td>BGR</td>
+<td id="BG">BG</td>
+<td><a href="/wiki/ISO_3166-2:BG" title="ISO 3166-2:BG">ISO 3166-2:BG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Burkina_Faso.svg" class="image" title="Flag of Burkina Faso"></a>&nbsp;<a href="/wiki/Burkina_Faso" title="Burkina Faso">Burkina Faso</a></td>
+<td>854</td>
+
+<td>BFA</td>
+<td id="BF">BF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BF&amp;action=edit" class="new" title="ISO 3166-2:BF">ISO 3166-2:BF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Burundi.svg" class="image" title="Flag of Burundi"></a>&nbsp;<a href="/wiki/Burundi" title="Burundi">Burundi</a></td>
+<td>108</td>
+<td>BDI</td>
+<td id="BI">BI</td>
+<td><a href="/wiki/ISO_3166-2:BI" title="ISO 3166-2:BI">ISO 3166-2:BI</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cambodia.svg" class="image" title="Flag of Cambodia"></a>&nbsp;<a href="/wiki/Cambodia" title="Cambodia">Cambodia</a></td>
+<td>116</td>
+<td>KHM</td>
+<td id="KH">KH</td>
+<td><a href="/wiki/ISO_3166-2:KH" title="ISO 3166-2:KH">ISO 3166-2:KH</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Cameroon.svg" class="image" title="Flag of Cameroon"></a>&nbsp;<a href="/wiki/Cameroon" title="Cameroon">Cameroon</a></td>
+<td>120</td>
+<td>CMR</td>
+<td id="CM">CM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CM&amp;action=edit" class="new" title="ISO 3166-2:CM">ISO 3166-2:CM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Canada.svg" class="image" title="Flag of Canada"></a>&nbsp;<a href="/wiki/Canada" title="Canada">Canada</a></td>
+<td>124</td>
+<td>CAN</td>
+
+<td id="CA">CA</td>
+<td><a href="/wiki/ISO_3166-2:CA" title="ISO 3166-2:CA">ISO 3166-2:CA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cape_Verde.svg" class="image" title="Flag of Cape Verde"></a>&nbsp;<a href="/wiki/Cape_Verde" title="Cape Verde">Cape Verde</a></td>
+<td>132</td>
+<td>CPV</td>
+<td id="CV">CV</td>
+<td><a href="/wiki/ISO_3166-2:CV" title="ISO 3166-2:CV">ISO 3166-2:CV</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="image" title="Flag of Cayman Islands"></a>&nbsp;<a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></td>
+<td>136</td>
+<td>CYM</td>
+<td id="KY">KY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KY&amp;action=edit" class="new" title="ISO 3166-2:KY">ISO 3166-2:KY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="image" title="Flag of the Central African Republic"></a>&nbsp;<a href="/wiki/Central_African_Republic" title="Central African Republic">Central African Republic</a></td>
+<td>140</td>
+
+<td>CAF</td>
+<td id="CF">CF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CF&amp;action=edit" class="new" title="ISO 3166-2:CF">ISO 3166-2:CF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Chad.svg" class="image" title="Flag of Chad"></a>&nbsp;<a href="/wiki/Chad" title="Chad">Chad</a></td>
+<td>148</td>
+<td>TCD</td>
+<td id="TD">TD</td>
+<td><a href="/wiki/ISO_3166-2:TD" title="ISO 3166-2:TD">ISO 3166-2:TD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Chile.svg" class="image" title="Flag of Chile"></a>&nbsp;<a href="/wiki/Chile" title="Chile">Chile</a></td>
+<td>152</td>
+<td>CHL</td>
+<td id="CL">CL</td>
+<td><a href="/wiki/ISO_3166-2:CL" title="ISO 3166-2:CL">ISO 3166-2:CL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="image" title="Flag of the People's Republic of China"></a>&nbsp;<a href="/wiki/People%27s_Republic_of_China" title="People's Republic of China">China</a></td>
+<td>156</td>
+
+<td>CHN</td>
+<td id="CN">CN</td>
+<td><a href="/wiki/ISO_3166-2:CN" title="ISO 3166-2:CN">ISO 3166-2:CN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Christmas_Island.svg" class="image" title="Flag of Christmas Island"></a>&nbsp;<a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></td>
+<td>162</td>
+<td>CXR</td>
+<td id="CX">CX</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CX&amp;action=edit" class="new" title="ISO 3166-2:CX">ISO 3166-2:CX</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of the Cocos (Keeling) Islands"></a>&nbsp;<a href="/wiki/Cocos_%28Keeling%29_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></td>
+<td>166</td>
+<td>CCK</td>
+<td id="CC">CC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CC&amp;action=edit" class="new" title="ISO 3166-2:CC">ISO 3166-2:CC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Colombia.svg" class="image" title="Flag of Colombia"></a>&nbsp;<a href="/wiki/Colombia" title="Colombia">Colombia</a></td>
+<td>170</td>
+
+<td>COL</td>
+<td id="CO">CO</td>
+<td><a href="/wiki/ISO_3166-2:CO" title="ISO 3166-2:CO">ISO 3166-2:CO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Comoros.svg" class="image" title="Flag of the Comoros"></a>&nbsp;<a href="/wiki/Comoros" title="Comoros">Comoros</a></td>
+<td>174</td>
+<td>COM</td>
+<td id="KM">KM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KM&amp;action=edit" class="new" title="ISO 3166-2:KM">ISO 3166-2:KM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="image" title="Flag of the Republic of the Congo"></a>&nbsp;<a href="/wiki/Republic_of_the_Congo" title="Republic of the Congo">Congo</a></td>
+<td>178</td>
+<td>COG</td>
+<td id="CG">CG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CG&amp;action=edit" class="new" title="ISO 3166-2:CG">ISO 3166-2:CG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="image" title="Flag of the Democratic Republic of the Congo"></a>&nbsp;<a href="/wiki/Democratic_Republic_of_the_Congo" title="Democratic Republic of the Congo">Congo, Democratic Republic of the</a></td>
+<td>180</td>
+
+<td>COD</td>
+<td id="CD">CD</td>
+<td><a href="/wiki/ISO_3166-2:CD" title="ISO 3166-2:CD">ISO 3166-2:CD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="image" title="Flag of the Cook Islands"></a>&nbsp;<a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></td>
+<td>184</td>
+<td>COK</td>
+<td id="CK">CK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CK&amp;action=edit" class="new" title="ISO 3166-2:CK">ISO 3166-2:CK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Costa_Rica.svg" class="image" title="Flag of Costa Rica"></a>&nbsp;<a href="/wiki/Costa_Rica" title="Costa Rica">Costa Rica</a></td>
+<td>188</td>
+<td>CRI</td>
+<td id="CR">CR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CR&amp;action=edit" class="new" title="ISO 3166-2:CR">ISO 3166-2:CR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="image" title="Flag of Côte d'Ivoire"></a>&nbsp;<a href="/wiki/C%C3%B4te_d%27Ivoire" title="Côte d'Ivoire">Côte d'Ivoire</a></td>
+<td>384</td>
+
+<td>CIV</td>
+<td id="CI">CI</td>
+<td><a href="/wiki/ISO_3166-2:CI" title="ISO 3166-2:CI">ISO 3166-2:CI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Croatia.svg" class="image" title="Flag of Croatia"></a>&nbsp;<a href="/wiki/Croatia" title="Croatia">Croatia</a></td>
+<td>191</td>
+<td>HRV</td>
+<td id="HR">HR</td>
+<td><a href="/wiki/ISO_3166-2:HR" title="ISO 3166-2:HR">ISO 3166-2:HR</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cuba.svg" class="image" title="Flag of Cuba"></a>&nbsp;<a href="/wiki/Cuba" title="Cuba">Cuba</a></td>
+<td>192</td>
+<td>CUB</td>
+<td id="CU">CU</td>
+<td><a href="/wiki/ISO_3166-2:CU" title="ISO 3166-2:CU">ISO 3166-2:CU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cyprus.svg" class="image" title="Flag of Cyprus"></a>&nbsp;<a href="/wiki/Cyprus" title="Cyprus">Cyprus</a></td>
+<td>196</td>
+
+<td>CYP</td>
+<td id="CY">CY</td>
+<td><a href="/wiki/ISO_3166-2:CY" title="ISO 3166-2:CY">ISO 3166-2:CY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="image" title="Flag of the Czech Republic"></a>&nbsp;<a href="/wiki/Czech_Republic" title="Czech Republic">Czech Republic</a></td>
+<td>203</td>
+<td>CZE</td>
+<td id="CZ">CZ</td>
+<td><a href="/wiki/ISO_3166-2:CZ" title="ISO 3166-2:CZ">ISO 3166-2:CZ</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Denmark.svg" class="image" title="Flag of Denmark"></a>&nbsp;<a href="/wiki/Denmark" title="Denmark">Denmark</a></td>
+<td>208</td>
+<td>DNK</td>
+<td id="DK">DK</td>
+<td><a href="/wiki/ISO_3166-2:DK" title="ISO 3166-2:DK">ISO 3166-2:DK</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Djibouti.svg" class="image" title="Flag of Djibouti"></a>&nbsp;<a href="/wiki/Djibouti" title="Djibouti">Djibouti</a></td>
+<td>262</td>
+<td>DJI</td>
+<td id="DJ">DJ</td>
+<td><a href="/wiki/ISO_3166-2:DJ" title="ISO 3166-2:DJ">ISO 3166-2:DJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Dominica.svg" class="image" title="Flag of Dominica"></a>&nbsp;<a href="/wiki/Dominica" title="Dominica">Dominica</a></td>
+<td>212</td>
+<td>DMA</td>
+
+<td id="DM">DM</td>
+<td><a href="/wiki/ISO_3166-2:DM" title="ISO 3166-2:DM">ISO 3166-2:DM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="image" title="Flag of the Dominican Republic"></a>&nbsp;<a href="/wiki/Dominican_Republic" title="Dominican Republic">Dominican Republic</a></td>
+<td>214</td>
+<td>DOM</td>
+<td id="DO">DO</td>
+<td><a href="/wiki/ISO_3166-2:DO" title="ISO 3166-2:DO">ISO 3166-2:DO</a></td>
+</tr>
+
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ecuador.svg" class="image" title="Flag of Ecuador"></a>&nbsp;<a href="/wiki/Ecuador" title="Ecuador">Ecuador</a></td>
+<td>218</td>
+<td>ECU</td>
+<td id="EC">EC</td>
+<td><a href="/wiki/ISO_3166-2:EC" title="ISO 3166-2:EC">ISO 3166-2:EC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Egypt.svg" class="image" title="Flag of Egypt"></a>&nbsp;<a href="/wiki/Egypt" title="Egypt">Egypt</a></td>
+
+<td>818</td>
+<td>EGY</td>
+<td id="EG">EG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:EG&amp;action=edit" class="new" title="ISO 3166-2:EG">ISO 3166-2:EG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_El_Salvador.svg" class="image" title="Flag of El Salvador"></a>&nbsp;<a href="/wiki/El_Salvador" title="El Salvador">El Salvador</a></td>
+<td>222</td>
+<td>SLV</td>
+<td id="SV">SV</td>
+
+<td><a href="/wiki/ISO_3166-2:SV" title="ISO 3166-2:SV">ISO 3166-2:SV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="image" title="Flag of Equatorial Guinea"></a>&nbsp;<a href="/wiki/Equatorial_Guinea" title="Equatorial Guinea">Equatorial Guinea</a></td>
+<td>226</td>
+<td>GNQ</td>
+<td id="GQ">GQ</td>
+<td><a href="/wiki/ISO_3166-2:GQ" title="ISO 3166-2:GQ">ISO 3166-2:GQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Eritrea.svg" class="image" title="Flag of Eritrea"></a>&nbsp;<a href="/wiki/Eritrea" title="Eritrea">Eritrea</a></td>
+
+<td>232</td>
+<td>ERI</td>
+<td id="ER">ER</td>
+<td><a href="/wiki/ISO_3166-2:ER" title="ISO 3166-2:ER">ISO 3166-2:ER</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Estonia.svg" class="image" title="Flag of Estonia"></a>&nbsp;<a href="/wiki/Estonia" title="Estonia">Estonia</a></td>
+<td>233</td>
+<td>EST</td>
+<td id="EE">EE</td>
+
+<td><a href="/wiki/ISO_3166-2:EE" title="ISO 3166-2:EE">ISO 3166-2:EE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ethiopia.svg" class="image" title="Flag of Ethiopia"></a>&nbsp;<a href="/wiki/Ethiopia" title="Ethiopia">Ethiopia</a></td>
+<td>231</td>
+<td>ETH</td>
+<td id="ET">ET</td>
+<td><a href="/wiki/ISO_3166-2:ET" title="ISO 3166-2:ET">ISO 3166-2:ET</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="image" title="Flag of the Falkland Islands"></a>&nbsp;<a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands (Malvinas)</a></td>
+<td>238</td>
+<td>FLK</td>
+<td id="FK">FK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FK&amp;action=edit" class="new" title="ISO 3166-2:FK">ISO 3166-2:FK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="image" title="Flag of the Faroe Islands"></a>&nbsp;<a href="/wiki/Faroe_Islands" title="Faroe Islands">Faroe Islands</a></td>
+<td>234</td>
+
+<td>FRO</td>
+<td id="FO">FO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FO&amp;action=edit" class="new" title="ISO 3166-2:FO">ISO 3166-2:FO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Fiji.svg" class="image" title="Flag of Fiji"></a>&nbsp;<a href="/wiki/Fiji" title="Fiji">Fiji</a></td>
+<td>242</td>
+<td>FJI</td>
+<td id="FJ">FJ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FJ&amp;action=edit" class="new" title="ISO 3166-2:FJ">ISO 3166-2:FJ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Finland.svg" class="image" title="Flag of Finland"></a>&nbsp;<a href="/wiki/Finland" title="Finland">Finland</a></td>
+<td>246</td>
+<td>FIN</td>
+<td id="FI">FI</td>
+<td><a href="/wiki/ISO_3166-2:FI" title="ISO 3166-2:FI">ISO 3166-2:FI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"></a>&nbsp;<a href="/wiki/France" title="France">France</a></td>
+<td>250</td>
+
+<td>FRA</td>
+<td id="FR">FR</td>
+<td><a href="/wiki/ISO_3166-2:FR" title="ISO 3166-2:FR">ISO 3166-2:FR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of French Guiana"></a>&nbsp;<a href="/wiki/French_Guiana" title="French Guiana">French Guiana</a></td>
+<td>254</td>
+<td>GUF</td>
+<td id="GF">GF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GF&amp;action=edit" class="new" title="ISO 3166-2:GF">ISO 3166-2:GF</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_French_Polynesia.svg" class="image" title="Flag of French Polynesia"></a>&nbsp;<a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a></td>
+<td>258</td>
+<td>PYF</td>
+<td id="PF">PF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PF&amp;action=edit" class="new" title="ISO 3166-2:PF">ISO 3166-2:PF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of the French Southern and Antarctic Lands"></a>&nbsp;<a href="/wiki/French_Southern_and_Antarctic_Lands" title="French Southern and Antarctic Lands">French Southern Territories</a></td>
+<td>260</td>
+
+<td>ATF</td>
+<td id="TF">TF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TF&amp;action=edit" class="new" title="ISO 3166-2:TF">ISO 3166-2:TF</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Gabon.svg" class="image" title="Flag of Gabon"></a>&nbsp;<a href="/wiki/Gabon" title="Gabon">Gabon</a></td>
+<td>266</td>
+<td>GAB</td>
+
+<td id="GA">GA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GA&amp;action=edit" class="new" title="ISO 3166-2:GA">ISO 3166-2:GA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_The_Gambia.svg" class="image" title="Flag of The Gambia"></a>&nbsp;<a href="/wiki/The_Gambia" title="The Gambia">Gambia</a></td>
+<td>270</td>
+<td>GMB</td>
+<td id="GM">GM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GM&amp;action=edit" class="new" title="ISO 3166-2:GM">ISO 3166-2:GM</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Georgia.svg" class="image" title="Flag of Georgia (country)"></a>&nbsp;<a href="/wiki/Georgia_%28country%29" title="Georgia (country)">Georgia</a></td>
+<td>268</td>
+<td>GEO</td>
+<td id="GE">GE</td>
+<td><a href="/wiki/ISO_3166-2:GE" title="ISO 3166-2:GE">ISO 3166-2:GE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Germany.svg" class="image" title="Flag of Germany"></a>&nbsp;<a href="/wiki/Germany" title="Germany">Germany</a></td>
+<td>276</td>
+
+<td>DEU</td>
+<td id="DE">DE</td>
+<td><a href="/wiki/ISO_3166-2:DE" title="ISO 3166-2:DE">ISO 3166-2:DE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ghana.svg" class="image" title="Flag of Ghana"></a>&nbsp;<a href="/wiki/Ghana" title="Ghana">Ghana</a></td>
+<td>288</td>
+<td>GHA</td>
+<td id="GH">GH</td>
+<td><a href="/wiki/ISO_3166-2:GH" title="ISO 3166-2:GH">ISO 3166-2:GH</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Gibraltar.svg" class="image" title="Flag of Gibraltar"></a>&nbsp;<a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></td>
+<td>292</td>
+<td>GIB</td>
+<td id="GI">GI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GI&amp;action=edit" class="new" title="ISO 3166-2:GI">ISO 3166-2:GI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Greece.svg" class="image" title="Flag of Greece"></a>&nbsp;<a href="/wiki/Greece" title="Greece">Greece</a></td>
+<td>300</td>
+
+<td>GRC</td>
+<td id="GR">GR</td>
+<td><a href="/wiki/ISO_3166-2:GR" title="ISO 3166-2:GR">ISO 3166-2:GR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Greenland.svg" class="image" title="Flag of Greenland"></a>&nbsp;<a href="/wiki/Greenland" title="Greenland">Greenland</a></td>
+<td>304</td>
+<td>GRL</td>
+<td id="GL">GL</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GL&amp;action=edit" class="new" title="ISO 3166-2:GL">ISO 3166-2:GL</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Grenada.svg" class="image" title="Flag of Grenada"></a>&nbsp;<a href="/wiki/Grenada" title="Grenada">Grenada</a></td>
+<td>308</td>
+<td>GRD</td>
+<td id="GD">GD</td>
+<td><a href="/wiki/ISO_3166-2:GD" title="ISO 3166-2:GD">ISO 3166-2:GD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Guadeloupe"></a>&nbsp;<a href="/wiki/Guadeloupe" title="Guadeloupe">Guadeloupe</a><span class="reference plainlinksneverexpand" id="ref_COM"><sup><a href="http://en.wikipedia.org/wiki/ISO_3166-1#endnote_COM"; class="external autonumber" title="http://en.wikipedia.org/wiki/ISO_3166-1#endnote_COM"; rel="nofollow">[2]</a></sup></span></td>
+
+<td>312</td>
+<td>GLP</td>
+<td id="GP">GP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GP&amp;action=edit" class="new" title="ISO 3166-2:GP">ISO 3166-2:GP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guam.svg" class="image" title="Flag of Guam"></a>&nbsp;<a href="/wiki/Guam" title="Guam">Guam</a></td>
+<td>316</td>
+<td>GUM</td>
+<td id="GU">GU</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:GU&amp;action=edit" class="new" title="ISO 3166-2:GU">ISO 3166-2:GU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guatemala.svg" class="image" title="Flag of Guatemala"></a>&nbsp;<a href="/wiki/Guatemala" title="Guatemala">Guatemala</a></td>
+<td>320</td>
+<td>GTM</td>
+<td id="GT">GT</td>
+<td><a href="/wiki/ISO_3166-2:GT" title="ISO 3166-2:GT">ISO 3166-2:GT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guernsey.svg" class="image" title="Flag of Guernsey"></a>&nbsp;<a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></td>
+
+<td>831</td>
+<td>GGY</td>
+<td id="GG">GG</td>
+<td><a href="/wiki/ISO_3166-2:GG" title="ISO 3166-2:GG">ISO 3166-2:GG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guinea.svg" class="image" title="Flag of Guinea"></a>&nbsp;<a href="/wiki/Guinea" title="Guinea">Guinea</a></td>
+<td>324</td>
+<td>GIN</td>
+<td id="GN">GN</td>
+
+<td><a href="/wiki/ISO_3166-2:GN" title="ISO 3166-2:GN">ISO 3166-2:GN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="image" title="Flag of Guinea-Bissau"></a>&nbsp;<a href="/wiki/Guinea-Bissau" title="Guinea-Bissau">Guinea-Bissau</a></td>
+<td>624</td>
+<td>GNB</td>
+<td id="GW">GW</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GW&amp;action=edit" class="new" title="ISO 3166-2:GW">ISO 3166-2:GW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guyana.svg" class="image" title="Flag of Guyana"></a>&nbsp;<a href="/wiki/Guyana" title="Guyana">Guyana</a></td>
+
+<td>328</td>
+<td>GUY</td>
+<td id="GY">GY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GY&amp;action=edit" class="new" title="ISO 3166-2:GY">ISO 3166-2:GY</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Haiti.svg" class="image" title="Flag of Haiti"></a>&nbsp;<a href="/wiki/Haiti" title="Haiti">Haiti</a></td>
+<td>332</td>
+
+<td>HTI</td>
+<td id="HT">HT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:HT&amp;action=edit" class="new" title="ISO 3166-2:HT">ISO 3166-2:HT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Heard Island and McDonald Islands"></a>&nbsp;<a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a></td>
+<td>334</td>
+<td>HMD</td>
+<td id="HM">HM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:HM&amp;action=edit" class="new" title="ISO 3166-2:HM">ISO 3166-2:HM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Vatican_City.svg" class="image" title="Flag of the Vatican City"></a>&nbsp;<a href="/wiki/Vatican_City" title="Vatican City">Holy See (Vatican City State)</a></td>
+<td>336</td>
+<td>VAT</td>
+<td id="VA">VA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VA&amp;action=edit" class="new" title="ISO 3166-2:VA">ISO 3166-2:VA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Honduras.svg" class="image" title="Flag of Honduras"></a>&nbsp;<a href="/wiki/Honduras" title="Honduras">Honduras</a></td>
+<td>340</td>
+
+<td>HND</td>
+<td id="HN">HN</td>
+<td><a href="/wiki/ISO_3166-2:HN" title="ISO 3166-2:HN">ISO 3166-2:HN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Hong_Kong.svg" class="image" title="Flag of Hong Kong"></a>&nbsp;<a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></td>
+<td>344</td>
+<td>HKG</td>
+<td id="HK">HK</td>
+<td><a href="/wiki/ISO_3166-2:HK" title="ISO 3166-2:HK">ISO 3166-2:HK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Hungary.svg" class="image" title="Flag of Hungary"></a>&nbsp;<a href="/wiki/Hungary" title="Hungary">Hungary</a></td>
+<td>348</td>
+<td>HUN</td>
+<td id="HU">HU</td>
+<td><a href="/wiki/ISO_3166-2:HU" title="ISO 3166-2:HU">ISO 3166-2:HU</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Iceland.svg" class="image" title="Flag of Iceland"></a>&nbsp;<a href="/wiki/Iceland" title="Iceland">Iceland</a></td>
+<td>352</td>
+<td>ISL</td>
+<td id="IS">IS</td>
+<td><a href="/wiki/ISO_3166-2:IS" title="ISO 3166-2:IS">ISO 3166-2:IS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_India.svg" class="image" title="Flag of India"></a>&nbsp;<a href="/wiki/India" title="India">India</a></td>
+<td>356</td>
+<td>IND</td>
+
+<td id="IN">IN</td>
+<td><a href="/wiki/ISO_3166-2:IN" title="ISO 3166-2:IN">ISO 3166-2:IN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Indonesia.svg" class="image" title="Flag of Indonesia"></a>&nbsp;<a href="/wiki/Indonesia" title="Indonesia">Indonesia</a></td>
+<td>360</td>
+<td>IDN</td>
+<td id="ID">ID</td>
+<td><a href="/wiki/ISO_3166-2:ID" title="ISO 3166-2:ID">ISO 3166-2:ID</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Iran.svg" class="image" title="Flag of Iran"></a>&nbsp;<a href="/wiki/Iran" title="Iran">Iran, Islamic Republic of</a></td>
+<td>364</td>
+<td>IRN</td>
+<td id="IR">IR</td>
+<td><a href="/wiki/ISO_3166-2:IR" title="ISO 3166-2:IR">ISO 3166-2:IR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Iraq.svg" class="image" title="Flag of Iraq"></a>&nbsp;<a href="/wiki/Iraq" title="Iraq">Iraq</a></td>
+<td>368</td>
+
+<td>IRQ</td>
+<td id="IQ">IQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:IQ&amp;action=edit" class="new" title="ISO 3166-2:IQ">ISO 3166-2:IQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ireland.svg" class="image" title="Flag of Ireland"></a>&nbsp;<a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a></td>
+<td>372</td>
+<td>IRL</td>
+<td id="IE">IE</td>
+<td><a href="/wiki/ISO_3166-2:IE" title="ISO 3166-2:IE">ISO 3166-2:IE</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="image" title="Flag of the Isle of Man"></a>&nbsp;<a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></td>
+<td>833</td>
+<td>IMN</td>
+<td id="IM">IM</td>
+<td><a href="/wiki/ISO_3166-2:IM" title="ISO 3166-2:IM">ISO 3166-2:IM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Israel.svg" class="image" title="Flag of Israel"></a>&nbsp;<a href="/wiki/Israel" title="Israel">Israel</a></td>
+<td>376</td>
+
+<td>ISR</td>
+<td id="IL">IL</td>
+<td><a href="/wiki/ISO_3166-2:IL" title="ISO 3166-2:IL">ISO 3166-2:IL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Italy.svg" class="image" title="Flag of Italy"></a>&nbsp;<a href="/wiki/Italy" title="Italy">Italy</a></td>
+<td>380</td>
+<td>ITA</td>
+<td id="IT">IT</td>
+<td><a href="/wiki/ISO_3166-2:IT" title="ISO 3166-2:IT">ISO 3166-2:IT</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jamaica.svg" class="image" title="Flag of Jamaica"></a>&nbsp;<a href="/wiki/Jamaica" title="Jamaica">Jamaica</a></td>
+<td>388</td>
+<td>JAM</td>
+<td id="JM">JM</td>
+<td><a href="/wiki/ISO_3166-2:JM" title="ISO 3166-2:JM">ISO 3166-2:JM</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Japan.svg" class="image" title="Flag of Japan"></a>&nbsp;<a href="/wiki/Japan" title="Japan">Japan</a></td>
+<td>392</td>
+<td>JPN</td>
+<td id="JP">JP</td>
+<td><a href="/wiki/ISO_3166-2:JP" title="ISO 3166-2:JP">ISO 3166-2:JP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jersey.svg" class="image" title="Flag of Jersey"></a>&nbsp;<a href="/wiki/Jersey" title="Jersey">Jersey</a></td>
+<td>832</td>
+<td>JEY</td>
+
+<td id="JE">JE</td>
+<td><a href="/wiki/ISO_3166-2:JE" title="ISO 3166-2:JE">ISO 3166-2:JE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jordan.svg" class="image" title="Flag of Jordan"></a>&nbsp;<a href="/wiki/Jordan" title="Jordan">Jordan</a></td>
+<td>400</td>
+<td>JOR</td>
+<td id="JO">JO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:JO&amp;action=edit" class="new" title="ISO 3166-2:JO">ISO 3166-2:JO</a></td>
+</tr>
+
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kazakhstan.svg" class="image" title="Flag of Kazakhstan"></a>&nbsp;<a href="/wiki/Kazakhstan" title="Kazakhstan">Kazakhstan</a></td>
+<td>398</td>
+<td>KAZ</td>
+<td id="KZ">KZ</td>
+<td><a href="/wiki/ISO_3166-2:KZ" title="ISO 3166-2:KZ">ISO 3166-2:KZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kenya.svg" class="image" title="Flag of Kenya"></a>&nbsp;<a href="/wiki/Kenya" title="Kenya">Kenya</a></td>
+
+<td>404</td>
+<td>KEN</td>
+<td id="KE">KE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KE&amp;action=edit" class="new" title="ISO 3166-2:KE">ISO 3166-2:KE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kiribati.svg" class="image" title="Flag of Kiribati"></a>&nbsp;<a href="/wiki/Kiribati" title="Kiribati">Kiribati</a></td>
+<td>296</td>
+<td>KIR</td>
+<td id="KI">KI</td>
+
+<td><a href="/wiki/ISO_3166-2:KI" title="ISO 3166-2:KI">ISO 3166-2:KI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_North_Korea.svg" class="image" title="Flag of North Korea"></a>&nbsp;<a href="/wiki/North_Korea" title="North Korea">Korea, Democratic People's Republic of</a></td>
+<td>408</td>
+<td>PRK</td>
+<td id="KP">KP</td>
+<td><a href="/wiki/ISO_3166-2:KP" title="ISO 3166-2:KP">ISO 3166-2:KP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Korea.svg" class="image" title="Flag of South Korea"></a>&nbsp;<a href="/wiki/South_Korea" title="South Korea">Korea, Republic of</a></td>
+
+<td>410</td>
+<td>KOR</td>
+<td id="KR">KR</td>
+<td><a href="/wiki/ISO_3166-2:KR" title="ISO 3166-2:KR">ISO 3166-2:KR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kuwait.svg" class="image" title="Flag of Kuwait"></a>&nbsp;<a href="/wiki/Kuwait" title="Kuwait">Kuwait</a></td>
+<td>414</td>
+<td>KWT</td>
+<td id="KW">KW</td>
+
+<td><a href="/wiki/ISO_3166-2:KW" title="ISO 3166-2:KW">ISO 3166-2:KW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="image" title="Flag of Kyrgyzstan"></a>&nbsp;<a href="/wiki/Kyrgyzstan" title="Kyrgyzstan">Kyrgyzstan</a></td>
+<td>417</td>
+<td>KGZ</td>
+<td id="KG">KG</td>
+<td><a href="/wiki/ISO_3166-2:KG" title="ISO 3166-2:KG">ISO 3166-2:KG</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Laos.svg" class="image" title="Flag of Laos"></a>&nbsp;<a href="/wiki/Laos" title="Laos">Lao People's Democratic Republic</a></td>
+<td>418</td>
+<td>LAO</td>
+<td id="LA">LA</td>
+<td><a href="/wiki/ISO_3166-2:LA" title="ISO 3166-2:LA">ISO 3166-2:LA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Latvia.svg" class="image" title="Flag of Latvia"></a>&nbsp;<a href="/wiki/Latvia" title="Latvia">Latvia</a></td>
+<td>428</td>
+
+<td>LVA</td>
+<td id="LV">LV</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LV&amp;action=edit" class="new" title="ISO 3166-2:LV">ISO 3166-2:LV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lebanon.svg" class="image" title="Flag of Lebanon"></a>&nbsp;<a href="/wiki/Lebanon" title="Lebanon">Lebanon</a></td>
+<td>422</td>
+<td>LBN</td>
+<td id="LB">LB</td>
+<td><a href="/wiki/ISO_3166-2:LB" title="ISO 3166-2:LB">ISO 3166-2:LB</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lesotho.svg" class="image" title="Flag of Lesotho"></a>&nbsp;<a href="/wiki/Lesotho" title="Lesotho">Lesotho</a></td>
+<td>426</td>
+<td>LSO</td>
+<td id="LS">LS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LS&amp;action=edit" class="new" title="ISO 3166-2:LS">ISO 3166-2:LS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Liberia.svg" class="image" title="Flag of Liberia"></a>&nbsp;<a href="/wiki/Liberia" title="Liberia">Liberia</a></td>
+<td>430</td>
+
+<td>LBR</td>
+<td id="LR">LR</td>
+<td><a href="/wiki/ISO_3166-2:LR" title="ISO 3166-2:LR">ISO 3166-2:LR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Libya.svg" class="image" title="Flag of Libya"></a>&nbsp;<a href="/wiki/Libya" title="Libya">Libyan Arab Jamahiriya</a></td>
+<td>434</td>
+<td>LBY</td>
+<td id="LY">LY</td>
+<td><a href="/wiki/ISO_3166-2:LY" title="ISO 3166-2:LY">ISO 3166-2:LY</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Liechtenstein.svg" class="image" title="Flag of Liechtenstein"></a>&nbsp;<a href="/wiki/Liechtenstein" title="Liechtenstein">Liechtenstein</a></td>
+<td>438</td>
+<td>LIE</td>
+<td id="LI">LI</td>
+<td><a href="/wiki/ISO_3166-2:LI" title="ISO 3166-2:LI">ISO 3166-2:LI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lithuania.svg" class="image" title="Flag of Lithuania"></a>&nbsp;<a href="/wiki/Lithuania" title="Lithuania">Lithuania</a></td>
+<td>440</td>
+
+<td>LTU</td>
+<td id="LT">LT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LT&amp;action=edit" class="new" title="ISO 3166-2:LT">ISO 3166-2:LT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Luxembourg.svg" class="image" title="Flag of Luxembourg"></a>&nbsp;<a href="/wiki/Luxembourg" title="Luxembourg">Luxembourg</a></td>
+<td>442</td>
+<td>LUX</td>
+<td id="LU">LU</td>
+<td><a href="/wiki/ISO_3166-2:LU" title="ISO 3166-2:LU">ISO 3166-2:LU</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Macau.svg" class="image" title="Flag of Macau"></a>&nbsp;<a href="/wiki/Macau" title="Macau">Macao</a></td>
+<td>446</td>
+<td>MAC</td>
+<td id="MO">MO</td>
+<td><a href="/wiki/ISO_3166-2:MO" title="ISO 3166-2:MO">ISO 3166-2:MO</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Macedonia.svg" class="image" title="Flag of the Republic of Macedonia"></a>&nbsp;<a href="/wiki/Republic_of_Macedonia" title="Republic of Macedonia">Macedonia, the former Yugoslav Republic of</a></td>
+<td>807</td>
+<td>MKD</td>
+<td id="MK">MK</td>
+<td><a href="/wiki/ISO_3166-2:MK" title="ISO 3166-2:MK">ISO 3166-2:MK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Madagascar.svg" class="image" title="Flag of Madagascar"></a>&nbsp;<a href="/wiki/Madagascar" title="Madagascar">Madagascar</a></td>
+<td>450</td>
+<td>MDG</td>
+
+<td id="MG">MG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MG&amp;action=edit" class="new" title="ISO 3166-2:MG">ISO 3166-2:MG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malawi.svg" class="image" title="Flag of Malawi"></a>&nbsp;<a href="/wiki/Malawi" title="Malawi">Malawi</a></td>
+<td>454</td>
+<td>MWI</td>
+<td id="MW">MW</td>
+<td><a href="/wiki/ISO_3166-2:MW" title="ISO 3166-2:MW">ISO 3166-2:MW</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malaysia.svg" class="image" title="Flag of Malaysia"></a>&nbsp;<a href="/wiki/Malaysia" title="Malaysia">Malaysia</a></td>
+<td>458</td>
+<td>MYS</td>
+<td id="MY">MY</td>
+<td><a href="/wiki/ISO_3166-2:MY" title="ISO 3166-2:MY">ISO 3166-2:MY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Maldives.svg" class="image" title="Flag of the Maldives"></a>&nbsp;<a href="/wiki/Maldives" title="Maldives">Maldives</a></td>
+<td>462</td>
+
+<td>MDV</td>
+<td id="MV">MV</td>
+<td><a href="/wiki/ISO_3166-2:MV" title="ISO 3166-2:MV">ISO 3166-2:MV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mali.svg" class="image" title="Flag of Mali"></a>&nbsp;<a href="/wiki/Mali" title="Mali">Mali</a></td>
+<td>466</td>
+<td>MLI</td>
+<td id="ML">ML</td>
+<td><a href="/w/index.php?title=ISO_3166-2:ML&amp;action=edit" class="new" title="ISO 3166-2:ML">ISO 3166-2:ML</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malta.svg" class="image" title="Flag of Malta"></a>&nbsp;<a href="/wiki/Malta" title="Malta">Malta</a></td>
+<td>470</td>
+<td>MLT</td>
+<td id="MT">MT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MT&amp;action=edit" class="new" title="ISO 3166-2:MT">ISO 3166-2:MT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="image" title="Flag of the Marshall Islands"></a>&nbsp;<a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a></td>
+<td>584</td>
+
+<td>MHL</td>
+<td id="MH">MH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MH&amp;action=edit" class="new" title="ISO 3166-2:MH">ISO 3166-2:MH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Martinique"></a>&nbsp;<a href="/wiki/Martinique" title="Martinique">Martinique</a></td>
+<td>474</td>
+<td>MTQ</td>
+<td id="MQ">MQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MQ&amp;action=edit" class="new" title="ISO 3166-2:MQ">ISO 3166-2:MQ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mauritania.svg" class="image" title="Flag of Mauritania"></a>&nbsp;<a href="/wiki/Mauritania" title="Mauritania">Mauritania</a></td>
+<td>478</td>
+<td>MRT</td>
+<td id="MR">MR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MR&amp;action=edit" class="new" title="ISO 3166-2:MR">ISO 3166-2:MR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mauritius.svg" class="image" title="Flag of Mauritius"></a>&nbsp;<a href="/wiki/Mauritius" title="Mauritius">Mauritius</a></td>
+<td>480</td>
+
+<td>MUS</td>
+<td id="MU">MU</td>
+<td><a href="/wiki/ISO_3166-2:MU" title="ISO 3166-2:MU">ISO 3166-2:MU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Mayotte"></a>&nbsp;<a href="/wiki/Mayotte" title="Mayotte">Mayotte</a></td>
+<td>175</td>
+<td>MYT</td>
+<td id="YT">YT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:YT&amp;action=edit" class="new" title="ISO 3166-2:YT">ISO 3166-2:YT</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mexico.svg" class="image" title="Flag of Mexico"></a>&nbsp;<a href="/wiki/Mexico" title="Mexico">Mexico</a></td>
+<td>484</td>
+<td>MEX</td>
+<td id="MX">MX</td>
+<td><a href="/wiki/ISO_3166-2:MX" title="ISO 3166-2:MX">ISO 3166-2:MX</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Micronesia.svg" class="image" title="Flag of the Federated States of Micronesia"></a>&nbsp;<a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia, Federated States of</a></td>
+<td>583</td>
+
+<td>FSM</td>
+<td id="FM">FM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FM&amp;action=edit" class="new" title="ISO 3166-2:FM">ISO 3166-2:FM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Moldova.svg" class="image" title="Flag of Moldova"></a>&nbsp;<a href="/wiki/Moldova" title="Moldova">Moldova, Republic of</a></td>
+<td>498</td>
+<td>MDA</td>
+<td id="MD">MD</td>
+<td><a href="/wiki/ISO_3166-2:MD" title="ISO 3166-2:MD">ISO 3166-2:MD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Monaco.svg" class="image" title="Flag of Monaco"></a>&nbsp;<a href="/wiki/Monaco" title="Monaco">Monaco</a></td>
+<td>492</td>
+<td>MCO</td>
+<td id="MC">MC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MC&amp;action=edit" class="new" title="ISO 3166-2:MC">ISO 3166-2:MC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mongolia.svg" class="image" title="Flag of Mongolia"></a>&nbsp;<a href="/wiki/Mongolia" title="Mongolia">Mongolia</a></td>
+<td>496</td>
+
+<td>MNG</td>
+<td id="MN">MN</td>
+<td><a href="/wiki/ISO_3166-2:MN" title="ISO 3166-2:MN">ISO 3166-2:MN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Montenegro.svg" class="image" title="Flag of Montenegro"></a>&nbsp;<a href="/wiki/Montenegro" title="Montenegro">Montenegro</a></td>
+<td>499</td>
+<td>MNE</td>
+<td id="ME">ME</td>
+<td><a href="/wiki/ISO_3166-2:ME" title="ISO 3166-2:ME">ISO 3166-2:ME</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Montserrat.svg" class="image" title="Flag of Montserrat"></a>&nbsp;<a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></td>
+<td>500</td>
+<td>MSR</td>
+<td id="MS">MS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MS&amp;action=edit" class="new" title="ISO 3166-2:MS">ISO 3166-2:MS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Morocco.svg" class="image" title="Flag of Morocco"></a>&nbsp;<a href="/wiki/Morocco" title="Morocco">Morocco</a></td>
+<td>504</td>
+
+<td>MAR</td>
+<td id="MA">MA</td>
+<td><a href="/wiki/ISO_3166-2:MA" title="ISO 3166-2:MA">ISO 3166-2:MA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mozambique.svg" class="image" title="Flag of Mozambique"></a>&nbsp;<a href="/wiki/Mozambique" title="Mozambique">Mozambique</a></td>
+<td>508</td>
+<td>MOZ</td>
+<td id="MZ">MZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MZ&amp;action=edit" class="new" title="ISO 3166-2:MZ">ISO 3166-2:MZ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Myanmar.svg" class="image" title="Flag of Myanmar"></a>&nbsp;<a href="/wiki/Myanmar" title="Myanmar">Myanmar</a></td>
+<td>104</td>
+<td>MMR</td>
+<td id="MM">MM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MM&amp;action=edit" class="new" title="ISO 3166-2:MM">ISO 3166-2:MM</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Namibia.svg" class="image" title="Flag of Namibia"></a>&nbsp;<a href="/wiki/Namibia" title="Namibia">Namibia</a></td>
+<td>516</td>
+<td>NAM</td>
+<td id="NA">NA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NA&amp;action=edit" class="new" title="ISO 3166-2:NA">ISO 3166-2:NA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nauru.svg" class="image" title="Flag of Nauru"></a>&nbsp;<a href="/wiki/Nauru" title="Nauru">Nauru</a></td>
+<td>520</td>
+<td>NRU</td>
+
+<td id="NR">NR</td>
+<td><a href="/wiki/ISO_3166-2:NR" title="ISO 3166-2:NR">ISO 3166-2:NR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nepal.svg" class="image" title="Flag of Nepal"></a>&nbsp;<a href="/wiki/Nepal" title="Nepal">Nepal</a></td>
+<td>524</td>
+<td>NPL</td>
+<td id="NP">NP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NP&amp;action=edit" class="new" title="ISO 3166-2:NP">ISO 3166-2:NP</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Netherlands.svg" class="image" title="Flag of the Netherlands"></a>&nbsp;<a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></td>
+<td>528</td>
+<td>NLD</td>
+<td id="NL">NL</td>
+<td><a href="/wiki/ISO_3166-2:NL" title="ISO 3166-2:NL">ISO 3166-2:NL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="image" title="Flag of the Netherlands Antilles"></a>&nbsp;<a href="/wiki/Netherlands_Antilles" title="Netherlands Antilles">Netherlands Antilles</a></td>
+<td>530</td>
+
+<td>ANT</td>
+<td id="AN">AN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AN&amp;action=edit" class="new" title="ISO 3166-2:AN">ISO 3166-2:AN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of New Caledonia"></a>&nbsp;<a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a></td>
+<td>540</td>
+<td>NCL</td>
+<td id="NC">NC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NC&amp;action=edit" class="new" title="ISO 3166-2:NC">ISO 3166-2:NC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"></a>&nbsp;<a href="/wiki/New_Zealand" title="New Zealand">New Zealand</a></td>
+<td>554</td>
+<td>NZL</td>
+<td id="NZ">NZ</td>
+<td><a href="/wiki/ISO_3166-2:NZ" title="ISO 3166-2:NZ">ISO 3166-2:NZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nicaragua.svg" class="image" title="Flag of Nicaragua"></a>&nbsp;<a href="/wiki/Nicaragua" title="Nicaragua">Nicaragua</a></td>
+<td>558</td>
+
+<td>NIC</td>
+<td id="NI">NI</td>
+<td><a href="/wiki/ISO_3166-2:NI" title="ISO 3166-2:NI">ISO 3166-2:NI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Niger.svg" class="image" title="Flag of Niger"></a>&nbsp;<a href="/wiki/Niger" title="Niger">Niger</a></td>
+<td>562</td>
+<td>NER</td>
+<td id="NE">NE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NE&amp;action=edit" class="new" title="ISO 3166-2:NE">ISO 3166-2:NE</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nigeria.svg" class="image" title="Flag of Nigeria"></a>&nbsp;<a href="/wiki/Nigeria" title="Nigeria">Nigeria</a></td>
+<td>566</td>
+<td>NGA</td>
+<td id="NG">NG</td>
+<td><a href="/wiki/ISO_3166-2:NG" title="ISO 3166-2:NG">ISO 3166-2:NG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Niue.svg" class="image" title="Flag of Niue"></a>&nbsp;<a href="/wiki/Niue" title="Niue">Niue</a></td>
+<td>570</td>
+
+<td>NIU</td>
+<td id="NU">NU</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NU&amp;action=edit" class="new" title="ISO 3166-2:NU">ISO 3166-2:NU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norfolk_Island.svg" class="image" title="Flag of Norfolk Island"></a>&nbsp;<a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></td>
+<td>574</td>
+<td>NFK</td>
+<td id="NF">NF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NF&amp;action=edit" class="new" title="ISO 3166-2:NF">ISO 3166-2:NF</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="image" title="Flag of the Northern Mariana Islands"></a>&nbsp;<a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></td>
+<td>580</td>
+<td>MNP</td>
+<td id="MP">MP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MP&amp;action=edit" class="new" title="ISO 3166-2:MP">ISO 3166-2:MP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Norway"></a>&nbsp;<a href="/wiki/Norway" title="Norway">Norway</a></td>
+<td>578</td>
+
+<td>NOR</td>
+<td id="NO">NO</td>
+<td><a href="/wiki/ISO_3166-2:NO" title="ISO 3166-2:NO">ISO 3166-2:NO</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Oman.svg" class="image" title="Flag of Oman"></a>&nbsp;<a href="/wiki/Oman" title="Oman">Oman</a></td>
+<td>512</td>
+<td>OMN</td>
+
+<td id="OM">OM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:OM&amp;action=edit" class="new" title="ISO 3166-2:OM">ISO 3166-2:OM</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Pakistan.svg" class="image" title="Flag of Pakistan"></a>&nbsp;<a href="/wiki/Pakistan" title="Pakistan">Pakistan</a></td>
+<td>586</td>
+<td>PAK</td>
+<td id="PK">PK</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:PK&amp;action=edit" class="new" title="ISO 3166-2:PK">ISO 3166-2:PK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Palau.svg" class="image" title="Flag of Palau"></a>&nbsp;<a href="/wiki/Palau" title="Palau">Palau</a></td>
+<td>585</td>
+<td>PLW</td>
+<td id="PW">PW</td>
+<td><a href="/wiki/ISO_3166-2:PW" title="ISO 3166-2:PW">ISO 3166-2:PW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Palestine.svg" class="image" title="Palestinian flag"></a>&nbsp;<a href="/wiki/Palestinian_territories" title="Palestinian territories">Palestinian Territory, Occupied</a></td>
+
+<td>275</td>
+<td>PSE</td>
+<td id="PS">PS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PS&amp;action=edit" class="new" title="ISO 3166-2:PS">ISO 3166-2:PS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Panama.svg" class="image" title="Flag of Panama"></a>&nbsp;<a href="/wiki/Panama" title="Panama">Panama</a></td>
+<td>591</td>
+<td>PAN</td>
+<td id="PA">PA</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:PA&amp;action=edit" class="new" title="ISO 3166-2:PA">ISO 3166-2:PA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="image" title="Flag of Papua New Guinea"></a>&nbsp;<a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a></td>
+<td>598</td>
+<td>PNG</td>
+<td id="PG">PG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PG&amp;action=edit" class="new" title="ISO 3166-2:PG">ISO 3166-2:PG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Paraguay.svg" class="image" title="Flag of Paraguay"></a>&nbsp;<a href="/wiki/Paraguay" title="Paraguay">Paraguay</a></td>
+
+<td>600</td>
+<td>PRY</td>
+<td id="PY">PY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PY&amp;action=edit" class="new" title="ISO 3166-2:PY">ISO 3166-2:PY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Peru.svg" class="image" title="Flag of Peru"></a>&nbsp;<a href="/wiki/Peru" title="Peru">Peru</a></td>
+<td>604</td>
+<td>PER</td>
+<td id="PE">PE</td>
+
+<td><a href="/wiki/ISO_3166-2:PE" title="ISO 3166-2:PE">ISO 3166-2:PE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Philippines.svg" class="image" title="Flag of the Philippines"></a>&nbsp;<a href="/wiki/Philippines" title="Philippines">Philippines</a></td>
+<td>608</td>
+<td>PHL</td>
+<td id="PH">PH</td>
+<td><a href="/wiki/ISO_3166-2:PH" title="ISO 3166-2:PH">ISO 3166-2:PH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="image" title="Flag of the Pitcairn Islands"></a>&nbsp;<a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn</a></td>
+
+<td>612</td>
+<td>PCN</td>
+<td id="PN">PN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PN&amp;action=edit" class="new" title="ISO 3166-2:PN">ISO 3166-2:PN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Poland.svg" class="image" title="Flag of Poland"></a>&nbsp;<a href="/wiki/Poland" title="Poland">Poland</a></td>
+<td>616</td>
+<td>POL</td>
+<td id="PL">PL</td>
+
+<td><a href="/wiki/ISO_3166-2:PL" title="ISO 3166-2:PL">ISO 3166-2:PL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Portugal.svg" class="image" title="Flag of Portugal"></a>&nbsp;<a href="/wiki/Portugal" title="Portugal">Portugal</a></td>
+<td>620</td>
+<td>PRT</td>
+<td id="PT">PT</td>
+<td><a href="/wiki/ISO_3166-2:PT" title="ISO 3166-2:PT">ISO 3166-2:PT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Puerto_Rico.svg" class="image" title="Flag of Puerto Rico"></a>&nbsp;<a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></td>
+
+<td>630</td>
+<td>PRI</td>
+<td id="PR">PR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PR&amp;action=edit" class="new" title="ISO 3166-2:PR">ISO 3166-2:PR</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Qatar.svg" class="image" title="Flag of Qatar"></a>&nbsp;<a href="/wiki/Qatar" title="Qatar">Qatar</a></td>
+<td>634</td>
+
+<td>QAT</td>
+<td id="QA">QA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:QA&amp;action=edit" class="new" title="ISO 3166-2:QA">ISO 3166-2:QA</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Réunion"></a>&nbsp;<a href="/wiki/R%C3%A9union" title="Réunion">Réunion</a></td>
+<td>638</td>
+<td>REU</td>
+
+<td id="RE">RE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:RE&amp;action=edit" class="new" title="ISO 3166-2:RE">ISO 3166-2:RE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Romania.svg" class="image" title="Flag of Romania"></a>&nbsp;<a href="/wiki/Romania" title="Romania">Romania</a></td>
+<td>642</td>
+<td>ROU</td>
+<td id="RO">RO</td>
+<td><a href="/wiki/ISO_3166-2:RO" title="ISO 3166-2:RO">ISO 3166-2:RO</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Russia.svg" class="image" title="Flag of Russia"></a>&nbsp;<a href="/wiki/Russia" title="Russia">Russian Federation</a></td>
+<td>643</td>
+<td>RUS</td>
+<td id="RU">RU</td>
+<td><a href="/wiki/ISO_3166-2:RU" title="ISO 3166-2:RU">ISO 3166-2:RU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Rwanda.svg" class="image" title="Flag of Rwanda"></a>&nbsp;<a href="/wiki/Rwanda" title="Rwanda">Rwanda</a></td>
+<td>646</td>
+
+<td>RWA</td>
+<td id="RW">RW</td>
+<td><a href="/wiki/ISO_3166-2:RW" title="ISO 3166-2:RW">ISO 3166-2:RW</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Helena.svg" class="image" title="Flag of Saint Helena"></a>&nbsp;<a href="/wiki/Saint_Helena" title="Saint Helena">Saint Helena</a></td>
+<td>654</td>
+<td>SHN</td>
+
+<td id="SH">SH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SH&amp;action=edit" class="new" title="ISO 3166-2:SH">ISO 3166-2:SH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="image" title="Flag of Saint Kitts and Nevis"></a>&nbsp;<a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a></td>
+<td>659</td>
+<td>KNA</td>
+<td id="KN">KN</td>
+<td><a href="/wiki/ISO_3166-2:KN" title="ISO 3166-2:KN">ISO 3166-2:KN</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Lucia.svg" class="image" title="Flag of Saint Lucia"></a>&nbsp;<a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a></td>
+<td>662</td>
+<td>LCA</td>
+<td id="LC">LC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LC&amp;action=edit" class="new" title="ISO 3166-2:LC">ISO 3166-2:LC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Pierre and Miquelon"></a>&nbsp;<a href="/wiki/Saint_Pierre_and_Miquelon" title="Saint Pierre and Miquelon">Saint Pierre and Miquelon</a></td>
+<td>666</td>
+
+<td>SPM</td>
+<td id="PM">PM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PM&amp;action=edit" class="new" title="ISO 3166-2:PM">ISO 3166-2:PM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="image" title="Flag of Saint Vincent and the Grenadines"></a>&nbsp;<a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a></td>
+<td>670</td>
+<td>VCT</td>
+<td id="VC">VC</td>
+<td><a href="/wiki/ISO_3166-2:VC" title="ISO 3166-2:VC">ISO 3166-2:VC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Samoa.svg" class="image" title="Flag of Samoa"></a>&nbsp;<a href="/wiki/Samoa" title="Samoa">Samoa</a></td>
+<td>882</td>
+<td>WSM</td>
+<td id="WS">WS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:WS&amp;action=edit" class="new" title="ISO 3166-2:WS">ISO 3166-2:WS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_San_Marino.svg" class="image" title="Flag of San Marino"></a>&nbsp;<a href="/wiki/San_Marino" title="San Marino">San Marino</a></td>
+<td>674</td>
+
+<td>SMR</td>
+<td id="SM">SM</td>
+<td><a href="/wiki/ISO_3166-2:SM" title="ISO 3166-2:SM">ISO 3166-2:SM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="image" title="Flag of São Tomé and Príncipe"></a>&nbsp;<a href="/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe" title="São Tomé and Príncipe">Sao Tome and Principe</a></td>
+<td>678</td>
+<td>STP</td>
+<td id="ST">ST</td>
+<td><a href="/wiki/ISO_3166-2:ST" title="ISO 3166-2:ST">ISO 3166-2:ST</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="image" title="Flag of Saudi Arabia"></a>&nbsp;<a href="/wiki/Saudi_Arabia" title="Saudi Arabia">Saudi Arabia</a></td>
+<td>682</td>
+<td>SAU</td>
+<td id="SA">SA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SA&amp;action=edit" class="new" title="ISO 3166-2:SA">ISO 3166-2:SA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Senegal.svg" class="image" title="Flag of Senegal"></a>&nbsp;<a href="/wiki/Senegal" title="Senegal">Senegal</a></td>
+<td>686</td>
+
+<td>SEN</td>
+<td id="SN">SN</td>
+<td><a href="/wiki/ISO_3166-2:SN" title="ISO 3166-2:SN">ISO 3166-2:SN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Serbia.svg" class="image" title="Flag of Serbia"></a>&nbsp;<a href="/wiki/Serbia" title="Serbia">Serbia</a></td>
+<td>688</td>
+<td>SRB</td>
+<td id="RS">RS</td>
+<td><a href="/wiki/ISO_3166-2:RS" title="ISO 3166-2:RS">ISO 3166-2:RS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Seychelles.svg" class="image" title="Flag of the Seychelles"></a>&nbsp;<a href="/wiki/Seychelles" title="Seychelles">Seychelles</a></td>
+<td>690</td>
+<td>SYC</td>
+<td id="SC">SC</td>
+<td><a href="/wiki/ISO_3166-2:SC" title="ISO 3166-2:SC">ISO 3166-2:SC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sierra_Leone.svg" class="image" title="Flag of Sierra Leone"></a>&nbsp;<a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a></td>
+<td>694</td>
+
+<td>SLE</td>
+<td id="SL">SL</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SL&amp;action=edit" class="new" title="ISO 3166-2:SL">ISO 3166-2:SL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Singapore.svg" class="image" title="Flag of Singapore"></a>&nbsp;<a href="/wiki/Singapore" title="Singapore">Singapore</a></td>
+<td>702</td>
+<td>SGP</td>
+<td id="SG">SG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SG&amp;action=edit" class="new" title="ISO 3166-2:SG">ISO 3166-2:SG</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Slovakia.svg" class="image" title="Flag of Slovakia"></a>&nbsp;<a href="/wiki/Slovakia" title="Slovakia">Slovakia</a></td>
+<td>703</td>
+<td>SVK</td>
+<td id="SK">SK</td>
+<td><a href="/wiki/ISO_3166-2:SK" title="ISO 3166-2:SK">ISO 3166-2:SK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Slovenia.svg" class="image" title="Flag of Slovenia"></a>&nbsp;<a href="/wiki/Slovenia" title="Slovenia">Slovenia</a></td>
+<td>705</td>
+
+<td>SVN</td>
+<td id="SI">SI</td>
+<td><a href="/wiki/ISO_3166-2:SI" title="ISO 3166-2:SI">ISO 3166-2:SI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="image" title="Flag of the Solomon Islands"></a>&nbsp;<a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a></td>
+<td>090</td>
+<td>SLB</td>
+<td id="SB">SB</td>
+<td><a href="/wiki/ISO_3166-2:SB" title="ISO 3166-2:SB">ISO 3166-2:SB</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Somalia.svg" class="image" title="Flag of Somalia"></a>&nbsp;<a href="/wiki/Somalia" title="Somalia">Somalia</a></td>
+<td>706</td>
+<td>SOM</td>
+<td id="SO">SO</td>
+<td><a href="/wiki/ISO_3166-2:SO" title="ISO 3166-2:SO">ISO 3166-2:SO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Africa.svg" class="image" title="Flag of South Africa"></a>&nbsp;<a href="/wiki/South_Africa" title="South Africa">South Africa</a></td>
+<td>710</td>
+
+<td>ZAF</td>
+<td id="ZA">ZA</td>
+<td><a href="/wiki/ISO_3166-2:ZA" title="ISO 3166-2:ZA">ISO 3166-2:ZA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="image" title="Flag of South Georgia and the South Sandwich Islands"></a>&nbsp;<a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></td>
+<td>239</td>
+<td>SGS</td>
+<td id="GS">GS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GS&amp;action=edit" class="new" title="ISO 3166-2:GS">ISO 3166-2:GS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Spain.svg" class="image" title="Flag of Spain"></a>&nbsp;<a href="/wiki/Spain" title="Spain">Spain</a></td>
+<td>724</td>
+<td>ESP</td>
+<td id="ES">ES</td>
+<td><a href="/wiki/ISO_3166-2:ES" title="ISO 3166-2:ES">ISO 3166-2:ES</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sri_Lanka.svg" class="image" title="Flag of Sri Lanka"></a>&nbsp;<a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a></td>
+<td>144</td>
+
+<td>LKA</td>
+<td id="LK">LK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LK&amp;action=edit" class="new" title="ISO 3166-2:LK">ISO 3166-2:LK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sudan.svg" class="image" title="Flag of Sudan"></a>&nbsp;<a href="/wiki/Sudan" title="Sudan">Sudan</a></td>
+<td>736</td>
+<td>SDN</td>
+<td id="SD">SD</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SD&amp;action=edit" class="new" title="ISO 3166-2:SD">ISO 3166-2:SD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Suriname.svg" class="image" title="Flag of Suriname"></a>&nbsp;<a href="/wiki/Suriname" title="Suriname">Suriname</a></td>
+<td>740</td>
+<td>SUR</td>
+<td id="SR">SR</td>
+<td><a href="/wiki/ISO_3166-2:SR" title="ISO 3166-2:SR">ISO 3166-2:SR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Svalbard and Jan Mayen"></a>&nbsp;<a href="/wiki/Svalbard_and_Jan_Mayen" title="Svalbard and Jan Mayen">Svalbard and Jan Mayen</a></td>
+<td>744</td>
+
+<td>SJM</td>
+<td id="SJ">SJ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SJ&amp;action=edit" class="new" title="ISO 3166-2:SJ">ISO 3166-2:SJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Swaziland.svg" class="image" title="Flag of Swaziland"></a>&nbsp;<a href="/wiki/Swaziland" title="Swaziland">Swaziland</a></td>
+<td>748</td>
+<td>SWZ</td>
+<td id="SZ">SZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SZ&amp;action=edit" class="new" title="ISO 3166-2:SZ">ISO 3166-2:SZ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sweden.svg" class="image" title="Flag of Sweden"></a>&nbsp;<a href="/wiki/Sweden" title="Sweden">Sweden</a></td>
+<td>752</td>
+<td>SWE</td>
+<td id="SE">SE</td>
+<td><a href="/wiki/ISO_3166-2:SE" title="ISO 3166-2:SE">ISO 3166-2:SE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Switzerland.svg" class="image" title="Flag of Switzerland"></a>&nbsp;<a href="/wiki/Switzerland" title="Switzerland">Switzerland</a></td>
+<td>756</td>
+
+<td>CHE</td>
+<td id="CH">CH</td>
+<td><a href="/wiki/ISO_3166-2:CH" title="ISO 3166-2:CH">ISO 3166-2:CH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Syria.svg" class="image" title="Flag of Syria"></a>&nbsp;<a href="/wiki/Syria" title="Syria">Syrian Arab Republic</a></td>
+<td>760</td>
+<td>SYR</td>
+<td id="SY">SY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SY&amp;action=edit" class="new" title="ISO 3166-2:SY">ISO 3166-2:SY</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="image" title="Flag of the Republic of China"></a>&nbsp;<a href="/wiki/Republic_of_China" title="Republic of China">Taiwan, Province of China</a></td>
+<td>158</td>
+<td>TWN</td>
+<td id="TW">TW</td>
+<td><a href="/wiki/ISO_3166-2:TW" title="ISO 3166-2:TW">ISO 3166-2:TW</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Tajikistan.svg" class="image" title="Flag of Tajikistan"></a>&nbsp;<a href="/wiki/Tajikistan" title="Tajikistan">Tajikistan</a></td>
+<td>762</td>
+<td>TJK</td>
+<td id="TJ">TJ</td>
+<td><a href="/wiki/ISO_3166-2:TJ" title="ISO 3166-2:TJ">ISO 3166-2:TJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tanzania.svg" class="image" title="Flag of Tanzania"></a>&nbsp;<a href="/wiki/Tanzania" title="Tanzania">Tanzania, United Republic of</a></td>
+<td>834</td>
+<td>TZA</td>
+
+<td id="TZ">TZ</td>
+<td><a href="/wiki/ISO_3166-2:TZ" title="ISO 3166-2:TZ">ISO 3166-2:TZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Thailand.svg" class="image" title="Flag of Thailand"></a>&nbsp;<a href="/wiki/Thailand" title="Thailand">Thailand</a></td>
+<td>764</td>
+<td>THA</td>
+<td id="TH">TH</td>
+<td><a href="/wiki/ISO_3166-2:TH" title="ISO 3166-2:TH">ISO 3166-2:TH</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_East_Timor.svg" class="image" title="Flag of East Timor"></a>&nbsp;<a href="/wiki/East_Timor" title="East Timor">Timor-Leste</a></td>
+<td>626</td>
+<td>TLS</td>
+<td id="TL">TL</td>
+<td><a href="/wiki/ISO_3166-2:TL" title="ISO 3166-2:TL">ISO 3166-2:TL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Togo.svg" class="image" title="Flag of Togo"></a>&nbsp;<a href="/wiki/Togo" title="Togo">Togo</a></td>
+<td>768</td>
+
+<td>TGO</td>
+<td id="TG">TG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TG&amp;action=edit" class="new" title="ISO 3166-2:TG">ISO 3166-2:TG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of Tokelau"></a>&nbsp;<a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></td>
+<td>772</td>
+<td>TKL</td>
+<td id="TK">TK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TK&amp;action=edit" class="new" title="ISO 3166-2:TK">ISO 3166-2:TK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tonga.svg" class="image" title="Flag of Tonga"></a>&nbsp;<a href="/wiki/Tonga" title="Tonga">Tonga</a></td>
+<td>776</td>
+<td>TON</td>
+<td id="TO">TO</td>
+<td><a href="/wiki/ISO_3166-2:TO" title="ISO 3166-2:TO">ISO 3166-2:TO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="image" title="Flag of Trinidad and Tobago"></a>&nbsp;<a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a></td>
+<td>780</td>
+
+<td>TTO</td>
+<td id="TT">TT</td>
+<td><a href="/wiki/ISO_3166-2:TT" title="ISO 3166-2:TT">ISO 3166-2:TT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tunisia.svg" class="image" title="Flag of Tunisia"></a>&nbsp;<a href="/wiki/Tunisia" title="Tunisia">Tunisia</a></td>
+<td>788</td>
+<td>TUN</td>
+<td id="TN">TN</td>
+<td><a href="/wiki/ISO_3166-2:TN" title="ISO 3166-2:TN">ISO 3166-2:TN</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Turkey.svg" class="image" title="Flag of Turkey"></a>&nbsp;<a href="/wiki/Turkey" title="Turkey">Turkey</a></td>
+<td>792</td>
+<td>TUR</td>
+<td id="TR">TR</td>
+<td><a href="/wiki/ISO_3166-2:TR" title="ISO 3166-2:TR">ISO 3166-2:TR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Turkmenistan.svg" class="image" title="Flag of Turkmenistan"></a>&nbsp;<a href="/wiki/Turkmenistan" title="Turkmenistan">Turkmenistan</a></td>
+<td>795</td>
+
+<td>TKM</td>
+<td id="TM">TM</td>
+<td><a href="/wiki/ISO_3166-2:TM" title="ISO 3166-2:TM">ISO 3166-2:TM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="image" title="Flag of the Turks and Caicos Islands"></a>&nbsp;<a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></td>
+<td>796</td>
+<td>TCA</td>
+<td id="TC">TC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TC&amp;action=edit" class="new" title="ISO 3166-2:TC">ISO 3166-2:TC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tuvalu.svg" class="image" title="Flag of Tuvalu"></a>&nbsp;<a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a></td>
+<td>798</td>
+<td>TUV</td>
+<td id="TV">TV</td>
+<td><a href="/wiki/ISO_3166-2:TV" title="ISO 3166-2:TV">ISO 3166-2:TV</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Uganda.svg" class="image" title="Flag of Uganda"></a>&nbsp;<a href="/wiki/Uganda" title="Uganda">Uganda</a></td>
+<td>800</td>
+<td>UGA</td>
+<td id="UG">UG</td>
+<td><a href="/wiki/ISO_3166-2:UG" title="ISO 3166-2:UG">ISO 3166-2:UG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ukraine.svg" class="image" title="Flag of Ukraine"></a>&nbsp;<a href="/wiki/Ukraine" title="Ukraine">Ukraine</a></td>
+<td>804</td>
+<td>UKR</td>
+
+<td id="UA">UA</td>
+<td><a href="/wiki/ISO_3166-2:UA" title="ISO 3166-2:UA">ISO 3166-2:UA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="image" title="Flag of the United Arab Emirates"></a>&nbsp;<a href="/wiki/United_Arab_Emirates" title="United Arab Emirates">United Arab Emirates</a></td>
+<td>784</td>
+<td>ARE</td>
+<td id="AE">AE</td>
+<td><a href="/wiki/ISO_3166-2:AE" title="ISO 3166-2:AE">ISO 3166-2:AE</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="image" title="Flag of the United Kingdom"></a>&nbsp;<a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a></td>
+<td>826</td>
+<td>GBR</td>
+<td id="GB">GB</td>
+<td><a href="/wiki/ISO_3166-2:GB" title="ISO 3166-2:GB">ISO 3166-2:GB</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a>&nbsp;<a href="/wiki/United_States" title="United States">United States</a></td>
+<td>840</td>
+
+<td>USA</td>
+<td id="US">US</td>
+<td><a href="/wiki/ISO_3166-2:US" title="ISO 3166-2:US">ISO 3166-2:US</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of United States Minor Outlying Islands"></a>&nbsp;<a href="/wiki/United_States_Minor_Outlying_Islands" title="United States Minor Outlying Islands">United States Minor Outlying Islands</a></td>
+<td>581</td>
+<td>UMI</td>
+<td id="UM">UM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:UM&amp;action=edit" class="new" title="ISO 3166-2:UM">ISO 3166-2:UM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Uruguay.svg" class="image" title="Flag of Uruguay"></a>&nbsp;<a href="/wiki/Uruguay" title="Uruguay">Uruguay</a></td>
+<td>858</td>
+<td>URY</td>
+<td id="UY">UY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:UY&amp;action=edit" class="new" title="ISO 3166-2:UY">ISO 3166-2:UY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Uzbekistan.svg" class="image" title="Flag of Uzbekistan"></a>&nbsp;<a href="/wiki/Uzbekistan" title="Uzbekistan">Uzbekistan</a></td>
+<td>860</td>
+
+<td>UZB</td>
+<td id="UZ">UZ</td>
+<td><a href="/wiki/ISO_3166-2:UZ" title="ISO 3166-2:UZ">ISO 3166-2:UZ</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Vanuatu.svg" class="image" title="Flag of Vanuatu"></a>&nbsp;<a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a></td>
+<td>548</td>
+<td>VUT</td>
+
+<td id="VU">VU</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VU&amp;action=edit" class="new" title="ISO 3166-2:VU">ISO 3166-2:VU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Venezuela.svg" class="image" title="Flag of Venezuela"></a>&nbsp;<a href="/wiki/Venezuela" title="Venezuela">Venezuela</a></td>
+<td>862</td>
+<td>VEN</td>
+<td id="VE">VE</td>
+<td><a href="/wiki/ISO_3166-2:VE" title="ISO 3166-2:VE">ISO 3166-2:VE</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Vietnam.svg" class="image" title="Flag of Vietnam"></a>&nbsp;<a href="/wiki/Vietnam" title="Vietnam">Viet Nam</a></td>
+<td>704</td>
+<td>VNM</td>
+<td id="VN">VN</td>
+<td><a href="/wiki/ISO_3166-2:VN" title="ISO 3166-2:VN">ISO 3166-2:VN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="image" title="Flag of the British Virgin Islands"></a>&nbsp;<a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">Virgin Islands, British</a></td>
+<td>092</td>
+
+<td>VGB</td>
+<td id="VG">VG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VG&amp;action=edit" class="new" title="ISO 3166-2:VG">ISO 3166-2:VG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="image" title="Flag of the United States Virgin Islands"></a>&nbsp;<a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">Virgin Islands, U.S.</a></td>
+<td>850</td>
+<td>VIR</td>
+<td id="VI">VI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VI&amp;action=edit" class="new" title="ISO 3166-2:VI">ISO 3166-2:VI</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Wallis and Futuna"></a>&nbsp;<a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a></td>
+<td>876</td>
+<td>WLF</td>
+<td id="WF">WF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:WF&amp;action=edit" class="new" title="ISO 3166-2:WF">ISO 3166-2:WF</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Western_Sahara.svg" class="image" title="Flag of Western Sahara"></a>&nbsp;<a href="/wiki/Western_Sahara" title="Western Sahara">Western Sahara</a></td>
+<td>732</td>
+<td>ESH</td>
+<td id="EH">EH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:EH&amp;action=edit" class="new" title="ISO 3166-2:EH">ISO 3166-2:EH</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Yemen.svg" class="image" title="Flag of Yemen"></a>&nbsp;<a href="/wiki/Yemen" title="Yemen">Yemen</a></td>
+
+<td>887</td>
+<td>YEM</td>
+<td id="YE">YE</td>
+<td><a href="/wiki/ISO_3166-2:YE" title="ISO 3166-2:YE">ISO 3166-2:YE</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Zambia.svg" class="image" title="Flag of Zambia"></a>&nbsp;<a href="/wiki/Zambia" title="Zambia">Zambia</a></td>
+<td>894</td>
+
+<td>ZMB</td>
+<td id="ZM">ZM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:ZM&amp;action=edit" class="new" title="ISO 3166-2:ZM">ISO 3166-2:ZM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Zimbabwe.svg" class="image" title="Flag of Zimbabwe"></a>&nbsp;<a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a></td>
+<td>716</td>
+<td>ZWE</td>
+<td id="ZW">ZW</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:ZW&amp;action=edit" class="new" title="ISO 3166-2:ZW">ISO 3166-2:ZW</a></td>
+</tr>
+
+</tbody>
+</table>
+
+
+<h1>Country Continent Mapping</h1>
+<p>abstracted from <a href="http://en.wikipedia.org/wiki/List_of_countries_by_continent";>wikipedia continent country page</a></p>
+<table id="continents">
+<!-- Africa -->
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Algeria.svg" class="image" title="Flag of Algeria"></a>&nbsp;<a href="/wiki/Algeria" title="Algeria">Algeria</a></b> – <a href="/wiki/Algiers" title="Algiers">Algiers</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Angola.svg" class="image" title="Flag of Angola"></a>&nbsp;<a href="/wiki/Angola" title="Angola">Angola</a></b> – <a href="/wiki/Luanda" title="Luanda">Luanda</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Benin.svg" class="image" title="Flag of Benin"></a>&nbsp;<a href="/wiki/Benin" title="Benin">Benin</a></b> – <a href="/wiki/Porto-Novo" title="Porto-Novo">Porto-Novo</a> (seat of government at <a href="/wiki/Cotonou" title="Cotonou">Cotonou</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Botswana.svg" class="image" title="Flag of Botswana"></a>&nbsp;<a href="/wiki/Botswana" title="Botswana">Botswana</a></b> – <a href="/wiki/Gaborone" title="Gaborone">Gaborone</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Burkina_Faso.svg" class="image" title="Flag of Burkina Faso"></a>&nbsp;<a href="/wiki/Burkina_Faso" title="Burkina Faso">Burkina Faso</a></b> – <a href="/wiki/Ouagadougou" title="Ouagadougou">Ouagadougou</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Burundi.svg" class="image" title="Flag of Burundi"></a>&nbsp;<a href="/wiki/Burundi" title="Burundi">Burundi</a></b> – <a href="/wiki/Bujumbura" title="Bujumbura">Bujumbura</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cameroon.svg" class="image" title="Flag of Cameroon"></a>&nbsp;<a href="/wiki/Cameroon" title="Cameroon">Cameroon</a></b> – <a href="/wiki/Yaound%C3%A9" title="Yaoundé">Yaoundé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cape_Verde.svg" class="image" title="Flag of Cape Verde"></a>&nbsp;<a href="/wiki/Cape_Verde" title="Cape Verde">Cape Verde</a></b> – <a href="/wiki/Praia" title="Praia">Praia</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="image" title="Flag of the Central African Republic"></a>&nbsp;<a href="/wiki/Central_African_Republic" title="Central African Republic">Central African Republic</a></b> – <a href="/wiki/Bangui" title="Bangui">Bangui</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Chad.svg" class="image" title="Flag of Chad"></a>&nbsp;<a href="/wiki/Chad" title="Chad">Chad</a></b> – <a href="/wiki/N%27Djamena" title="N'Djamena">N'Djamena</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Comoros.svg" class="image" title="Flag of the Comoros"></a>&nbsp;<a href="/wiki/Comoros" title="Comoros">Comoros</a></b> – <a href="/wiki/Moroni%2C_Comoros" title="Moroni, Comoros">Moroni</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="image" title="Flag of the Democratic Republic of the Congo"></a>&nbsp;<a href="/wiki/Democratic_Republic_of_the_Congo" title="Democratic Republic of the Congo">Congo, Democratic Republic of</a></b> (also known as <b>Congo-Kinshasa</b>, formerly known as <b>Zaire</b>) – <a href="/wiki/Kinshasa" title="Kinshasa">Kinshasa</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="image" title="Flag of the Republic of the Congo"></a>&nbsp;<a href="/wiki/Republic_of_the_Congo" title="Republic of the Congo">Congo, Republic of</a></b> (also known as <b>Congo-Brazzaville</b>) – <a href="/wiki/Brazzaville" title="Brazzaville">Brazzaville</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="image" title="Flag of Côte d'Ivoire"></a>&nbsp;<a href="/wiki/C%C3%B4te_d%27Ivoire" title="Côte d'Ivoire">Côte d'Ivoire</a></b> (commonly known as <b>Ivory Coast</b>) – <a href="/wiki/Yamoussoukro" title="Yamoussoukro">Yamoussoukro</a> (seat of government at <a href="/wiki/Abidjan" title="Abidjan">Abidjan</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Djibouti.svg" class="image" title="Flag of Djibouti"></a>&nbsp;<a href="/wiki/Djibouti" title="Djibouti">Djibouti</a></b> – <a href="/wiki/Djibouti%2C_Djibouti" title="Djibouti, Djibouti">Djibouti</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Egypt.svg" class="image" title="Flag of Egypt"></a>&nbsp;<a href="/wiki/Egypt" title="Egypt">Egypt</a></b> – <a href="/wiki/Cairo" title="Cairo">Cairo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="image" title="Flag of Equatorial Guinea"></a>&nbsp;<a href="/wiki/Equatorial_Guinea" title="Equatorial Guinea">Equatorial Guinea</a></b> – <a href="/wiki/Malabo" title="Malabo">Malabo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Eritrea.svg" class="image" title="Flag of Eritrea"></a>&nbsp;<a href="/wiki/Eritrea" title="Eritrea">Eritrea</a></b> – <a href="/wiki/Asmara" title="Asmara">Asmara</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Ethiopia.svg" class="image" title="Flag of Ethiopia"></a>&nbsp;<a href="/wiki/Ethiopia" title="Ethiopia">Ethiopia</a></b> – <a href="/wiki/Addis_Ababa" title="Addis Ababa">Addis Ababa</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Gabon.svg" class="image" title="Flag of Gabon"></a>&nbsp;<a href="/wiki/Gabon" title="Gabon">Gabon</a></b> – <a href="/wiki/Libreville" title="Libreville">Libreville</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_The_Gambia.svg" class="image" title="Flag of The Gambia"></a>&nbsp;<a href="/wiki/The_Gambia" title="The Gambia">Gambia</a></b> – <a href="/wiki/Banjul" title="Banjul">Banjul</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Ghana.svg" class="image" title="Flag of Ghana"></a>&nbsp;<a href="/wiki/Ghana" title="Ghana">Ghana</a></b> – <a href="/wiki/Accra" title="Accra">Accra</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Guinea.svg" class="image" title="Flag of Guinea"></a>&nbsp;<a href="/wiki/Guinea" title="Guinea">Guinea</a></b> – <a href="/wiki/Conakry" title="Conakry">Conakry</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="image" title="Flag of Guinea-Bissau"></a>&nbsp;<a href="/wiki/Guinea-Bissau" title="Guinea-Bissau">Guinea-Bissau</a></b> – <a href="/wiki/Bissau" title="Bissau">Bissau</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Kenya.svg" class="image" title="Flag of Kenya"></a>&nbsp;<a href="/wiki/Kenya" title="Kenya">Kenya</a></b> – <a href="/wiki/Nairobi" title="Nairobi">Nairobi</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Lesotho.svg" class="image" title="Flag of Lesotho"></a>&nbsp;<a href="/wiki/Lesotho" title="Lesotho">Lesotho</a></b> – <a href="/wiki/Maseru" title="Maseru">Maseru</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Liberia.svg" class="image" title="Flag of Liberia"></a>&nbsp;<a href="/wiki/Liberia" title="Liberia">Liberia</a></b> – <a href="/wiki/Monrovia" title="Monrovia">Monrovia</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Libya.svg" class="image" title="Flag of Libya"></a>&nbsp;<a href="/wiki/Libya" title="Libya">Libya</a></b> – <a href="/wiki/Tripoli" title="Tripoli">Tripoli</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Madagascar.svg" class="image" title="Flag of Madagascar"></a>&nbsp;<a href="/wiki/Madagascar" title="Madagascar">Madagascar</a></b> – <a href="/wiki/Antananarivo" title="Antananarivo">Antananarivo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Malawi.svg" class="image" title="Flag of Malawi"></a>&nbsp;<a href="/wiki/Malawi" title="Malawi">Malawi</a></b> – <a href="/wiki/Lilongwe" title="Lilongwe">Lilongwe</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mali.svg" class="image" title="Flag of Mali"></a>&nbsp;<a href="/wiki/Mali" title="Mali">Mali</a></b> – <a href="/wiki/Bamako" title="Bamako">Bamako</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mauritania.svg" class="image" title="Flag of Mauritania"></a>&nbsp;<a href="/wiki/Mauritania" title="Mauritania">Mauritania</a></b> – <a href="/wiki/Nouakchott" title="Nouakchott">Nouakchott</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mauritius.svg" class="image" title="Flag of Mauritius"></a>&nbsp;<a href="/wiki/Mauritius" title="Mauritius">Mauritius</a></b> – <a href="/wiki/Port_Louis" title="Port Louis">Port Louis</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Mayotte"></a>&nbsp;<a href="/wiki/Mayotte" title="Mayotte">Mayotte</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Mamoudzou" title="Mamoudzou">Mamoudzou</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Morocco.svg" class="image" title="Flag of Morocco"></a>&nbsp;<a href="/wiki/Morocco" title="Morocco">Morocco</a></b> – <a href="/wiki/Rabat" title="Rabat">Rabat</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mozambique.svg" class="image" title="Flag of Mozambique"></a>&nbsp;<a href="/wiki/Mozambique" title="Mozambique">Mozambique</a></b> – <a href="/wiki/Maputo" title="Maputo">Maputo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Namibia.svg" class="image" title="Flag of Namibia"></a>&nbsp;<a href="/wiki/Namibia" title="Namibia">Namibia</a></b> – <a href="/wiki/Windhoek" title="Windhoek">Windhoek</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Niger.svg" class="image" title="Flag of Niger"></a>&nbsp;<a href="/wiki/Niger" title="Niger">Niger</a></b> – <a href="/wiki/Niamey" title="Niamey">Niamey</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Nigeria.svg" class="image" title="Flag of Nigeria"></a>&nbsp;<a href="/wiki/Nigeria" title="Nigeria">Nigeria</a></b> – <a href="/wiki/Abuja" title="Abuja">Abuja</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Réunion"></a>&nbsp;<a href="/wiki/R%C3%A9union" title="Réunion">Réunion</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Saint-Denis%2C_R%C3%A9union" title="Saint-Denis, Réunion">Saint-Denis</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Rwanda.svg" class="image" title="Flag of Rwanda"></a>&nbsp;<a href="/wiki/Rwanda" title="Rwanda">Rwanda</a></b> – <a href="/wiki/Kigali" title="Kigali">Kigali</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_Saint_Helena.svg" class="image" title="Flag of Saint Helena"></a>&nbsp;<a href="/wiki/Saint_Helena" title="Saint Helena">Saint Helena</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Jamestown%2C_Saint_Helena" title="Jamestown, Saint Helena">Jamestown</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="image" title="Flag of São Tomé and Príncipe"></a>&nbsp;<a href="/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe" title="São Tomé and Príncipe">Sao Tome and Principe</a></b> – <a href="/wiki/S%C3%A3o_Tom%C3%A9" title="São Tomé">São Tomé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Senegal.svg" class="image" title="Flag of Senegal"></a>&nbsp;<a href="/wiki/Senegal" title="Senegal">Senegal</a></b> – <a href="/wiki/Dakar" title="Dakar">Dakar</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Seychelles.svg" class="image" title="Flag of the Seychelles"></a>&nbsp;<a href="/wiki/Seychelles" title="Seychelles">Seychelles</a></b> – <a href="/wiki/Victoria%2C_Seychelles" title="Victoria, Seychelles">Victoria</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sierra_Leone.svg" class="image" title="Flag of Sierra Leone"></a>&nbsp;<a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a></b> – <a href="/wiki/Freetown" title="Freetown">Freetown</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Somalia.svg" class="image" title="Flag of Somalia"></a>&nbsp;<a href="/wiki/Somalia" title="Somalia">Somalia</a></b> – <a href="/wiki/Mogadishu" title="Mogadishu">Mogadishu</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_South_Africa.svg" class="image" title="Flag of South Africa"></a>&nbsp;<a href="/wiki/South_Africa" title="South Africa">South Africa</a></b> – <a href="/wiki/Pretoria" title="Pretoria">Pretoria</a> (administrative), <a href="/wiki/Cape_Town" title="Cape Town">Cape Town</a> (legislative), <a href="/wiki/Bloemfontein" title="Bloemfontein">Bloemfontein</a> (judicial)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sudan.svg" class="image" title="Flag of Sudan"></a>&nbsp;<a href="/wiki/Sudan" title="Sudan">Sudan</a></b> – <a href="/wiki/Khartoum" title="Khartoum">Khartoum</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Swaziland.svg" class="image" title="Flag of Swaziland"></a>&nbsp;<a href="/wiki/Swaziland" title="Swaziland">Swaziland</a></b> – <a href="/wiki/Mbabane" title="Mbabane">Mbabane</a> (administrative), <a href="/wiki/Lobamba" title="Lobamba">Lobamba</a> (royal and legislative)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Tanzania.svg" class="image" title="Flag of Tanzania"></a>&nbsp;<a href="/wiki/Tanzania" title="Tanzania">Tanzania</a></b> – <a href="/wiki/Dodoma" title="Dodoma">Dodoma</a> (seat of government at <a href="/wiki/Dar_es_Salaam" title="Dar es Salaam">Dar es Salaam</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Togo.svg" class="image" title="Flag of Togo"></a>&nbsp;<a href="/wiki/Togo" title="Togo">Togo</a></b> – <a href="/wiki/Lom%C3%A9" title="Lomé">Lomé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Tunisia.svg" class="image" title="Flag of Tunisia"></a>&nbsp;<a href="/wiki/Tunisia" title="Tunisia">Tunisia</a></b> – <a href="/wiki/Tunis" title="Tunis">Tunis</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Uganda.svg" class="image" title="Flag of Uganda"></a>&nbsp;<a href="/wiki/Uganda" title="Uganda">Uganda</a></b> – <a href="/wiki/Kampala" title="Kampala">Kampala</a></td></tr>
+<tr><td>Africa</td><td><i><b><a href="/wiki/Image:Flag_of_Western_Sahara.svg" class="image" title="Flag of Western Sahara"></a>&nbsp;<a href="/wiki/Western_Sahara" title="Western Sahara">Western Sahara</a></b></i> – <a href="/wiki/El_Aai%C3%BAn" title="El Aaiún">El Aaiún</a> (unofficial)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Zambia.svg" class="image" title="Flag of Zambia"></a>&nbsp;<a href="/wiki/Zambia" title="Zambia">Zambia</a></b> – <a href="/wiki/Lusaka" title="Lusaka">Lusaka</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Zimbabwe.svg" class="image" title="Flag of Zimbabwe"></a>&nbsp;<a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a></b> – <a href="/wiki/Harare" title="Harare">Harare</a></td></tr>
+
+<!-- Eurasia: Asia -->
+
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Afghanistan.svg" class="image" title="Flag of Afghanistan"></a>&nbsp;<a href="/wiki/Afghanistan" title="Afghanistan">Afghanistan</a></b> – <a href="/wiki/Kabul" title="Kabul">Kabul</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Armenia.svg" class="image" title="Flag of Armenia"></a>&nbsp;<a href="/wiki/Armenia" title="Armenia">Armenia</a></b><sup id="_ref-europe_0" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Yerevan" title="Yerevan">Yerevan</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Azerbaijan.svg" class="image" title="Flag of Azerbaijan"></a>&nbsp;<a href="/wiki/Azerbaijan" title="Azerbaijan">Azerbaijan</a></b><sup id="_ref-europe_1" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Baku" title="Baku">Baku</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bahrain.svg" class="image" title="Flag of Bahrain"></a>&nbsp;<a href="/wiki/Bahrain" title="Bahrain">Bahrain</a></b> – <a href="/wiki/Manama" title="Manama">Manama</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bangladesh.svg" class="image" title="Flag of Bangladesh"></a>&nbsp;<a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a></b> – <a href="/wiki/Dhaka" title="Dhaka">Dhaka</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bhutan.svg" class="image" title="Flag of Bhutan"></a>&nbsp;<a href="/wiki/Bhutan" title="Bhutan">Bhutan</a></b> – <a href="/wiki/Thimphu" title="Thimphu">Thimphu</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="image" title="Flag of British Indian Ocean Territory"></a>&nbsp;<a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a></i><sup id="_ref-1" class="reference"><a href="#_note-1" title="">[3]</a></sup> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Brunei.svg" class="image" title="Flag of Brunei"></a>&nbsp;<a href="/wiki/Brunei" title="Brunei">Brunei</a></b> – <a href="/wiki/Bandar_Seri_Begawan" title="Bandar Seri Begawan">Bandar Seri Begawan</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Cambodia.svg" class="image" title="Flag of Cambodia"></a>&nbsp;<a href="/wiki/Cambodia" title="Cambodia">Cambodia</a></b> – <a href="/wiki/Phnom_Penh" title="Phnom Penh">Phnom Penh</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="image" title="Flag of the People's Republic of China"></a>&nbsp;<a href="/wiki/People%27s_Republic_of_China" title="People's Republic of China">China, People's Republic of</a></b> – <a href="/wiki/Beijing" title="Beijing">Beijing</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="image" title="Flag of the Republic of China"></a>&nbsp;<a href="/wiki/Republic_of_China" title="Republic of China">China, Republic of</a></b> (commonly known as <b>Taiwan</b>) – <a href="/wiki/Taipei" title="Taipei">Taipei</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Christmas_Island.svg" class="image" title="Flag of Christmas Island"></a>&nbsp;<a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></i><sup id="_ref-australia_0" class="reference"><a href="#_note-australia" title="">[4]</a></sup> (overseas territory of Australia)</td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of the Cocos (Keeling) Islands"></a>&nbsp;<a href="/wiki/Cocos_%28Keeling%29_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></i><sup id="_ref-australia_1" class="reference"><a href="#_note-australia" title="">[4]</a></sup> (overseas territory of Australia)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Cyprus.svg" class="image" title="Flag of Cyprus"></a>&nbsp;<a href="/wiki/Cyprus" title="Cyprus">Cyprus</a></b><sup id="_ref-europe_2" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Nicosia" title="Nicosia">Nicosia</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Georgia.svg" class="image" title="Flag of Georgia (country)"></a>&nbsp;<a href="/wiki/Georgia_%28country%29" title="Georgia (country)">Georgia</a></b><sup id="_ref-europe_3" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Tbilisi" title="Tbilisi">Tbilisi</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Hong_Kong.svg" class="image" title="Flag of Hong Kong"></a>&nbsp;<a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></i> (<a href="/wiki/Special_administrative_region_%28People%27s_Republic_of_China%29" title="Special administrative region (People's Republic of China)">special administrative region of the People's Republic of China</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_India.svg" class="image" title="Flag of India"></a>&nbsp;<a href="/wiki/India" title="India">India</a></b> – <a href="/wiki/New_Delhi" title="New Delhi">New Delhi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Indonesia.svg" class="image" title="Flag of Indonesia"></a>&nbsp;<a href="/wiki/Indonesia" title="Indonesia">Indonesia</a></b> – <a href="/wiki/Jakarta" title="Jakarta">Jakarta</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Iran.svg" class="image" title="Flag of Iran"></a>&nbsp;<a href="/wiki/Iran" title="Iran">Iran</a></b> – <a href="/wiki/Tehran" title="Tehran">Tehran</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Iraq.svg" class="image" title="Flag of Iraq"></a>&nbsp;<a href="/wiki/Iraq" title="Iraq">Iraq</a></b> – <a href="/wiki/Baghdad" title="Baghdad">Baghdad</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Israel.svg" class="image" title="Flag of Israel"></a>&nbsp;<a href="/wiki/Israel" title="Israel">Israel</a></b> – <a href="/wiki/Jerusalem" title="Jerusalem">Jerusalem</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Japan.svg" class="image" title="Flag of Japan"></a>&nbsp;<a href="/wiki/Japan" title="Japan">Japan</a></b> – <a href="/wiki/Tokyo" title="Tokyo">Tokyo</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Jordan.svg" class="image" title="Flag of Jordan"></a>&nbsp;<a href="/wiki/Jordan" title="Jordan">Jordan</a></b> – <a href="/wiki/Amman" title="Amman">Amman</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kazakhstan.svg" class="image" title="Flag of Kazakhstan"></a>&nbsp;<a href="/wiki/Kazakhstan" title="Kazakhstan">Kazakhstan</a></b> – <a href="/wiki/Astana" title="Astana">Astana</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_North_Korea.svg" class="image" title="Flag of North Korea"></a>&nbsp;<a href="/wiki/North_Korea" title="North Korea">Korea, Democratic People's Republic of</a></b> (commonly known as <b>North Korea</b>) – <a href="/wiki/Pyongyang" title="Pyongyang">Pyongyang</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_South_Korea.svg" class="image" title="Flag of South Korea"></a>&nbsp;<a href="/wiki/South_Korea" title="South Korea">Korea, Republic of</a></b> (commonly known as <b>South Korea</b>) – <a href="/wiki/Seoul" title="Seoul">Seoul</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kuwait.svg" class="image" title="Flag of Kuwait"></a>&nbsp;<a href="/wiki/Kuwait" title="Kuwait">Kuwait</a></b> – <a href="/wiki/Kuwait_City" title="Kuwait City">Kuwait City</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="image" title="Flag of Kyrgyzstan"></a>&nbsp;<a href="/wiki/Kyrgyzstan" title="Kyrgyzstan">Kyrgyzstan</a></b> – <a href="/wiki/Bishkek" title="Bishkek">Bishkek</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Laos.svg" class="image" title="Flag of Laos"></a>&nbsp;<a href="/wiki/Laos" title="Laos">Laos</a></b> – <a href="/wiki/Vientiane" title="Vientiane">Vientiane</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Lebanon.svg" class="image" title="Flag of Lebanon"></a>&nbsp;<a href="/wiki/Lebanon" title="Lebanon">Lebanon</a></b> – <a href="/wiki/Beirut" title="Beirut">Beirut</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Macau.svg" class="image" title="Flag of Macau"></a>&nbsp;<a href="/wiki/Macau" title="Macau">Macau</a></i> (<a href="/wiki/Special_administrative_region_%28People%27s_Republic_of_China%29" title="Special administrative region (People's Republic of China)">special administrative region of the People's Republic of China</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Malaysia.svg" class="image" title="Flag of Malaysia"></a>&nbsp;<a href="/wiki/Malaysia" title="Malaysia">Malaysia</a></b> – <a href="/wiki/Kuala_Lumpur" title="Kuala Lumpur">Kuala Lumpur</a> (seat of government at <a href="/wiki/Putrajaya" title="Putrajaya">Putrajaya</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Maldives.svg" class="image" title="Flag of the Maldives"></a>&nbsp;<a href="/wiki/Maldives" title="Maldives">Maldives</a></b> – <a href="/wiki/Mal%C3%A9" title="Malé">Malé</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Mongolia.svg" class="image" title="Flag of Mongolia"></a>&nbsp;<a href="/wiki/Mongolia" title="Mongolia">Mongolia</a></b> – <a href="/wiki/Ulaanbaatar" title="Ulaanbaatar">Ulaanbaatar</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Myanmar.svg" class="image" title="Flag of Myanmar"></a>&nbsp;<a href="/wiki/Myanmar" title="Myanmar">Myanmar</a></b> (formerly known as <b>Burma</b>) – <a href="/wiki/Naypyidaw" title="Naypyidaw">Naypyidaw</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Nepal.svg" class="image" title="Flag of Nepal"></a>&nbsp;<a href="/wiki/Nepal" title="Nepal">Nepal</a></b> – <a href="/wiki/Kathmandu" title="Kathmandu">Kathmandu</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Oman.svg" class="image" title="Flag of Oman"></a>&nbsp;<a href="/wiki/Oman" title="Oman">Oman</a></b> – <a href="/wiki/Muscat%2C_Oman" title="Muscat, Oman">Muscat</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Pakistan.svg" class="image" title="Flag of Pakistan"></a>&nbsp;<a href="/wiki/Pakistan" title="Pakistan">Pakistan</a></b> – <a href="/wiki/Islamabad" title="Islamabad">Islamabad</a></td></tr>
+<tr><td>Asia</td><td><i><b><a href="/wiki/Image:Flag_of_Palestine.svg" class="image" title="Palestinian flag"></a>&nbsp;<a href="/wiki/Palestinian_territories" title="Palestinian territories">Palestinian territories</a></b></i> (collectively the territories of the <a href="/wiki/West_Bank" title="West Bank">West Bank</a> and the <a href="/wiki/Gaza_Strip" title="Gaza Strip">Gaza Strip</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_Philippines.svg" class="image" title="Flag of the Philippines"></a>&nbsp;<a href="/wiki/Philippines" title="Philippines">Philippines</a></b> – <a href="/wiki/Manila" title="Manila">Manila</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Qatar.svg" class="image" title="Flag of Qatar"></a>&nbsp;<a href="/wiki/Qatar" title="Qatar">Qatar</a></b> – <a href="/wiki/Doha" title="Doha">Doha</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="image" title="Flag of Saudi Arabia"></a>&nbsp;<a href="/wiki/Saudi_Arabia" title="Saudi Arabia">Saudi Arabia</a></b> – <a href="/wiki/Riyadh" title="Riyadh">Riyadh</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Singapore.svg" class="image" title="Flag of Singapore"></a>&nbsp;<a href="/wiki/Singapore" title="Singapore">Singapore</a></b> – Singapore<sup id="_ref-city-state_0" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Sri_Lanka.svg" class="image" title="Flag of Sri Lanka"></a>&nbsp;<a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a></b> – <a href="/wiki/Sri_Jayawardenepura" title="Sri Jayawardenepura">Sri Jayawardenepura</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Syria.svg" class="image" title="Flag of Syria"></a>&nbsp;<a href="/wiki/Syria" title="Syria">Syria</a></b> – <a href="/wiki/Damascus" title="Damascus">Damascus</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Tajikistan.svg" class="image" title="Flag of Tajikistan"></a>&nbsp;<a href="/wiki/Tajikistan" title="Tajikistan">Tajikistan</a></b> – <a href="/wiki/Dushanbe" title="Dushanbe">Dushanbe</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Thailand.svg" class="image" title="Flag of Thailand"></a>&nbsp;<a href="/wiki/Thailand" title="Thailand">Thailand</a></b> – <a href="/wiki/Bangkok" title="Bangkok">Bangkok</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_East_Timor.svg" class="image" title="Flag of East Timor"></a>&nbsp;<a href="/wiki/East_Timor" title="East Timor">Timor-Leste</a></b> (commonly known as <b>East Timor</b>) – <a href="/wiki/Dili" title="Dili">Dili</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Turkey.svg" class="image" title="Flag of Turkey"></a>&nbsp;<a href="/wiki/Turkey" title="Turkey">Turkey</a></b><sup id="_ref-europe_4" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Ankara" title="Ankara">Ankara</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Turkmenistan.svg" class="image" title="Flag of Turkmenistan"></a>&nbsp;<a href="/wiki/Turkmenistan" title="Turkmenistan">Turkmenistan</a></b> – <a href="/wiki/Ashgabat" title="Ashgabat">Ashgabat</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="image" title="Flag of the United Arab Emirates"></a>&nbsp;<a href="/wiki/United_Arab_Emirates" title="United Arab Emirates">United Arab Emirates</a></b> – <a href="/wiki/Abu_Dhabi" title="Abu Dhabi">Abu Dhabi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Uzbekistan.svg" class="image" title="Flag of Uzbekistan"></a>&nbsp;<a href="/wiki/Uzbekistan" title="Uzbekistan">Uzbekistan</a></b> – <a href="/wiki/Tashkent" title="Tashkent">Tashkent</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Vietnam.svg" class="image" title="Flag of Vietnam"></a>&nbsp;<a href="/wiki/Vietnam" title="Vietnam">Vietnam</a></b> – <a href="/wiki/Hanoi" title="Hanoi">Hanoi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Yemen.svg" class="image" title="Flag of Yemen"></a>&nbsp;<a href="/wiki/Yemen" title="Yemen">Yemen</a></b> – <a href="/wiki/Sana%27a" title="Sana'a">Sana'a</a></td></tr>
+
+<!-- Eurasia: Europe -->
+
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Albania.svg" class="image" title="Flag of Albania"></a>&nbsp;<a href="/wiki/Albania" title="Albania">Albania</a></b> – <a href="/wiki/Tirana" title="Tirana">Tirana</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Andorra.svg" class="image" title="Flag of Andorra"></a>&nbsp;<a href="/wiki/Andorra" title="Andorra">Andorra</a></b> – <a href="/wiki/Andorra_la_Vella" title="Andorra la Vella">Andorra la Vella</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Austria.svg" class="image" title="Flag of Austria"></a>&nbsp;<a href="/wiki/Austria" title="Austria">Austria</a></b> – <a href="/wiki/Vienna" title="Vienna">Vienna</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Belarus.svg" class="image" title="Flag of Belarus"></a>&nbsp;<a href="/wiki/Belarus" title="Belarus">Belarus</a></b> – <a href="/wiki/Minsk" title="Minsk">Minsk</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="image" title="Flag of Belgium"></a>&nbsp;<a href="/wiki/Belgium" title="Belgium">Belgium</a></b> – <a href="/wiki/Brussels" title="Brussels">Brussels</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="image" title="Flag of Bosnia and Herzegovina"></a>&nbsp;<a href="/wiki/Bosnia_and_Herzegovina" title="Bosnia and Herzegovina">Bosnia and Herzegovina</a></b> – <a href="/wiki/Sarajevo" title="Sarajevo">Sarajevo</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Bulgaria.svg" class="image" title="Flag of Bulgaria"></a>&nbsp;<a href="/wiki/Bulgaria" title="Bulgaria">Bulgaria</a></b> – <a href="/wiki/Sofia" title="Sofia">Sofia</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Croatia.svg" class="image" title="Flag of Croatia"></a>&nbsp;<a href="/wiki/Croatia" title="Croatia">Croatia</a></b> – <a href="/wiki/Zagreb" title="Zagreb">Zagreb</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="image" title="Flag of the Czech Republic"></a>&nbsp;<a href="/wiki/Czech_Republic" title="Czech Republic">Czech Republic</a></b> – <a href="/wiki/Prague" title="Prague">Prague</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Denmark.svg" class="image" title="Flag of Denmark"></a>&nbsp;<a href="/wiki/Denmark" title="Denmark">Denmark</a></b> – <a href="/wiki/Copenhagen" title="Copenhagen">Copenhagen</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Estonia.svg" class="image" title="Flag of Estonia"></a>&nbsp;<a href="/wiki/Estonia" title="Estonia">Estonia</a></b> – <a href="/wiki/Tallinn" title="Tallinn">Tallinn</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="image" title="Flag of the Faroe Islands"></a>&nbsp;<a href="/wiki/Faroe_Islands" title="Faroe Islands">Faroe Islands</a></i> (overseas territory of Denmark) – <a href="/wiki/T%C3%B3rshavn" title="Tórshavn">Tórshavn</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Finland.svg" class="image" title="Flag of Finland"></a>&nbsp;<a href="/wiki/Finland" title="Finland">Finland</a></b> – <a href="/wiki/Helsinki" title="Helsinki">Helsinki</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"></a>&nbsp;<a href="/wiki/France" title="France">France</a></b> – <a href="/wiki/Paris" title="Paris">Paris</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Germany.svg" class="image" title="Flag of Germany"></a>&nbsp;<a href="/wiki/Germany" title="Germany">Germany</a></b> – <a href="/wiki/Berlin" title="Berlin">Berlin</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Gibraltar.svg" class="image" title="Flag of Gibraltar"></a>&nbsp;<a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – Gibraltar<sup id="_ref-city-state_1" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Greece.svg" class="image" title="Flag of Greece"></a>&nbsp;<a href="/wiki/Greece" title="Greece">Greece</a></b> – <a href="/wiki/Athens" title="Athens">Athens</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Guernsey.svg" class="image" title="Flag of Guernsey"></a>&nbsp;<a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Saint_Peter_Port" title="Saint Peter Port">Saint Peter Port</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Hungary.svg" class="image" title="Flag of Hungary"></a>&nbsp;<a href="/wiki/Hungary" title="Hungary">Hungary</a></b> – <a href="/wiki/Budapest" title="Budapest">Budapest</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Iceland.svg" class="image" title="Flag of Iceland"></a>&nbsp;<a href="/wiki/Iceland" title="Iceland">Iceland</a></b> – <a href="/wiki/Reykjav%C3%ADk" title="Reykjavík">Reykjavík</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Ireland.svg" class="image" title="Flag of Ireland"></a>&nbsp;<a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a></b> – <a href="/wiki/Dublin" title="Dublin">Dublin</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="image" title="Flag of the Isle of Man"></a>&nbsp;<a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Douglas%2C_Isle_of_Man" title="Douglas, Isle of Man">Douglas</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Italy.svg" class="image" title="Flag of Italy"></a>&nbsp;<a href="/wiki/Italy" title="Italy">Italy</a></b> – <a href="/wiki/Rome" title="Rome">Rome</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Jersey.svg" class="image" title="Flag of Jersey"></a>&nbsp;<a href="/wiki/Jersey" title="Jersey">Jersey</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Saint_Helier" title="Saint Helier">Saint Helier</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Latvia.svg" class="image" title="Flag of Latvia"></a>&nbsp;<a href="/wiki/Latvia" title="Latvia">Latvia</a></b> – <a href="/wiki/Riga" title="Riga">Riga</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Liechtenstein.svg" class="image" title="Flag of Liechtenstein"></a>&nbsp;<a href="/wiki/Liechtenstein" title="Liechtenstein">Liechtenstein</a></b> – <a href="/wiki/Vaduz" title="Vaduz">Vaduz</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Lithuania.svg" class="image" title="Flag of Lithuania"></a>&nbsp;<a href="/wiki/Lithuania" title="Lithuania">Lithuania</a></b> – <a href="/wiki/Vilnius" title="Vilnius">Vilnius</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Luxembourg.svg" class="image" title="Flag of Luxembourg"></a>&nbsp;<a href="/wiki/Luxembourg" title="Luxembourg">Luxembourg</a></b> – <a href="/wiki/Luxembourg%2C_Luxembourg" title="Luxembourg, Luxembourg">Luxembourg</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Macedonia.svg" class="image" title="Flag of the Republic of Macedonia"></a>&nbsp;<a href="/wiki/Republic_of_Macedonia" title="Republic of Macedonia">Macedonia</a></b> – <a href="/wiki/Skopje" title="Skopje">Skopje</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Malta.svg" class="image" title="Flag of Malta"></a>&nbsp;<a href="/wiki/Malta" title="Malta">Malta</a></b> – <a href="/wiki/Valletta" title="Valletta">Valletta</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Moldova.svg" class="image" title="Flag of Moldova"></a>&nbsp;<a href="/wiki/Moldova" title="Moldova">Moldova</a></b> – <a href="/wiki/Chi%C5%9Fin%C4%83u" title="Chişinău">Chişinău</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Monaco.svg" class="image" title="Flag of Monaco"></a>&nbsp;<a href="/wiki/Monaco" title="Monaco">Monaco</a></b> – Monaco<sup id="_ref-city-state_2" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Montenegro.svg" class="image" title="Flag of Montenegro"></a>&nbsp;<a href="/wiki/Montenegro" title="Montenegro">Montenegro</a></b> – <a href="/wiki/Podgorica" title="Podgorica">Podgorica</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Netherlands.svg" class="image" title="Flag of the Netherlands"></a>&nbsp;<a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></b> – <a href="/wiki/Amsterdam" title="Amsterdam">Amsterdam</a> (seat of government at <a href="/wiki/The_Hague" title="The Hague">The Hague</a>)</td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Norway"></a>&nbsp;<a href="/wiki/Norway" title="Norway">Norway</a></b> – <a href="/wiki/Oslo" title="Oslo">Oslo</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Poland.svg" class="image" title="Flag of Poland"></a>&nbsp;<a href="/wiki/Poland" title="Poland">Poland</a></b> – <a href="/wiki/Warsaw" title="Warsaw">Warsaw</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Portugal.svg" class="image" title="Flag of Portugal"></a>&nbsp;<a href="/wiki/Portugal" title="Portugal">Portugal</a></b> – <a href="/wiki/Lisbon" title="Lisbon">Lisbon</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Romania.svg" class="image" title="Flag of Romania"></a>&nbsp;<a href="/wiki/Romania" title="Romania">Romania</a></b> – <a href="/wiki/Bucharest" title="Bucharest">Bucharest</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Russia.svg" class="image" title="Flag of Russia"></a>&nbsp;<a href="/wiki/Russia" title="Russia">Russia</a></b><sup id="_ref-2" class="reference"><a href="#_note-2" title="">[6]</a></sup> – <a href="/wiki/Moscow" title="Moscow">Moscow</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_San_Marino.svg" class="image" title="Flag of San Marino"></a>&nbsp;<a href="/wiki/San_Marino" title="San Marino">San Marino</a></b> – <a href="/wiki/San_Marino%2C_San_Marino" title="San Marino, San Marino">San Marino</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Serbia.svg" class="image" title="Flag of Serbia"></a>&nbsp;<a href="/wiki/Serbia" title="Serbia">Serbia</a></b> – <a href="/wiki/Belgrade" title="Belgrade">Belgrade</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Slovakia.svg" class="image" title="Flag of Slovakia"></a>&nbsp;<a href="/wiki/Slovakia" title="Slovakia">Slovakia</a></b> – <a href="/wiki/Bratislava" title="Bratislava">Bratislava</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Slovenia.svg" class="image" title="Flag of Slovenia"></a>&nbsp;<a href="/wiki/Slovenia" title="Slovenia">Slovenia</a></b> – <a href="/wiki/Ljubljana" title="Ljubljana">Ljubljana</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Spain.svg" class="image" title="Flag of Spain"></a>&nbsp;<a href="/wiki/Spain" title="Spain">Spain</a></b> – <a href="/wiki/Madrid" title="Madrid">Madrid</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Sweden.svg" class="image" title="Flag of Sweden"></a>&nbsp;<a href="/wiki/Sweden" title="Sweden">Sweden</a></b> – <a href="/wiki/Stockholm" title="Stockholm">Stockholm</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Switzerland.svg" class="image" title="Flag of Switzerland"></a>&nbsp;<a href="/wiki/Switzerland" title="Switzerland">Switzerland</a></b> – <a href="/wiki/Berne" title="Berne">Berne</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Ukraine.svg" class="image" title="Flag of Ukraine"></a>&nbsp;<a href="/wiki/Ukraine" title="Ukraine">Ukraine</a></b> – <a href="/wiki/Kiev" title="Kiev">Kiev</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="image" title="Flag of the United Kingdom"></a>&nbsp;<a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a></b> – <a href="/wiki/London" title="London">London</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Vatican_City.svg" class="image" title="Flag of the Vatican City"></a>&nbsp;<a href="/wiki/Vatican_City" title="Vatican City">Vatican City</a></b> – Vatican City<sup id="_ref-city-state_3" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+
+<!-- Americas: North_America -->
+
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Anguilla.svg" class="image" title="Flag of Anguilla"></a>&nbsp;<a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/The_Valley%2C_Anguilla" title="The Valley, Anguilla">The Valley</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="image" title="Flag of Antigua and Barbuda"></a>&nbsp;<a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a></b> – <a href="/wiki/Saint_John%27s%2C_Antigua_and_Barbuda" title="Saint John's, Antigua and Barbuda">Saint John's</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Aruba.svg" class="image" title="Flag of Aruba"></a>&nbsp;<a href="/wiki/Aruba" title="Aruba">Aruba</a></i> (overseas country in the <a href="/wiki/Kingdom_of_the_Netherlands" title="Kingdom of the Netherlands">Kingdom of the Netherlands</a>) – <a href="/wiki/Oranjestad%2C_Aruba" title="Oranjestad, Aruba">Oranjestad</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_Bahamas.svg" class="image" title="Flag of the Bahamas"></a>&nbsp;<a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a></b> – <a href="/wiki/Nassau%2C_Bahamas" title="Nassau, Bahamas">Nassau</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Barbados.svg" class="image" title="Flag of Barbados"></a>&nbsp;<a href="/wiki/Barbados" title="Barbados">Barbados</a></b> – <a href="/wiki/Bridgetown" title="Bridgetown">Bridgetown</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Belize.svg" class="image" title="Flag of Belize"></a>&nbsp;<a href="/wiki/Belize" title="Belize">Belize</a></b> – <a href="/wiki/Belmopan" title="Belmopan">Belmopan</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Bermuda.svg" class="image" title="Flag of Bermuda"></a>&nbsp;<a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Hamilton%2C_Bermuda" title="Hamilton, Bermuda">Hamilton</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="image" title="Flag of the British Virgin Islands"></a>&nbsp;<a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">British Virgin Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Road_Town" title="Road Town">Road Town</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Canada.svg" class="image" title="Flag of Canada"></a>&nbsp;<a href="/wiki/Canada" title="Canada">Canada</a></b> – <a href="/wiki/Ottawa" title="Ottawa">Ottawa</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="image" title="Flag of Cayman Islands"></a>&nbsp;<a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/George_Town%2C_Cayman_Islands" title="George Town, Cayman Islands">George Town</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"></a> <a href="/wiki/Clipperton_Island" title="Clipperton Island">Clipperton Island</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>)</td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Costa_Rica.svg" class="image" title="Flag of Costa Rica"></a>&nbsp;<a href="/wiki/Costa_Rica" title="Costa Rica">Costa Rica</a></b> – <a href="/wiki/San_Jos%C3%A9%2C_Costa_Rica" title="San José, Costa Rica">San José</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Cuba.svg" class="image" title="Flag of Cuba"></a>&nbsp;<a href="/wiki/Cuba" title="Cuba">Cuba</a></b> – <a href="/wiki/Havana" title="Havana">Havana</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Dominica.svg" class="image" title="Flag of Dominica"></a>&nbsp;<a href="/wiki/Dominica" title="Dominica">Dominica</a></b> – <a href="/wiki/Roseau" title="Roseau">Roseau</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="image" title="Flag of the Dominican Republic"></a>&nbsp;<a href="/wiki/Dominican_Republic" title="Dominican Republic">Dominican Republic</a></b> – <a href="/wiki/Santo_Domingo" title="Santo Domingo">Santo Domingo</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_El_Salvador.svg" class="image" title="Flag of El Salvador"></a>&nbsp;<a href="/wiki/El_Salvador" title="El Salvador">El Salvador</a></b> – <a href="/wiki/San_Salvador" title="San Salvador">San Salvador</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Greenland.svg" class="image" title="Flag of Greenland"></a>&nbsp;<a href="/wiki/Greenland" title="Greenland">Greenland</a></i> (overseas territory of Denmark) – <a href="/wiki/Nuuk" title="Nuuk">Nuuk</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Grenada.svg" class="image" title="Flag of Grenada"></a>&nbsp;<a href="/wiki/Grenada" title="Grenada">Grenada</a></b> – <a href="/wiki/Saint_George%27s%2C_Grenada" title="Saint George's, Grenada">Saint George's</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Guadeloupe"></a>&nbsp;<a href="/wiki/Guadeloupe" title="Guadeloupe">Guadeloupe</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Basse-Terre" title="Basse-Terre">Basse-Terre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Guatemala.svg" class="image" title="Flag of Guatemala"></a>&nbsp;<a href="/wiki/Guatemala" title="Guatemala">Guatemala</a></b> – <a href="/wiki/Guatemala_City" title="Guatemala City">Guatemala City</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Haiti.svg" class="image" title="Flag of Haiti"></a>&nbsp;<a href="/wiki/Haiti" title="Haiti">Haiti</a></b> – <a href="/wiki/Port-au-Prince" title="Port-au-Prince">Port-au-Prince</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Honduras.svg" class="image" title="Flag of Honduras"></a>&nbsp;<a href="/wiki/Honduras" title="Honduras">Honduras</a></b> – <a href="/wiki/Tegucigalpa" title="Tegucigalpa">Tegucigalpa</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Jamaica.svg" class="image" title="Flag of Jamaica"></a>&nbsp;<a href="/wiki/Jamaica" title="Jamaica">Jamaica</a></b> – <a href="/wiki/Kingston%2C_Jamaica" title="Kingston, Jamaica">Kingston</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Martinique"></a>&nbsp;<a href="/wiki/Martinique" title="Martinique">Martinique</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Fort-de-France" title="Fort-de-France">Fort-de-France</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Mexico.svg" class="image" title="Flag of Mexico"></a>&nbsp;<a href="/wiki/Mexico" title="Mexico">Mexico</a></b> – <a href="/wiki/Mexico_City" title="Mexico City">Mexico City</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Montserrat.svg" class="image" title="Flag of Montserrat"></a>&nbsp;<a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Plymouth%2C_Montserrat" title="Plymouth, Montserrat">Plymouth</a> (seat of government at <a href="/wiki/Brades" title="Brades">Brades</a>)</td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of Navassa Island"></a>&nbsp;<a href="/wiki/Navassa_Island" title="Navassa Island">Navassa Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="image" title="Flag of the Netherlands Antilles"></a>&nbsp;<a href="/wiki/Netherlands_Antilles" title="Netherlands Antilles">Netherlands Antilles</a></i> (overseas country in the <a href="/wiki/Kingdom_of_the_Netherlands" title="Kingdom of the Netherlands">Kingdom of the Netherlands</a>) – <a href="/wiki/Willemstad%2C_Netherlands_Antilles" title="Willemstad, Netherlands Antilles">Willemstad</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Nicaragua.svg" class="image" title="Flag of Nicaragua"></a>&nbsp;<a href="/wiki/Nicaragua" title="Nicaragua">Nicaragua</a></b> – <a href="/wiki/Managua" title="Managua">Managua</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Panama.svg" class="image" title="Flag of Panama"></a>&nbsp;<a href="/wiki/Panama" title="Panama">Panama</a></b> – <a href="/wiki/Panama_City" title="Panama City">Panama City</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Puerto_Rico.svg" class="image" title="Flag of Puerto Rico"></a>&nbsp;<a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/San_Juan%2C_Puerto_Rico" title="San Juan, Puerto Rico">San Juan</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Barthelemy"></a>&nbsp;<a href="/wiki/Saint_Barthelemy" title="Saint Barthelemy">Saint Barthelemy</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Gustavia%2C_Saint_Barthelemy" title="Gustavia, Saint Barthelemy">Gustavia</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="image" title="Flag of Saint Kitts and Nevis"></a>&nbsp;<a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a></b> – <a href="/wiki/Basseterre" title="Basseterre">Basseterre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Lucia.svg" class="image" title="Flag of Saint Lucia"></a>&nbsp;<a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a></b> – <a href="/wiki/Castries" title="Castries">Castries</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Martin (France)"></a>&nbsp;<a href="/wiki/Saint_Martin_%28France%29" title="Saint Martin (France)">Saint Martin</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Marigot%2C_Saint_Martin" title="Marigot, Saint Martin">Marigot</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Pierre and Miquelon"></a>&nbsp;<a href="/wiki/Saint_Pierre_and_Miquelon" title="Saint Pierre and Miquelon">Saint Pierre and Miquelon</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Saint-Pierre%2C_Saint_Pierre_and_Miquelon" title="Saint-Pierre, Saint Pierre and Miquelon">Saint-Pierre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="image" title="Flag of Saint Vincent and the Grenadines"></a>&nbsp;<a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a></b> – <a href="/wiki/Kingstown" title="Kingstown">Kingstown</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="image" title="Flag of Trinidad and Tobago"></a>&nbsp;<a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a></b> – <a href="/wiki/Port_of_Spain" title="Port of Spain">Port of Spain</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="image" title="Flag of the Turks and Caicos Islands"></a>&nbsp;<a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Cockburn_Town" title="Cockburn Town">Cockburn Town</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a>&nbsp;<a href="/wiki/United_States" title="United States">United States</a></b> – <a href="/wiki/Washington%2C_D.C." title="Washington, D.C.">Washington, D.C.</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="image" title="Flag of the United States Virgin Islands"></a>&nbsp;<a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">United States Virgin Islands</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Charlotte_Amalie%2C_United_States_Virgin_Islands" title="Charlotte Amalie, United States Virgin Islands">Charlotte Amalie</a></td></tr>
+
+<!-- Americas: South America -->
+
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Argentina.svg" class="image" title="Flag of Argentina"></a>&nbsp;<a href="/wiki/Argentina" title="Argentina">Argentina</a></b> – <a href="/wiki/Buenos_Aires" title="Buenos Aires">Buenos Aires</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Bolivia.svg" class="image" title="Flag of Bolivia"></a>&nbsp;<a href="/wiki/Bolivia" title="Bolivia">Bolivia</a></b> – <a href="/wiki/Sucre" title="Sucre">Sucre</a> (seat of government at <a href="/wiki/La_Paz" title="La Paz">La Paz</a>)</td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Brazil.svg" class="image" title="Flag of Brazil"></a>&nbsp;<a href="/wiki/Brazil" title="Brazil">Brazil</a></b> – <a href="/wiki/Bras%C3%ADlia" title="Brasília">Brasília</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Chile.svg" class="image" title="Flag of Chile"></a>&nbsp;<a href="/wiki/Chile" title="Chile">Chile</a></b> – <a href="/wiki/Santiago%2C_Chile" title="Santiago, Chile">Santiago</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Colombia.svg" class="image" title="Flag of Colombia"></a>&nbsp;<a href="/wiki/Colombia" title="Colombia">Colombia</a></b> – <a href="/wiki/Bogot%C3%A1" title="Bogotá">Bogotá</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Ecuador.svg" class="image" title="Flag of Ecuador"></a>&nbsp;<a href="/wiki/Ecuador" title="Ecuador">Ecuador</a></b> – <a href="/wiki/Quito" title="Quito">Quito</a></td></tr>
+<tr><td>South America</td><td><i><a href="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="image" title="Flag of the Falkland Islands"></a>&nbsp;<a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Stanley%2C_Falkland_Islands" title="Stanley, Falkland Islands">Stanley</a></td></tr>
+<tr><td>South America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of French Guiana"></a>&nbsp;<a href="/wiki/French_Guiana" title="French Guiana">French Guiana</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Cayenne" title="Cayenne">Cayenne</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Guyana.svg" class="image" title="Flag of Guyana"></a>&nbsp;<a href="/wiki/Guyana" title="Guyana">Guyana</a></b> – <a href="/wiki/Georgetown%2C_Guyana" title="Georgetown, Guyana">Georgetown</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Paraguay.svg" class="image" title="Flag of Paraguay"></a>&nbsp;<a href="/wiki/Paraguay" title="Paraguay">Paraguay</a></b> – <a href="/wiki/Asunci%C3%B3n" title="Asunción">Asunción</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Peru.svg" class="image" title="Flag of Peru"></a>&nbsp;<a href="/wiki/Peru" title="Peru">Peru</a></b> – <a href="/wiki/Lima" title="Lima">Lima</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Suriname.svg" class="image" title="Flag of Suriname"></a>&nbsp;<a href="/wiki/Suriname" title="Suriname">Suriname</a></b> – <a href="/wiki/Paramaribo" title="Paramaribo">Paramaribo</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Uruguay.svg" class="image" title="Flag of Uruguay"></a>&nbsp;<a href="/wiki/Uruguay" title="Uruguay">Uruguay</a></b> – <a href="/wiki/Montevideo" title="Montevideo">Montevideo</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Venezuela.svg" class="image" title="Flag of Venezuela"></a>&nbsp;<a href="/wiki/Venezuela" title="Venezuela">Venezuela</a></b> – <a href="/wiki/Caracas" title="Caracas">Caracas</a></td></tr>
+
+<!-- Americas: Oceania -->
+
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_American_Samoa.svg" class="image" title="Flag of American Samoa"></a>&nbsp;<a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Pago_Pago" title="Pago Pago">Pago Pago</a> (seat of government at <a href="/wiki/Fagatogo" title="Fagatogo">Fagatogo</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Australia"></a>&nbsp;<a href="/wiki/Australia" title="Australia">Australia</a></b> – <a href="/wiki/Canberra" title="Canberra">Canberra</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Baker_Island" title="Baker Island">Baker Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="image" title="Flag of the Cook Islands"></a>&nbsp;<a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></i> (<a href="/wiki/Associated_state" title="Associated state">territory in free association</a> with New Zealand) – <a href="/wiki/Avarua" title="Avarua">Avarua</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Fiji.svg" class="image" title="Flag of Fiji"></a>&nbsp;<a href="/wiki/Fiji" title="Fiji">Fiji</a></b> – <a href="/wiki/Suva" title="Suva">Suva</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_French_Polynesia.svg" class="image" title="Flag of French Polynesia"></a>&nbsp;<a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Papeete" title="Papeete">Papeete</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Guam.svg" class="image" title="Flag of Guam"></a>&nbsp;<a href="/wiki/Guam" title="Guam">Guam</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Hag%C3%A5t%C3%B1a" title="Hagåtña">Hagåtña</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Howland_Island" title="Howland Island">Howland Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Jarvis_Island" title="Jarvis Island">Jarvis Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Johnston_Atoll" title="Johnston Atoll">Johnston Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Kingman_Reef" title="Kingman Reef">Kingman Reef</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Kiribati.svg" class="image" title="Flag of Kiribati"></a>&nbsp;<a href="/wiki/Kiribati" title="Kiribati">Kiribati</a></b> – <a href="/wiki/South_Tarawa" title="South Tarawa">South Tarawa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="image" title="Flag of the Marshall Islands"></a>&nbsp;<a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a></b> – <a href="/wiki/Majuro" title="Majuro">Majuro</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Micronesia.svg" class="image" title="Flag of the Federated States of Micronesia"></a>&nbsp;<a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia</a></b> – <a href="/wiki/Palikir" title="Palikir">Palikir</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Midway_Atoll" title="Midway Atoll">Midway Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Nauru.svg" class="image" title="Flag of Nauru"></a>&nbsp;<a href="/wiki/Nauru" title="Nauru">Nauru</a></b> – no official capital (seat of government at <a href="/wiki/Yaren" title="Yaren">Yaren</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of New Caledonia"></a>&nbsp;<a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Noum%C3%A9a" title="Nouméa">Nouméa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"></a>&nbsp;<a href="/wiki/New_Zealand" title="New Zealand">New Zealand</a></b> – <a href="/wiki/Wellington" title="Wellington">Wellington</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Niue.svg" class="image" title="Flag of Niue"></a>&nbsp;<a href="/wiki/Niue" title="Niue">Niue</a></i> (<a href="/wiki/Associated_state" title="Associated state">territory in free association</a> with New Zealand) – <a href="/wiki/Alofi" title="Alofi">Alofi</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Norfolk_Island.svg" class="image" title="Flag of Norfolk Island"></a>&nbsp;<a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></i> (overseas territory of Australia) – <a href="/wiki/Kingston%2C_Norfolk_Island" title="Kingston, Norfolk Island">Kingston</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="image" title="Flag of the Northern Mariana Islands"></a>&nbsp;<a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Saipan" title="Saipan">Saipan</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Palau.svg" class="image" title="Flag of Palau"></a>&nbsp;<a href="/wiki/Palau" title="Palau">Palau</a></b> – <a href="/wiki/Melekeok" title="Melekeok">Melekeok</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Palmyra_Atoll" title="Palmyra Atoll">Palmyra Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="image" title="Flag of Papua New Guinea"></a>&nbsp;<a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a></b> – <a href="/wiki/Port_Moresby" title="Port Moresby">Port Moresby</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="image" title="Flag of the Pitcairn Islands"></a>&nbsp;<a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Adamstown%2C_Pitcairn_Island" title="Adamstown, Pitcairn Island">Adamstown</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Samoa.svg" class="image" title="Flag of Samoa"></a>&nbsp;<a href="/wiki/Samoa" title="Samoa">Samoa</a></b> – <a href="/wiki/Apia" title="Apia">Apia</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="image" title="Flag of the Solomon Islands"></a>&nbsp;<a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a></b> – <a href="/wiki/Honiara" title="Honiara">Honiara</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of Tokelau"></a>&nbsp;<a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></i> (overseas territory of New Zealand) – no official capital (each atoll has its own administrative centre)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Tonga.svg" class="image" title="Flag of Tonga"></a>&nbsp;<a href="/wiki/Tonga" title="Tonga">Tonga</a></b> – <a href="/wiki/Nuku%27alofa" title="Nuku'alofa">Nuku'alofa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Tuvalu.svg" class="image" title="Flag of Tuvalu"></a>&nbsp;<a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a></b> – <a href="/wiki/Funafuti" title="Funafuti">Funafuti</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Vanuatu.svg" class="image" title="Flag of Vanuatu"></a>&nbsp;<a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a></b> – <a href="/wiki/Port_Vila" title="Port Vila">Port Vila</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Wake_Island" title="Wake Island">Wake Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Wallis and Futuna"></a>&nbsp;<a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Mata-Utu" title="Mata-Utu">Mata-Utu</a></td></tr>
+
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Bouvet Island"></a>&nbsp;<a href="/wiki/Bouvet_Island" title="Bouvet Island">Bouvet Island</a></i> (overseas territory of Norway)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of the French Southern and Antarctic Lands"></a>&nbsp;<a href="/wiki/French_Southern_and_Antarctic_Lands" title="French Southern and Antarctic Lands">French Southern Territories</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Heard Island and McDonald Islands"></a>&nbsp;<a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a></i> (overseas territory of Australia)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="image" title="Flag of South Georgia and the South Sandwich Islands"></a>&nbsp;<a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></i><sup id="_ref-3" class="reference"><a href="#_note-3" title="">[7]</a></sup> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>)</td></tr>
+</table>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/langCountryMap.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/langCountryMap.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/langCountryMap.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"}
+]

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/languages.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/languages.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/languages.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"},
+],
+},
+]

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/languages.sh
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/languages.sh	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/languages.sh	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,18 @@
+echo "["
+for lang in $(ls [a-z][a-z].xml |sed s/.xml//)
+do
+	echo '{ type: "language", iso: "'${lang}'",'
+
+	# countries that use this language
+	echo 'countries: ['
+	ls ${lang}_[A-Z][A-Z].xml | sed -e 's/^.*_/{_reference: "/' -e 's/.xml/"},/'
+	echo '],'
+
+	# name of this language (in this language)
+	grep '<language type="'${lang}'"[ >]' ${lang}.xml |head -1 |sed -e 's/.*<language type=".."[^>]*>/name: "/' -e 's/<\/language>/",/'
+
+	# names of other langauges (in this language)
+	grep '<language type="..">' ${lang}.xml |sed -e 's/.*<language type=//' -e 's/<\/language>/",/' -e 's/>/: "/' -e 's/-->//'
+	echo '},'
+done
+echo "]"

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/sprite.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/sprite.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n/sprite.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,2319 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+	"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<script type="text/javascript" src="../../../dojo/dojo.js"
+		djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script>
+		dojo.require("dijit.layout.ContentPane");
+	</script>
+	<style>
+		img { padding: 0; border: 0; margin: 0; }
+	</style>
+	<script>
+
+		function t(node){ return node.innerText || node.textContent; };
+
+		var languages, langCountryMap, continents, countries;
+
+		function generate(){
+			// Generate country items
+			countries = dojo.query("tr", "source").
+				filter(function(row){ return dojo.query("img", row).length; } ).
+				map(function(row){
+					var iso = t(dojo.query("td", row)[3]),
+						a = dojo.query("td:nth-child(1) a:nth-child(2)", row)[0],
+						name = t(a);
+					var country = {
+						type: "country",
+						iso: iso,
+						name: name,
+						href: "http://en.wikipedia.org/wiki"; + a.href.replace(/.*\/wiki/, "")
+					};
+					return country;
+				});
+
+			// make sprite
+			var sprite = dojo.byId("sprite");
+			dojo.query("img", "source").forEach(function(img, idx, ary){
+				img = img.cloneNode(true);
+				sprite.appendChild(img);
+				if(idx%20==19){
+					sprite.appendChild(document.createElement("br"));
+				}
+			});
+
+			// generate css rules		
+			var css = dojo.byId("css");
+			var val = "";
+			dojo.query("img", "sprite").forEach(function(img, idx, ary){
+				var style=dojo.coords(img);
+				val += [
+					".country" + countries[idx].iso + "Icon {",
+					"	background-position: " + -1*style.l + "px " + -1*style.t + "px;",
+					"	width: " + img.width + "px;",
+					"	height: " + img.height + "px;",
+					"}"].join("\n") + "\n";
+			});
+			css.value = ".countryIcon {\n\tbackground-image: url('flags.png');\n}\n\n" + val;
+		}
+	</script>
+</head>
+<body>
+<h1>Flag Sprite/CSS Generator</h1>
+<button onclick="generate();">generate</button>
+
+<h1>Sprite</h1>
+<div style="border: 1px solid black; padding: 10px;">
+	<div style="position:relative" id="sprite"></div>
+</div>
+
+<h1>CSS</h1>
+<textarea id="css" cols=100 rows=20>push generate to fill in</textarea>
+
+
+<h1>Country names, flags, and ISO code</h1>
+<p>data taken from <a href="http://en.wikipedia.org/wiki/ISO_3166-1";>wikipedia ISO 3166-1 site</a></p>
+<table id="source" style="height: 300px; overflow: auto;">
+<tbody>
+
+<tr>
+<th width="300">Official country names used by the ISO 3166/MA</th>
+<th><a href="/wiki/ISO_3166-1_numeric" title="ISO 3166-1 numeric">Numeric</a></th>
+<th><a href="/wiki/ISO_3166-1_alpha-3" title="ISO 3166-1 alpha-3">Alpha-3</a></th>
+<th><a href="/wiki/ISO_3166-1_alpha-2" title="ISO 3166-1 alpha-2">Alpha-2</a></th>
+<th>Local ISO codes</th>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Afghanistan.svg" class="image" title="Flag of Afghanistan"><img alt="Flag of Afghanistan" longdesc="/wiki/Image:Flag_of_Afghanistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Afghanistan.svg/22px-Flag_of_Afghanistan.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Afghanistan" title="Afghanistan">Afghanistan</a></td>
+<td>004</td>
+
+<td>AFG</td>
+<td id="AF">AF</td>
+<td><a href="/wiki/ISO_3166-2:AF" title="ISO 3166-2:AF">ISO 3166-2:AF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Aaland.svg" class="image" title="Flag of Åland"><img alt="Flag of Åland" longdesc="/wiki/Image:Flag_of_Aaland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Flag_of_Aaland.svg/22px-Flag_of_Aaland.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/%C3%85land" title="Åland">Åland Islands</a></td>
+<td>248</td>
+<td>ALA</td>
+<td id="AX">AX</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AX&amp;action=edit" class="new" title="ISO 3166-2:AX">ISO 3166-2:AX</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Albania.svg" class="image" title="Flag of Albania"><img alt="Flag of Albania" longdesc="/wiki/Image:Flag_of_Albania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Albania.svg/22px-Flag_of_Albania.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Albania" title="Albania">Albania</a></td>
+<td>008</td>
+<td>ALB</td>
+<td id="AL">AL</td>
+<td><a href="/wiki/ISO_3166-2:AL" title="ISO 3166-2:AL">ISO 3166-2:AL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Algeria.svg" class="image" title="Flag of Algeria"><img alt="Flag of Algeria" longdesc="/wiki/Image:Flag_of_Algeria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Algeria.svg/22px-Flag_of_Algeria.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Algeria" title="Algeria">Algeria</a></td>
+<td>012</td>
+
+<td>DZA</td>
+<td id="DZ">DZ</td>
+<td><a href="/wiki/ISO_3166-2:DZ" title="ISO 3166-2:DZ">ISO 3166-2:DZ</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_American_Samoa.svg" class="image" title="Flag of American Samoa"><img alt="Flag of American Samoa" longdesc="/wiki/Image:Flag_of_American_Samoa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_American_Samoa.svg/22px-Flag_of_American_Samoa.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></td>
+<td>016</td>
+<td>ASM</td>
+<td id="AS">AS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AS&amp;action=edit" class="new" title="ISO 3166-2:AS">ISO 3166-2:AS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Andorra.svg" class="image" title="Flag of Andorra"><img alt="Flag of Andorra" longdesc="/wiki/Image:Flag_of_Andorra.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Andorra.svg/22px-Flag_of_Andorra.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Andorra" title="Andorra">Andorra</a></td>
+<td>020</td>
+<td>AND</td>
+<td id="AD">AD</td>
+<td><a href="/wiki/ISO_3166-2:AD" title="ISO 3166-2:AD">ISO 3166-2:AD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Angola.svg" class="image" title="Flag of Angola"><img alt="Flag of Angola" longdesc="/wiki/Image:Flag_of_Angola.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Flag_of_Angola.svg/22px-Flag_of_Angola.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Angola" title="Angola">Angola</a></td>
+<td>024</td>
+
+<td>AGO</td>
+<td id="AO">AO</td>
+<td><a href="/wiki/ISO_3166-2:AO" title="ISO 3166-2:AO">ISO 3166-2:AO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Anguilla.svg" class="image" title="Flag of Anguilla"><img alt="Flag of Anguilla" longdesc="/wiki/Image:Flag_of_Anguilla.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Anguilla.svg/22px-Flag_of_Anguilla.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></td>
+<td>660</td>
+<td>AIA</td>
+<td id="AI">AI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AI&amp;action=edit" class="new" title="ISO 3166-2:AI">ISO 3166-2:AI</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Antarctica.svg" class="image" title="Flag of Antarctica"><img alt="Flag of Antarctica" longdesc="/wiki/Image:Flag_of_Antarctica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Antarctica.svg/22px-Flag_of_Antarctica.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Antarctica" title="Antarctica">Antarctica</a></td>
+<td>010</td>
+<td>ATA</td>
+<td id="AQ">AQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AQ&amp;action=edit" class="new" title="ISO 3166-2:AQ">ISO 3166-2:AQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="image" title="Flag of Antigua and Barbuda"><img alt="Flag of Antigua and Barbuda" longdesc="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Antigua_and_Barbuda.svg/22px-Flag_of_Antigua_and_Barbuda.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a></td>
+<td>028</td>
+
+<td>ATG</td>
+<td id="AG">AG</td>
+<td><a href="/wiki/ISO_3166-2:AG" title="ISO 3166-2:AG">ISO 3166-2:AG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Argentina.svg" class="image" title="Flag of Argentina"><img alt="Flag of Argentina" longdesc="/wiki/Image:Flag_of_Argentina.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Flag_of_Argentina.svg/22px-Flag_of_Argentina.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/Argentina" title="Argentina">Argentina</a></td>
+<td>032</td>
+<td>ARG</td>
+<td id="AR">AR</td>
+<td><a href="/wiki/ISO_3166-2:AR" title="ISO 3166-2:AR">ISO 3166-2:AR</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Armenia.svg" class="image" title="Flag of Armenia"><img alt="Flag of Armenia" longdesc="/wiki/Image:Flag_of_Armenia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Flag_of_Armenia.svg/22px-Flag_of_Armenia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Armenia" title="Armenia">Armenia</a></td>
+<td>051</td>
+<td>ARM</td>
+<td id="AM">AM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AM&amp;action=edit" class="new" title="ISO 3166-2:AM">ISO 3166-2:AM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Aruba.svg" class="image" title="Flag of Aruba"><img alt="Flag of Aruba" longdesc="/wiki/Image:Flag_of_Aruba.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Aruba.svg/22px-Flag_of_Aruba.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Aruba" title="Aruba">Aruba</a></td>
+<td>533</td>
+
+<td>ABW</td>
+<td id="AW">AW</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AW&amp;action=edit" class="new" title="ISO 3166-2:AW">ISO 3166-2:AW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Australia"><img alt="Flag of Australia" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/22px-Flag_of_Australia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Australia" title="Australia">Australia</a></td>
+<td>036</td>
+<td>AUS</td>
+<td id="AU">AU</td>
+<td><a href="/wiki/ISO_3166-2:AU" title="ISO 3166-2:AU">ISO 3166-2:AU</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Austria.svg" class="image" title="Flag of Austria"><img alt="Flag of Austria" longdesc="/wiki/Image:Flag_of_Austria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_Austria.svg/22px-Flag_of_Austria.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Austria" title="Austria">Austria</a></td>
+<td>040</td>
+<td>AUT</td>
+<td id="AT">AT</td>
+<td><a href="/wiki/ISO_3166-2:AT" title="ISO 3166-2:AT">ISO 3166-2:AT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Azerbaijan.svg" class="image" title="Flag of Azerbaijan"><img alt="Flag of Azerbaijan" longdesc="/wiki/Image:Flag_of_Azerbaijan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Azerbaijan.svg/22px-Flag_of_Azerbaijan.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Azerbaijan" title="Azerbaijan">Azerbaijan</a></td>
+<td>031</td>
+
+<td>AZE</td>
+<td id="AZ">AZ</td>
+<td><a href="/wiki/ISO_3166-2:AZ" title="ISO 3166-2:AZ">ISO 3166-2:AZ</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Bahamas.svg" class="image" title="Flag of the Bahamas"><img alt="Flag of the Bahamas" longdesc="/wiki/Image:Flag_of_the_Bahamas.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Flag_of_the_Bahamas.svg/22px-Flag_of_the_Bahamas.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a></td>
+<td>044</td>
+<td>BHS</td>
+
+<td id="BS">BS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BS&amp;action=edit" class="new" title="ISO 3166-2:BS">ISO 3166-2:BS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bahrain.svg" class="image" title="Flag of Bahrain"><img alt="Flag of Bahrain" longdesc="/wiki/Image:Flag_of_Bahrain.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Bahrain.svg/22px-Flag_of_Bahrain.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Bahrain" title="Bahrain">Bahrain</a></td>
+<td>048</td>
+<td>BHR</td>
+<td id="BH">BH</td>
+<td><a href="/wiki/ISO_3166-2:BH" title="ISO 3166-2:BH">ISO 3166-2:BH</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bangladesh.svg" class="image" title="Flag of Bangladesh"><img alt="Flag of Bangladesh" longdesc="/wiki/Image:Flag_of_Bangladesh.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Flag_of_Bangladesh.svg/22px-Flag_of_Bangladesh.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a></td>
+<td>050</td>
+<td>BGD</td>
+<td id="BD">BD</td>
+<td><a href="/wiki/ISO_3166-2:BD" title="ISO 3166-2:BD">ISO 3166-2:BD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Barbados.svg" class="image" title="Flag of Barbados"><img alt="Flag of Barbados" longdesc="/wiki/Image:Flag_of_Barbados.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Flag_of_Barbados.svg/22px-Flag_of_Barbados.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Barbados" title="Barbados">Barbados</a></td>
+<td>052</td>
+
+<td>BRB</td>
+<td id="BB">BB</td>
+<td><a href="/wiki/ISO_3166-2:BB" title="ISO 3166-2:BB">ISO 3166-2:BB</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belarus.svg" class="image" title="Flag of Belarus"><img alt="Flag of Belarus" longdesc="/wiki/Image:Flag_of_Belarus.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Flag_of_Belarus.svg/22px-Flag_of_Belarus.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Belarus" title="Belarus">Belarus</a></td>
+<td>112</td>
+<td>BLR</td>
+<td id="BY">BY</td>
+<td><a href="/wiki/ISO_3166-2:BY" title="ISO 3166-2:BY">ISO 3166-2:BY</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="image" title="Flag of Belgium"><img alt="Flag of Belgium" longdesc="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Belgium_%28civil%29.svg/22px-Flag_of_Belgium_%28civil%29.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Belgium" title="Belgium">Belgium</a></td>
+<td>056</td>
+<td>BEL</td>
+<td id="BE">BE</td>
+<td><a href="/wiki/ISO_3166-2:BE" title="ISO 3166-2:BE">ISO 3166-2:BE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belize.svg" class="image" title="Flag of Belize"><img alt="Flag of Belize" longdesc="/wiki/Image:Flag_of_Belize.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Flag_of_Belize.svg/22px-Flag_of_Belize.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Belize" title="Belize">Belize</a></td>
+<td>084</td>
+
+<td>BLZ</td>
+<td id="BZ">BZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BZ&amp;action=edit" class="new" title="ISO 3166-2:BZ">ISO 3166-2:BZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Benin.svg" class="image" title="Flag of Benin"><img alt="Flag of Benin" longdesc="/wiki/Image:Flag_of_Benin.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Benin.svg/22px-Flag_of_Benin.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Benin" title="Benin">Benin</a></td>
+<td>204</td>
+<td>BEN</td>
+<td id="BJ">BJ</td>
+<td><a href="/wiki/ISO_3166-2:BJ" title="ISO 3166-2:BJ">ISO 3166-2:BJ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bermuda.svg" class="image" title="Flag of Bermuda"><img alt="Flag of Bermuda" longdesc="/wiki/Image:Flag_of_Bermuda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Bermuda.svg/22px-Flag_of_Bermuda.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></td>
+<td>060</td>
+<td>BMU</td>
+<td id="BM">BM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BM&amp;action=edit" class="new" title="ISO 3166-2:BM">ISO 3166-2:BM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bhutan.svg" class="image" title="Flag of Bhutan"><img alt="Flag of Bhutan" longdesc="/wiki/Image:Flag_of_Bhutan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Flag_of_Bhutan.svg/22px-Flag_of_Bhutan.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Bhutan" title="Bhutan">Bhutan</a></td>
+<td>064</td>
+
+<td>BTN</td>
+<td id="BT">BT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BT&amp;action=edit" class="new" title="ISO 3166-2:BT">ISO 3166-2:BT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bolivia.svg" class="image" title="Flag of Bolivia"><img alt="Flag of Bolivia" longdesc="/wiki/Image:Flag_of_Bolivia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Bolivia.svg/22px-Flag_of_Bolivia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Bolivia" title="Bolivia">Bolivia</a></td>
+<td>068</td>
+<td>BOL</td>
+<td id="BO">BO</td>
+<td><a href="/wiki/ISO_3166-2:BO" title="ISO 3166-2:BO">ISO 3166-2:BO</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="image" title="Flag of Bosnia and Herzegovina"><img alt="Flag of Bosnia and Herzegovina" longdesc="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Bosnia_and_Herzegovina.svg/22px-Flag_of_Bosnia_and_Herzegovina.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Bosnia_and_Herzegovina" title="Bosnia and Herzegovina">Bosnia and Herzegovina</a></td>
+<td>070</td>
+<td>BIH</td>
+<td id="BA">BA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BA&amp;action=edit" class="new" title="ISO 3166-2:BA">ISO 3166-2:BA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Botswana.svg" class="image" title="Flag of Botswana"><img alt="Flag of Botswana" longdesc="/wiki/Image:Flag_of_Botswana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Botswana.svg/22px-Flag_of_Botswana.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Botswana" title="Botswana">Botswana</a></td>
+<td>072</td>
+
+<td>BWA</td>
+<td id="BW">BW</td>
+<td><a href="/wiki/ISO_3166-2:BW" title="ISO 3166-2:BW">ISO 3166-2:BW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Bouvet Island"><img alt="Flag of Bouvet Island" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/22px-Flag_of_Norway.svg.png"; height="16" width="22"></a>&nbsp;<a href="/wiki/Bouvet_Island" title="Bouvet Island">Bouvet Island</a></td>
+<td>074</td>
+<td>BVT</td>
+<td id="BV">BV</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BV&amp;action=edit" class="new" title="ISO 3166-2:BV">ISO 3166-2:BV</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Brazil.svg" class="image" title="Flag of Brazil"><img alt="Flag of Brazil" longdesc="/wiki/Image:Flag_of_Brazil.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Brazil.svg/22px-Flag_of_Brazil.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Brazil" title="Brazil">Brazil</a></td>
+<td>076</td>
+<td>BRA</td>
+<td id="BR">BR</td>
+<td><a href="/wiki/ISO_3166-2:BR" title="ISO 3166-2:BR">ISO 3166-2:BR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="image" title="Flag of British Indian Ocean Territory"><img alt="Flag of British Indian Ocean Territory" longdesc="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Flag_of_the_British_Indian_Ocean_Territory.svg/22px-Flag_of_the_British_Indian_Ocean_Territory.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a></td>
+<td>086</td>
+
+<td>IOT</td>
+<td id="IO">IO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:IO&amp;action=edit" class="new" title="ISO 3166-2:IO">ISO 3166-2:IO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Brunei.svg" class="image" title="Flag of Brunei"><img alt="Flag of Brunei" longdesc="/wiki/Image:Flag_of_Brunei.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Brunei.svg/22px-Flag_of_Brunei.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Brunei" title="Brunei">Brunei Darussalam</a></td>
+<td>096</td>
+<td>BRN</td>
+<td id="BN">BN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BN&amp;action=edit" class="new" title="ISO 3166-2:BN">ISO 3166-2:BN</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bulgaria.svg" class="image" title="Flag of Bulgaria"><img alt="Flag of Bulgaria" longdesc="/wiki/Image:Flag_of_Bulgaria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Bulgaria.svg/22px-Flag_of_Bulgaria.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Bulgaria" title="Bulgaria">Bulgaria</a></td>
+<td>100</td>
+<td>BGR</td>
+<td id="BG">BG</td>
+<td><a href="/wiki/ISO_3166-2:BG" title="ISO 3166-2:BG">ISO 3166-2:BG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Burkina_Faso.svg" class="image" title="Flag of Burkina Faso"><img alt="Flag of Burkina Faso" longdesc="/wiki/Image:Flag_of_Burkina_Faso.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Burkina_Faso.svg/22px-Flag_of_Burkina_Faso.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Burkina_Faso" title="Burkina Faso">Burkina Faso</a></td>
+<td>854</td>
+
+<td>BFA</td>
+<td id="BF">BF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BF&amp;action=edit" class="new" title="ISO 3166-2:BF">ISO 3166-2:BF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Burundi.svg" class="image" title="Flag of Burundi"><img alt="Flag of Burundi" longdesc="/wiki/Image:Flag_of_Burundi.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Flag_of_Burundi.svg/22px-Flag_of_Burundi.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Burundi" title="Burundi">Burundi</a></td>
+<td>108</td>
+<td>BDI</td>
+<td id="BI">BI</td>
+<td><a href="/wiki/ISO_3166-2:BI" title="ISO 3166-2:BI">ISO 3166-2:BI</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cambodia.svg" class="image" title="Flag of Cambodia"><img alt="Flag of Cambodia" longdesc="/wiki/Image:Flag_of_Cambodia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_Cambodia.svg/22px-Flag_of_Cambodia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Cambodia" title="Cambodia">Cambodia</a></td>
+<td>116</td>
+<td>KHM</td>
+<td id="KH">KH</td>
+<td><a href="/wiki/ISO_3166-2:KH" title="ISO 3166-2:KH">ISO 3166-2:KH</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Cameroon.svg" class="image" title="Flag of Cameroon"><img alt="Flag of Cameroon" longdesc="/wiki/Image:Flag_of_Cameroon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Cameroon.svg/22px-Flag_of_Cameroon.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Cameroon" title="Cameroon">Cameroon</a></td>
+<td>120</td>
+<td>CMR</td>
+<td id="CM">CM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CM&amp;action=edit" class="new" title="ISO 3166-2:CM">ISO 3166-2:CM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Canada.svg" class="image" title="Flag of Canada"><img alt="Flag of Canada" longdesc="/wiki/Image:Flag_of_Canada.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Flag_of_Canada.svg/22px-Flag_of_Canada.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Canada" title="Canada">Canada</a></td>
+<td>124</td>
+<td>CAN</td>
+
+<td id="CA">CA</td>
+<td><a href="/wiki/ISO_3166-2:CA" title="ISO 3166-2:CA">ISO 3166-2:CA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cape_Verde.svg" class="image" title="Flag of Cape Verde"><img alt="Flag of Cape Verde" longdesc="/wiki/Image:Flag_of_Cape_Verde.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Cape_Verde.svg/22px-Flag_of_Cape_Verde.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Cape_Verde" title="Cape Verde">Cape Verde</a></td>
+<td>132</td>
+<td>CPV</td>
+<td id="CV">CV</td>
+<td><a href="/wiki/ISO_3166-2:CV" title="ISO 3166-2:CV">ISO 3166-2:CV</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="image" title="Flag of Cayman Islands"><img alt="Flag of Cayman Islands" longdesc="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_the_Cayman_Islands.svg/22px-Flag_of_the_Cayman_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></td>
+<td>136</td>
+<td>CYM</td>
+<td id="KY">KY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KY&amp;action=edit" class="new" title="ISO 3166-2:KY">ISO 3166-2:KY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="image" title="Flag of the Central African Republic"><img alt="Flag of the Central African Republic" longdesc="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Central_African_Republic.svg/22px-Flag_of_the_Central_African_Republic.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Central_African_Republic" title="Central African Republic">Central African Republic</a></td>
+<td>140</td>
+
+<td>CAF</td>
+<td id="CF">CF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CF&amp;action=edit" class="new" title="ISO 3166-2:CF">ISO 3166-2:CF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Chad.svg" class="image" title="Flag of Chad"><img alt="Flag of Chad" longdesc="/wiki/Image:Flag_of_Chad.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Flag_of_Chad.svg/22px-Flag_of_Chad.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Chad" title="Chad">Chad</a></td>
+<td>148</td>
+<td>TCD</td>
+<td id="TD">TD</td>
+<td><a href="/wiki/ISO_3166-2:TD" title="ISO 3166-2:TD">ISO 3166-2:TD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Chile.svg" class="image" title="Flag of Chile"><img alt="Flag of Chile" longdesc="/wiki/Image:Flag_of_Chile.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Flag_of_Chile.svg/22px-Flag_of_Chile.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Chile" title="Chile">Chile</a></td>
+<td>152</td>
+<td>CHL</td>
+<td id="CL">CL</td>
+<td><a href="/wiki/ISO_3166-2:CL" title="ISO 3166-2:CL">ISO 3166-2:CL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="image" title="Flag of the People's Republic of China"><img alt="Flag of the People's Republic of China" longdesc="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_the_People%27s_Republic_of_China.svg/22px-Flag_of_the_People%27s_Republic_of_China.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/People%27s_Republic_of_China" title="People's Republic of China">China</a></td>
+<td>156</td>
+
+<td>CHN</td>
+<td id="CN">CN</td>
+<td><a href="/wiki/ISO_3166-2:CN" title="ISO 3166-2:CN">ISO 3166-2:CN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Christmas_Island.svg" class="image" title="Flag of Christmas Island"><img alt="Flag of Christmas Island" longdesc="/wiki/Image:Flag_of_Christmas_Island.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Flag_of_Christmas_Island.svg/22px-Flag_of_Christmas_Island.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></td>
+<td>162</td>
+<td>CXR</td>
+<td id="CX">CX</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CX&amp;action=edit" class="new" title="ISO 3166-2:CX">ISO 3166-2:CX</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of the Cocos (Keeling) Islands"><img alt="Flag of the Cocos (Keeling) Islands" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/22px-Flag_of_Australia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Cocos_%28Keeling%29_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></td>
+<td>166</td>
+<td>CCK</td>
+<td id="CC">CC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CC&amp;action=edit" class="new" title="ISO 3166-2:CC">ISO 3166-2:CC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Colombia.svg" class="image" title="Flag of Colombia"><img alt="Flag of Colombia" longdesc="/wiki/Image:Flag_of_Colombia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Colombia.svg/22px-Flag_of_Colombia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Colombia" title="Colombia">Colombia</a></td>
+<td>170</td>
+
+<td>COL</td>
+<td id="CO">CO</td>
+<td><a href="/wiki/ISO_3166-2:CO" title="ISO 3166-2:CO">ISO 3166-2:CO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Comoros.svg" class="image" title="Flag of the Comoros"><img alt="Flag of the Comoros" longdesc="/wiki/Image:Flag_of_the_Comoros.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Flag_of_the_Comoros.svg/22px-Flag_of_the_Comoros.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Comoros" title="Comoros">Comoros</a></td>
+<td>174</td>
+<td>COM</td>
+<td id="KM">KM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KM&amp;action=edit" class="new" title="ISO 3166-2:KM">ISO 3166-2:KM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="image" title="Flag of the Republic of the Congo"><img alt="Flag of the Republic of the Congo" longdesc="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Republic_of_the_Congo.svg/22px-Flag_of_the_Republic_of_the_Congo.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Republic_of_the_Congo" title="Republic of the Congo">Congo</a></td>
+<td>178</td>
+<td>COG</td>
+<td id="CG">CG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CG&amp;action=edit" class="new" title="ISO 3166-2:CG">ISO 3166-2:CG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="image" title="Flag of the Democratic Republic of the Congo"><img alt="Flag of the Democratic Republic of the Congo" longdesc="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Democratic_Republic_of_the_Congo.svg/22px-Flag_of_the_Democratic_Republic_of_the_Congo.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Democratic_Republic_of_the_Congo" title="Democratic Republic of the Congo">Congo, Democratic Republic of the</a></td>
+<td>180</td>
+
+<td>COD</td>
+<td id="CD">CD</td>
+<td><a href="/wiki/ISO_3166-2:CD" title="ISO 3166-2:CD">ISO 3166-2:CD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="image" title="Flag of the Cook Islands"><img alt="Flag of the Cook Islands" longdesc="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/22px-Flag_of_the_Cook_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></td>
+<td>184</td>
+<td>COK</td>
+<td id="CK">CK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CK&amp;action=edit" class="new" title="ISO 3166-2:CK">ISO 3166-2:CK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Costa_Rica.svg" class="image" title="Flag of Costa Rica"><img alt="Flag of Costa Rica" longdesc="/wiki/Image:Flag_of_Costa_Rica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Flag_of_Costa_Rica.svg/22px-Flag_of_Costa_Rica.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Costa_Rica" title="Costa Rica">Costa Rica</a></td>
+<td>188</td>
+<td>CRI</td>
+<td id="CR">CR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CR&amp;action=edit" class="new" title="ISO 3166-2:CR">ISO 3166-2:CR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="image" title="Flag of Côte d'Ivoire"><img alt="Flag of Côte d'Ivoire" longdesc="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Flag_of_Cote_d%27Ivoire.svg/22px-Flag_of_Cote_d%27Ivoire.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/C%C3%B4te_d%27Ivoire" title="Côte d'Ivoire">Côte d'Ivoire</a></td>
+<td>384</td>
+
+<td>CIV</td>
+<td id="CI">CI</td>
+<td><a href="/wiki/ISO_3166-2:CI" title="ISO 3166-2:CI">ISO 3166-2:CI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Croatia.svg" class="image" title="Flag of Croatia"><img alt="Flag of Croatia" longdesc="/wiki/Image:Flag_of_Croatia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Croatia.svg/22px-Flag_of_Croatia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Croatia" title="Croatia">Croatia</a></td>
+<td>191</td>
+<td>HRV</td>
+<td id="HR">HR</td>
+<td><a href="/wiki/ISO_3166-2:HR" title="ISO 3166-2:HR">ISO 3166-2:HR</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cuba.svg" class="image" title="Flag of Cuba"><img alt="Flag of Cuba" longdesc="/wiki/Image:Flag_of_Cuba.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Flag_of_Cuba.svg/22px-Flag_of_Cuba.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Cuba" title="Cuba">Cuba</a></td>
+<td>192</td>
+<td>CUB</td>
+<td id="CU">CU</td>
+<td><a href="/wiki/ISO_3166-2:CU" title="ISO 3166-2:CU">ISO 3166-2:CU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cyprus.svg" class="image" title="Flag of Cyprus"><img alt="Flag of Cyprus" longdesc="/wiki/Image:Flag_of_Cyprus.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Cyprus.svg/22px-Flag_of_Cyprus.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Cyprus" title="Cyprus">Cyprus</a></td>
+<td>196</td>
+
+<td>CYP</td>
+<td id="CY">CY</td>
+<td><a href="/wiki/ISO_3166-2:CY" title="ISO 3166-2:CY">ISO 3166-2:CY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="image" title="Flag of the Czech Republic"><img alt="Flag of the Czech Republic" longdesc="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_Czech_Republic.svg/22px-Flag_of_the_Czech_Republic.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Czech_Republic" title="Czech Republic">Czech Republic</a></td>
+<td>203</td>
+<td>CZE</td>
+<td id="CZ">CZ</td>
+<td><a href="/wiki/ISO_3166-2:CZ" title="ISO 3166-2:CZ">ISO 3166-2:CZ</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Denmark.svg" class="image" title="Flag of Denmark"><img alt="Flag of Denmark" longdesc="/wiki/Image:Flag_of_Denmark.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Denmark.svg/22px-Flag_of_Denmark.svg.png"; height="17" width="22"></a>&nbsp;<a href="/wiki/Denmark" title="Denmark">Denmark</a></td>
+<td>208</td>
+<td>DNK</td>
+<td id="DK">DK</td>
+<td><a href="/wiki/ISO_3166-2:DK" title="ISO 3166-2:DK">ISO 3166-2:DK</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Djibouti.svg" class="image" title="Flag of Djibouti"><img alt="Flag of Djibouti" longdesc="/wiki/Image:Flag_of_Djibouti.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_Djibouti.svg/22px-Flag_of_Djibouti.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Djibouti" title="Djibouti">Djibouti</a></td>
+<td>262</td>
+<td>DJI</td>
+<td id="DJ">DJ</td>
+<td><a href="/wiki/ISO_3166-2:DJ" title="ISO 3166-2:DJ">ISO 3166-2:DJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Dominica.svg" class="image" title="Flag of Dominica"><img alt="Flag of Dominica" longdesc="/wiki/Image:Flag_of_Dominica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Flag_of_Dominica.svg/22px-Flag_of_Dominica.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Dominica" title="Dominica">Dominica</a></td>
+<td>212</td>
+<td>DMA</td>
+
+<td id="DM">DM</td>
+<td><a href="/wiki/ISO_3166-2:DM" title="ISO 3166-2:DM">ISO 3166-2:DM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="image" title="Flag of the Dominican Republic"><img alt="Flag of the Dominican Republic" longdesc="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_the_Dominican_Republic.svg/22px-Flag_of_the_Dominican_Republic.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/Dominican_Republic" title="Dominican Republic">Dominican Republic</a></td>
+<td>214</td>
+<td>DOM</td>
+<td id="DO">DO</td>
+<td><a href="/wiki/ISO_3166-2:DO" title="ISO 3166-2:DO">ISO 3166-2:DO</a></td>
+</tr>
+
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ecuador.svg" class="image" title="Flag of Ecuador"><img alt="Flag of Ecuador" longdesc="/wiki/Image:Flag_of_Ecuador.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Flag_of_Ecuador.svg/22px-Flag_of_Ecuador.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Ecuador" title="Ecuador">Ecuador</a></td>
+<td>218</td>
+<td>ECU</td>
+<td id="EC">EC</td>
+<td><a href="/wiki/ISO_3166-2:EC" title="ISO 3166-2:EC">ISO 3166-2:EC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Egypt.svg" class="image" title="Flag of Egypt"><img alt="Flag of Egypt" longdesc="/wiki/Image:Flag_of_Egypt.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Egypt.svg/22px-Flag_of_Egypt.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Egypt" title="Egypt">Egypt</a></td>
+
+<td>818</td>
+<td>EGY</td>
+<td id="EG">EG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:EG&amp;action=edit" class="new" title="ISO 3166-2:EG">ISO 3166-2:EG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_El_Salvador.svg" class="image" title="Flag of El Salvador"><img alt="Flag of El Salvador" longdesc="/wiki/Image:Flag_of_El_Salvador.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_El_Salvador.svg/22px-Flag_of_El_Salvador.svg.png"; height="12" width="22"></a>&nbsp;<a href="/wiki/El_Salvador" title="El Salvador">El Salvador</a></td>
+<td>222</td>
+<td>SLV</td>
+<td id="SV">SV</td>
+
+<td><a href="/wiki/ISO_3166-2:SV" title="ISO 3166-2:SV">ISO 3166-2:SV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="image" title="Flag of Equatorial Guinea"><img alt="Flag of Equatorial Guinea" longdesc="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Equatorial_Guinea.svg/22px-Flag_of_Equatorial_Guinea.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Equatorial_Guinea" title="Equatorial Guinea">Equatorial Guinea</a></td>
+<td>226</td>
+<td>GNQ</td>
+<td id="GQ">GQ</td>
+<td><a href="/wiki/ISO_3166-2:GQ" title="ISO 3166-2:GQ">ISO 3166-2:GQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Eritrea.svg" class="image" title="Flag of Eritrea"><img alt="Flag of Eritrea" longdesc="/wiki/Image:Flag_of_Eritrea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Flag_of_Eritrea.svg/22px-Flag_of_Eritrea.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Eritrea" title="Eritrea">Eritrea</a></td>
+
+<td>232</td>
+<td>ERI</td>
+<td id="ER">ER</td>
+<td><a href="/wiki/ISO_3166-2:ER" title="ISO 3166-2:ER">ISO 3166-2:ER</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Estonia.svg" class="image" title="Flag of Estonia"><img alt="Flag of Estonia" longdesc="/wiki/Image:Flag_of_Estonia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Flag_of_Estonia.svg/22px-Flag_of_Estonia.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/Estonia" title="Estonia">Estonia</a></td>
+<td>233</td>
+<td>EST</td>
+<td id="EE">EE</td>
+
+<td><a href="/wiki/ISO_3166-2:EE" title="ISO 3166-2:EE">ISO 3166-2:EE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ethiopia.svg" class="image" title="Flag of Ethiopia"><img alt="Flag of Ethiopia" longdesc="/wiki/Image:Flag_of_Ethiopia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_Ethiopia.svg/22px-Flag_of_Ethiopia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Ethiopia" title="Ethiopia">Ethiopia</a></td>
+<td>231</td>
+<td>ETH</td>
+<td id="ET">ET</td>
+<td><a href="/wiki/ISO_3166-2:ET" title="ISO 3166-2:ET">ISO 3166-2:ET</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="image" title="Flag of the Falkland Islands"><img alt="Flag of the Falkland Islands" longdesc="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_the_Falkland_Islands.svg/22px-Flag_of_the_Falkland_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands (Malvinas)</a></td>
+<td>238</td>
+<td>FLK</td>
+<td id="FK">FK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FK&amp;action=edit" class="new" title="ISO 3166-2:FK">ISO 3166-2:FK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="image" title="Flag of the Faroe Islands"><img alt="Flag of the Faroe Islands" longdesc="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_the_Faroe_Islands.svg/22px-Flag_of_the_Faroe_Islands.svg.png"; height="16" width="22"></a>&nbsp;<a href="/wiki/Faroe_Islands" title="Faroe Islands">Faroe Islands</a></td>
+<td>234</td>
+
+<td>FRO</td>
+<td id="FO">FO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FO&amp;action=edit" class="new" title="ISO 3166-2:FO">ISO 3166-2:FO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Fiji.svg" class="image" title="Flag of Fiji"><img alt="Flag of Fiji" longdesc="/wiki/Image:Flag_of_Fiji.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Fiji.svg/22px-Flag_of_Fiji.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Fiji" title="Fiji">Fiji</a></td>
+<td>242</td>
+<td>FJI</td>
+<td id="FJ">FJ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FJ&amp;action=edit" class="new" title="ISO 3166-2:FJ">ISO 3166-2:FJ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Finland.svg" class="image" title="Flag of Finland"><img alt="Flag of Finland" longdesc="/wiki/Image:Flag_of_Finland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Finland.svg/22px-Flag_of_Finland.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Finland" title="Finland">Finland</a></td>
+<td>246</td>
+<td>FIN</td>
+<td id="FI">FI</td>
+<td><a href="/wiki/ISO_3166-2:FI" title="ISO 3166-2:FI">ISO 3166-2:FI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"><img alt="Flag of France" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/France" title="France">France</a></td>
+<td>250</td>
+
+<td>FRA</td>
+<td id="FR">FR</td>
+<td><a href="/wiki/ISO_3166-2:FR" title="ISO 3166-2:FR">ISO 3166-2:FR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of French Guiana"><img alt="Flag of French Guiana" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/French_Guiana" title="French Guiana">French Guiana</a></td>
+<td>254</td>
+<td>GUF</td>
+<td id="GF">GF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GF&amp;action=edit" class="new" title="ISO 3166-2:GF">ISO 3166-2:GF</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_French_Polynesia.svg" class="image" title="Flag of French Polynesia"><img alt="Flag of French Polynesia" longdesc="/wiki/Image:Flag_of_French_Polynesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Flag_of_French_Polynesia.svg/22px-Flag_of_French_Polynesia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a></td>
+<td>258</td>
+<td>PYF</td>
+<td id="PF">PF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PF&amp;action=edit" class="new" title="ISO 3166-2:PF">ISO 3166-2:PF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of the French Southern and Antarctic Lands"><img alt="Flag of the French Southern and Antarctic Lands" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/French_Southern_and_Antarctic_Lands" title="French Southern and Antarctic Lands">French Southern Territories</a></td>
+<td>260</td>
+
+<td>ATF</td>
+<td id="TF">TF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TF&amp;action=edit" class="new" title="ISO 3166-2:TF">ISO 3166-2:TF</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Gabon.svg" class="image" title="Flag of Gabon"><img alt="Flag of Gabon" longdesc="/wiki/Image:Flag_of_Gabon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Flag_of_Gabon.svg/22px-Flag_of_Gabon.svg.png"; height="17" width="22"></a>&nbsp;<a href="/wiki/Gabon" title="Gabon">Gabon</a></td>
+<td>266</td>
+<td>GAB</td>
+
+<td id="GA">GA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GA&amp;action=edit" class="new" title="ISO 3166-2:GA">ISO 3166-2:GA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_The_Gambia.svg" class="image" title="Flag of The Gambia"><img alt="Flag of The Gambia" longdesc="/wiki/Image:Flag_of_The_Gambia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_The_Gambia.svg/22px-Flag_of_The_Gambia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/The_Gambia" title="The Gambia">Gambia</a></td>
+<td>270</td>
+<td>GMB</td>
+<td id="GM">GM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GM&amp;action=edit" class="new" title="ISO 3166-2:GM">ISO 3166-2:GM</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Georgia.svg" class="image" title="Flag of Georgia (country)"><img alt="Flag of Georgia (country)" longdesc="/wiki/Image:Flag_of_Georgia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Georgia.svg/22px-Flag_of_Georgia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Georgia_%28country%29" title="Georgia (country)">Georgia</a></td>
+<td>268</td>
+<td>GEO</td>
+<td id="GE">GE</td>
+<td><a href="/wiki/ISO_3166-2:GE" title="ISO 3166-2:GE">ISO 3166-2:GE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Germany.svg" class="image" title="Flag of Germany"><img alt="Flag of Germany" longdesc="/wiki/Image:Flag_of_Germany.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Germany.svg/22px-Flag_of_Germany.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Germany" title="Germany">Germany</a></td>
+<td>276</td>
+
+<td>DEU</td>
+<td id="DE">DE</td>
+<td><a href="/wiki/ISO_3166-2:DE" title="ISO 3166-2:DE">ISO 3166-2:DE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ghana.svg" class="image" title="Flag of Ghana"><img alt="Flag of Ghana" longdesc="/wiki/Image:Flag_of_Ghana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Ghana.svg/22px-Flag_of_Ghana.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Ghana" title="Ghana">Ghana</a></td>
+<td>288</td>
+<td>GHA</td>
+<td id="GH">GH</td>
+<td><a href="/wiki/ISO_3166-2:GH" title="ISO 3166-2:GH">ISO 3166-2:GH</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Gibraltar.svg" class="image" title="Flag of Gibraltar"><img alt="Flag of Gibraltar" longdesc="/wiki/Image:Flag_of_Gibraltar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Flag_of_Gibraltar.svg/22px-Flag_of_Gibraltar.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></td>
+<td>292</td>
+<td>GIB</td>
+<td id="GI">GI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GI&amp;action=edit" class="new" title="ISO 3166-2:GI">ISO 3166-2:GI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Greece.svg" class="image" title="Flag of Greece"><img alt="Flag of Greece" longdesc="/wiki/Image:Flag_of_Greece.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Greece.svg/22px-Flag_of_Greece.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Greece" title="Greece">Greece</a></td>
+<td>300</td>
+
+<td>GRC</td>
+<td id="GR">GR</td>
+<td><a href="/wiki/ISO_3166-2:GR" title="ISO 3166-2:GR">ISO 3166-2:GR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Greenland.svg" class="image" title="Flag of Greenland"><img alt="Flag of Greenland" longdesc="/wiki/Image:Flag_of_Greenland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_Greenland.svg/22px-Flag_of_Greenland.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Greenland" title="Greenland">Greenland</a></td>
+<td>304</td>
+<td>GRL</td>
+<td id="GL">GL</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GL&amp;action=edit" class="new" title="ISO 3166-2:GL">ISO 3166-2:GL</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Grenada.svg" class="image" title="Flag of Grenada"><img alt="Flag of Grenada" longdesc="/wiki/Image:Flag_of_Grenada.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Grenada.svg/22px-Flag_of_Grenada.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Grenada" title="Grenada">Grenada</a></td>
+<td>308</td>
+<td>GRD</td>
+<td id="GD">GD</td>
+<td><a href="/wiki/ISO_3166-2:GD" title="ISO 3166-2:GD">ISO 3166-2:GD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Guadeloupe"><img alt="Flag of Guadeloupe" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Guadeloupe" title="Guadeloupe">Guadeloupe</a><span class="reference plainlinksneverexpand" id="ref_COM"><sup><a href="http://en.wikipedia.org/wiki/ISO_3166-1#endnote_COM"; class="external autonumber" title="http://en.wikipedia.org/wiki/ISO_3166-1#endnote_COM"; rel="nofollow">[2]</a></sup></span></td>
+
+<td>312</td>
+<td>GLP</td>
+<td id="GP">GP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GP&amp;action=edit" class="new" title="ISO 3166-2:GP">ISO 3166-2:GP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guam.svg" class="image" title="Flag of Guam"><img alt="Flag of Guam" longdesc="/wiki/Image:Flag_of_Guam.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Flag_of_Guam.svg/22px-Flag_of_Guam.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Guam" title="Guam">Guam</a></td>
+<td>316</td>
+<td>GUM</td>
+<td id="GU">GU</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:GU&amp;action=edit" class="new" title="ISO 3166-2:GU">ISO 3166-2:GU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guatemala.svg" class="image" title="Flag of Guatemala"><img alt="Flag of Guatemala" longdesc="/wiki/Image:Flag_of_Guatemala.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Flag_of_Guatemala.svg/22px-Flag_of_Guatemala.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/Guatemala" title="Guatemala">Guatemala</a></td>
+<td>320</td>
+<td>GTM</td>
+<td id="GT">GT</td>
+<td><a href="/wiki/ISO_3166-2:GT" title="ISO 3166-2:GT">ISO 3166-2:GT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guernsey.svg" class="image" title="Flag of Guernsey"><img alt="Flag of Guernsey" longdesc="/wiki/Image:Flag_of_Guernsey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Guernsey.svg/22px-Flag_of_Guernsey.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></td>
+
+<td>831</td>
+<td>GGY</td>
+<td id="GG">GG</td>
+<td><a href="/wiki/ISO_3166-2:GG" title="ISO 3166-2:GG">ISO 3166-2:GG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guinea.svg" class="image" title="Flag of Guinea"><img alt="Flag of Guinea" longdesc="/wiki/Image:Flag_of_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Guinea.svg/22px-Flag_of_Guinea.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Guinea" title="Guinea">Guinea</a></td>
+<td>324</td>
+<td>GIN</td>
+<td id="GN">GN</td>
+
+<td><a href="/wiki/ISO_3166-2:GN" title="ISO 3166-2:GN">ISO 3166-2:GN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="image" title="Flag of Guinea-Bissau"><img alt="Flag of Guinea-Bissau" longdesc="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Guinea-Bissau.svg/22px-Flag_of_Guinea-Bissau.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Guinea-Bissau" title="Guinea-Bissau">Guinea-Bissau</a></td>
+<td>624</td>
+<td>GNB</td>
+<td id="GW">GW</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GW&amp;action=edit" class="new" title="ISO 3166-2:GW">ISO 3166-2:GW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guyana.svg" class="image" title="Flag of Guyana"><img alt="Flag of Guyana" longdesc="/wiki/Image:Flag_of_Guyana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_Guyana.svg/22px-Flag_of_Guyana.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Guyana" title="Guyana">Guyana</a></td>
+
+<td>328</td>
+<td>GUY</td>
+<td id="GY">GY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GY&amp;action=edit" class="new" title="ISO 3166-2:GY">ISO 3166-2:GY</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Haiti.svg" class="image" title="Flag of Haiti"><img alt="Flag of Haiti" longdesc="/wiki/Image:Flag_of_Haiti.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Haiti.svg/22px-Flag_of_Haiti.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Haiti" title="Haiti">Haiti</a></td>
+<td>332</td>
+
+<td>HTI</td>
+<td id="HT">HT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:HT&amp;action=edit" class="new" title="ISO 3166-2:HT">ISO 3166-2:HT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Heard Island and McDonald Islands"><img alt="Flag of Heard Island and McDonald Islands" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/22px-Flag_of_Australia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a></td>
+<td>334</td>
+<td>HMD</td>
+<td id="HM">HM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:HM&amp;action=edit" class="new" title="ISO 3166-2:HM">ISO 3166-2:HM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Vatican_City.svg" class="image" title="Flag of the Vatican City"><img alt="Flag of the Vatican City" longdesc="/wiki/Image:Flag_of_the_Vatican_City.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_the_Vatican_City.svg/20px-Flag_of_the_Vatican_City.svg.png"; height="20" width="20"></a>&nbsp;<a href="/wiki/Vatican_City" title="Vatican City">Holy See (Vatican City State)</a></td>
+<td>336</td>
+<td>VAT</td>
+<td id="VA">VA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VA&amp;action=edit" class="new" title="ISO 3166-2:VA">ISO 3166-2:VA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Honduras.svg" class="image" title="Flag of Honduras"><img alt="Flag of Honduras" longdesc="/wiki/Image:Flag_of_Honduras.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Flag_of_Honduras.svg/22px-Flag_of_Honduras.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Honduras" title="Honduras">Honduras</a></td>
+<td>340</td>
+
+<td>HND</td>
+<td id="HN">HN</td>
+<td><a href="/wiki/ISO_3166-2:HN" title="ISO 3166-2:HN">ISO 3166-2:HN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Hong_Kong.svg" class="image" title="Flag of Hong Kong"><img alt="Flag of Hong Kong" longdesc="/wiki/Image:Flag_of_Hong_Kong.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Flag_of_Hong_Kong.svg/22px-Flag_of_Hong_Kong.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></td>
+<td>344</td>
+<td>HKG</td>
+<td id="HK">HK</td>
+<td><a href="/wiki/ISO_3166-2:HK" title="ISO 3166-2:HK">ISO 3166-2:HK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Hungary.svg" class="image" title="Flag of Hungary"><img alt="Flag of Hungary" longdesc="/wiki/Image:Flag_of_Hungary.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Flag_of_Hungary.svg/22px-Flag_of_Hungary.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Hungary" title="Hungary">Hungary</a></td>
+<td>348</td>
+<td>HUN</td>
+<td id="HU">HU</td>
+<td><a href="/wiki/ISO_3166-2:HU" title="ISO 3166-2:HU">ISO 3166-2:HU</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Iceland.svg" class="image" title="Flag of Iceland"><img alt="Flag of Iceland" longdesc="/wiki/Image:Flag_of_Iceland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Iceland.svg/22px-Flag_of_Iceland.svg.png"; height="16" width="22"></a>&nbsp;<a href="/wiki/Iceland" title="Iceland">Iceland</a></td>
+<td>352</td>
+<td>ISL</td>
+<td id="IS">IS</td>
+<td><a href="/wiki/ISO_3166-2:IS" title="ISO 3166-2:IS">ISO 3166-2:IS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_India.svg" class="image" title="Flag of India"><img alt="Flag of India" longdesc="/wiki/Image:Flag_of_India.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_India.svg/22px-Flag_of_India.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/India" title="India">India</a></td>
+<td>356</td>
+<td>IND</td>
+
+<td id="IN">IN</td>
+<td><a href="/wiki/ISO_3166-2:IN" title="ISO 3166-2:IN">ISO 3166-2:IN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Indonesia.svg" class="image" title="Flag of Indonesia"><img alt="Flag of Indonesia" longdesc="/wiki/Image:Flag_of_Indonesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Indonesia.svg/22px-Flag_of_Indonesia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Indonesia" title="Indonesia">Indonesia</a></td>
+<td>360</td>
+<td>IDN</td>
+<td id="ID">ID</td>
+<td><a href="/wiki/ISO_3166-2:ID" title="ISO 3166-2:ID">ISO 3166-2:ID</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Iran.svg" class="image" title="Flag of Iran"><img alt="Flag of Iran" longdesc="/wiki/Image:Flag_of_Iran.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Flag_of_Iran.svg/22px-Flag_of_Iran.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Iran" title="Iran">Iran, Islamic Republic of</a></td>
+<td>364</td>
+<td>IRN</td>
+<td id="IR">IR</td>
+<td><a href="/wiki/ISO_3166-2:IR" title="ISO 3166-2:IR">ISO 3166-2:IR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Iraq.svg" class="image" title="Flag of Iraq"><img alt="Flag of Iraq" longdesc="/wiki/Image:Flag_of_Iraq.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Iraq.svg/22px-Flag_of_Iraq.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Iraq" title="Iraq">Iraq</a></td>
+<td>368</td>
+
+<td>IRQ</td>
+<td id="IQ">IQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:IQ&amp;action=edit" class="new" title="ISO 3166-2:IQ">ISO 3166-2:IQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ireland.svg" class="image" title="Flag of Ireland"><img alt="Flag of Ireland" longdesc="/wiki/Image:Flag_of_Ireland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Flag_of_Ireland.svg/22px-Flag_of_Ireland.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a></td>
+<td>372</td>
+<td>IRL</td>
+<td id="IE">IE</td>
+<td><a href="/wiki/ISO_3166-2:IE" title="ISO 3166-2:IE">ISO 3166-2:IE</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="image" title="Flag of the Isle of Man"><img alt="Flag of the Isle of Man" longdesc="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_the_Isle_of_Man.svg/22px-Flag_of_the_Isle_of_Man.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></td>
+<td>833</td>
+<td>IMN</td>
+<td id="IM">IM</td>
+<td><a href="/wiki/ISO_3166-2:IM" title="ISO 3166-2:IM">ISO 3166-2:IM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Israel.svg" class="image" title="Flag of Israel"><img alt="Flag of Israel" longdesc="/wiki/Image:Flag_of_Israel.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Israel.svg/22px-Flag_of_Israel.svg.png"; height="16" width="22"></a>&nbsp;<a href="/wiki/Israel" title="Israel">Israel</a></td>
+<td>376</td>
+
+<td>ISR</td>
+<td id="IL">IL</td>
+<td><a href="/wiki/ISO_3166-2:IL" title="ISO 3166-2:IL">ISO 3166-2:IL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Italy.svg" class="image" title="Flag of Italy"><img alt="Flag of Italy" longdesc="/wiki/Image:Flag_of_Italy.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Flag_of_Italy.svg/22px-Flag_of_Italy.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Italy" title="Italy">Italy</a></td>
+<td>380</td>
+<td>ITA</td>
+<td id="IT">IT</td>
+<td><a href="/wiki/ISO_3166-2:IT" title="ISO 3166-2:IT">ISO 3166-2:IT</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jamaica.svg" class="image" title="Flag of Jamaica"><img alt="Flag of Jamaica" longdesc="/wiki/Image:Flag_of_Jamaica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Jamaica.svg/22px-Flag_of_Jamaica.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Jamaica" title="Jamaica">Jamaica</a></td>
+<td>388</td>
+<td>JAM</td>
+<td id="JM">JM</td>
+<td><a href="/wiki/ISO_3166-2:JM" title="ISO 3166-2:JM">ISO 3166-2:JM</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Japan.svg" class="image" title="Flag of Japan"><img alt="Flag of Japan" longdesc="/wiki/Image:Flag_of_Japan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Flag_of_Japan.svg/22px-Flag_of_Japan.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Japan" title="Japan">Japan</a></td>
+<td>392</td>
+<td>JPN</td>
+<td id="JP">JP</td>
+<td><a href="/wiki/ISO_3166-2:JP" title="ISO 3166-2:JP">ISO 3166-2:JP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jersey.svg" class="image" title="Flag of Jersey"><img alt="Flag of Jersey" longdesc="/wiki/Image:Flag_of_Jersey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Flag_of_Jersey.svg/22px-Flag_of_Jersey.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Jersey" title="Jersey">Jersey</a></td>
+<td>832</td>
+<td>JEY</td>
+
+<td id="JE">JE</td>
+<td><a href="/wiki/ISO_3166-2:JE" title="ISO 3166-2:JE">ISO 3166-2:JE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jordan.svg" class="image" title="Flag of Jordan"><img alt="Flag of Jordan" longdesc="/wiki/Image:Flag_of_Jordan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Flag_of_Jordan.svg/22px-Flag_of_Jordan.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Jordan" title="Jordan">Jordan</a></td>
+<td>400</td>
+<td>JOR</td>
+<td id="JO">JO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:JO&amp;action=edit" class="new" title="ISO 3166-2:JO">ISO 3166-2:JO</a></td>
+</tr>
+
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kazakhstan.svg" class="image" title="Flag of Kazakhstan"><img alt="Flag of Kazakhstan" longdesc="/wiki/Image:Flag_of_Kazakhstan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kazakhstan.svg/22px-Flag_of_Kazakhstan.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Kazakhstan" title="Kazakhstan">Kazakhstan</a></td>
+<td>398</td>
+<td>KAZ</td>
+<td id="KZ">KZ</td>
+<td><a href="/wiki/ISO_3166-2:KZ" title="ISO 3166-2:KZ">ISO 3166-2:KZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kenya.svg" class="image" title="Flag of Kenya"><img alt="Flag of Kenya" longdesc="/wiki/Image:Flag_of_Kenya.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Kenya.svg/22px-Flag_of_Kenya.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Kenya" title="Kenya">Kenya</a></td>
+
+<td>404</td>
+<td>KEN</td>
+<td id="KE">KE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KE&amp;action=edit" class="new" title="ISO 3166-2:KE">ISO 3166-2:KE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kiribati.svg" class="image" title="Flag of Kiribati"><img alt="Flag of Kiribati" longdesc="/wiki/Image:Flag_of_Kiribati.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kiribati.svg/22px-Flag_of_Kiribati.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Kiribati" title="Kiribati">Kiribati</a></td>
+<td>296</td>
+<td>KIR</td>
+<td id="KI">KI</td>
+
+<td><a href="/wiki/ISO_3166-2:KI" title="ISO 3166-2:KI">ISO 3166-2:KI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_North_Korea.svg" class="image" title="Flag of North Korea"><img alt="Flag of North Korea" longdesc="/wiki/Image:Flag_of_North_Korea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Flag_of_North_Korea.svg/22px-Flag_of_North_Korea.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/North_Korea" title="North Korea">Korea, Democratic People's Republic of</a></td>
+<td>408</td>
+<td>PRK</td>
+<td id="KP">KP</td>
+<td><a href="/wiki/ISO_3166-2:KP" title="ISO 3166-2:KP">ISO 3166-2:KP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Korea.svg" class="image" title="Flag of South Korea"><img alt="Flag of South Korea" longdesc="/wiki/Image:Flag_of_South_Korea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_South_Korea.svg/22px-Flag_of_South_Korea.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/South_Korea" title="South Korea">Korea, Republic of</a></td>
+
+<td>410</td>
+<td>KOR</td>
+<td id="KR">KR</td>
+<td><a href="/wiki/ISO_3166-2:KR" title="ISO 3166-2:KR">ISO 3166-2:KR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kuwait.svg" class="image" title="Flag of Kuwait"><img alt="Flag of Kuwait" longdesc="/wiki/Image:Flag_of_Kuwait.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Flag_of_Kuwait.svg/22px-Flag_of_Kuwait.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Kuwait" title="Kuwait">Kuwait</a></td>
+<td>414</td>
+<td>KWT</td>
+<td id="KW">KW</td>
+
+<td><a href="/wiki/ISO_3166-2:KW" title="ISO 3166-2:KW">ISO 3166-2:KW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="image" title="Flag of Kyrgyzstan"><img alt="Flag of Kyrgyzstan" longdesc="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Flag_of_Kyrgyzstan.svg/22px-Flag_of_Kyrgyzstan.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Kyrgyzstan" title="Kyrgyzstan">Kyrgyzstan</a></td>
+<td>417</td>
+<td>KGZ</td>
+<td id="KG">KG</td>
+<td><a href="/wiki/ISO_3166-2:KG" title="ISO 3166-2:KG">ISO 3166-2:KG</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Laos.svg" class="image" title="Flag of Laos"><img alt="Flag of Laos" longdesc="/wiki/Image:Flag_of_Laos.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Laos.svg/22px-Flag_of_Laos.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Laos" title="Laos">Lao People's Democratic Republic</a></td>
+<td>418</td>
+<td>LAO</td>
+<td id="LA">LA</td>
+<td><a href="/wiki/ISO_3166-2:LA" title="ISO 3166-2:LA">ISO 3166-2:LA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Latvia.svg" class="image" title="Flag of Latvia"><img alt="Flag of Latvia" longdesc="/wiki/Image:Flag_of_Latvia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Latvia.svg/22px-Flag_of_Latvia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Latvia" title="Latvia">Latvia</a></td>
+<td>428</td>
+
+<td>LVA</td>
+<td id="LV">LV</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LV&amp;action=edit" class="new" title="ISO 3166-2:LV">ISO 3166-2:LV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lebanon.svg" class="image" title="Flag of Lebanon"><img alt="Flag of Lebanon" longdesc="/wiki/Image:Flag_of_Lebanon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Flag_of_Lebanon.svg/22px-Flag_of_Lebanon.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Lebanon" title="Lebanon">Lebanon</a></td>
+<td>422</td>
+<td>LBN</td>
+<td id="LB">LB</td>
+<td><a href="/wiki/ISO_3166-2:LB" title="ISO 3166-2:LB">ISO 3166-2:LB</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lesotho.svg" class="image" title="Flag of Lesotho"><img alt="Flag of Lesotho" longdesc="/wiki/Image:Flag_of_Lesotho.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Flag_of_Lesotho.svg/22px-Flag_of_Lesotho.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Lesotho" title="Lesotho">Lesotho</a></td>
+<td>426</td>
+<td>LSO</td>
+<td id="LS">LS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LS&amp;action=edit" class="new" title="ISO 3166-2:LS">ISO 3166-2:LS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Liberia.svg" class="image" title="Flag of Liberia"><img alt="Flag of Liberia" longdesc="/wiki/Image:Flag_of_Liberia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_Liberia.svg/22px-Flag_of_Liberia.svg.png"; height="12" width="22"></a>&nbsp;<a href="/wiki/Liberia" title="Liberia">Liberia</a></td>
+<td>430</td>
+
+<td>LBR</td>
+<td id="LR">LR</td>
+<td><a href="/wiki/ISO_3166-2:LR" title="ISO 3166-2:LR">ISO 3166-2:LR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Libya.svg" class="image" title="Flag of Libya"><img alt="Flag of Libya" longdesc="/wiki/Image:Flag_of_Libya.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Libya.svg/22px-Flag_of_Libya.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Libya" title="Libya">Libyan Arab Jamahiriya</a></td>
+<td>434</td>
+<td>LBY</td>
+<td id="LY">LY</td>
+<td><a href="/wiki/ISO_3166-2:LY" title="ISO 3166-2:LY">ISO 3166-2:LY</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Liechtenstein.svg" class="image" title="Flag of Liechtenstein"><img alt="Flag of Liechtenstein" longdesc="/wiki/Image:Flag_of_Liechtenstein.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Flag_of_Liechtenstein.svg/22px-Flag_of_Liechtenstein.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Liechtenstein" title="Liechtenstein">Liechtenstein</a></td>
+<td>438</td>
+<td>LIE</td>
+<td id="LI">LI</td>
+<td><a href="/wiki/ISO_3166-2:LI" title="ISO 3166-2:LI">ISO 3166-2:LI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lithuania.svg" class="image" title="Flag of Lithuania"><img alt="Flag of Lithuania" longdesc="/wiki/Image:Flag_of_Lithuania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Lithuania.svg/22px-Flag_of_Lithuania.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Lithuania" title="Lithuania">Lithuania</a></td>
+<td>440</td>
+
+<td>LTU</td>
+<td id="LT">LT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LT&amp;action=edit" class="new" title="ISO 3166-2:LT">ISO 3166-2:LT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Luxembourg.svg" class="image" title="Flag of Luxembourg"><img alt="Flag of Luxembourg" longdesc="/wiki/Image:Flag_of_Luxembourg.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Flag_of_Luxembourg.svg/22px-Flag_of_Luxembourg.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Luxembourg" title="Luxembourg">Luxembourg</a></td>
+<td>442</td>
+<td>LUX</td>
+<td id="LU">LU</td>
+<td><a href="/wiki/ISO_3166-2:LU" title="ISO 3166-2:LU">ISO 3166-2:LU</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Macau.svg" class="image" title="Flag of Macau"><img alt="Flag of Macau" longdesc="/wiki/Image:Flag_of_Macau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Flag_of_Macau.svg/22px-Flag_of_Macau.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Macau" title="Macau">Macao</a></td>
+<td>446</td>
+<td>MAC</td>
+<td id="MO">MO</td>
+<td><a href="/wiki/ISO_3166-2:MO" title="ISO 3166-2:MO">ISO 3166-2:MO</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Macedonia.svg" class="image" title="Flag of the Republic of Macedonia"><img alt="Flag of the Republic of Macedonia" longdesc="/wiki/Image:Flag_of_Macedonia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_Macedonia.svg/22px-Flag_of_Macedonia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Republic_of_Macedonia" title="Republic of Macedonia">Macedonia, the former Yugoslav Republic of</a></td>
+<td>807</td>
+<td>MKD</td>
+<td id="MK">MK</td>
+<td><a href="/wiki/ISO_3166-2:MK" title="ISO 3166-2:MK">ISO 3166-2:MK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Madagascar.svg" class="image" title="Flag of Madagascar"><img alt="Flag of Madagascar" longdesc="/wiki/Image:Flag_of_Madagascar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Madagascar.svg/22px-Flag_of_Madagascar.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Madagascar" title="Madagascar">Madagascar</a></td>
+<td>450</td>
+<td>MDG</td>
+
+<td id="MG">MG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MG&amp;action=edit" class="new" title="ISO 3166-2:MG">ISO 3166-2:MG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malawi.svg" class="image" title="Flag of Malawi"><img alt="Flag of Malawi" longdesc="/wiki/Image:Flag_of_Malawi.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Flag_of_Malawi.svg/22px-Flag_of_Malawi.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Malawi" title="Malawi">Malawi</a></td>
+<td>454</td>
+<td>MWI</td>
+<td id="MW">MW</td>
+<td><a href="/wiki/ISO_3166-2:MW" title="ISO 3166-2:MW">ISO 3166-2:MW</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malaysia.svg" class="image" title="Flag of Malaysia"><img alt="Flag of Malaysia" longdesc="/wiki/Image:Flag_of_Malaysia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Flag_of_Malaysia.svg/22px-Flag_of_Malaysia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Malaysia" title="Malaysia">Malaysia</a></td>
+<td>458</td>
+<td>MYS</td>
+<td id="MY">MY</td>
+<td><a href="/wiki/ISO_3166-2:MY" title="ISO 3166-2:MY">ISO 3166-2:MY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Maldives.svg" class="image" title="Flag of the Maldives"><img alt="Flag of the Maldives" longdesc="/wiki/Image:Flag_of_Maldives.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Maldives.svg/22px-Flag_of_Maldives.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Maldives" title="Maldives">Maldives</a></td>
+<td>462</td>
+
+<td>MDV</td>
+<td id="MV">MV</td>
+<td><a href="/wiki/ISO_3166-2:MV" title="ISO 3166-2:MV">ISO 3166-2:MV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mali.svg" class="image" title="Flag of Mali"><img alt="Flag of Mali" longdesc="/wiki/Image:Flag_of_Mali.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Mali.svg/22px-Flag_of_Mali.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Mali" title="Mali">Mali</a></td>
+<td>466</td>
+<td>MLI</td>
+<td id="ML">ML</td>
+<td><a href="/w/index.php?title=ISO_3166-2:ML&amp;action=edit" class="new" title="ISO 3166-2:ML">ISO 3166-2:ML</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malta.svg" class="image" title="Flag of Malta"><img alt="Flag of Malta" longdesc="/wiki/Image:Flag_of_Malta.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Malta.svg/22px-Flag_of_Malta.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Malta" title="Malta">Malta</a></td>
+<td>470</td>
+<td>MLT</td>
+<td id="MT">MT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MT&amp;action=edit" class="new" title="ISO 3166-2:MT">ISO 3166-2:MT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="image" title="Flag of the Marshall Islands"><img alt="Flag of the Marshall Islands" longdesc="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Flag_of_the_Marshall_Islands.svg/22px-Flag_of_the_Marshall_Islands.svg.png"; height="12" width="22"></a>&nbsp;<a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a></td>
+<td>584</td>
+
+<td>MHL</td>
+<td id="MH">MH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MH&amp;action=edit" class="new" title="ISO 3166-2:MH">ISO 3166-2:MH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Martinique"><img alt="Flag of Martinique" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Martinique" title="Martinique">Martinique</a></td>
+<td>474</td>
+<td>MTQ</td>
+<td id="MQ">MQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MQ&amp;action=edit" class="new" title="ISO 3166-2:MQ">ISO 3166-2:MQ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mauritania.svg" class="image" title="Flag of Mauritania"><img alt="Flag of Mauritania" longdesc="/wiki/Image:Flag_of_Mauritania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Flag_of_Mauritania.svg/22px-Flag_of_Mauritania.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Mauritania" title="Mauritania">Mauritania</a></td>
+<td>478</td>
+<td>MRT</td>
+<td id="MR">MR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MR&amp;action=edit" class="new" title="ISO 3166-2:MR">ISO 3166-2:MR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mauritius.svg" class="image" title="Flag of Mauritius"><img alt="Flag of Mauritius" longdesc="/wiki/Image:Flag_of_Mauritius.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Mauritius.svg/22px-Flag_of_Mauritius.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Mauritius" title="Mauritius">Mauritius</a></td>
+<td>480</td>
+
+<td>MUS</td>
+<td id="MU">MU</td>
+<td><a href="/wiki/ISO_3166-2:MU" title="ISO 3166-2:MU">ISO 3166-2:MU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Mayotte"><img alt="Flag of Mayotte" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Mayotte" title="Mayotte">Mayotte</a></td>
+<td>175</td>
+<td>MYT</td>
+<td id="YT">YT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:YT&amp;action=edit" class="new" title="ISO 3166-2:YT">ISO 3166-2:YT</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mexico.svg" class="image" title="Flag of Mexico"><img alt="Flag of Mexico" longdesc="/wiki/Image:Flag_of_Mexico.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Flag_of_Mexico.svg/22px-Flag_of_Mexico.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Mexico" title="Mexico">Mexico</a></td>
+<td>484</td>
+<td>MEX</td>
+<td id="MX">MX</td>
+<td><a href="/wiki/ISO_3166-2:MX" title="ISO 3166-2:MX">ISO 3166-2:MX</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Micronesia.svg" class="image" title="Flag of the Federated States of Micronesia"><img alt="Flag of the Federated States of Micronesia" longdesc="/wiki/Image:Flag_of_Micronesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Micronesia.svg/22px-Flag_of_Micronesia.svg.png"; height="12" width="22"></a>&nbsp;<a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia, Federated States of</a></td>
+<td>583</td>
+
+<td>FSM</td>
+<td id="FM">FM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FM&amp;action=edit" class="new" title="ISO 3166-2:FM">ISO 3166-2:FM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Moldova.svg" class="image" title="Flag of Moldova"><img alt="Flag of Moldova" longdesc="/wiki/Image:Flag_of_Moldova.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Moldova.svg/22px-Flag_of_Moldova.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Moldova" title="Moldova">Moldova, Republic of</a></td>
+<td>498</td>
+<td>MDA</td>
+<td id="MD">MD</td>
+<td><a href="/wiki/ISO_3166-2:MD" title="ISO 3166-2:MD">ISO 3166-2:MD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Monaco.svg" class="image" title="Flag of Monaco"><img alt="Flag of Monaco" longdesc="/wiki/Image:Flag_of_Monaco.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Flag_of_Monaco.svg/22px-Flag_of_Monaco.svg.png"; height="18" width="22"></a>&nbsp;<a href="/wiki/Monaco" title="Monaco">Monaco</a></td>
+<td>492</td>
+<td>MCO</td>
+<td id="MC">MC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MC&amp;action=edit" class="new" title="ISO 3166-2:MC">ISO 3166-2:MC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mongolia.svg" class="image" title="Flag of Mongolia"><img alt="Flag of Mongolia" longdesc="/wiki/Image:Flag_of_Mongolia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Mongolia.svg/22px-Flag_of_Mongolia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Mongolia" title="Mongolia">Mongolia</a></td>
+<td>496</td>
+
+<td>MNG</td>
+<td id="MN">MN</td>
+<td><a href="/wiki/ISO_3166-2:MN" title="ISO 3166-2:MN">ISO 3166-2:MN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Montenegro.svg" class="image" title="Flag of Montenegro"><img alt="Flag of Montenegro" longdesc="/wiki/Image:Flag_of_Montenegro.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Montenegro.svg/22px-Flag_of_Montenegro.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Montenegro" title="Montenegro">Montenegro</a></td>
+<td>499</td>
+<td>MNE</td>
+<td id="ME">ME</td>
+<td><a href="/wiki/ISO_3166-2:ME" title="ISO 3166-2:ME">ISO 3166-2:ME</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Montserrat.svg" class="image" title="Flag of Montserrat"><img alt="Flag of Montserrat" longdesc="/wiki/Image:Flag_of_Montserrat.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Montserrat.svg/22px-Flag_of_Montserrat.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></td>
+<td>500</td>
+<td>MSR</td>
+<td id="MS">MS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MS&amp;action=edit" class="new" title="ISO 3166-2:MS">ISO 3166-2:MS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Morocco.svg" class="image" title="Flag of Morocco"><img alt="Flag of Morocco" longdesc="/wiki/Image:Flag_of_Morocco.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Morocco.svg/22px-Flag_of_Morocco.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Morocco" title="Morocco">Morocco</a></td>
+<td>504</td>
+
+<td>MAR</td>
+<td id="MA">MA</td>
+<td><a href="/wiki/ISO_3166-2:MA" title="ISO 3166-2:MA">ISO 3166-2:MA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mozambique.svg" class="image" title="Flag of Mozambique"><img alt="Flag of Mozambique" longdesc="/wiki/Image:Flag_of_Mozambique.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Mozambique.svg/22px-Flag_of_Mozambique.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Mozambique" title="Mozambique">Mozambique</a></td>
+<td>508</td>
+<td>MOZ</td>
+<td id="MZ">MZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MZ&amp;action=edit" class="new" title="ISO 3166-2:MZ">ISO 3166-2:MZ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Myanmar.svg" class="image" title="Flag of Myanmar"><img alt="Flag of Myanmar" longdesc="/wiki/Image:Flag_of_Myanmar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Flag_of_Myanmar.svg/22px-Flag_of_Myanmar.svg.png"; height="12" width="22"></a>&nbsp;<a href="/wiki/Myanmar" title="Myanmar">Myanmar</a></td>
+<td>104</td>
+<td>MMR</td>
+<td id="MM">MM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MM&amp;action=edit" class="new" title="ISO 3166-2:MM">ISO 3166-2:MM</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Namibia.svg" class="image" title="Flag of Namibia"><img alt="Flag of Namibia" longdesc="/wiki/Image:Flag_of_Namibia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Namibia.svg/22px-Flag_of_Namibia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Namibia" title="Namibia">Namibia</a></td>
+<td>516</td>
+<td>NAM</td>
+<td id="NA">NA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NA&amp;action=edit" class="new" title="ISO 3166-2:NA">ISO 3166-2:NA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nauru.svg" class="image" title="Flag of Nauru"><img alt="Flag of Nauru" longdesc="/wiki/Image:Flag_of_Nauru.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Flag_of_Nauru.svg/22px-Flag_of_Nauru.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Nauru" title="Nauru">Nauru</a></td>
+<td>520</td>
+<td>NRU</td>
+
+<td id="NR">NR</td>
+<td><a href="/wiki/ISO_3166-2:NR" title="ISO 3166-2:NR">ISO 3166-2:NR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nepal.svg" class="image" title="Flag of Nepal"><img alt="Flag of Nepal" longdesc="/wiki/Image:Flag_of_Nepal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Flag_of_Nepal.svg/16px-Flag_of_Nepal.svg.png"; height="20" width="16"></a>&nbsp;<a href="/wiki/Nepal" title="Nepal">Nepal</a></td>
+<td>524</td>
+<td>NPL</td>
+<td id="NP">NP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NP&amp;action=edit" class="new" title="ISO 3166-2:NP">ISO 3166-2:NP</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Netherlands.svg" class="image" title="Flag of the Netherlands"><img alt="Flag of the Netherlands" longdesc="/wiki/Image:Flag_of_the_Netherlands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_the_Netherlands.svg/22px-Flag_of_the_Netherlands.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></td>
+<td>528</td>
+<td>NLD</td>
+<td id="NL">NL</td>
+<td><a href="/wiki/ISO_3166-2:NL" title="ISO 3166-2:NL">ISO 3166-2:NL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="image" title="Flag of the Netherlands Antilles"><img alt="Flag of the Netherlands Antilles" longdesc="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Flag_of_the_Netherlands_Antilles.svg/22px-Flag_of_the_Netherlands_Antilles.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Netherlands_Antilles" title="Netherlands Antilles">Netherlands Antilles</a></td>
+<td>530</td>
+
+<td>ANT</td>
+<td id="AN">AN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AN&amp;action=edit" class="new" title="ISO 3166-2:AN">ISO 3166-2:AN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of New Caledonia"><img alt="Flag of New Caledonia" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a></td>
+<td>540</td>
+<td>NCL</td>
+<td id="NC">NC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NC&amp;action=edit" class="new" title="ISO 3166-2:NC">ISO 3166-2:NC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"><img alt="Flag of New Zealand" longdesc="/wiki/Image:Flag_of_New_Zealand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/22px-Flag_of_New_Zealand.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/New_Zealand" title="New Zealand">New Zealand</a></td>
+<td>554</td>
+<td>NZL</td>
+<td id="NZ">NZ</td>
+<td><a href="/wiki/ISO_3166-2:NZ" title="ISO 3166-2:NZ">ISO 3166-2:NZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nicaragua.svg" class="image" title="Flag of Nicaragua"><img alt="Flag of Nicaragua" longdesc="/wiki/Image:Flag_of_Nicaragua.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Nicaragua.svg/22px-Flag_of_Nicaragua.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Nicaragua" title="Nicaragua">Nicaragua</a></td>
+<td>558</td>
+
+<td>NIC</td>
+<td id="NI">NI</td>
+<td><a href="/wiki/ISO_3166-2:NI" title="ISO 3166-2:NI">ISO 3166-2:NI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Niger.svg" class="image" title="Flag of Niger"><img alt="Flag of Niger" longdesc="/wiki/Image:Flag_of_Niger.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Flag_of_Niger.svg/22px-Flag_of_Niger.svg.png"; height="19" width="22"></a>&nbsp;<a href="/wiki/Niger" title="Niger">Niger</a></td>
+<td>562</td>
+<td>NER</td>
+<td id="NE">NE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NE&amp;action=edit" class="new" title="ISO 3166-2:NE">ISO 3166-2:NE</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nigeria.svg" class="image" title="Flag of Nigeria"><img alt="Flag of Nigeria" longdesc="/wiki/Image:Flag_of_Nigeria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Flag_of_Nigeria.svg/22px-Flag_of_Nigeria.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Nigeria" title="Nigeria">Nigeria</a></td>
+<td>566</td>
+<td>NGA</td>
+<td id="NG">NG</td>
+<td><a href="/wiki/ISO_3166-2:NG" title="ISO 3166-2:NG">ISO 3166-2:NG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Niue.svg" class="image" title="Flag of Niue"><img alt="Flag of Niue" longdesc="/wiki/Image:Flag_of_Niue.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/22px-Flag_of_Niue.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Niue" title="Niue">Niue</a></td>
+<td>570</td>
+
+<td>NIU</td>
+<td id="NU">NU</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NU&amp;action=edit" class="new" title="ISO 3166-2:NU">ISO 3166-2:NU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norfolk_Island.svg" class="image" title="Flag of Norfolk Island"><img alt="Flag of Norfolk Island" longdesc="/wiki/Image:Flag_of_Norfolk_Island.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Norfolk_Island.svg/22px-Flag_of_Norfolk_Island.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></td>
+<td>574</td>
+<td>NFK</td>
+<td id="NF">NF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NF&amp;action=edit" class="new" title="ISO 3166-2:NF">ISO 3166-2:NF</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="image" title="Flag of the Northern Mariana Islands"><img alt="Flag of the Northern Mariana Islands" longdesc="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Flag_of_the_Northern_Mariana_Islands.svg/22px-Flag_of_the_Northern_Mariana_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></td>
+<td>580</td>
+<td>MNP</td>
+<td id="MP">MP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MP&amp;action=edit" class="new" title="ISO 3166-2:MP">ISO 3166-2:MP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Norway"><img alt="Flag of Norway" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/22px-Flag_of_Norway.svg.png"; height="16" width="22"></a>&nbsp;<a href="/wiki/Norway" title="Norway">Norway</a></td>
+<td>578</td>
+
+<td>NOR</td>
+<td id="NO">NO</td>
+<td><a href="/wiki/ISO_3166-2:NO" title="ISO 3166-2:NO">ISO 3166-2:NO</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Oman.svg" class="image" title="Flag of Oman"><img alt="Flag of Oman" longdesc="/wiki/Image:Flag_of_Oman.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Oman.svg/22px-Flag_of_Oman.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Oman" title="Oman">Oman</a></td>
+<td>512</td>
+<td>OMN</td>
+
+<td id="OM">OM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:OM&amp;action=edit" class="new" title="ISO 3166-2:OM">ISO 3166-2:OM</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Pakistan.svg" class="image" title="Flag of Pakistan"><img alt="Flag of Pakistan" longdesc="/wiki/Image:Flag_of_Pakistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Flag_of_Pakistan.svg/22px-Flag_of_Pakistan.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Pakistan" title="Pakistan">Pakistan</a></td>
+<td>586</td>
+<td>PAK</td>
+<td id="PK">PK</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:PK&amp;action=edit" class="new" title="ISO 3166-2:PK">ISO 3166-2:PK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Palau.svg" class="image" title="Flag of Palau"><img alt="Flag of Palau" longdesc="/wiki/Image:Flag_of_Palau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Palau.svg/22px-Flag_of_Palau.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/Palau" title="Palau">Palau</a></td>
+<td>585</td>
+<td>PLW</td>
+<td id="PW">PW</td>
+<td><a href="/wiki/ISO_3166-2:PW" title="ISO 3166-2:PW">ISO 3166-2:PW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Palestine.svg" class="image" title="Palestinian flag"><img alt="Palestinian flag" longdesc="/wiki/Image:Flag_of_Palestine.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Palestine.svg/22px-Flag_of_Palestine.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Palestinian_territories" title="Palestinian territories">Palestinian Territory, Occupied</a></td>
+
+<td>275</td>
+<td>PSE</td>
+<td id="PS">PS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PS&amp;action=edit" class="new" title="ISO 3166-2:PS">ISO 3166-2:PS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Panama.svg" class="image" title="Flag of Panama"><img alt="Flag of Panama" longdesc="/wiki/Image:Flag_of_Panama.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Flag_of_Panama.svg/22px-Flag_of_Panama.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Panama" title="Panama">Panama</a></td>
+<td>591</td>
+<td>PAN</td>
+<td id="PA">PA</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:PA&amp;action=edit" class="new" title="ISO 3166-2:PA">ISO 3166-2:PA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="image" title="Flag of Papua New Guinea"><img alt="Flag of Papua New Guinea" longdesc="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Flag_of_Papua_New_Guinea.svg/22px-Flag_of_Papua_New_Guinea.svg.png"; height="17" width="22"></a>&nbsp;<a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a></td>
+<td>598</td>
+<td>PNG</td>
+<td id="PG">PG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PG&amp;action=edit" class="new" title="ISO 3166-2:PG">ISO 3166-2:PG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Paraguay.svg" class="image" title="Flag of Paraguay"><img alt="Flag of Paraguay" longdesc="/wiki/Image:Flag_of_Paraguay.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Paraguay.svg/22px-Flag_of_Paraguay.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Paraguay" title="Paraguay">Paraguay</a></td>
+
+<td>600</td>
+<td>PRY</td>
+<td id="PY">PY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PY&amp;action=edit" class="new" title="ISO 3166-2:PY">ISO 3166-2:PY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Peru.svg" class="image" title="Flag of Peru"><img alt="Flag of Peru" longdesc="/wiki/Image:Flag_of_Peru.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Flag_of_Peru.svg/22px-Flag_of_Peru.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Peru" title="Peru">Peru</a></td>
+<td>604</td>
+<td>PER</td>
+<td id="PE">PE</td>
+
+<td><a href="/wiki/ISO_3166-2:PE" title="ISO 3166-2:PE">ISO 3166-2:PE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Philippines.svg" class="image" title="Flag of the Philippines"><img alt="Flag of the Philippines" longdesc="/wiki/Image:Flag_of_the_Philippines.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_the_Philippines.svg/22px-Flag_of_the_Philippines.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Philippines" title="Philippines">Philippines</a></td>
+<td>608</td>
+<td>PHL</td>
+<td id="PH">PH</td>
+<td><a href="/wiki/ISO_3166-2:PH" title="ISO 3166-2:PH">ISO 3166-2:PH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="image" title="Flag of the Pitcairn Islands"><img alt="Flag of the Pitcairn Islands" longdesc="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Flag_of_the_Pitcairn_Islands.svg/22px-Flag_of_the_Pitcairn_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn</a></td>
+
+<td>612</td>
+<td>PCN</td>
+<td id="PN">PN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PN&amp;action=edit" class="new" title="ISO 3166-2:PN">ISO 3166-2:PN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Poland.svg" class="image" title="Flag of Poland"><img alt="Flag of Poland" longdesc="/wiki/Image:Flag_of_Poland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Flag_of_Poland.svg/22px-Flag_of_Poland.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/Poland" title="Poland">Poland</a></td>
+<td>616</td>
+<td>POL</td>
+<td id="PL">PL</td>
+
+<td><a href="/wiki/ISO_3166-2:PL" title="ISO 3166-2:PL">ISO 3166-2:PL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Portugal.svg" class="image" title="Flag of Portugal"><img alt="Flag of Portugal" longdesc="/wiki/Image:Flag_of_Portugal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Portugal.svg/22px-Flag_of_Portugal.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Portugal" title="Portugal">Portugal</a></td>
+<td>620</td>
+<td>PRT</td>
+<td id="PT">PT</td>
+<td><a href="/wiki/ISO_3166-2:PT" title="ISO 3166-2:PT">ISO 3166-2:PT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Puerto_Rico.svg" class="image" title="Flag of Puerto Rico"><img alt="Flag of Puerto Rico" longdesc="/wiki/Image:Flag_of_Puerto_Rico.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Flag_of_Puerto_Rico.svg/22px-Flag_of_Puerto_Rico.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></td>
+
+<td>630</td>
+<td>PRI</td>
+<td id="PR">PR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PR&amp;action=edit" class="new" title="ISO 3166-2:PR">ISO 3166-2:PR</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Qatar.svg" class="image" title="Flag of Qatar"><img alt="Flag of Qatar" longdesc="/wiki/Image:Flag_of_Qatar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Flag_of_Qatar.svg/22px-Flag_of_Qatar.svg.png"; height="9" width="22"></a>&nbsp;<a href="/wiki/Qatar" title="Qatar">Qatar</a></td>
+<td>634</td>
+
+<td>QAT</td>
+<td id="QA">QA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:QA&amp;action=edit" class="new" title="ISO 3166-2:QA">ISO 3166-2:QA</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Réunion"><img alt="Flag of Réunion" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/R%C3%A9union" title="Réunion">Réunion</a></td>
+<td>638</td>
+<td>REU</td>
+
+<td id="RE">RE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:RE&amp;action=edit" class="new" title="ISO 3166-2:RE">ISO 3166-2:RE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Romania.svg" class="image" title="Flag of Romania"><img alt="Flag of Romania" longdesc="/wiki/Image:Flag_of_Romania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Romania.svg/22px-Flag_of_Romania.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Romania" title="Romania">Romania</a></td>
+<td>642</td>
+<td>ROU</td>
+<td id="RO">RO</td>
+<td><a href="/wiki/ISO_3166-2:RO" title="ISO 3166-2:RO">ISO 3166-2:RO</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Russia.svg" class="image" title="Flag of Russia"><img alt="Flag of Russia" longdesc="/wiki/Image:Flag_of_Russia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Russia.svg/22px-Flag_of_Russia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Russia" title="Russia">Russian Federation</a></td>
+<td>643</td>
+<td>RUS</td>
+<td id="RU">RU</td>
+<td><a href="/wiki/ISO_3166-2:RU" title="ISO 3166-2:RU">ISO 3166-2:RU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Rwanda.svg" class="image" title="Flag of Rwanda"><img alt="Flag of Rwanda" longdesc="/wiki/Image:Flag_of_Rwanda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Rwanda.svg/22px-Flag_of_Rwanda.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Rwanda" title="Rwanda">Rwanda</a></td>
+<td>646</td>
+
+<td>RWA</td>
+<td id="RW">RW</td>
+<td><a href="/wiki/ISO_3166-2:RW" title="ISO 3166-2:RW">ISO 3166-2:RW</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Helena.svg" class="image" title="Flag of Saint Helena"><img alt="Flag of Saint Helena" longdesc="/wiki/Image:Flag_of_Saint_Helena.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Saint_Helena.svg/22px-Flag_of_Saint_Helena.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Saint_Helena" title="Saint Helena">Saint Helena</a></td>
+<td>654</td>
+<td>SHN</td>
+
+<td id="SH">SH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SH&amp;action=edit" class="new" title="ISO 3166-2:SH">ISO 3166-2:SH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="image" title="Flag of Saint Kitts and Nevis"><img alt="Flag of Saint Kitts and Nevis" longdesc="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Saint_Kitts_and_Nevis.svg/22px-Flag_of_Saint_Kitts_and_Nevis.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a></td>
+<td>659</td>
+<td>KNA</td>
+<td id="KN">KN</td>
+<td><a href="/wiki/ISO_3166-2:KN" title="ISO 3166-2:KN">ISO 3166-2:KN</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Lucia.svg" class="image" title="Flag of Saint Lucia"><img alt="Flag of Saint Lucia" longdesc="/wiki/Image:Flag_of_Saint_Lucia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Saint_Lucia.svg/22px-Flag_of_Saint_Lucia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a></td>
+<td>662</td>
+<td>LCA</td>
+<td id="LC">LC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LC&amp;action=edit" class="new" title="ISO 3166-2:LC">ISO 3166-2:LC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Pierre and Miquelon"><img alt="Flag of Saint Pierre and Miquelon" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Saint_Pierre_and_Miquelon" title="Saint Pierre and Miquelon">Saint Pierre and Miquelon</a></td>
+<td>666</td>
+
+<td>SPM</td>
+<td id="PM">PM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PM&amp;action=edit" class="new" title="ISO 3166-2:PM">ISO 3166-2:PM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="image" title="Flag of Saint Vincent and the Grenadines"><img alt="Flag of Saint Vincent and the Grenadines" longdesc="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Flag_of_Saint_Vincent_and_the_Grenadines.svg/22px-Flag_of_Saint_Vincent_and_the_Grenadines.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a></td>
+<td>670</td>
+<td>VCT</td>
+<td id="VC">VC</td>
+<td><a href="/wiki/ISO_3166-2:VC" title="ISO 3166-2:VC">ISO 3166-2:VC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Samoa.svg" class="image" title="Flag of Samoa"><img alt="Flag of Samoa" longdesc="/wiki/Image:Flag_of_Samoa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Samoa.svg/22px-Flag_of_Samoa.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Samoa" title="Samoa">Samoa</a></td>
+<td>882</td>
+<td>WSM</td>
+<td id="WS">WS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:WS&amp;action=edit" class="new" title="ISO 3166-2:WS">ISO 3166-2:WS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_San_Marino.svg" class="image" title="Flag of San Marino"><img alt="Flag of San Marino" longdesc="/wiki/Image:Flag_of_San_Marino.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Flag_of_San_Marino.svg/22px-Flag_of_San_Marino.svg.png"; height="17" width="22"></a>&nbsp;<a href="/wiki/San_Marino" title="San Marino">San Marino</a></td>
+<td>674</td>
+
+<td>SMR</td>
+<td id="SM">SM</td>
+<td><a href="/wiki/ISO_3166-2:SM" title="ISO 3166-2:SM">ISO 3166-2:SM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="image" title="Flag of São Tomé and Príncipe"><img alt="Flag of São Tomé and Príncipe" longdesc="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Sao_Tome_and_Principe.svg/22px-Flag_of_Sao_Tome_and_Principe.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe" title="São Tomé and Príncipe">Sao Tome and Principe</a></td>
+<td>678</td>
+<td>STP</td>
+<td id="ST">ST</td>
+<td><a href="/wiki/ISO_3166-2:ST" title="ISO 3166-2:ST">ISO 3166-2:ST</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="image" title="Flag of Saudi Arabia"><img alt="Flag of Saudi Arabia" longdesc="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Flag_of_Saudi_Arabia.svg/22px-Flag_of_Saudi_Arabia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Saudi_Arabia" title="Saudi Arabia">Saudi Arabia</a></td>
+<td>682</td>
+<td>SAU</td>
+<td id="SA">SA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SA&amp;action=edit" class="new" title="ISO 3166-2:SA">ISO 3166-2:SA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Senegal.svg" class="image" title="Flag of Senegal"><img alt="Flag of Senegal" longdesc="/wiki/Image:Flag_of_Senegal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Flag_of_Senegal.svg/22px-Flag_of_Senegal.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Senegal" title="Senegal">Senegal</a></td>
+<td>686</td>
+
+<td>SEN</td>
+<td id="SN">SN</td>
+<td><a href="/wiki/ISO_3166-2:SN" title="ISO 3166-2:SN">ISO 3166-2:SN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Serbia.svg" class="image" title="Flag of Serbia"><img alt="Flag of Serbia" longdesc="/wiki/Image:Flag_of_Serbia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Flag_of_Serbia.svg/22px-Flag_of_Serbia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Serbia" title="Serbia">Serbia</a></td>
+<td>688</td>
+<td>SRB</td>
+<td id="RS">RS</td>
+<td><a href="/wiki/ISO_3166-2:RS" title="ISO 3166-2:RS">ISO 3166-2:RS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Seychelles.svg" class="image" title="Flag of the Seychelles"><img alt="Flag of the Seychelles" longdesc="/wiki/Image:Flag_of_the_Seychelles.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Seychelles.svg/22px-Flag_of_the_Seychelles.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Seychelles" title="Seychelles">Seychelles</a></td>
+<td>690</td>
+<td>SYC</td>
+<td id="SC">SC</td>
+<td><a href="/wiki/ISO_3166-2:SC" title="ISO 3166-2:SC">ISO 3166-2:SC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sierra_Leone.svg" class="image" title="Flag of Sierra Leone"><img alt="Flag of Sierra Leone" longdesc="/wiki/Image:Flag_of_Sierra_Leone.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Sierra_Leone.svg/22px-Flag_of_Sierra_Leone.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a></td>
+<td>694</td>
+
+<td>SLE</td>
+<td id="SL">SL</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SL&amp;action=edit" class="new" title="ISO 3166-2:SL">ISO 3166-2:SL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Singapore.svg" class="image" title="Flag of Singapore"><img alt="Flag of Singapore" longdesc="/wiki/Image:Flag_of_Singapore.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Singapore.svg/22px-Flag_of_Singapore.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Singapore" title="Singapore">Singapore</a></td>
+<td>702</td>
+<td>SGP</td>
+<td id="SG">SG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SG&amp;action=edit" class="new" title="ISO 3166-2:SG">ISO 3166-2:SG</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Slovakia.svg" class="image" title="Flag of Slovakia"><img alt="Flag of Slovakia" longdesc="/wiki/Image:Flag_of_Slovakia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Flag_of_Slovakia.svg/22px-Flag_of_Slovakia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Slovakia" title="Slovakia">Slovakia</a></td>
+<td>703</td>
+<td>SVK</td>
+<td id="SK">SK</td>
+<td><a href="/wiki/ISO_3166-2:SK" title="ISO 3166-2:SK">ISO 3166-2:SK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Slovenia.svg" class="image" title="Flag of Slovenia"><img alt="Flag of Slovenia" longdesc="/wiki/Image:Flag_of_Slovenia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f0/Flag_of_Slovenia.svg/22px-Flag_of_Slovenia.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Slovenia" title="Slovenia">Slovenia</a></td>
+<td>705</td>
+
+<td>SVN</td>
+<td id="SI">SI</td>
+<td><a href="/wiki/ISO_3166-2:SI" title="ISO 3166-2:SI">ISO 3166-2:SI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="image" title="Flag of the Solomon Islands"><img alt="Flag of the Solomon Islands" longdesc="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Flag_of_the_Solomon_Islands.svg/22px-Flag_of_the_Solomon_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a></td>
+<td>090</td>
+<td>SLB</td>
+<td id="SB">SB</td>
+<td><a href="/wiki/ISO_3166-2:SB" title="ISO 3166-2:SB">ISO 3166-2:SB</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Somalia.svg" class="image" title="Flag of Somalia"><img alt="Flag of Somalia" longdesc="/wiki/Image:Flag_of_Somalia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_Somalia.svg/22px-Flag_of_Somalia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Somalia" title="Somalia">Somalia</a></td>
+<td>706</td>
+<td>SOM</td>
+<td id="SO">SO</td>
+<td><a href="/wiki/ISO_3166-2:SO" title="ISO 3166-2:SO">ISO 3166-2:SO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Africa.svg" class="image" title="Flag of South Africa"><img alt="Flag of South Africa" longdesc="/wiki/Image:Flag_of_South_Africa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Flag_of_South_Africa.svg/22px-Flag_of_South_Africa.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/South_Africa" title="South Africa">South Africa</a></td>
+<td>710</td>
+
+<td>ZAF</td>
+<td id="ZA">ZA</td>
+<td><a href="/wiki/ISO_3166-2:ZA" title="ISO 3166-2:ZA">ISO 3166-2:ZA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="image" title="Flag of South Georgia and the South Sandwich Islands"><img alt="Flag of South Georgia and the South Sandwich Islands" longdesc="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg/22px-Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></td>
+<td>239</td>
+<td>SGS</td>
+<td id="GS">GS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GS&amp;action=edit" class="new" title="ISO 3166-2:GS">ISO 3166-2:GS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Spain.svg" class="image" title="Flag of Spain"><img alt="Flag of Spain" longdesc="/wiki/Image:Flag_of_Spain.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Spain.svg/22px-Flag_of_Spain.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Spain" title="Spain">Spain</a></td>
+<td>724</td>
+<td>ESP</td>
+<td id="ES">ES</td>
+<td><a href="/wiki/ISO_3166-2:ES" title="ISO 3166-2:ES">ISO 3166-2:ES</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sri_Lanka.svg" class="image" title="Flag of Sri Lanka"><img alt="Flag of Sri Lanka" longdesc="/wiki/Image:Flag_of_Sri_Lanka.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Sri_Lanka.svg/22px-Flag_of_Sri_Lanka.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a></td>
+<td>144</td>
+
+<td>LKA</td>
+<td id="LK">LK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LK&amp;action=edit" class="new" title="ISO 3166-2:LK">ISO 3166-2:LK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sudan.svg" class="image" title="Flag of Sudan"><img alt="Flag of Sudan" longdesc="/wiki/Image:Flag_of_Sudan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Sudan.svg/22px-Flag_of_Sudan.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Sudan" title="Sudan">Sudan</a></td>
+<td>736</td>
+<td>SDN</td>
+<td id="SD">SD</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SD&amp;action=edit" class="new" title="ISO 3166-2:SD">ISO 3166-2:SD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Suriname.svg" class="image" title="Flag of Suriname"><img alt="Flag of Suriname" longdesc="/wiki/Image:Flag_of_Suriname.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Flag_of_Suriname.svg/22px-Flag_of_Suriname.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Suriname" title="Suriname">Suriname</a></td>
+<td>740</td>
+<td>SUR</td>
+<td id="SR">SR</td>
+<td><a href="/wiki/ISO_3166-2:SR" title="ISO 3166-2:SR">ISO 3166-2:SR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Svalbard and Jan Mayen"><img alt="Flag of Svalbard and Jan Mayen" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/22px-Flag_of_Norway.svg.png"; height="16" width="22"></a>&nbsp;<a href="/wiki/Svalbard_and_Jan_Mayen" title="Svalbard and Jan Mayen">Svalbard and Jan Mayen</a></td>
+<td>744</td>
+
+<td>SJM</td>
+<td id="SJ">SJ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SJ&amp;action=edit" class="new" title="ISO 3166-2:SJ">ISO 3166-2:SJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Swaziland.svg" class="image" title="Flag of Swaziland"><img alt="Flag of Swaziland" longdesc="/wiki/Image:Flag_of_Swaziland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Flag_of_Swaziland.svg/22px-Flag_of_Swaziland.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Swaziland" title="Swaziland">Swaziland</a></td>
+<td>748</td>
+<td>SWZ</td>
+<td id="SZ">SZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SZ&amp;action=edit" class="new" title="ISO 3166-2:SZ">ISO 3166-2:SZ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sweden.svg" class="image" title="Flag of Sweden"><img alt="Flag of Sweden" longdesc="/wiki/Image:Flag_of_Sweden.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Sweden.svg/22px-Flag_of_Sweden.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/Sweden" title="Sweden">Sweden</a></td>
+<td>752</td>
+<td>SWE</td>
+<td id="SE">SE</td>
+<td><a href="/wiki/ISO_3166-2:SE" title="ISO 3166-2:SE">ISO 3166-2:SE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Switzerland.svg" class="image" title="Flag of Switzerland"><img alt="Flag of Switzerland" longdesc="/wiki/Image:Flag_of_Switzerland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Switzerland.svg/20px-Flag_of_Switzerland.svg.png"; height="20" width="20"></a>&nbsp;<a href="/wiki/Switzerland" title="Switzerland">Switzerland</a></td>
+<td>756</td>
+
+<td>CHE</td>
+<td id="CH">CH</td>
+<td><a href="/wiki/ISO_3166-2:CH" title="ISO 3166-2:CH">ISO 3166-2:CH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Syria.svg" class="image" title="Flag of Syria"><img alt="Flag of Syria" longdesc="/wiki/Image:Flag_of_Syria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Flag_of_Syria.svg/22px-Flag_of_Syria.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Syria" title="Syria">Syrian Arab Republic</a></td>
+<td>760</td>
+<td>SYR</td>
+<td id="SY">SY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SY&amp;action=edit" class="new" title="ISO 3166-2:SY">ISO 3166-2:SY</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="image" title="Flag of the Republic of China"><img alt="Flag of the Republic of China" longdesc="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Flag_of_the_Republic_of_China.svg/22px-Flag_of_the_Republic_of_China.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Republic_of_China" title="Republic of China">Taiwan, Province of China</a></td>
+<td>158</td>
+<td>TWN</td>
+<td id="TW">TW</td>
+<td><a href="/wiki/ISO_3166-2:TW" title="ISO 3166-2:TW">ISO 3166-2:TW</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Tajikistan.svg" class="image" title="Flag of Tajikistan"><img alt="Flag of Tajikistan" longdesc="/wiki/Image:Flag_of_Tajikistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Tajikistan.svg/22px-Flag_of_Tajikistan.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Tajikistan" title="Tajikistan">Tajikistan</a></td>
+<td>762</td>
+<td>TJK</td>
+<td id="TJ">TJ</td>
+<td><a href="/wiki/ISO_3166-2:TJ" title="ISO 3166-2:TJ">ISO 3166-2:TJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tanzania.svg" class="image" title="Flag of Tanzania"><img alt="Flag of Tanzania" longdesc="/wiki/Image:Flag_of_Tanzania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tanzania.svg/22px-Flag_of_Tanzania.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Tanzania" title="Tanzania">Tanzania, United Republic of</a></td>
+<td>834</td>
+<td>TZA</td>
+
+<td id="TZ">TZ</td>
+<td><a href="/wiki/ISO_3166-2:TZ" title="ISO 3166-2:TZ">ISO 3166-2:TZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Thailand.svg" class="image" title="Flag of Thailand"><img alt="Flag of Thailand" longdesc="/wiki/Image:Flag_of_Thailand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Flag_of_Thailand.svg/22px-Flag_of_Thailand.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Thailand" title="Thailand">Thailand</a></td>
+<td>764</td>
+<td>THA</td>
+<td id="TH">TH</td>
+<td><a href="/wiki/ISO_3166-2:TH" title="ISO 3166-2:TH">ISO 3166-2:TH</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_East_Timor.svg" class="image" title="Flag of East Timor"><img alt="Flag of East Timor" longdesc="/wiki/Image:Flag_of_East_Timor.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Flag_of_East_Timor.svg/22px-Flag_of_East_Timor.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/East_Timor" title="East Timor">Timor-Leste</a></td>
+<td>626</td>
+<td>TLS</td>
+<td id="TL">TL</td>
+<td><a href="/wiki/ISO_3166-2:TL" title="ISO 3166-2:TL">ISO 3166-2:TL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Togo.svg" class="image" title="Flag of Togo"><img alt="Flag of Togo" longdesc="/wiki/Image:Flag_of_Togo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Flag_of_Togo.svg/22px-Flag_of_Togo.svg.png"; height="14" width="22"></a>&nbsp;<a href="/wiki/Togo" title="Togo">Togo</a></td>
+<td>768</td>
+
+<td>TGO</td>
+<td id="TG">TG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TG&amp;action=edit" class="new" title="ISO 3166-2:TG">ISO 3166-2:TG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of Tokelau"><img alt="Flag of Tokelau" longdesc="/wiki/Image:Flag_of_New_Zealand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/22px-Flag_of_New_Zealand.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></td>
+<td>772</td>
+<td>TKL</td>
+<td id="TK">TK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TK&amp;action=edit" class="new" title="ISO 3166-2:TK">ISO 3166-2:TK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tonga.svg" class="image" title="Flag of Tonga"><img alt="Flag of Tonga" longdesc="/wiki/Image:Flag_of_Tonga.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Tonga.svg/22px-Flag_of_Tonga.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Tonga" title="Tonga">Tonga</a></td>
+<td>776</td>
+<td>TON</td>
+<td id="TO">TO</td>
+<td><a href="/wiki/ISO_3166-2:TO" title="ISO 3166-2:TO">ISO 3166-2:TO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="image" title="Flag of Trinidad and Tobago"><img alt="Flag of Trinidad and Tobago" longdesc="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Trinidad_and_Tobago.svg/22px-Flag_of_Trinidad_and_Tobago.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a></td>
+<td>780</td>
+
+<td>TTO</td>
+<td id="TT">TT</td>
+<td><a href="/wiki/ISO_3166-2:TT" title="ISO 3166-2:TT">ISO 3166-2:TT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tunisia.svg" class="image" title="Flag of Tunisia"><img alt="Flag of Tunisia" longdesc="/wiki/Image:Flag_of_Tunisia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Tunisia.svg/22px-Flag_of_Tunisia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Tunisia" title="Tunisia">Tunisia</a></td>
+<td>788</td>
+<td>TUN</td>
+<td id="TN">TN</td>
+<td><a href="/wiki/ISO_3166-2:TN" title="ISO 3166-2:TN">ISO 3166-2:TN</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Turkey.svg" class="image" title="Flag of Turkey"><img alt="Flag of Turkey" longdesc="/wiki/Image:Flag_of_Turkey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Turkey.svg/22px-Flag_of_Turkey.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Turkey" title="Turkey">Turkey</a></td>
+<td>792</td>
+<td>TUR</td>
+<td id="TR">TR</td>
+<td><a href="/wiki/ISO_3166-2:TR" title="ISO 3166-2:TR">ISO 3166-2:TR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Turkmenistan.svg" class="image" title="Flag of Turkmenistan"><img alt="Flag of Turkmenistan" longdesc="/wiki/Image:Flag_of_Turkmenistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Turkmenistan.svg/22px-Flag_of_Turkmenistan.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Turkmenistan" title="Turkmenistan">Turkmenistan</a></td>
+<td>795</td>
+
+<td>TKM</td>
+<td id="TM">TM</td>
+<td><a href="/wiki/ISO_3166-2:TM" title="ISO 3166-2:TM">ISO 3166-2:TM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="image" title="Flag of the Turks and Caicos Islands"><img alt="Flag of the Turks and Caicos Islands" longdesc="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_the_Turks_and_Caicos_Islands.svg/22px-Flag_of_the_Turks_and_Caicos_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></td>
+<td>796</td>
+<td>TCA</td>
+<td id="TC">TC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TC&amp;action=edit" class="new" title="ISO 3166-2:TC">ISO 3166-2:TC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tuvalu.svg" class="image" title="Flag of Tuvalu"><img alt="Flag of Tuvalu" longdesc="/wiki/Image:Flag_of_Tuvalu.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tuvalu.svg/22px-Flag_of_Tuvalu.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a></td>
+<td>798</td>
+<td>TUV</td>
+<td id="TV">TV</td>
+<td><a href="/wiki/ISO_3166-2:TV" title="ISO 3166-2:TV">ISO 3166-2:TV</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Uganda.svg" class="image" title="Flag of Uganda"><img alt="Flag of Uganda" longdesc="/wiki/Image:Flag_of_Uganda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Flag_of_Uganda.svg/22px-Flag_of_Uganda.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Uganda" title="Uganda">Uganda</a></td>
+<td>800</td>
+<td>UGA</td>
+<td id="UG">UG</td>
+<td><a href="/wiki/ISO_3166-2:UG" title="ISO 3166-2:UG">ISO 3166-2:UG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ukraine.svg" class="image" title="Flag of Ukraine"><img alt="Flag of Ukraine" longdesc="/wiki/Image:Flag_of_Ukraine.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Ukraine.svg/22px-Flag_of_Ukraine.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Ukraine" title="Ukraine">Ukraine</a></td>
+<td>804</td>
+<td>UKR</td>
+
+<td id="UA">UA</td>
+<td><a href="/wiki/ISO_3166-2:UA" title="ISO 3166-2:UA">ISO 3166-2:UA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="image" title="Flag of the United Arab Emirates"><img alt="Flag of the United Arab Emirates" longdesc="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_United_Arab_Emirates.svg/22px-Flag_of_the_United_Arab_Emirates.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/United_Arab_Emirates" title="United Arab Emirates">United Arab Emirates</a></td>
+<td>784</td>
+<td>ARE</td>
+<td id="AE">AE</td>
+<td><a href="/wiki/ISO_3166-2:AE" title="ISO 3166-2:AE">ISO 3166-2:AE</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="image" title="Flag of the United Kingdom"><img alt="Flag of the United Kingdom" longdesc="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_United_Kingdom.svg/22px-Flag_of_the_United_Kingdom.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a></td>
+<td>826</td>
+<td>GBR</td>
+<td id="GB">GB</td>
+<td><a href="/wiki/ISO_3166-2:GB" title="ISO 3166-2:GB">ISO 3166-2:GB</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/22px-Flag_of_the_United_States.svg.png"; height="12" width="22"></a>&nbsp;<a href="/wiki/United_States" title="United States">United States</a></td>
+<td>840</td>
+
+<td>USA</td>
+<td id="US">US</td>
+<td><a href="/wiki/ISO_3166-2:US" title="ISO 3166-2:US">ISO 3166-2:US</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of United States Minor Outlying Islands"><img alt="Flag of United States Minor Outlying Islands" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/22px-Flag_of_the_United_States.svg.png"; height="12" width="22"></a>&nbsp;<a href="/wiki/United_States_Minor_Outlying_Islands" title="United States Minor Outlying Islands">United States Minor Outlying Islands</a></td>
+<td>581</td>
+<td>UMI</td>
+<td id="UM">UM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:UM&amp;action=edit" class="new" title="ISO 3166-2:UM">ISO 3166-2:UM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Uruguay.svg" class="image" title="Flag of Uruguay"><img alt="Flag of Uruguay" longdesc="/wiki/Image:Flag_of_Uruguay.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Uruguay.svg/22px-Flag_of_Uruguay.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Uruguay" title="Uruguay">Uruguay</a></td>
+<td>858</td>
+<td>URY</td>
+<td id="UY">UY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:UY&amp;action=edit" class="new" title="ISO 3166-2:UY">ISO 3166-2:UY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Uzbekistan.svg" class="image" title="Flag of Uzbekistan"><img alt="Flag of Uzbekistan" longdesc="/wiki/Image:Flag_of_Uzbekistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Uzbekistan.svg/22px-Flag_of_Uzbekistan.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Uzbekistan" title="Uzbekistan">Uzbekistan</a></td>
+<td>860</td>
+
+<td>UZB</td>
+<td id="UZ">UZ</td>
+<td><a href="/wiki/ISO_3166-2:UZ" title="ISO 3166-2:UZ">ISO 3166-2:UZ</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Vanuatu.svg" class="image" title="Flag of Vanuatu"><img alt="Flag of Vanuatu" longdesc="/wiki/Image:Flag_of_Vanuatu.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Vanuatu.svg/22px-Flag_of_Vanuatu.svg.png"; height="13" width="22"></a>&nbsp;<a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a></td>
+<td>548</td>
+<td>VUT</td>
+
+<td id="VU">VU</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VU&amp;action=edit" class="new" title="ISO 3166-2:VU">ISO 3166-2:VU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Venezuela.svg" class="image" title="Flag of Venezuela"><img alt="Flag of Venezuela" longdesc="/wiki/Image:Flag_of_Venezuela.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Venezuela.svg/22px-Flag_of_Venezuela.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Venezuela" title="Venezuela">Venezuela</a></td>
+<td>862</td>
+<td>VEN</td>
+<td id="VE">VE</td>
+<td><a href="/wiki/ISO_3166-2:VE" title="ISO 3166-2:VE">ISO 3166-2:VE</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Vietnam.svg" class="image" title="Flag of Vietnam"><img alt="Flag of Vietnam" longdesc="/wiki/Image:Flag_of_Vietnam.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Vietnam.svg/22px-Flag_of_Vietnam.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Vietnam" title="Vietnam">Viet Nam</a></td>
+<td>704</td>
+<td>VNM</td>
+<td id="VN">VN</td>
+<td><a href="/wiki/ISO_3166-2:VN" title="ISO 3166-2:VN">ISO 3166-2:VN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="image" title="Flag of the British Virgin Islands"><img alt="Flag of the British Virgin Islands" longdesc="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/Flag_of_the_British_Virgin_Islands.svg/22px-Flag_of_the_British_Virgin_Islands.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">Virgin Islands, British</a></td>
+<td>092</td>
+
+<td>VGB</td>
+<td id="VG">VG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VG&amp;action=edit" class="new" title="ISO 3166-2:VG">ISO 3166-2:VG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="image" title="Flag of the United States Virgin Islands"><img alt="Flag of the United States Virgin Islands" longdesc="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_the_United_States_Virgin_Islands.svg/22px-Flag_of_the_United_States_Virgin_Islands.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">Virgin Islands, U.S.</a></td>
+<td>850</td>
+<td>VIR</td>
+<td id="VI">VI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VI&amp;action=edit" class="new" title="ISO 3166-2:VI">ISO 3166-2:VI</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Wallis and Futuna"><img alt="Flag of Wallis and Futuna" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a></td>
+<td>876</td>
+<td>WLF</td>
+<td id="WF">WF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:WF&amp;action=edit" class="new" title="ISO 3166-2:WF">ISO 3166-2:WF</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Western_Sahara.svg" class="image" title="Flag of Western Sahara"><img alt="Flag of Western Sahara" longdesc="/wiki/Image:Flag_of_Western_Sahara.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Flag_of_Western_Sahara.svg/22px-Flag_of_Western_Sahara.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Western_Sahara" title="Western Sahara">Western Sahara</a></td>
+<td>732</td>
+<td>ESH</td>
+<td id="EH">EH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:EH&amp;action=edit" class="new" title="ISO 3166-2:EH">ISO 3166-2:EH</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Yemen.svg" class="image" title="Flag of Yemen"><img alt="Flag of Yemen" longdesc="/wiki/Image:Flag_of_Yemen.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Yemen.svg/22px-Flag_of_Yemen.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Yemen" title="Yemen">Yemen</a></td>
+
+<td>887</td>
+<td>YEM</td>
+<td id="YE">YE</td>
+<td><a href="/wiki/ISO_3166-2:YE" title="ISO 3166-2:YE">ISO 3166-2:YE</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Zambia.svg" class="image" title="Flag of Zambia"><img alt="Flag of Zambia" longdesc="/wiki/Image:Flag_of_Zambia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Zambia.svg/22px-Flag_of_Zambia.svg.png"; height="15" width="22"></a>&nbsp;<a href="/wiki/Zambia" title="Zambia">Zambia</a></td>
+<td>894</td>
+
+<td>ZMB</td>
+<td id="ZM">ZM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:ZM&amp;action=edit" class="new" title="ISO 3166-2:ZM">ISO 3166-2:ZM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Zimbabwe.svg" class="image" title="Flag of Zimbabwe"><img alt="Flag of Zimbabwe" longdesc="/wiki/Image:Flag_of_Zimbabwe.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Flag_of_Zimbabwe.svg/22px-Flag_of_Zimbabwe.svg.png"; height="11" width="22"></a>&nbsp;<a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a></td>
+<td>716</td>
+<td>ZWE</td>
+<td id="ZW">ZW</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:ZW&amp;action=edit" class="new" title="ISO 3166-2:ZW">ISO 3166-2:ZW</a></td>
+</tr>
+
+</tbody>
+</table>
+
+<h1>Country Continent Mapping</h1>
+<p>abstracted from <a href="http://en.wikipedia.org/wiki/List_of_countries_by_continent";>wikipedia continent country page</a></p>
+<table id="continents">
+<!-- Africa -->
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Algeria.svg" class="image" title="Flag of Algeria"><img alt="Flag of Algeria" longdesc="/wiki/Image:Flag_of_Algeria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Algeria.svg/50px-Flag_of_Algeria.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Algeria" title="Algeria">Algeria</a></b> – <a href="/wiki/Algiers" title="Algiers">Algiers</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Angola.svg" class="image" title="Flag of Angola"><img alt="Flag of Angola" longdesc="/wiki/Image:Flag_of_Angola.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Flag_of_Angola.svg/50px-Flag_of_Angola.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Angola" title="Angola">Angola</a></b> – <a href="/wiki/Luanda" title="Luanda">Luanda</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Benin.svg" class="image" title="Flag of Benin"><img alt="Flag of Benin" longdesc="/wiki/Image:Flag_of_Benin.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Benin.svg/50px-Flag_of_Benin.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Benin" title="Benin">Benin</a></b> – <a href="/wiki/Porto-Novo" title="Porto-Novo">Porto-Novo</a> (seat of government at <a href="/wiki/Cotonou" title="Cotonou">Cotonou</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Botswana.svg" class="image" title="Flag of Botswana"><img alt="Flag of Botswana" longdesc="/wiki/Image:Flag_of_Botswana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Botswana.svg/50px-Flag_of_Botswana.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Botswana" title="Botswana">Botswana</a></b> – <a href="/wiki/Gaborone" title="Gaborone">Gaborone</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Burkina_Faso.svg" class="image" title="Flag of Burkina Faso"><img alt="Flag of Burkina Faso" longdesc="/wiki/Image:Flag_of_Burkina_Faso.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Burkina_Faso.svg/50px-Flag_of_Burkina_Faso.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Burkina_Faso" title="Burkina Faso">Burkina Faso</a></b> – <a href="/wiki/Ouagadougou" title="Ouagadougou">Ouagadougou</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Burundi.svg" class="image" title="Flag of Burundi"><img alt="Flag of Burundi" longdesc="/wiki/Image:Flag_of_Burundi.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Flag_of_Burundi.svg/50px-Flag_of_Burundi.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Burundi" title="Burundi">Burundi</a></b> – <a href="/wiki/Bujumbura" title="Bujumbura">Bujumbura</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cameroon.svg" class="image" title="Flag of Cameroon"><img alt="Flag of Cameroon" longdesc="/wiki/Image:Flag_of_Cameroon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Cameroon.svg/50px-Flag_of_Cameroon.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Cameroon" title="Cameroon">Cameroon</a></b> – <a href="/wiki/Yaound%C3%A9" title="Yaoundé">Yaoundé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cape_Verde.svg" class="image" title="Flag of Cape Verde"><img alt="Flag of Cape Verde" longdesc="/wiki/Image:Flag_of_Cape_Verde.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Cape_Verde.svg/50px-Flag_of_Cape_Verde.svg.png"; height="29" width="50"></a>&nbsp;<a href="/wiki/Cape_Verde" title="Cape Verde">Cape Verde</a></b> – <a href="/wiki/Praia" title="Praia">Praia</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="image" title="Flag of the Central African Republic"><img alt="Flag of the Central African Republic" longdesc="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Central_African_Republic.svg/50px-Flag_of_the_Central_African_Republic.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Central_African_Republic" title="Central African Republic">Central African Republic</a></b> – <a href="/wiki/Bangui" title="Bangui">Bangui</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Chad.svg" class="image" title="Flag of Chad"><img alt="Flag of Chad" longdesc="/wiki/Image:Flag_of_Chad.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Flag_of_Chad.svg/50px-Flag_of_Chad.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Chad" title="Chad">Chad</a></b> – <a href="/wiki/N%27Djamena" title="N'Djamena">N'Djamena</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Comoros.svg" class="image" title="Flag of the Comoros"><img alt="Flag of the Comoros" longdesc="/wiki/Image:Flag_of_the_Comoros.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Flag_of_the_Comoros.svg/50px-Flag_of_the_Comoros.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Comoros" title="Comoros">Comoros</a></b> – <a href="/wiki/Moroni%2C_Comoros" title="Moroni, Comoros">Moroni</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="image" title="Flag of the Democratic Republic of the Congo"><img alt="Flag of the Democratic Republic of the Congo" longdesc="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Democratic_Republic_of_the_Congo.svg/50px-Flag_of_the_Democratic_Republic_of_the_Congo.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Democratic_Republic_of_the_Congo" title="Democratic Republic of the Congo">Congo, Democratic Republic of</a></b> (also known as <b>Congo-Kinshasa</b>, formerly known as <b>Zaire</b>) – <a href="/wiki/Kinshasa" title="Kinshasa">Kinshasa</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="image" title="Flag of the Republic of the Congo"><img alt="Flag of the Republic of the Congo" longdesc="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Republic_of_the_Congo.svg/50px-Flag_of_the_Republic_of_the_Congo.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Republic_of_the_Congo" title="Republic of the Congo">Congo, Republic of</a></b> (also known as <b>Congo-Brazzaville</b>) – <a href="/wiki/Brazzaville" title="Brazzaville">Brazzaville</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="image" title="Flag of Côte d'Ivoire"><img alt="Flag of Côte d'Ivoire" longdesc="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Flag_of_Cote_d%27Ivoire.svg/50px-Flag_of_Cote_d%27Ivoire.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/C%C3%B4te_d%27Ivoire" title="Côte d'Ivoire">Côte d'Ivoire</a></b> (commonly known as <b>Ivory Coast</b>) – <a href="/wiki/Yamoussoukro" title="Yamoussoukro">Yamoussoukro</a> (seat of government at <a href="/wiki/Abidjan" title="Abidjan">Abidjan</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Djibouti.svg" class="image" title="Flag of Djibouti"><img alt="Flag of Djibouti" longdesc="/wiki/Image:Flag_of_Djibouti.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_Djibouti.svg/50px-Flag_of_Djibouti.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Djibouti" title="Djibouti">Djibouti</a></b> – <a href="/wiki/Djibouti%2C_Djibouti" title="Djibouti, Djibouti">Djibouti</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Egypt.svg" class="image" title="Flag of Egypt"><img alt="Flag of Egypt" longdesc="/wiki/Image:Flag_of_Egypt.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Egypt.svg/50px-Flag_of_Egypt.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Egypt" title="Egypt">Egypt</a></b> – <a href="/wiki/Cairo" title="Cairo">Cairo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="image" title="Flag of Equatorial Guinea"><img alt="Flag of Equatorial Guinea" longdesc="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Equatorial_Guinea.svg/50px-Flag_of_Equatorial_Guinea.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Equatorial_Guinea" title="Equatorial Guinea">Equatorial Guinea</a></b> – <a href="/wiki/Malabo" title="Malabo">Malabo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Eritrea.svg" class="image" title="Flag of Eritrea"><img alt="Flag of Eritrea" longdesc="/wiki/Image:Flag_of_Eritrea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Flag_of_Eritrea.svg/50px-Flag_of_Eritrea.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Eritrea" title="Eritrea">Eritrea</a></b> – <a href="/wiki/Asmara" title="Asmara">Asmara</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Ethiopia.svg" class="image" title="Flag of Ethiopia"><img alt="Flag of Ethiopia" longdesc="/wiki/Image:Flag_of_Ethiopia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_Ethiopia.svg/50px-Flag_of_Ethiopia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Ethiopia" title="Ethiopia">Ethiopia</a></b> – <a href="/wiki/Addis_Ababa" title="Addis Ababa">Addis Ababa</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Gabon.svg" class="image" title="Flag of Gabon"><img alt="Flag of Gabon" longdesc="/wiki/Image:Flag_of_Gabon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Flag_of_Gabon.svg/50px-Flag_of_Gabon.svg.png"; height="38" width="50"></a>&nbsp;<a href="/wiki/Gabon" title="Gabon">Gabon</a></b> – <a href="/wiki/Libreville" title="Libreville">Libreville</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_The_Gambia.svg" class="image" title="Flag of The Gambia"><img alt="Flag of The Gambia" longdesc="/wiki/Image:Flag_of_The_Gambia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_The_Gambia.svg/50px-Flag_of_The_Gambia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/The_Gambia" title="The Gambia">Gambia</a></b> – <a href="/wiki/Banjul" title="Banjul">Banjul</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Ghana.svg" class="image" title="Flag of Ghana"><img alt="Flag of Ghana" longdesc="/wiki/Image:Flag_of_Ghana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Ghana.svg/50px-Flag_of_Ghana.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Ghana" title="Ghana">Ghana</a></b> – <a href="/wiki/Accra" title="Accra">Accra</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Guinea.svg" class="image" title="Flag of Guinea"><img alt="Flag of Guinea" longdesc="/wiki/Image:Flag_of_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Guinea.svg/50px-Flag_of_Guinea.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Guinea" title="Guinea">Guinea</a></b> – <a href="/wiki/Conakry" title="Conakry">Conakry</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="image" title="Flag of Guinea-Bissau"><img alt="Flag of Guinea-Bissau" longdesc="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Guinea-Bissau.svg/50px-Flag_of_Guinea-Bissau.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Guinea-Bissau" title="Guinea-Bissau">Guinea-Bissau</a></b> – <a href="/wiki/Bissau" title="Bissau">Bissau</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Kenya.svg" class="image" title="Flag of Kenya"><img alt="Flag of Kenya" longdesc="/wiki/Image:Flag_of_Kenya.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Kenya.svg/50px-Flag_of_Kenya.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Kenya" title="Kenya">Kenya</a></b> – <a href="/wiki/Nairobi" title="Nairobi">Nairobi</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Lesotho.svg" class="image" title="Flag of Lesotho"><img alt="Flag of Lesotho" longdesc="/wiki/Image:Flag_of_Lesotho.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Flag_of_Lesotho.svg/50px-Flag_of_Lesotho.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Lesotho" title="Lesotho">Lesotho</a></b> – <a href="/wiki/Maseru" title="Maseru">Maseru</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Liberia.svg" class="image" title="Flag of Liberia"><img alt="Flag of Liberia" longdesc="/wiki/Image:Flag_of_Liberia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_Liberia.svg/50px-Flag_of_Liberia.svg.png"; height="26" width="50"></a>&nbsp;<a href="/wiki/Liberia" title="Liberia">Liberia</a></b> – <a href="/wiki/Monrovia" title="Monrovia">Monrovia</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Libya.svg" class="image" title="Flag of Libya"><img alt="Flag of Libya" longdesc="/wiki/Image:Flag_of_Libya.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Libya.svg/50px-Flag_of_Libya.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Libya" title="Libya">Libya</a></b> – <a href="/wiki/Tripoli" title="Tripoli">Tripoli</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Madagascar.svg" class="image" title="Flag of Madagascar"><img alt="Flag of Madagascar" longdesc="/wiki/Image:Flag_of_Madagascar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Madagascar.svg/50px-Flag_of_Madagascar.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Madagascar" title="Madagascar">Madagascar</a></b> – <a href="/wiki/Antananarivo" title="Antananarivo">Antananarivo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Malawi.svg" class="image" title="Flag of Malawi"><img alt="Flag of Malawi" longdesc="/wiki/Image:Flag_of_Malawi.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Flag_of_Malawi.svg/50px-Flag_of_Malawi.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Malawi" title="Malawi">Malawi</a></b> – <a href="/wiki/Lilongwe" title="Lilongwe">Lilongwe</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mali.svg" class="image" title="Flag of Mali"><img alt="Flag of Mali" longdesc="/wiki/Image:Flag_of_Mali.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Mali.svg/50px-Flag_of_Mali.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Mali" title="Mali">Mali</a></b> – <a href="/wiki/Bamako" title="Bamako">Bamako</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mauritania.svg" class="image" title="Flag of Mauritania"><img alt="Flag of Mauritania" longdesc="/wiki/Image:Flag_of_Mauritania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Flag_of_Mauritania.svg/50px-Flag_of_Mauritania.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Mauritania" title="Mauritania">Mauritania</a></b> – <a href="/wiki/Nouakchott" title="Nouakchott">Nouakchott</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mauritius.svg" class="image" title="Flag of Mauritius"><img alt="Flag of Mauritius" longdesc="/wiki/Image:Flag_of_Mauritius.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Mauritius.svg/50px-Flag_of_Mauritius.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Mauritius" title="Mauritius">Mauritius</a></b> – <a href="/wiki/Port_Louis" title="Port Louis">Port Louis</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Mayotte"><img alt="Flag of Mayotte" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Mayotte" title="Mayotte">Mayotte</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Mamoudzou" title="Mamoudzou">Mamoudzou</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Morocco.svg" class="image" title="Flag of Morocco"><img alt="Flag of Morocco" longdesc="/wiki/Image:Flag_of_Morocco.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Morocco.svg/50px-Flag_of_Morocco.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Morocco" title="Morocco">Morocco</a></b> – <a href="/wiki/Rabat" title="Rabat">Rabat</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mozambique.svg" class="image" title="Flag of Mozambique"><img alt="Flag of Mozambique" longdesc="/wiki/Image:Flag_of_Mozambique.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Mozambique.svg/50px-Flag_of_Mozambique.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Mozambique" title="Mozambique">Mozambique</a></b> – <a href="/wiki/Maputo" title="Maputo">Maputo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Namibia.svg" class="image" title="Flag of Namibia"><img alt="Flag of Namibia" longdesc="/wiki/Image:Flag_of_Namibia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Namibia.svg/50px-Flag_of_Namibia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Namibia" title="Namibia">Namibia</a></b> – <a href="/wiki/Windhoek" title="Windhoek">Windhoek</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Niger.svg" class="image" title="Flag of Niger"><img alt="Flag of Niger" longdesc="/wiki/Image:Flag_of_Niger.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Flag_of_Niger.svg/50px-Flag_of_Niger.svg.png"; height="43" width="50"></a>&nbsp;<a href="/wiki/Niger" title="Niger">Niger</a></b> – <a href="/wiki/Niamey" title="Niamey">Niamey</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Nigeria.svg" class="image" title="Flag of Nigeria"><img alt="Flag of Nigeria" longdesc="/wiki/Image:Flag_of_Nigeria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Flag_of_Nigeria.svg/50px-Flag_of_Nigeria.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Nigeria" title="Nigeria">Nigeria</a></b> – <a href="/wiki/Abuja" title="Abuja">Abuja</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Réunion"><img alt="Flag of Réunion" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/R%C3%A9union" title="Réunion">Réunion</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Saint-Denis%2C_R%C3%A9union" title="Saint-Denis, Réunion">Saint-Denis</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Rwanda.svg" class="image" title="Flag of Rwanda"><img alt="Flag of Rwanda" longdesc="/wiki/Image:Flag_of_Rwanda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Rwanda.svg/50px-Flag_of_Rwanda.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Rwanda" title="Rwanda">Rwanda</a></b> – <a href="/wiki/Kigali" title="Kigali">Kigali</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_Saint_Helena.svg" class="image" title="Flag of Saint Helena"><img alt="Flag of Saint Helena" longdesc="/wiki/Image:Flag_of_Saint_Helena.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Saint_Helena.svg/50px-Flag_of_Saint_Helena.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Saint_Helena" title="Saint Helena">Saint Helena</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Jamestown%2C_Saint_Helena" title="Jamestown, Saint Helena">Jamestown</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="image" title="Flag of São Tomé and Príncipe"><img alt="Flag of São Tomé and Príncipe" longdesc="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Sao_Tome_and_Principe.svg/50px-Flag_of_Sao_Tome_and_Principe.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe" title="São Tomé and Príncipe">Sao Tome and Principe</a></b> – <a href="/wiki/S%C3%A3o_Tom%C3%A9" title="São Tomé">São Tomé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Senegal.svg" class="image" title="Flag of Senegal"><img alt="Flag of Senegal" longdesc="/wiki/Image:Flag_of_Senegal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Flag_of_Senegal.svg/50px-Flag_of_Senegal.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Senegal" title="Senegal">Senegal</a></b> – <a href="/wiki/Dakar" title="Dakar">Dakar</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Seychelles.svg" class="image" title="Flag of the Seychelles"><img alt="Flag of the Seychelles" longdesc="/wiki/Image:Flag_of_the_Seychelles.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Seychelles.svg/50px-Flag_of_the_Seychelles.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Seychelles" title="Seychelles">Seychelles</a></b> – <a href="/wiki/Victoria%2C_Seychelles" title="Victoria, Seychelles">Victoria</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sierra_Leone.svg" class="image" title="Flag of Sierra Leone"><img alt="Flag of Sierra Leone" longdesc="/wiki/Image:Flag_of_Sierra_Leone.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Sierra_Leone.svg/50px-Flag_of_Sierra_Leone.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a></b> – <a href="/wiki/Freetown" title="Freetown">Freetown</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Somalia.svg" class="image" title="Flag of Somalia"><img alt="Flag of Somalia" longdesc="/wiki/Image:Flag_of_Somalia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_Somalia.svg/50px-Flag_of_Somalia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Somalia" title="Somalia">Somalia</a></b> – <a href="/wiki/Mogadishu" title="Mogadishu">Mogadishu</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_South_Africa.svg" class="image" title="Flag of South Africa"><img alt="Flag of South Africa" longdesc="/wiki/Image:Flag_of_South_Africa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Flag_of_South_Africa.svg/50px-Flag_of_South_Africa.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/South_Africa" title="South Africa">South Africa</a></b> – <a href="/wiki/Pretoria" title="Pretoria">Pretoria</a> (administrative), <a href="/wiki/Cape_Town" title="Cape Town">Cape Town</a> (legislative), <a href="/wiki/Bloemfontein" title="Bloemfontein">Bloemfontein</a> (judicial)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sudan.svg" class="image" title="Flag of Sudan"><img alt="Flag of Sudan" longdesc="/wiki/Image:Flag_of_Sudan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Sudan.svg/50px-Flag_of_Sudan.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Sudan" title="Sudan">Sudan</a></b> – <a href="/wiki/Khartoum" title="Khartoum">Khartoum</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Swaziland.svg" class="image" title="Flag of Swaziland"><img alt="Flag of Swaziland" longdesc="/wiki/Image:Flag_of_Swaziland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Flag_of_Swaziland.svg/50px-Flag_of_Swaziland.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Swaziland" title="Swaziland">Swaziland</a></b> – <a href="/wiki/Mbabane" title="Mbabane">Mbabane</a> (administrative), <a href="/wiki/Lobamba" title="Lobamba">Lobamba</a> (royal and legislative)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Tanzania.svg" class="image" title="Flag of Tanzania"><img alt="Flag of Tanzania" longdesc="/wiki/Image:Flag_of_Tanzania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tanzania.svg/50px-Flag_of_Tanzania.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Tanzania" title="Tanzania">Tanzania</a></b> – <a href="/wiki/Dodoma" title="Dodoma">Dodoma</a> (seat of government at <a href="/wiki/Dar_es_Salaam" title="Dar es Salaam">Dar es Salaam</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Togo.svg" class="image" title="Flag of Togo"><img alt="Flag of Togo" longdesc="/wiki/Image:Flag_of_Togo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Flag_of_Togo.svg/50px-Flag_of_Togo.svg.png"; height="31" width="50"></a>&nbsp;<a href="/wiki/Togo" title="Togo">Togo</a></b> – <a href="/wiki/Lom%C3%A9" title="Lomé">Lomé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Tunisia.svg" class="image" title="Flag of Tunisia"><img alt="Flag of Tunisia" longdesc="/wiki/Image:Flag_of_Tunisia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Tunisia.svg/50px-Flag_of_Tunisia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Tunisia" title="Tunisia">Tunisia</a></b> – <a href="/wiki/Tunis" title="Tunis">Tunis</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Uganda.svg" class="image" title="Flag of Uganda"><img alt="Flag of Uganda" longdesc="/wiki/Image:Flag_of_Uganda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Flag_of_Uganda.svg/50px-Flag_of_Uganda.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Uganda" title="Uganda">Uganda</a></b> – <a href="/wiki/Kampala" title="Kampala">Kampala</a></td></tr>
+<tr><td>Africa</td><td><i><b><a href="/wiki/Image:Flag_of_Western_Sahara.svg" class="image" title="Flag of Western Sahara"><img alt="Flag of Western Sahara" longdesc="/wiki/Image:Flag_of_Western_Sahara.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Flag_of_Western_Sahara.svg/50px-Flag_of_Western_Sahara.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Western_Sahara" title="Western Sahara">Western Sahara</a></b></i> – <a href="/wiki/El_Aai%C3%BAn" title="El Aaiún">El Aaiún</a> (unofficial)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Zambia.svg" class="image" title="Flag of Zambia"><img alt="Flag of Zambia" longdesc="/wiki/Image:Flag_of_Zambia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Zambia.svg/50px-Flag_of_Zambia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Zambia" title="Zambia">Zambia</a></b> – <a href="/wiki/Lusaka" title="Lusaka">Lusaka</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Zimbabwe.svg" class="image" title="Flag of Zimbabwe"><img alt="Flag of Zimbabwe" longdesc="/wiki/Image:Flag_of_Zimbabwe.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Flag_of_Zimbabwe.svg/50px-Flag_of_Zimbabwe.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a></b> – <a href="/wiki/Harare" title="Harare">Harare</a></td></tr>
+
+<!-- Eurasia: Asia -->
+
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Afghanistan.svg" class="image" title="Flag of Afghanistan"><img alt="Flag of Afghanistan" longdesc="/wiki/Image:Flag_of_Afghanistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Afghanistan.svg/50px-Flag_of_Afghanistan.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Afghanistan" title="Afghanistan">Afghanistan</a></b> – <a href="/wiki/Kabul" title="Kabul">Kabul</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Armenia.svg" class="image" title="Flag of Armenia"><img alt="Flag of Armenia" longdesc="/wiki/Image:Flag_of_Armenia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Flag_of_Armenia.svg/50px-Flag_of_Armenia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Armenia" title="Armenia">Armenia</a></b><sup id="_ref-europe_0" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Yerevan" title="Yerevan">Yerevan</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Azerbaijan.svg" class="image" title="Flag of Azerbaijan"><img alt="Flag of Azerbaijan" longdesc="/wiki/Image:Flag_of_Azerbaijan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Azerbaijan.svg/50px-Flag_of_Azerbaijan.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Azerbaijan" title="Azerbaijan">Azerbaijan</a></b><sup id="_ref-europe_1" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Baku" title="Baku">Baku</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bahrain.svg" class="image" title="Flag of Bahrain"><img alt="Flag of Bahrain" longdesc="/wiki/Image:Flag_of_Bahrain.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Bahrain.svg/50px-Flag_of_Bahrain.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Bahrain" title="Bahrain">Bahrain</a></b> – <a href="/wiki/Manama" title="Manama">Manama</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bangladesh.svg" class="image" title="Flag of Bangladesh"><img alt="Flag of Bangladesh" longdesc="/wiki/Image:Flag_of_Bangladesh.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Flag_of_Bangladesh.svg/50px-Flag_of_Bangladesh.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a></b> – <a href="/wiki/Dhaka" title="Dhaka">Dhaka</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bhutan.svg" class="image" title="Flag of Bhutan"><img alt="Flag of Bhutan" longdesc="/wiki/Image:Flag_of_Bhutan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Flag_of_Bhutan.svg/50px-Flag_of_Bhutan.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Bhutan" title="Bhutan">Bhutan</a></b> – <a href="/wiki/Thimphu" title="Thimphu">Thimphu</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="image" title="Flag of British Indian Ocean Territory"><img alt="Flag of British Indian Ocean Territory" longdesc="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Flag_of_the_British_Indian_Ocean_Territory.svg/50px-Flag_of_the_British_Indian_Ocean_Territory.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a></i><sup id="_ref-1" class="reference"><a href="#_note-1" title="">[3]</a></sup> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Brunei.svg" class="image" title="Flag of Brunei"><img alt="Flag of Brunei" longdesc="/wiki/Image:Flag_of_Brunei.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Brunei.svg/50px-Flag_of_Brunei.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Brunei" title="Brunei">Brunei</a></b> – <a href="/wiki/Bandar_Seri_Begawan" title="Bandar Seri Begawan">Bandar Seri Begawan</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Cambodia.svg" class="image" title="Flag of Cambodia"><img alt="Flag of Cambodia" longdesc="/wiki/Image:Flag_of_Cambodia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_Cambodia.svg/50px-Flag_of_Cambodia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Cambodia" title="Cambodia">Cambodia</a></b> – <a href="/wiki/Phnom_Penh" title="Phnom Penh">Phnom Penh</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="image" title="Flag of the People's Republic of China"><img alt="Flag of the People's Republic of China" longdesc="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_the_People%27s_Republic_of_China.svg/50px-Flag_of_the_People%27s_Republic_of_China.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/People%27s_Republic_of_China" title="People's Republic of China">China, People's Republic of</a></b> – <a href="/wiki/Beijing" title="Beijing">Beijing</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="image" title="Flag of the Republic of China"><img alt="Flag of the Republic of China" longdesc="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Flag_of_the_Republic_of_China.svg/50px-Flag_of_the_Republic_of_China.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Republic_of_China" title="Republic of China">China, Republic of</a></b> (commonly known as <b>Taiwan</b>) – <a href="/wiki/Taipei" title="Taipei">Taipei</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Christmas_Island.svg" class="image" title="Flag of Christmas Island"><img alt="Flag of Christmas Island" longdesc="/wiki/Image:Flag_of_Christmas_Island.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Flag_of_Christmas_Island.svg/50px-Flag_of_Christmas_Island.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></i><sup id="_ref-australia_0" class="reference"><a href="#_note-australia" title="">[4]</a></sup> (overseas territory of Australia)</td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of the Cocos (Keeling) Islands"><img alt="Flag of the Cocos (Keeling) Islands" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/50px-Flag_of_Australia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Cocos_%28Keeling%29_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></i><sup id="_ref-australia_1" class="reference"><a href="#_note-australia" title="">[4]</a></sup> (overseas territory of Australia)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Cyprus.svg" class="image" title="Flag of Cyprus"><img alt="Flag of Cyprus" longdesc="/wiki/Image:Flag_of_Cyprus.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Cyprus.svg/50px-Flag_of_Cyprus.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Cyprus" title="Cyprus">Cyprus</a></b><sup id="_ref-europe_2" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Nicosia" title="Nicosia">Nicosia</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Georgia.svg" class="image" title="Flag of Georgia (country)"><img alt="Flag of Georgia (country)" longdesc="/wiki/Image:Flag_of_Georgia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Georgia.svg/50px-Flag_of_Georgia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Georgia_%28country%29" title="Georgia (country)">Georgia</a></b><sup id="_ref-europe_3" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Tbilisi" title="Tbilisi">Tbilisi</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Hong_Kong.svg" class="image" title="Flag of Hong Kong"><img alt="Flag of Hong Kong" longdesc="/wiki/Image:Flag_of_Hong_Kong.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Flag_of_Hong_Kong.svg/50px-Flag_of_Hong_Kong.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></i> (<a href="/wiki/Special_administrative_region_%28People%27s_Republic_of_China%29" title="Special administrative region (People's Republic of China)">special administrative region of the People's Republic of China</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_India.svg" class="image" title="Flag of India"><img alt="Flag of India" longdesc="/wiki/Image:Flag_of_India.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_India.svg/50px-Flag_of_India.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/India" title="India">India</a></b> – <a href="/wiki/New_Delhi" title="New Delhi">New Delhi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Indonesia.svg" class="image" title="Flag of Indonesia"><img alt="Flag of Indonesia" longdesc="/wiki/Image:Flag_of_Indonesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Indonesia.svg/50px-Flag_of_Indonesia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Indonesia" title="Indonesia">Indonesia</a></b> – <a href="/wiki/Jakarta" title="Jakarta">Jakarta</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Iran.svg" class="image" title="Flag of Iran"><img alt="Flag of Iran" longdesc="/wiki/Image:Flag_of_Iran.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Flag_of_Iran.svg/50px-Flag_of_Iran.svg.png"; height="29" width="50"></a>&nbsp;<a href="/wiki/Iran" title="Iran">Iran</a></b> – <a href="/wiki/Tehran" title="Tehran">Tehran</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Iraq.svg" class="image" title="Flag of Iraq"><img alt="Flag of Iraq" longdesc="/wiki/Image:Flag_of_Iraq.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Iraq.svg/50px-Flag_of_Iraq.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Iraq" title="Iraq">Iraq</a></b> – <a href="/wiki/Baghdad" title="Baghdad">Baghdad</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Israel.svg" class="image" title="Flag of Israel"><img alt="Flag of Israel" longdesc="/wiki/Image:Flag_of_Israel.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Israel.svg/50px-Flag_of_Israel.svg.png"; height="36" width="50"></a>&nbsp;<a href="/wiki/Israel" title="Israel">Israel</a></b> – <a href="/wiki/Jerusalem" title="Jerusalem">Jerusalem</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Japan.svg" class="image" title="Flag of Japan"><img alt="Flag of Japan" longdesc="/wiki/Image:Flag_of_Japan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Flag_of_Japan.svg/50px-Flag_of_Japan.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Japan" title="Japan">Japan</a></b> – <a href="/wiki/Tokyo" title="Tokyo">Tokyo</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Jordan.svg" class="image" title="Flag of Jordan"><img alt="Flag of Jordan" longdesc="/wiki/Image:Flag_of_Jordan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Flag_of_Jordan.svg/50px-Flag_of_Jordan.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Jordan" title="Jordan">Jordan</a></b> – <a href="/wiki/Amman" title="Amman">Amman</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kazakhstan.svg" class="image" title="Flag of Kazakhstan"><img alt="Flag of Kazakhstan" longdesc="/wiki/Image:Flag_of_Kazakhstan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kazakhstan.svg/50px-Flag_of_Kazakhstan.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Kazakhstan" title="Kazakhstan">Kazakhstan</a></b> – <a href="/wiki/Astana" title="Astana">Astana</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_North_Korea.svg" class="image" title="Flag of North Korea"><img alt="Flag of North Korea" longdesc="/wiki/Image:Flag_of_North_Korea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Flag_of_North_Korea.svg/50px-Flag_of_North_Korea.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/North_Korea" title="North Korea">Korea, Democratic People's Republic of</a></b> (commonly known as <b>North Korea</b>) – <a href="/wiki/Pyongyang" title="Pyongyang">Pyongyang</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_South_Korea.svg" class="image" title="Flag of South Korea"><img alt="Flag of South Korea" longdesc="/wiki/Image:Flag_of_South_Korea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_South_Korea.svg/50px-Flag_of_South_Korea.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/South_Korea" title="South Korea">Korea, Republic of</a></b> (commonly known as <b>South Korea</b>) – <a href="/wiki/Seoul" title="Seoul">Seoul</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kuwait.svg" class="image" title="Flag of Kuwait"><img alt="Flag of Kuwait" longdesc="/wiki/Image:Flag_of_Kuwait.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Flag_of_Kuwait.svg/50px-Flag_of_Kuwait.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Kuwait" title="Kuwait">Kuwait</a></b> – <a href="/wiki/Kuwait_City" title="Kuwait City">Kuwait City</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="image" title="Flag of Kyrgyzstan"><img alt="Flag of Kyrgyzstan" longdesc="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Flag_of_Kyrgyzstan.svg/50px-Flag_of_Kyrgyzstan.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Kyrgyzstan" title="Kyrgyzstan">Kyrgyzstan</a></b> – <a href="/wiki/Bishkek" title="Bishkek">Bishkek</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Laos.svg" class="image" title="Flag of Laos"><img alt="Flag of Laos" longdesc="/wiki/Image:Flag_of_Laos.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Laos.svg/50px-Flag_of_Laos.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Laos" title="Laos">Laos</a></b> – <a href="/wiki/Vientiane" title="Vientiane">Vientiane</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Lebanon.svg" class="image" title="Flag of Lebanon"><img alt="Flag of Lebanon" longdesc="/wiki/Image:Flag_of_Lebanon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Flag_of_Lebanon.svg/50px-Flag_of_Lebanon.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Lebanon" title="Lebanon">Lebanon</a></b> – <a href="/wiki/Beirut" title="Beirut">Beirut</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Macau.svg" class="image" title="Flag of Macau"><img alt="Flag of Macau" longdesc="/wiki/Image:Flag_of_Macau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Flag_of_Macau.svg/50px-Flag_of_Macau.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Macau" title="Macau">Macau</a></i> (<a href="/wiki/Special_administrative_region_%28People%27s_Republic_of_China%29" title="Special administrative region (People's Republic of China)">special administrative region of the People's Republic of China</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Malaysia.svg" class="image" title="Flag of Malaysia"><img alt="Flag of Malaysia" longdesc="/wiki/Image:Flag_of_Malaysia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Flag_of_Malaysia.svg/50px-Flag_of_Malaysia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Malaysia" title="Malaysia">Malaysia</a></b> – <a href="/wiki/Kuala_Lumpur" title="Kuala Lumpur">Kuala Lumpur</a> (seat of government at <a href="/wiki/Putrajaya" title="Putrajaya">Putrajaya</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Maldives.svg" class="image" title="Flag of the Maldives"><img alt="Flag of the Maldives" longdesc="/wiki/Image:Flag_of_Maldives.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Maldives.svg/50px-Flag_of_Maldives.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Maldives" title="Maldives">Maldives</a></b> – <a href="/wiki/Mal%C3%A9" title="Malé">Malé</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Mongolia.svg" class="image" title="Flag of Mongolia"><img alt="Flag of Mongolia" longdesc="/wiki/Image:Flag_of_Mongolia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Mongolia.svg/50px-Flag_of_Mongolia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Mongolia" title="Mongolia">Mongolia</a></b> – <a href="/wiki/Ulaanbaatar" title="Ulaanbaatar">Ulaanbaatar</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Myanmar.svg" class="image" title="Flag of Myanmar"><img alt="Flag of Myanmar" longdesc="/wiki/Image:Flag_of_Myanmar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Flag_of_Myanmar.svg/50px-Flag_of_Myanmar.svg.png"; height="28" width="50"></a>&nbsp;<a href="/wiki/Myanmar" title="Myanmar">Myanmar</a></b> (formerly known as <b>Burma</b>) – <a href="/wiki/Naypyidaw" title="Naypyidaw">Naypyidaw</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Nepal.svg" class="image" title="Flag of Nepal"><img alt="Flag of Nepal" longdesc="/wiki/Image:Flag_of_Nepal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Flag_of_Nepal.svg/50px-Flag_of_Nepal.svg.png"; height="61" width="50"></a>&nbsp;<a href="/wiki/Nepal" title="Nepal">Nepal</a></b> – <a href="/wiki/Kathmandu" title="Kathmandu">Kathmandu</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Oman.svg" class="image" title="Flag of Oman"><img alt="Flag of Oman" longdesc="/wiki/Image:Flag_of_Oman.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Oman.svg/50px-Flag_of_Oman.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Oman" title="Oman">Oman</a></b> – <a href="/wiki/Muscat%2C_Oman" title="Muscat, Oman">Muscat</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Pakistan.svg" class="image" title="Flag of Pakistan"><img alt="Flag of Pakistan" longdesc="/wiki/Image:Flag_of_Pakistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Flag_of_Pakistan.svg/50px-Flag_of_Pakistan.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Pakistan" title="Pakistan">Pakistan</a></b> – <a href="/wiki/Islamabad" title="Islamabad">Islamabad</a></td></tr>
+<tr><td>Asia</td><td><i><b><a href="/wiki/Image:Flag_of_Palestine.svg" class="image" title="Palestinian flag"><img alt="Palestinian flag" longdesc="/wiki/Image:Flag_of_Palestine.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Palestine.svg/50px-Flag_of_Palestine.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Palestinian_territories" title="Palestinian territories">Palestinian territories</a></b></i> (collectively the territories of the <a href="/wiki/West_Bank" title="West Bank">West Bank</a> and the <a href="/wiki/Gaza_Strip" title="Gaza Strip">Gaza Strip</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_Philippines.svg" class="image" title="Flag of the Philippines"><img alt="Flag of the Philippines" longdesc="/wiki/Image:Flag_of_the_Philippines.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_the_Philippines.svg/50px-Flag_of_the_Philippines.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Philippines" title="Philippines">Philippines</a></b> – <a href="/wiki/Manila" title="Manila">Manila</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Qatar.svg" class="image" title="Flag of Qatar"><img alt="Flag of Qatar" longdesc="/wiki/Image:Flag_of_Qatar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Flag_of_Qatar.svg/50px-Flag_of_Qatar.svg.png"; height="20" width="50"></a>&nbsp;<a href="/wiki/Qatar" title="Qatar">Qatar</a></b> – <a href="/wiki/Doha" title="Doha">Doha</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="image" title="Flag of Saudi Arabia"><img alt="Flag of Saudi Arabia" longdesc="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Flag_of_Saudi_Arabia.svg/50px-Flag_of_Saudi_Arabia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Saudi_Arabia" title="Saudi Arabia">Saudi Arabia</a></b> – <a href="/wiki/Riyadh" title="Riyadh">Riyadh</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Singapore.svg" class="image" title="Flag of Singapore"><img alt="Flag of Singapore" longdesc="/wiki/Image:Flag_of_Singapore.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Singapore.svg/50px-Flag_of_Singapore.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Singapore" title="Singapore">Singapore</a></b> – Singapore<sup id="_ref-city-state_0" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Sri_Lanka.svg" class="image" title="Flag of Sri Lanka"><img alt="Flag of Sri Lanka" longdesc="/wiki/Image:Flag_of_Sri_Lanka.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Sri_Lanka.svg/50px-Flag_of_Sri_Lanka.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a></b> – <a href="/wiki/Sri_Jayawardenepura" title="Sri Jayawardenepura">Sri Jayawardenepura</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Syria.svg" class="image" title="Flag of Syria"><img alt="Flag of Syria" longdesc="/wiki/Image:Flag_of_Syria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Flag_of_Syria.svg/50px-Flag_of_Syria.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Syria" title="Syria">Syria</a></b> – <a href="/wiki/Damascus" title="Damascus">Damascus</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Tajikistan.svg" class="image" title="Flag of Tajikistan"><img alt="Flag of Tajikistan" longdesc="/wiki/Image:Flag_of_Tajikistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Tajikistan.svg/50px-Flag_of_Tajikistan.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Tajikistan" title="Tajikistan">Tajikistan</a></b> – <a href="/wiki/Dushanbe" title="Dushanbe">Dushanbe</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Thailand.svg" class="image" title="Flag of Thailand"><img alt="Flag of Thailand" longdesc="/wiki/Image:Flag_of_Thailand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Flag_of_Thailand.svg/50px-Flag_of_Thailand.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Thailand" title="Thailand">Thailand</a></b> – <a href="/wiki/Bangkok" title="Bangkok">Bangkok</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_East_Timor.svg" class="image" title="Flag of East Timor"><img alt="Flag of East Timor" longdesc="/wiki/Image:Flag_of_East_Timor.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Flag_of_East_Timor.svg/50px-Flag_of_East_Timor.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/East_Timor" title="East Timor">Timor-Leste</a></b> (commonly known as <b>East Timor</b>) – <a href="/wiki/Dili" title="Dili">Dili</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Turkey.svg" class="image" title="Flag of Turkey"><img alt="Flag of Turkey" longdesc="/wiki/Image:Flag_of_Turkey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Turkey.svg/50px-Flag_of_Turkey.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Turkey" title="Turkey">Turkey</a></b><sup id="_ref-europe_4" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Ankara" title="Ankara">Ankara</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Turkmenistan.svg" class="image" title="Flag of Turkmenistan"><img alt="Flag of Turkmenistan" longdesc="/wiki/Image:Flag_of_Turkmenistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Turkmenistan.svg/50px-Flag_of_Turkmenistan.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Turkmenistan" title="Turkmenistan">Turkmenistan</a></b> – <a href="/wiki/Ashgabat" title="Ashgabat">Ashgabat</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="image" title="Flag of the United Arab Emirates"><img alt="Flag of the United Arab Emirates" longdesc="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_United_Arab_Emirates.svg/50px-Flag_of_the_United_Arab_Emirates.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/United_Arab_Emirates" title="United Arab Emirates">United Arab Emirates</a></b> – <a href="/wiki/Abu_Dhabi" title="Abu Dhabi">Abu Dhabi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Uzbekistan.svg" class="image" title="Flag of Uzbekistan"><img alt="Flag of Uzbekistan" longdesc="/wiki/Image:Flag_of_Uzbekistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Uzbekistan.svg/50px-Flag_of_Uzbekistan.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Uzbekistan" title="Uzbekistan">Uzbekistan</a></b> – <a href="/wiki/Tashkent" title="Tashkent">Tashkent</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Vietnam.svg" class="image" title="Flag of Vietnam"><img alt="Flag of Vietnam" longdesc="/wiki/Image:Flag_of_Vietnam.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Vietnam.svg/50px-Flag_of_Vietnam.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Vietnam" title="Vietnam">Vietnam</a></b> – <a href="/wiki/Hanoi" title="Hanoi">Hanoi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Yemen.svg" class="image" title="Flag of Yemen"><img alt="Flag of Yemen" longdesc="/wiki/Image:Flag_of_Yemen.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Yemen.svg/50px-Flag_of_Yemen.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Yemen" title="Yemen">Yemen</a></b> – <a href="/wiki/Sana%27a" title="Sana'a">Sana'a</a></td></tr>
+
+<!-- Eurasia: Europe -->
+
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Albania.svg" class="image" title="Flag of Albania"><img alt="Flag of Albania" longdesc="/wiki/Image:Flag_of_Albania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Albania.svg/50px-Flag_of_Albania.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Albania" title="Albania">Albania</a></b> – <a href="/wiki/Tirana" title="Tirana">Tirana</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Andorra.svg" class="image" title="Flag of Andorra"><img alt="Flag of Andorra" longdesc="/wiki/Image:Flag_of_Andorra.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Andorra.svg/50px-Flag_of_Andorra.svg.png"; height="35" width="50"></a>&nbsp;<a href="/wiki/Andorra" title="Andorra">Andorra</a></b> – <a href="/wiki/Andorra_la_Vella" title="Andorra la Vella">Andorra la Vella</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Austria.svg" class="image" title="Flag of Austria"><img alt="Flag of Austria" longdesc="/wiki/Image:Flag_of_Austria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_Austria.svg/50px-Flag_of_Austria.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Austria" title="Austria">Austria</a></b> – <a href="/wiki/Vienna" title="Vienna">Vienna</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Belarus.svg" class="image" title="Flag of Belarus"><img alt="Flag of Belarus" longdesc="/wiki/Image:Flag_of_Belarus.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Flag_of_Belarus.svg/50px-Flag_of_Belarus.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Belarus" title="Belarus">Belarus</a></b> – <a href="/wiki/Minsk" title="Minsk">Minsk</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="image" title="Flag of Belgium"><img alt="Flag of Belgium" longdesc="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Belgium_%28civil%29.svg/50px-Flag_of_Belgium_%28civil%29.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Belgium" title="Belgium">Belgium</a></b> – <a href="/wiki/Brussels" title="Brussels">Brussels</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="image" title="Flag of Bosnia and Herzegovina"><img alt="Flag of Bosnia and Herzegovina" longdesc="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Bosnia_and_Herzegovina.svg/50px-Flag_of_Bosnia_and_Herzegovina.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Bosnia_and_Herzegovina" title="Bosnia and Herzegovina">Bosnia and Herzegovina</a></b> – <a href="/wiki/Sarajevo" title="Sarajevo">Sarajevo</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Bulgaria.svg" class="image" title="Flag of Bulgaria"><img alt="Flag of Bulgaria" longdesc="/wiki/Image:Flag_of_Bulgaria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Bulgaria.svg/50px-Flag_of_Bulgaria.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Bulgaria" title="Bulgaria">Bulgaria</a></b> – <a href="/wiki/Sofia" title="Sofia">Sofia</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Croatia.svg" class="image" title="Flag of Croatia"><img alt="Flag of Croatia" longdesc="/wiki/Image:Flag_of_Croatia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Croatia.svg/50px-Flag_of_Croatia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Croatia" title="Croatia">Croatia</a></b> – <a href="/wiki/Zagreb" title="Zagreb">Zagreb</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="image" title="Flag of the Czech Republic"><img alt="Flag of the Czech Republic" longdesc="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_Czech_Republic.svg/50px-Flag_of_the_Czech_Republic.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Czech_Republic" title="Czech Republic">Czech Republic</a></b> – <a href="/wiki/Prague" title="Prague">Prague</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Denmark.svg" class="image" title="Flag of Denmark"><img alt="Flag of Denmark" longdesc="/wiki/Image:Flag_of_Denmark.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Denmark.svg/50px-Flag_of_Denmark.svg.png"; height="38" width="50"></a>&nbsp;<a href="/wiki/Denmark" title="Denmark">Denmark</a></b> – <a href="/wiki/Copenhagen" title="Copenhagen">Copenhagen</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Estonia.svg" class="image" title="Flag of Estonia"><img alt="Flag of Estonia" longdesc="/wiki/Image:Flag_of_Estonia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Flag_of_Estonia.svg/50px-Flag_of_Estonia.svg.png"; height="32" width="50"></a>&nbsp;<a href="/wiki/Estonia" title="Estonia">Estonia</a></b> – <a href="/wiki/Tallinn" title="Tallinn">Tallinn</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="image" title="Flag of the Faroe Islands"><img alt="Flag of the Faroe Islands" longdesc="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_the_Faroe_Islands.svg/50px-Flag_of_the_Faroe_Islands.svg.png"; height="36" width="50"></a>&nbsp;<a href="/wiki/Faroe_Islands" title="Faroe Islands">Faroe Islands</a></i> (overseas territory of Denmark) – <a href="/wiki/T%C3%B3rshavn" title="Tórshavn">Tórshavn</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Finland.svg" class="image" title="Flag of Finland"><img alt="Flag of Finland" longdesc="/wiki/Image:Flag_of_Finland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Finland.svg/50px-Flag_of_Finland.svg.png"; height="31" width="50"></a>&nbsp;<a href="/wiki/Finland" title="Finland">Finland</a></b> – <a href="/wiki/Helsinki" title="Helsinki">Helsinki</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"><img alt="Flag of France" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/France" title="France">France</a></b> – <a href="/wiki/Paris" title="Paris">Paris</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Germany.svg" class="image" title="Flag of Germany"><img alt="Flag of Germany" longdesc="/wiki/Image:Flag_of_Germany.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Germany.svg/50px-Flag_of_Germany.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Germany" title="Germany">Germany</a></b> – <a href="/wiki/Berlin" title="Berlin">Berlin</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Gibraltar.svg" class="image" title="Flag of Gibraltar"><img alt="Flag of Gibraltar" longdesc="/wiki/Image:Flag_of_Gibraltar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Flag_of_Gibraltar.svg/50px-Flag_of_Gibraltar.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – Gibraltar<sup id="_ref-city-state_1" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Greece.svg" class="image" title="Flag of Greece"><img alt="Flag of Greece" longdesc="/wiki/Image:Flag_of_Greece.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Greece.svg/50px-Flag_of_Greece.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Greece" title="Greece">Greece</a></b> – <a href="/wiki/Athens" title="Athens">Athens</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Guernsey.svg" class="image" title="Flag of Guernsey"><img alt="Flag of Guernsey" longdesc="/wiki/Image:Flag_of_Guernsey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Guernsey.svg/50px-Flag_of_Guernsey.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Saint_Peter_Port" title="Saint Peter Port">Saint Peter Port</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Hungary.svg" class="image" title="Flag of Hungary"><img alt="Flag of Hungary" longdesc="/wiki/Image:Flag_of_Hungary.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Flag_of_Hungary.svg/50px-Flag_of_Hungary.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Hungary" title="Hungary">Hungary</a></b> – <a href="/wiki/Budapest" title="Budapest">Budapest</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Iceland.svg" class="image" title="Flag of Iceland"><img alt="Flag of Iceland" longdesc="/wiki/Image:Flag_of_Iceland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Iceland.svg/50px-Flag_of_Iceland.svg.png"; height="36" width="50"></a>&nbsp;<a href="/wiki/Iceland" title="Iceland">Iceland</a></b> – <a href="/wiki/Reykjav%C3%ADk" title="Reykjavík">Reykjavík</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Ireland.svg" class="image" title="Flag of Ireland"><img alt="Flag of Ireland" longdesc="/wiki/Image:Flag_of_Ireland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Flag_of_Ireland.svg/50px-Flag_of_Ireland.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a></b> – <a href="/wiki/Dublin" title="Dublin">Dublin</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="image" title="Flag of the Isle of Man"><img alt="Flag of the Isle of Man" longdesc="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_the_Isle_of_Man.svg/50px-Flag_of_the_Isle_of_Man.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Douglas%2C_Isle_of_Man" title="Douglas, Isle of Man">Douglas</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Italy.svg" class="image" title="Flag of Italy"><img alt="Flag of Italy" longdesc="/wiki/Image:Flag_of_Italy.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Flag_of_Italy.svg/50px-Flag_of_Italy.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Italy" title="Italy">Italy</a></b> – <a href="/wiki/Rome" title="Rome">Rome</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Jersey.svg" class="image" title="Flag of Jersey"><img alt="Flag of Jersey" longdesc="/wiki/Image:Flag_of_Jersey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Flag_of_Jersey.svg/50px-Flag_of_Jersey.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Jersey" title="Jersey">Jersey</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Saint_Helier" title="Saint Helier">Saint Helier</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Latvia.svg" class="image" title="Flag of Latvia"><img alt="Flag of Latvia" longdesc="/wiki/Image:Flag_of_Latvia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Latvia.svg/50px-Flag_of_Latvia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Latvia" title="Latvia">Latvia</a></b> – <a href="/wiki/Riga" title="Riga">Riga</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Liechtenstein.svg" class="image" title="Flag of Liechtenstein"><img alt="Flag of Liechtenstein" longdesc="/wiki/Image:Flag_of_Liechtenstein.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Flag_of_Liechtenstein.svg/50px-Flag_of_Liechtenstein.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Liechtenstein" title="Liechtenstein">Liechtenstein</a></b> – <a href="/wiki/Vaduz" title="Vaduz">Vaduz</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Lithuania.svg" class="image" title="Flag of Lithuania"><img alt="Flag of Lithuania" longdesc="/wiki/Image:Flag_of_Lithuania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Lithuania.svg/50px-Flag_of_Lithuania.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Lithuania" title="Lithuania">Lithuania</a></b> – <a href="/wiki/Vilnius" title="Vilnius">Vilnius</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Luxembourg.svg" class="image" title="Flag of Luxembourg"><img alt="Flag of Luxembourg" longdesc="/wiki/Image:Flag_of_Luxembourg.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Flag_of_Luxembourg.svg/50px-Flag_of_Luxembourg.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Luxembourg" title="Luxembourg">Luxembourg</a></b> – <a href="/wiki/Luxembourg%2C_Luxembourg" title="Luxembourg, Luxembourg">Luxembourg</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Macedonia.svg" class="image" title="Flag of the Republic of Macedonia"><img alt="Flag of the Republic of Macedonia" longdesc="/wiki/Image:Flag_of_Macedonia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_Macedonia.svg/50px-Flag_of_Macedonia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Republic_of_Macedonia" title="Republic of Macedonia">Macedonia</a></b> – <a href="/wiki/Skopje" title="Skopje">Skopje</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Malta.svg" class="image" title="Flag of Malta"><img alt="Flag of Malta" longdesc="/wiki/Image:Flag_of_Malta.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Malta.svg/50px-Flag_of_Malta.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Malta" title="Malta">Malta</a></b> – <a href="/wiki/Valletta" title="Valletta">Valletta</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Moldova.svg" class="image" title="Flag of Moldova"><img alt="Flag of Moldova" longdesc="/wiki/Image:Flag_of_Moldova.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Moldova.svg/50px-Flag_of_Moldova.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Moldova" title="Moldova">Moldova</a></b> – <a href="/wiki/Chi%C5%9Fin%C4%83u" title="Chişinău">Chişinău</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Monaco.svg" class="image" title="Flag of Monaco"><img alt="Flag of Monaco" longdesc="/wiki/Image:Flag_of_Monaco.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Flag_of_Monaco.svg/50px-Flag_of_Monaco.svg.png"; height="40" width="50"></a>&nbsp;<a href="/wiki/Monaco" title="Monaco">Monaco</a></b> – Monaco<sup id="_ref-city-state_2" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Montenegro.svg" class="image" title="Flag of Montenegro"><img alt="Flag of Montenegro" longdesc="/wiki/Image:Flag_of_Montenegro.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Montenegro.svg/50px-Flag_of_Montenegro.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Montenegro" title="Montenegro">Montenegro</a></b> – <a href="/wiki/Podgorica" title="Podgorica">Podgorica</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Netherlands.svg" class="image" title="Flag of the Netherlands"><img alt="Flag of the Netherlands" longdesc="/wiki/Image:Flag_of_the_Netherlands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_the_Netherlands.svg/50px-Flag_of_the_Netherlands.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></b> – <a href="/wiki/Amsterdam" title="Amsterdam">Amsterdam</a> (seat of government at <a href="/wiki/The_Hague" title="The Hague">The Hague</a>)</td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Norway"><img alt="Flag of Norway" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/50px-Flag_of_Norway.svg.png"; height="36" width="50"></a>&nbsp;<a href="/wiki/Norway" title="Norway">Norway</a></b> – <a href="/wiki/Oslo" title="Oslo">Oslo</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Poland.svg" class="image" title="Flag of Poland"><img alt="Flag of Poland" longdesc="/wiki/Image:Flag_of_Poland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Flag_of_Poland.svg/50px-Flag_of_Poland.svg.png"; height="31" width="50"></a>&nbsp;<a href="/wiki/Poland" title="Poland">Poland</a></b> – <a href="/wiki/Warsaw" title="Warsaw">Warsaw</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Portugal.svg" class="image" title="Flag of Portugal"><img alt="Flag of Portugal" longdesc="/wiki/Image:Flag_of_Portugal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Portugal.svg/50px-Flag_of_Portugal.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Portugal" title="Portugal">Portugal</a></b> – <a href="/wiki/Lisbon" title="Lisbon">Lisbon</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Romania.svg" class="image" title="Flag of Romania"><img alt="Flag of Romania" longdesc="/wiki/Image:Flag_of_Romania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Romania.svg/50px-Flag_of_Romania.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Romania" title="Romania">Romania</a></b> – <a href="/wiki/Bucharest" title="Bucharest">Bucharest</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Russia.svg" class="image" title="Flag of Russia"><img alt="Flag of Russia" longdesc="/wiki/Image:Flag_of_Russia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Russia.svg/50px-Flag_of_Russia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Russia" title="Russia">Russia</a></b><sup id="_ref-2" class="reference"><a href="#_note-2" title="">[6]</a></sup> – <a href="/wiki/Moscow" title="Moscow">Moscow</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_San_Marino.svg" class="image" title="Flag of San Marino"><img alt="Flag of San Marino" longdesc="/wiki/Image:Flag_of_San_Marino.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Flag_of_San_Marino.svg/50px-Flag_of_San_Marino.svg.png"; height="38" width="50"></a>&nbsp;<a href="/wiki/San_Marino" title="San Marino">San Marino</a></b> – <a href="/wiki/San_Marino%2C_San_Marino" title="San Marino, San Marino">San Marino</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Serbia.svg" class="image" title="Flag of Serbia"><img alt="Flag of Serbia" longdesc="/wiki/Image:Flag_of_Serbia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Flag_of_Serbia.svg/50px-Flag_of_Serbia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Serbia" title="Serbia">Serbia</a></b> – <a href="/wiki/Belgrade" title="Belgrade">Belgrade</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Slovakia.svg" class="image" title="Flag of Slovakia"><img alt="Flag of Slovakia" longdesc="/wiki/Image:Flag_of_Slovakia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Flag_of_Slovakia.svg/50px-Flag_of_Slovakia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Slovakia" title="Slovakia">Slovakia</a></b> – <a href="/wiki/Bratislava" title="Bratislava">Bratislava</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Slovenia.svg" class="image" title="Flag of Slovenia"><img alt="Flag of Slovenia" longdesc="/wiki/Image:Flag_of_Slovenia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f0/Flag_of_Slovenia.svg/50px-Flag_of_Slovenia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Slovenia" title="Slovenia">Slovenia</a></b> – <a href="/wiki/Ljubljana" title="Ljubljana">Ljubljana</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Spain.svg" class="image" title="Flag of Spain"><img alt="Flag of Spain" longdesc="/wiki/Image:Flag_of_Spain.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Spain.svg/50px-Flag_of_Spain.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Spain" title="Spain">Spain</a></b> – <a href="/wiki/Madrid" title="Madrid">Madrid</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Sweden.svg" class="image" title="Flag of Sweden"><img alt="Flag of Sweden" longdesc="/wiki/Image:Flag_of_Sweden.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Sweden.svg/50px-Flag_of_Sweden.svg.png"; height="31" width="50"></a>&nbsp;<a href="/wiki/Sweden" title="Sweden">Sweden</a></b> – <a href="/wiki/Stockholm" title="Stockholm">Stockholm</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Switzerland.svg" class="image" title="Flag of Switzerland"><img alt="Flag of Switzerland" longdesc="/wiki/Image:Flag_of_Switzerland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Switzerland.svg/50px-Flag_of_Switzerland.svg.png"; height="50" width="50"></a>&nbsp;<a href="/wiki/Switzerland" title="Switzerland">Switzerland</a></b> – <a href="/wiki/Berne" title="Berne">Berne</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Ukraine.svg" class="image" title="Flag of Ukraine"><img alt="Flag of Ukraine" longdesc="/wiki/Image:Flag_of_Ukraine.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Ukraine.svg/50px-Flag_of_Ukraine.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Ukraine" title="Ukraine">Ukraine</a></b> – <a href="/wiki/Kiev" title="Kiev">Kiev</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="image" title="Flag of the United Kingdom"><img alt="Flag of the United Kingdom" longdesc="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_United_Kingdom.svg/50px-Flag_of_the_United_Kingdom.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a></b> – <a href="/wiki/London" title="London">London</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Vatican_City.svg" class="image" title="Flag of the Vatican City"><img alt="Flag of the Vatican City" longdesc="/wiki/Image:Flag_of_the_Vatican_City.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_the_Vatican_City.svg/50px-Flag_of_the_Vatican_City.svg.png"; height="50" width="50"></a>&nbsp;<a href="/wiki/Vatican_City" title="Vatican City">Vatican City</a></b> – Vatican City<sup id="_ref-city-state_3" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+
+<!-- Americas: North_America -->
+
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Anguilla.svg" class="image" title="Flag of Anguilla"><img alt="Flag of Anguilla" longdesc="/wiki/Image:Flag_of_Anguilla.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Anguilla.svg/50px-Flag_of_Anguilla.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/The_Valley%2C_Anguilla" title="The Valley, Anguilla">The Valley</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="image" title="Flag of Antigua and Barbuda"><img alt="Flag of Antigua and Barbuda" longdesc="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Antigua_and_Barbuda.svg/50px-Flag_of_Antigua_and_Barbuda.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a></b> – <a href="/wiki/Saint_John%27s%2C_Antigua_and_Barbuda" title="Saint John's, Antigua and Barbuda">Saint John's</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Aruba.svg" class="image" title="Flag of Aruba"><img alt="Flag of Aruba" longdesc="/wiki/Image:Flag_of_Aruba.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Aruba.svg/50px-Flag_of_Aruba.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Aruba" title="Aruba">Aruba</a></i> (overseas country in the <a href="/wiki/Kingdom_of_the_Netherlands" title="Kingdom of the Netherlands">Kingdom of the Netherlands</a>) – <a href="/wiki/Oranjestad%2C_Aruba" title="Oranjestad, Aruba">Oranjestad</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_Bahamas.svg" class="image" title="Flag of the Bahamas"><img alt="Flag of the Bahamas" longdesc="/wiki/Image:Flag_of_the_Bahamas.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Flag_of_the_Bahamas.svg/50px-Flag_of_the_Bahamas.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a></b> – <a href="/wiki/Nassau%2C_Bahamas" title="Nassau, Bahamas">Nassau</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Barbados.svg" class="image" title="Flag of Barbados"><img alt="Flag of Barbados" longdesc="/wiki/Image:Flag_of_Barbados.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Flag_of_Barbados.svg/50px-Flag_of_Barbados.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Barbados" title="Barbados">Barbados</a></b> – <a href="/wiki/Bridgetown" title="Bridgetown">Bridgetown</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Belize.svg" class="image" title="Flag of Belize"><img alt="Flag of Belize" longdesc="/wiki/Image:Flag_of_Belize.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Flag_of_Belize.svg/50px-Flag_of_Belize.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Belize" title="Belize">Belize</a></b> – <a href="/wiki/Belmopan" title="Belmopan">Belmopan</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Bermuda.svg" class="image" title="Flag of Bermuda"><img alt="Flag of Bermuda" longdesc="/wiki/Image:Flag_of_Bermuda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Bermuda.svg/50px-Flag_of_Bermuda.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Hamilton%2C_Bermuda" title="Hamilton, Bermuda">Hamilton</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="image" title="Flag of the British Virgin Islands"><img alt="Flag of the British Virgin Islands" longdesc="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/Flag_of_the_British_Virgin_Islands.svg/50px-Flag_of_the_British_Virgin_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">British Virgin Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Road_Town" title="Road Town">Road Town</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Canada.svg" class="image" title="Flag of Canada"><img alt="Flag of Canada" longdesc="/wiki/Image:Flag_of_Canada.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Flag_of_Canada.svg/50px-Flag_of_Canada.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Canada" title="Canada">Canada</a></b> – <a href="/wiki/Ottawa" title="Ottawa">Ottawa</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="image" title="Flag of Cayman Islands"><img alt="Flag of Cayman Islands" longdesc="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_the_Cayman_Islands.svg/50px-Flag_of_the_Cayman_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/George_Town%2C_Cayman_Islands" title="George Town, Cayman Islands">George Town</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"><img alt="Flag of France" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a> <a href="/wiki/Clipperton_Island" title="Clipperton Island">Clipperton Island</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>)</td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Costa_Rica.svg" class="image" title="Flag of Costa Rica"><img alt="Flag of Costa Rica" longdesc="/wiki/Image:Flag_of_Costa_Rica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Flag_of_Costa_Rica.svg/50px-Flag_of_Costa_Rica.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Costa_Rica" title="Costa Rica">Costa Rica</a></b> – <a href="/wiki/San_Jos%C3%A9%2C_Costa_Rica" title="San José, Costa Rica">San José</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Cuba.svg" class="image" title="Flag of Cuba"><img alt="Flag of Cuba" longdesc="/wiki/Image:Flag_of_Cuba.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Flag_of_Cuba.svg/50px-Flag_of_Cuba.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Cuba" title="Cuba">Cuba</a></b> – <a href="/wiki/Havana" title="Havana">Havana</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Dominica.svg" class="image" title="Flag of Dominica"><img alt="Flag of Dominica" longdesc="/wiki/Image:Flag_of_Dominica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Flag_of_Dominica.svg/50px-Flag_of_Dominica.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Dominica" title="Dominica">Dominica</a></b> – <a href="/wiki/Roseau" title="Roseau">Roseau</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="image" title="Flag of the Dominican Republic"><img alt="Flag of the Dominican Republic" longdesc="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_the_Dominican_Republic.svg/50px-Flag_of_the_Dominican_Republic.svg.png"; height="31" width="50"></a>&nbsp;<a href="/wiki/Dominican_Republic" title="Dominican Republic">Dominican Republic</a></b> – <a href="/wiki/Santo_Domingo" title="Santo Domingo">Santo Domingo</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_El_Salvador.svg" class="image" title="Flag of El Salvador"><img alt="Flag of El Salvador" longdesc="/wiki/Image:Flag_of_El_Salvador.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_El_Salvador.svg/50px-Flag_of_El_Salvador.svg.png"; height="28" width="50"></a>&nbsp;<a href="/wiki/El_Salvador" title="El Salvador">El Salvador</a></b> – <a href="/wiki/San_Salvador" title="San Salvador">San Salvador</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Greenland.svg" class="image" title="Flag of Greenland"><img alt="Flag of Greenland" longdesc="/wiki/Image:Flag_of_Greenland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_Greenland.svg/50px-Flag_of_Greenland.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Greenland" title="Greenland">Greenland</a></i> (overseas territory of Denmark) – <a href="/wiki/Nuuk" title="Nuuk">Nuuk</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Grenada.svg" class="image" title="Flag of Grenada"><img alt="Flag of Grenada" longdesc="/wiki/Image:Flag_of_Grenada.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Grenada.svg/50px-Flag_of_Grenada.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Grenada" title="Grenada">Grenada</a></b> – <a href="/wiki/Saint_George%27s%2C_Grenada" title="Saint George's, Grenada">Saint George's</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Guadeloupe"><img alt="Flag of Guadeloupe" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Guadeloupe" title="Guadeloupe">Guadeloupe</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Basse-Terre" title="Basse-Terre">Basse-Terre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Guatemala.svg" class="image" title="Flag of Guatemala"><img alt="Flag of Guatemala" longdesc="/wiki/Image:Flag_of_Guatemala.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Flag_of_Guatemala.svg/50px-Flag_of_Guatemala.svg.png"; height="31" width="50"></a>&nbsp;<a href="/wiki/Guatemala" title="Guatemala">Guatemala</a></b> – <a href="/wiki/Guatemala_City" title="Guatemala City">Guatemala City</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Haiti.svg" class="image" title="Flag of Haiti"><img alt="Flag of Haiti" longdesc="/wiki/Image:Flag_of_Haiti.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Haiti.svg/50px-Flag_of_Haiti.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Haiti" title="Haiti">Haiti</a></b> – <a href="/wiki/Port-au-Prince" title="Port-au-Prince">Port-au-Prince</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Honduras.svg" class="image" title="Flag of Honduras"><img alt="Flag of Honduras" longdesc="/wiki/Image:Flag_of_Honduras.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Flag_of_Honduras.svg/50px-Flag_of_Honduras.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Honduras" title="Honduras">Honduras</a></b> – <a href="/wiki/Tegucigalpa" title="Tegucigalpa">Tegucigalpa</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Jamaica.svg" class="image" title="Flag of Jamaica"><img alt="Flag of Jamaica" longdesc="/wiki/Image:Flag_of_Jamaica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Jamaica.svg/50px-Flag_of_Jamaica.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Jamaica" title="Jamaica">Jamaica</a></b> – <a href="/wiki/Kingston%2C_Jamaica" title="Kingston, Jamaica">Kingston</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Martinique"><img alt="Flag of Martinique" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Martinique" title="Martinique">Martinique</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Fort-de-France" title="Fort-de-France">Fort-de-France</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Mexico.svg" class="image" title="Flag of Mexico"><img alt="Flag of Mexico" longdesc="/wiki/Image:Flag_of_Mexico.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Flag_of_Mexico.svg/50px-Flag_of_Mexico.svg.png"; height="29" width="50"></a>&nbsp;<a href="/wiki/Mexico" title="Mexico">Mexico</a></b> – <a href="/wiki/Mexico_City" title="Mexico City">Mexico City</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Montserrat.svg" class="image" title="Flag of Montserrat"><img alt="Flag of Montserrat" longdesc="/wiki/Image:Flag_of_Montserrat.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Montserrat.svg/50px-Flag_of_Montserrat.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Plymouth%2C_Montserrat" title="Plymouth, Montserrat">Plymouth</a> (seat of government at <a href="/wiki/Brades" title="Brades">Brades</a>)</td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of Navassa Island"><img alt="Flag of Navassa Island" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a>&nbsp;<a href="/wiki/Navassa_Island" title="Navassa Island">Navassa Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="image" title="Flag of the Netherlands Antilles"><img alt="Flag of the Netherlands Antilles" longdesc="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Flag_of_the_Netherlands_Antilles.svg/50px-Flag_of_the_Netherlands_Antilles.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Netherlands_Antilles" title="Netherlands Antilles">Netherlands Antilles</a></i> (overseas country in the <a href="/wiki/Kingdom_of_the_Netherlands" title="Kingdom of the Netherlands">Kingdom of the Netherlands</a>) – <a href="/wiki/Willemstad%2C_Netherlands_Antilles" title="Willemstad, Netherlands Antilles">Willemstad</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Nicaragua.svg" class="image" title="Flag of Nicaragua"><img alt="Flag of Nicaragua" longdesc="/wiki/Image:Flag_of_Nicaragua.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Nicaragua.svg/50px-Flag_of_Nicaragua.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Nicaragua" title="Nicaragua">Nicaragua</a></b> – <a href="/wiki/Managua" title="Managua">Managua</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Panama.svg" class="image" title="Flag of Panama"><img alt="Flag of Panama" longdesc="/wiki/Image:Flag_of_Panama.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Flag_of_Panama.svg/50px-Flag_of_Panama.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Panama" title="Panama">Panama</a></b> – <a href="/wiki/Panama_City" title="Panama City">Panama City</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Puerto_Rico.svg" class="image" title="Flag of Puerto Rico"><img alt="Flag of Puerto Rico" longdesc="/wiki/Image:Flag_of_Puerto_Rico.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Flag_of_Puerto_Rico.svg/50px-Flag_of_Puerto_Rico.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/San_Juan%2C_Puerto_Rico" title="San Juan, Puerto Rico">San Juan</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Barthelemy"><img alt="Flag of Saint Barthelemy" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Barthelemy" title="Saint Barthelemy">Saint Barthelemy</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Gustavia%2C_Saint_Barthelemy" title="Gustavia, Saint Barthelemy">Gustavia</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="image" title="Flag of Saint Kitts and Nevis"><img alt="Flag of Saint Kitts and Nevis" longdesc="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Saint_Kitts_and_Nevis.svg/50px-Flag_of_Saint_Kitts_and_Nevis.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a></b> – <a href="/wiki/Basseterre" title="Basseterre">Basseterre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Lucia.svg" class="image" title="Flag of Saint Lucia"><img alt="Flag of Saint Lucia" longdesc="/wiki/Image:Flag_of_Saint_Lucia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Saint_Lucia.svg/50px-Flag_of_Saint_Lucia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a></b> – <a href="/wiki/Castries" title="Castries">Castries</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Martin (France)"><img alt="Flag of Saint Martin (France)" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Martin_%28France%29" title="Saint Martin (France)">Saint Martin</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Marigot%2C_Saint_Martin" title="Marigot, Saint Martin">Marigot</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Pierre and Miquelon"><img alt="Flag of Saint Pierre and Miquelon" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Pierre_and_Miquelon" title="Saint Pierre and Miquelon">Saint Pierre and Miquelon</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Saint-Pierre%2C_Saint_Pierre_and_Miquelon" title="Saint-Pierre, Saint Pierre and Miquelon">Saint-Pierre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="image" title="Flag of Saint Vincent and the Grenadines"><img alt="Flag of Saint Vincent and the Grenadines" longdesc="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Flag_of_Saint_Vincent_and_the_Grenadines.svg/50px-Flag_of_Saint_Vincent_and_the_Grenadines.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a></b> – <a href="/wiki/Kingstown" title="Kingstown">Kingstown</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="image" title="Flag of Trinidad and Tobago"><img alt="Flag of Trinidad and Tobago" longdesc="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Trinidad_and_Tobago.svg/50px-Flag_of_Trinidad_and_Tobago.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a></b> – <a href="/wiki/Port_of_Spain" title="Port of Spain">Port of Spain</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="image" title="Flag of the Turks and Caicos Islands"><img alt="Flag of the Turks and Caicos Islands" longdesc="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_the_Turks_and_Caicos_Islands.svg/50px-Flag_of_the_Turks_and_Caicos_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Cockburn_Town" title="Cockburn Town">Cockburn Town</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a>&nbsp;<a href="/wiki/United_States" title="United States">United States</a></b> – <a href="/wiki/Washington%2C_D.C." title="Washington, D.C.">Washington, D.C.</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="image" title="Flag of the United States Virgin Islands"><img alt="Flag of the United States Virgin Islands" longdesc="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_the_United_States_Virgin_Islands.svg/50px-Flag_of_the_United_States_Virgin_Islands.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">United States Virgin Islands</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Charlotte_Amalie%2C_United_States_Virgin_Islands" title="Charlotte Amalie, United States Virgin Islands">Charlotte Amalie</a></td></tr>
+
+<!-- Americas: South America -->
+
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Argentina.svg" class="image" title="Flag of Argentina"><img alt="Flag of Argentina" longdesc="/wiki/Image:Flag_of_Argentina.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Flag_of_Argentina.svg/50px-Flag_of_Argentina.svg.png"; height="32" width="50"></a>&nbsp;<a href="/wiki/Argentina" title="Argentina">Argentina</a></b> – <a href="/wiki/Buenos_Aires" title="Buenos Aires">Buenos Aires</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Bolivia.svg" class="image" title="Flag of Bolivia"><img alt="Flag of Bolivia" longdesc="/wiki/Image:Flag_of_Bolivia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Bolivia.svg/50px-Flag_of_Bolivia.svg.png"; height="34" width="50"></a>&nbsp;<a href="/wiki/Bolivia" title="Bolivia">Bolivia</a></b> – <a href="/wiki/Sucre" title="Sucre">Sucre</a> (seat of government at <a href="/wiki/La_Paz" title="La Paz">La Paz</a>)</td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Brazil.svg" class="image" title="Flag of Brazil"><img alt="Flag of Brazil" longdesc="/wiki/Image:Flag_of_Brazil.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Brazil.svg/50px-Flag_of_Brazil.svg.png"; height="35" width="50"></a>&nbsp;<a href="/wiki/Brazil" title="Brazil">Brazil</a></b> – <a href="/wiki/Bras%C3%ADlia" title="Brasília">Brasília</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Chile.svg" class="image" title="Flag of Chile"><img alt="Flag of Chile" longdesc="/wiki/Image:Flag_of_Chile.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Flag_of_Chile.svg/50px-Flag_of_Chile.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Chile" title="Chile">Chile</a></b> – <a href="/wiki/Santiago%2C_Chile" title="Santiago, Chile">Santiago</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Colombia.svg" class="image" title="Flag of Colombia"><img alt="Flag of Colombia" longdesc="/wiki/Image:Flag_of_Colombia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Colombia.svg/50px-Flag_of_Colombia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Colombia" title="Colombia">Colombia</a></b> – <a href="/wiki/Bogot%C3%A1" title="Bogotá">Bogotá</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Ecuador.svg" class="image" title="Flag of Ecuador"><img alt="Flag of Ecuador" longdesc="/wiki/Image:Flag_of_Ecuador.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Flag_of_Ecuador.svg/50px-Flag_of_Ecuador.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Ecuador" title="Ecuador">Ecuador</a></b> – <a href="/wiki/Quito" title="Quito">Quito</a></td></tr>
+<tr><td>South America</td><td><i><a href="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="image" title="Flag of the Falkland Islands"><img alt="Flag of the Falkland Islands" longdesc="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_the_Falkland_Islands.svg/50px-Flag_of_the_Falkland_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Stanley%2C_Falkland_Islands" title="Stanley, Falkland Islands">Stanley</a></td></tr>
+<tr><td>South America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of French Guiana"><img alt="Flag of French Guiana" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/French_Guiana" title="French Guiana">French Guiana</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Cayenne" title="Cayenne">Cayenne</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Guyana.svg" class="image" title="Flag of Guyana"><img alt="Flag of Guyana" longdesc="/wiki/Image:Flag_of_Guyana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_Guyana.svg/50px-Flag_of_Guyana.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Guyana" title="Guyana">Guyana</a></b> – <a href="/wiki/Georgetown%2C_Guyana" title="Georgetown, Guyana">Georgetown</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Paraguay.svg" class="image" title="Flag of Paraguay"><img alt="Flag of Paraguay" longdesc="/wiki/Image:Flag_of_Paraguay.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Paraguay.svg/50px-Flag_of_Paraguay.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Paraguay" title="Paraguay">Paraguay</a></b> – <a href="/wiki/Asunci%C3%B3n" title="Asunción">Asunción</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Peru.svg" class="image" title="Flag of Peru"><img alt="Flag of Peru" longdesc="/wiki/Image:Flag_of_Peru.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Flag_of_Peru.svg/50px-Flag_of_Peru.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Peru" title="Peru">Peru</a></b> – <a href="/wiki/Lima" title="Lima">Lima</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Suriname.svg" class="image" title="Flag of Suriname"><img alt="Flag of Suriname" longdesc="/wiki/Image:Flag_of_Suriname.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Flag_of_Suriname.svg/50px-Flag_of_Suriname.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Suriname" title="Suriname">Suriname</a></b> – <a href="/wiki/Paramaribo" title="Paramaribo">Paramaribo</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Uruguay.svg" class="image" title="Flag of Uruguay"><img alt="Flag of Uruguay" longdesc="/wiki/Image:Flag_of_Uruguay.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Uruguay.svg/50px-Flag_of_Uruguay.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Uruguay" title="Uruguay">Uruguay</a></b> – <a href="/wiki/Montevideo" title="Montevideo">Montevideo</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Venezuela.svg" class="image" title="Flag of Venezuela"><img alt="Flag of Venezuela" longdesc="/wiki/Image:Flag_of_Venezuela.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Venezuela.svg/50px-Flag_of_Venezuela.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Venezuela" title="Venezuela">Venezuela</a></b> – <a href="/wiki/Caracas" title="Caracas">Caracas</a></td></tr>
+
+<!-- Americas: Oceania -->
+
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_American_Samoa.svg" class="image" title="Flag of American Samoa"><img alt="Flag of American Samoa" longdesc="/wiki/Image:Flag_of_American_Samoa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_American_Samoa.svg/50px-Flag_of_American_Samoa.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Pago_Pago" title="Pago Pago">Pago Pago</a> (seat of government at <a href="/wiki/Fagatogo" title="Fagatogo">Fagatogo</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Australia"><img alt="Flag of Australia" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/50px-Flag_of_Australia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Australia" title="Australia">Australia</a></b> – <a href="/wiki/Canberra" title="Canberra">Canberra</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a> <a href="/wiki/Baker_Island" title="Baker Island">Baker Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="image" title="Flag of the Cook Islands"><img alt="Flag of the Cook Islands" longdesc="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/50px-Flag_of_the_Cook_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></i> (<a href="/wiki/Associated_state" title="Associated state">territory in free association</a> with New Zealand) – <a href="/wiki/Avarua" title="Avarua">Avarua</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Fiji.svg" class="image" title="Flag of Fiji"><img alt="Flag of Fiji" longdesc="/wiki/Image:Flag_of_Fiji.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Fiji.svg/50px-Flag_of_Fiji.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Fiji" title="Fiji">Fiji</a></b> – <a href="/wiki/Suva" title="Suva">Suva</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_French_Polynesia.svg" class="image" title="Flag of French Polynesia"><img alt="Flag of French Polynesia" longdesc="/wiki/Image:Flag_of_French_Polynesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Flag_of_French_Polynesia.svg/50px-Flag_of_French_Polynesia.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Papeete" title="Papeete">Papeete</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Guam.svg" class="image" title="Flag of Guam"><img alt="Flag of Guam" longdesc="/wiki/Image:Flag_of_Guam.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Flag_of_Guam.svg/50px-Flag_of_Guam.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Guam" title="Guam">Guam</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Hag%C3%A5t%C3%B1a" title="Hagåtña">Hagåtña</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a> <a href="/wiki/Howland_Island" title="Howland Island">Howland Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a> <a href="/wiki/Jarvis_Island" title="Jarvis Island">Jarvis Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a> <a href="/wiki/Johnston_Atoll" title="Johnston Atoll">Johnston Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a> <a href="/wiki/Kingman_Reef" title="Kingman Reef">Kingman Reef</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Kiribati.svg" class="image" title="Flag of Kiribati"><img alt="Flag of Kiribati" longdesc="/wiki/Image:Flag_of_Kiribati.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kiribati.svg/50px-Flag_of_Kiribati.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Kiribati" title="Kiribati">Kiribati</a></b> – <a href="/wiki/South_Tarawa" title="South Tarawa">South Tarawa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="image" title="Flag of the Marshall Islands"><img alt="Flag of the Marshall Islands" longdesc="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Flag_of_the_Marshall_Islands.svg/50px-Flag_of_the_Marshall_Islands.svg.png"; height="26" width="50"></a>&nbsp;<a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a></b> – <a href="/wiki/Majuro" title="Majuro">Majuro</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Micronesia.svg" class="image" title="Flag of the Federated States of Micronesia"><img alt="Flag of the Federated States of Micronesia" longdesc="/wiki/Image:Flag_of_Micronesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Micronesia.svg/50px-Flag_of_Micronesia.svg.png"; height="26" width="50"></a>&nbsp;<a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia</a></b> – <a href="/wiki/Palikir" title="Palikir">Palikir</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a> <a href="/wiki/Midway_Atoll" title="Midway Atoll">Midway Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Nauru.svg" class="image" title="Flag of Nauru"><img alt="Flag of Nauru" longdesc="/wiki/Image:Flag_of_Nauru.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Flag_of_Nauru.svg/50px-Flag_of_Nauru.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Nauru" title="Nauru">Nauru</a></b> – no official capital (seat of government at <a href="/wiki/Yaren" title="Yaren">Yaren</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of New Caledonia"><img alt="Flag of New Caledonia" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Noum%C3%A9a" title="Nouméa">Nouméa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"><img alt="Flag of New Zealand" longdesc="/wiki/Image:Flag_of_New_Zealand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/50px-Flag_of_New_Zealand.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/New_Zealand" title="New Zealand">New Zealand</a></b> – <a href="/wiki/Wellington" title="Wellington">Wellington</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Niue.svg" class="image" title="Flag of Niue"><img alt="Flag of Niue" longdesc="/wiki/Image:Flag_of_Niue.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/50px-Flag_of_Niue.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Niue" title="Niue">Niue</a></i> (<a href="/wiki/Associated_state" title="Associated state">territory in free association</a> with New Zealand) – <a href="/wiki/Alofi" title="Alofi">Alofi</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Norfolk_Island.svg" class="image" title="Flag of Norfolk Island"><img alt="Flag of Norfolk Island" longdesc="/wiki/Image:Flag_of_Norfolk_Island.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Norfolk_Island.svg/50px-Flag_of_Norfolk_Island.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></i> (overseas territory of Australia) – <a href="/wiki/Kingston%2C_Norfolk_Island" title="Kingston, Norfolk Island">Kingston</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="image" title="Flag of the Northern Mariana Islands"><img alt="Flag of the Northern Mariana Islands" longdesc="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Flag_of_the_Northern_Mariana_Islands.svg/50px-Flag_of_the_Northern_Mariana_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Saipan" title="Saipan">Saipan</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Palau.svg" class="image" title="Flag of Palau"><img alt="Flag of Palau" longdesc="/wiki/Image:Flag_of_Palau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Palau.svg/50px-Flag_of_Palau.svg.png"; height="31" width="50"></a>&nbsp;<a href="/wiki/Palau" title="Palau">Palau</a></b> – <a href="/wiki/Melekeok" title="Melekeok">Melekeok</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a> <a href="/wiki/Palmyra_Atoll" title="Palmyra Atoll">Palmyra Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="image" title="Flag of Papua New Guinea"><img alt="Flag of Papua New Guinea" longdesc="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Flag_of_Papua_New_Guinea.svg/50px-Flag_of_Papua_New_Guinea.svg.png"; height="38" width="50"></a>&nbsp;<a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a></b> – <a href="/wiki/Port_Moresby" title="Port Moresby">Port Moresby</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="image" title="Flag of the Pitcairn Islands"><img alt="Flag of the Pitcairn Islands" longdesc="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Flag_of_the_Pitcairn_Islands.svg/50px-Flag_of_the_Pitcairn_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Adamstown%2C_Pitcairn_Island" title="Adamstown, Pitcairn Island">Adamstown</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Samoa.svg" class="image" title="Flag of Samoa"><img alt="Flag of Samoa" longdesc="/wiki/Image:Flag_of_Samoa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Samoa.svg/50px-Flag_of_Samoa.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Samoa" title="Samoa">Samoa</a></b> – <a href="/wiki/Apia" title="Apia">Apia</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="image" title="Flag of the Solomon Islands"><img alt="Flag of the Solomon Islands" longdesc="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Flag_of_the_Solomon_Islands.svg/50px-Flag_of_the_Solomon_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a></b> – <a href="/wiki/Honiara" title="Honiara">Honiara</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of Tokelau"><img alt="Flag of Tokelau" longdesc="/wiki/Image:Flag_of_New_Zealand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/50px-Flag_of_New_Zealand.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></i> (overseas territory of New Zealand) – no official capital (each atoll has its own administrative centre)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Tonga.svg" class="image" title="Flag of Tonga"><img alt="Flag of Tonga" longdesc="/wiki/Image:Flag_of_Tonga.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Tonga.svg/50px-Flag_of_Tonga.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Tonga" title="Tonga">Tonga</a></b> – <a href="/wiki/Nuku%27alofa" title="Nuku'alofa">Nuku'alofa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Tuvalu.svg" class="image" title="Flag of Tuvalu"><img alt="Flag of Tuvalu" longdesc="/wiki/Image:Flag_of_Tuvalu.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tuvalu.svg/50px-Flag_of_Tuvalu.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a></b> – <a href="/wiki/Funafuti" title="Funafuti">Funafuti</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Vanuatu.svg" class="image" title="Flag of Vanuatu"><img alt="Flag of Vanuatu" longdesc="/wiki/Image:Flag_of_Vanuatu.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Vanuatu.svg/50px-Flag_of_Vanuatu.svg.png"; height="30" width="50"></a>&nbsp;<a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a></b> – <a href="/wiki/Port_Vila" title="Port Vila">Port Vila</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png"; height="26" width="50"></a> <a href="/wiki/Wake_Island" title="Wake Island">Wake Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Wallis and Futuna"><img alt="Flag of Wallis and Futuna" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Mata-Utu" title="Mata-Utu">Mata-Utu</a></td></tr>
+
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Bouvet Island"><img alt="Flag of Bouvet Island" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/50px-Flag_of_Norway.svg.png"; height="36" width="50"></a>&nbsp;<a href="/wiki/Bouvet_Island" title="Bouvet Island">Bouvet Island</a></i> (overseas territory of Norway)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of the French Southern and Antarctic Lands"><img alt="Flag of the French Southern and Antarctic Lands" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png"; height="33" width="50"></a>&nbsp;<a href="/wiki/French_Southern_and_Antarctic_Lands" title="French Southern and Antarctic Lands">French Southern Territories</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Heard Island and McDonald Islands"><img alt="Flag of Heard Island and McDonald Islands" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/50px-Flag_of_Australia.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a></i> (overseas territory of Australia)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="image" title="Flag of South Georgia and the South Sandwich Islands"><img alt="Flag of South Georgia and the South Sandwich Islands" longdesc="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg/50px-Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg.png"; height="25" width="50"></a>&nbsp;<a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></i><sup id="_ref-3" class="reference"><a href="#_note-3" title="">[7]</a></sup> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>)</td></tr>
+</table>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/i18n.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,158 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+		"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Dijit I18N Demo</title>
+
+	<script>
+		var djConfig = {parseOnLoad: true, isDebug: true},
+			locale,
+			lang,
+			bidi;
+
+		// read in HREF arguments
+		if(window.location.href.indexOf("?") > -1){
+			var str = window.location.href.substr(window.location.href.indexOf("?")+1);
+			var ary = str.split(/&/);
+			for(var i=0; i<ary.length; i++){
+				var split = ary[i].split(/=/),
+					key = split[0],
+					value = split[1];
+				switch(key){
+					case "locale":
+						djConfig.locale = locale = value;
+						lang = locale.replace(/-.*/, "");
+						break;
+					case "dir":
+						document.getElementsByTagName("html")[0].dir = value;
+						bidi = value;
+						break;
+				}
+			}
+		}		
+	</script>
+	<style type="text/css">
+		@import "../../dojo/resources/dojo.css";
+		@import "../themes/tundra/tundra.css";
+		@import "../themes/tundra/tundra_rtl.css";
+		@import "../tests/css/dijitTests.css";
+		@import "i18n/flags.css";
+	</style>
+
+	<script type="text/javascript" src="../../dojo/dojo.js"></script>
+
+	<script language="JavaScript" type="text/javascript">
+		dojo.require("dojo.data.ItemFileReadStore");
+		dojo.require("dijit.Tree");
+		dojo.require("dijit._Calendar");
+		dojo.require("dijit.form.DateTextBox");
+		dojo.require("dijit.form.CurrencyTextBox");
+		dojo.require("dijit.form.NumberSpinner");
+		dojo.require("dijit.form.ComboBox");
+		dojo.require("dijit.Menu");
+		dojo.require("dojo.parser");
+		dojo.addOnLoad(function(){
+			dojo.byId("locale").innerHTML = locale || "default";
+			dojo.byId("dir").innerHTML = bidi || "default";
+		});
+	</script>
+
+</head>
+<body class="tundra">
+	<div dojoType="dojo.data.ItemFileReadStore" jsId="store"
+		url="i18n/data.json"></div>
+	<div dojoType="dijit.tree.ForestStoreModel" jsId="model" store="store" childrenAttrs="languages">
+		<!-- Override all the data access functions to work from the I18N data store -->
+		<script type="dojo/method" event="getChildren" args="item, onComplete">
+			switch(item.root ?  "top" : store.getValue(item, "type")){
+				case "top":
+					return store.fetch({query: {type:'continent'}, onComplete: onComplete});
+				case "continent":
+					return store.fetch({query: {continent: store.getValue(item, "iso")}, onComplete: onComplete});
+				case "country":
+					return dijit.tree.ForestStoreModel.prototype.getChildren.apply(this, arguments);
+			}
+		</script>
+		<script type="dojo/method" event="mayHaveChildren" args="item">
+			if(item.root){ return true; }	// top level
+			var type = store.getValue(item, "type");
+			return (type == "continent" || type == "country");
+		</script>
+	</div>
+
+	<h1 class="testTitle" dir="ltr">Dijit I18N Demo (locale=<span id="locale"></span>  dir=<span id="dir"></span>)</h1>
+
+	<table width="100%">
+		<tr>
+			<td width="30%" style="vertical-align: top;">
+				<div dojoType="dijit.Tree" id="mytree" model="model">
+					<!-- override functions for display of each node -->
+					<script type="dojo/method" event="getIconClass" args="item">
+						var icon =
+							(!item.root && store.getValue(item, "type") == "country") ?
+							("countryIcon country" + store.getValue(item, "iso") + "Icon") :
+							dijit.Tree.prototype.getIconClass.apply(this, arguments);
+						return icon;
+					</script>
+					<script type="dojo/method" event="getLabel" args="item">
+						if(item.root){ return "Continents"; }
+						var localizedName = lang && store.getValue(item, lang);
+						return localizedName || (store.getLabel(item) + " \u202b" + "(" + store.getIdentity(item) + ")\u202c");
+					</script>
+
+					<!-- clicking a node refreshes the page with new locale setting -->
+					<script type="dojo/method" event="onClick" args="item, node">
+						var type = store.getValue(item, "type");
+						if(type == "language"){
+							var lang = store.getIdentity(item),
+								locale = lang + "-" + store.getIdentity(node.getParent().item).toLowerCase(),
+							dir = /ar|fa|he|ps|ur|yi/i.test(lang) ? "rtl" : "ltr";
+							window.location.href = window.location.href.replace(/\?.*/, "") + "?locale=" + locale + "&dir=" + dir;
+						}else{
+							alert("Please click a language, not a country or continent.");
+						}
+					</script>
+				</div>
+			</td>
+			<td style="vertical-align: top;">
+				<p dir="ltr">
+				Use the tree to select a language or a language/country combo; the page will reload
+				in the specified locale.  Note that tree is also rerendered using the specified language for top level tree items.
+				Arabic and Hebrew display right-to-left so be sure to try those.
+				</p>
+				<input dojoType="dijit._Calendar"/>
+
+				<p>Some form controls:</p>
+
+				<label for="date">Date:</label>
+				<input id="date" dojoType="dijit.form.DateTextBox" value="2006-07-04"/>
+				<br/>
+				<label for="spinner">Number spinner:</label>
+				<input id="spinner" dojoType="dijit.form.NumberSpinner" value="123456789"/>
+				<br/>
+				<label for="currency">Currency:</label>
+				<input id="currency" type="text" name="income1" value="54775.53"
+					dojoType="dijit.form.CurrencyTextBox"
+					required="true"
+					constraints="{fractional:true}"
+					currency="USD"/>
+				<br/>
+
+				<label for="combo1">Simple Combo:</label>
+				<select id="combo1" dojoType="dijit.form.ComboBox">
+					<option>option #1</option>
+					<option>option #2</option>
+					<option>option #3</option>
+				</select>
+				<br/>
+				<label for="combo2">Combo on languages and countries:</label>
+				<input id="combo2" dojoType="dijit.form.ComboBox"
+						value=""
+						store="store"
+						searchAttr="name"
+						name="anything"/>
+			</td>
+		</tr>
+	</table>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/icons.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/icons.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/icons.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/icons.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,133 @@
+html, body, #main{	
+	width: 100%;	
+	height: 100%;
+	overflow: hidden;	
+	padding: 0 0 0 0;
+	margin: 0 0 0 0;
+	font: 10pt Arial,Myriad,Tahoma,Verdana,sans-serif;
+}
+#banner, #footer {
+background-color: #ededff; 
+color: #333;
+padding:3px; 
+}
+#banner { text-align:right; } 
+#listPane tr:hover, #listPane td:hover, .dijitTreeContent:hover {
+	background-color: #ededed;
+	color: #333;
+	cursor: pointer;
+}
+#listPane tr, #listPane td { cursor: pointer; }
+table.demoTable {
+	border-collapse: collapse;	
+}
+th {
+	background-color: #4f8ce5; 
+	color: #666; 
+	font-weight:: bold !important;
+	margin:0;
+	padding:3px; 
+	background-image:url('../../themes/soria/images/titleBar.png');
+	background-position:0px -1px; 
+}
+.dijitRtl caption,
+.dijitRtl th {
+	text-align:right;
+}
+th .arrowNode { 
+	position:relative; 
+	float:left;
+	top:4px;
+	left:4px; 
+	width:16px;
+	height:16px;
+}
+.dijitRtl th .arrowNode{
+	float:right;	
+}
+th.arrowUp .arrowNode {
+	margin-right: 5px;
+	margin-top: -4px;
+	margin-bottom: 5px;
+	width: 15px;
+	height:15px;
+	background:transparent url("../../themes/soria/images/spriteRoundedIconsSmall.png") -45px top no-repeat;
+}
+th.arrowDown .arrowNode {
+	margin-right: 5px;
+	margin-top: -4px;
+	margin-bottom: 5px;
+	width: 15px;
+	height:15px;
+	background:transparent url("../../themes/soria/images/spriteRoundedIconsSmall.png") -15px top no-repeat;
+}
+.demoTable td { padding:3px; } 
+.demoTable {
+	border-spacing:0; 
+	padding:0; margin:0; 
+	width:98%;
+	
+}
+.oddRow {
+	background-color: #f2f5f9;
+}
+#message {
+	padding: 8px;
+}
+.subject {
+	background: gray;
+	width: 100%;
+	padding-top: 5px;
+	padding-bottom: 10px;
+}
+.message {
+	border: black 2px;
+}
+.messageHeader {
+	font:12pt Arial,sans-serif;
+	font-weight:bold;
+	color:#333; 
+}
+body .dojoSplitPane {
+	background: #ededff;
+	overflow: auto;
+}
+.mailIconCancel,
+.mailIconOptions,
+.mailIconFolderDocuments,
+.mailIconFolderInbox,
+.mailIconFolderSent,
+.mailIconGetMail,
+.mailIconNewMessage,
+.mailIconMailbox,
+.mailIconOk,
+.mailIconTrashcanFull {
+	background-image: url('icons.png'); 
+	background-repeat: no-repeat; 
+	width: 16px;
+	height: 16px;
+	text-align: center;
+	padding-right:4px; 
+}
+.dj_ie6 .mailIconCancel,
+.dj_ie6 .mailIconOptions,
+.dj_ie6 .mailIconFolderDocuments,
+.dj_ie6 .mailIconFolderInbox,
+.dj_ie6 .mailIconFolderSent,
+.dj_ie6 .mailIconGetMail,
+.dj_ie6 .mailIconNewMessage,
+.dj_ie6 .mailIconMailbox,
+.dj_ie6 .mailIconOk,
+.dj_ie6 .mailIconTrashcanFull {
+	background-image: url('icons.gif');
+}
+.mailIconCancel { background-position: 0px; }
+.mailIconOptions { background-position: -22px; }
+.mailIconFolderDocuments { background-position: -44px; }
+.mailIconFolderInbox { background-position: -66px; }
+.mailIconFolderSent { background-position: -88px; }
+.mailIconGetMail { background-position: -110px; }
+.mailIconNewMessage { background-position: -132px; }
+.mailIconMailbox { background-position: -154px; }
+.mailIconOk { background-position: -176px; }
+.mailIconTrashcanFull { background-position: -198px; }

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,157 @@
+html, body, #main{	
+	width: 100%;	/* make the body expand to fill the visible window */
+	height: 100%;
+	overflow: hidden;	/* erase window level scrollbars */
+	padding: 0 0 0 0;
+	margin: 0 0 0 0;
+	font: 10pt Arial,Myriad,Tahoma,Verdana,sans-serif;
+}
+
+#banner, #footer {
+background-color: #ededff; 
+color: #333;
+padding:3px; 
+}
+#banner { text-align:right; } 
+
+/* list of messages
+TODO: If i add the rules below as a plain tr/td it seems to mess up accordion, tree, etc. ???
+*/
+#listPane tr:hover, #listPane td:hover, .dijitTreeContent:hover {
+	background-color: #ededed;
+	color: #333;
+	cursor: pointer;
+}
+#listPane tr, #listPane td { cursor: pointer; }
+
+table.demoTable {
+	border-collapse: collapse;	
+}
+
+th {
+	background-color: #4f8ce5; 
+	color: #666; 
+	font-weight:: bold !important;
+	margin:0;
+	padding:3px; 
+	background-image:url('../../themes/soria/images/titleBar.png');
+	background-position:0px -1px; 
+}
+
+.dijitRtl caption,
+.dijitRtl th {
+	text-align:right;
+}
+
+th .arrowNode { 
+	position:relative; 
+	float:left;
+	top:4px;
+	left:4px; 
+	width:16px;
+	height:16px;
+}
+
+.dijitRtl th .arrowNode{
+	float:right;	
+}
+
+th.arrowUp .arrowNode {
+	margin-right: 5px;
+	margin-top: -4px;
+	margin-bottom: 5px;
+	width: 15px;
+	height:15px;
+	background:transparent url("../../themes/soria/images/spriteRoundedIconsSmall.png") -45px top no-repeat;
+}
+
+th.arrowDown .arrowNode {
+	margin-right: 5px;
+	margin-top: -4px;
+	margin-bottom: 5px;
+	width: 15px;
+	height:15px;
+	background:transparent url("../../themes/soria/images/spriteRoundedIconsSmall.png") -15px top no-repeat;
+}
+
+.demoTable td { padding:3px; } 
+.demoTable {
+	border-spacing:0; 
+	padding:0; margin:0; 
+	width:98%;
+	
+}
+.oddRow {
+	background-color: #f2f5f9;
+}
+
+#message {
+	padding: 8px;
+}
+
+/* Stuff for new messages */
+
+.subject {
+	background: gray;
+	width: 100%;
+	padding-top: 5px;
+	padding-bottom: 10px;
+}
+
+.message {
+	border: black 2px;
+}
+.messageHeader {
+	font:12pt Arial,sans-serif;
+	font-weight:bold;
+	color:#333; 
+}
+body .dojoSplitPane {
+	background: #ededff;
+	overflow: auto;
+}
+
+/* Icons */
+
+.mailIconCancel,
+.mailIconOptions,
+.mailIconFolderDocuments,
+.mailIconFolderInbox,
+.mailIconFolderSent,
+.mailIconGetMail,
+.mailIconNewMessage,
+.mailIconMailbox,
+.mailIconOk,
+.mailIconTrashcanFull {
+	background-image: url('icons.png'); /* mail icons sprite image */
+	background-repeat: no-repeat; 
+	width: 16px;
+	height: 16px;
+	text-align: center;
+	padding-right:4px; 
+}
+
+.dj_ie6 .mailIconCancel,
+.dj_ie6 .mailIconOptions,
+.dj_ie6 .mailIconFolderDocuments,
+.dj_ie6 .mailIconFolderInbox,
+.dj_ie6 .mailIconFolderSent,
+.dj_ie6 .mailIconGetMail,
+.dj_ie6 .mailIconNewMessage,
+.dj_ie6 .mailIconMailbox,
+.dj_ie6 .mailIconOk,
+.dj_ie6 .mailIconTrashcanFull {
+	background-image: url('icons.gif');
+}
+
+
+.mailIconCancel { background-position: 0px; }
+.mailIconOptions { background-position: -22px; }
+.mailIconFolderDocuments { background-position: -44px; }
+.mailIconFolderInbox { background-position: -66px; }
+.mailIconFolderSent { background-position: -88px; }
+.mailIconGetMail { background-position: -110px; }
+.mailIconNewMessage { background-position: -132px; }
+.mailIconMailbox { background-position: -154px; }
+.mailIconOk { background-position: -176px; }
+.mailIconTrashcanFull { background-position: -198px; }

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/mail.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,75 @@
+{ 
+	identifier: 'id',
+	label: 'label',
+	items: [
+
+		// Hierarchy of folders
+		{ type: 'folder', id: 'inbox', label:'Inbox', icon:'mailIconFolderInbox' },
+		{ type: 'folder', id: 'deleted', label:'Trash', icon:'mailIconTrashcanFull' },
+		{ type: 'folder', id: 'save', label:'Save',  folders:[
+			{ id: 'work', label:'stuff for work'},
+			{ id: 'fun', label:'stuff for fun'}
+		]},
+
+		// Address book (list of people that have sent me messages)
+		{ type: 'address', id: 'adam', label: "Adam Arlen" },
+		{ type: 'address', id: 'bob', label: "Bob Baxter" },
+		{ type: 'address', id: 'carrie', label: "Carrie Crow" },
+
+		// Flat list of messages (each message lists it's folder)
+
+		{ type: 'message', id: 'node1.1', folder: 'inbox', label: "today's meeting", sender: "Adam Arlen", sent: "2005-12-19",
+			text: "Today's meeting is cancelled.<br>Let's do it tomorrow instead.<br><br>Adam" },
+		{ type: 'message', id: 'node1.2', folder: 'inbox', label: "remaining work", sender: "Bob Baxter", sent: "2005-12-18",
+			text:
+				"<p>Hey, we need to talk about who's gonna do all the left over work.  Pick a day you want to meet: <div dojoType='dijit._Calendar'></div></p>"
+		},
+		{ type: 'message', id: 'node1.3', folder: 'inbox', label: "Hey, look!", sender: "Carrey Crown", sent: "2005-12-17", text:
+				"This is our new simple mail app. What do you think? <br><br>You can navigate around this demo with arrows and tabs ... <br><br>Regards,<br>Carrey"
+		},
+		{ type: 'message', id: 'node1.4', folder: 'inbox', label: "paint", sender: "David Davis", sent: "2005-12-16", text:
+			"<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+		},
+		{ type: 'message', id: 'node2.1', folder: 'deleted', label: "today's meeting", sender: "Madam Marlen", sent: "2005-12-19",
+			text: "Today's meeting is cancelled.<br>Let's do it tomorrow instead.<br><br>Madam" },
+		{ type: 'message', id: 'node2.2', folder: 'deleted', label: "congratulations", sender: "Rob Raxter", sent: "2005-12-18", text: " Good job on that project! " },
+		{ type: 'message', id: 'node2.3', folder: 'deleted', label: "schedule", sender: "Carrie Crow", sent: "2005-12-17", text: " Are we still on schedule?<br>The deadline is next Friday. " },
+		{ type: 'message', id: 'node2.4', folder: 'deleted', label: "paint", sender: "Daniel Dooey", sent: "2005-12-16", text:
+			"<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+		},
+		{ type: 'message', id: 'node3.1', folder: 'work', label: "today's meeting", sender: "Bob Baxter", sent: "2005-12-19",
+			text: "Today's meeting is cancelled.<br>Unnecessary.<br><br>Bob" },
+		{ type: 'message', id: 'node3.2', folder: 'work', label: "remaining work", sender: "Bob Baxter", sent: "2005-12-18", text: " Are we still on schedule?<br>The deadline is next Friday. " },
+		{ type: 'message', id: 'node3.3', folder: 'work', label: "lunch", sender: "Bob Baxter", sent: "2005-12-17", text:
+				"Where do you want to go for lunch?<br><br><ul><li>Fresh Choice<li>Starbucks<li>Dominos</ul><br><br>Let me know..."
+		},
+		{ type: 'message', id: 'node3.4', folder: 'work', label: "paint", sender: "Bob Baxter", sent: "2005-12-16", text:
+			"<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+		},
+		{ type: 'message', id: 'node4.1', folder: 'fun', label: "today's meeting", sender: "Jack Jackson", sent: "2005-12-19",
+			text: "Today's meeting is cancelled.<br>Let's do it friday instead.<br><br>Joe" },
+		{ type: 'message', id: 'node4.2', folder: 'fun', label: "remaining work", sender: "Jack Jackson", sent: "2005-12-18",
+			text:
+				"<p>Hey, we need to talk about who's gonna do all the left over work.  Pick a day you want to meet: <div dojoType='dijit._Calendar'></div></p>"
+		},
+		{ type: 'message', id: 'node4.3', folder: 'fun', label: "lunch", sender: "Jack Jackson", sent: "2005-12-17", text:
+				"Where do you want to go for lunch?<br><br><ul><li>Indian<li>Mexican<li>Chinese<li>Japanese<li>Pizza</ul><br><br>Let me know..."
+		},
+		{ type: 'message', id: 'node4.4', folder: 'fun', label: "paint", sender: "Jack Jackson", sent: "2005-12-16", text:
+			"<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+		},
+
+		{ type: 'message', id: 'node5.1', folder: 'deleted', label: "today's meeting", sender: "Jill Jones", sent: "2005-12-19",
+			text: "Today's meeting is cancelled.<br>Let's do it thursday instead.<br><br>Jill" },
+		{ type: 'message', id: 'node5.2', folder: 'deleted', label: "remaining work", sender: "Jill Jones", sent: "2005-12-18",
+			text:
+				"<p>Hey, we need to talk about who's gonna do all the left over work.  Pick a day you want to meet: <div dojoType='dijit._Calendar'></div></p>"
+		},
+		{ type: 'message', id: 'node5.3', folder: 'deleted', label: "lunch", sender: "Jill Jones", sent: "2005-12-17", text:
+				"Where do you want to go for lunch?<br><br><ul><li>McDonalds<li>Burger King<li>KFC</ul><br><br>Let me know..."
+		},
+		{ type: 'message', id: 'node5.4', folder: 'deleted', label: "paint", sender: "Jill Jones", sent: "2005-12-16", text:
+			"<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+		}
+	]
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/newMail.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/newMail.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/mail/newMail.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,8 @@
+<textarea dojoType="dijit.Editor" style="overflow:auto"
+	extraPlugins="[{name:'dijit._editor.plugins.LinkDialog'}]"
+
+>
+<i> This is just a sample message. There is email-address auto-complete in the to: field.
+<br><br> give it a whirl.
+</i>
+</textarea>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/mail.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/mail.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/mail.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,426 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+	"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Demo Mail Application</title>
+
+	<style type="text/css">
+		@import "../../dojo/resources/dojo.css";
+		@import "../themes/soria/soria.css";
+		@import "mail/mail.css";
+	</style>
+	<style type="text/css">
+		#inbox .dijitSplitterH { height: 5px }
+		#inbox .dijitSplitterV { width: 5px }
+	</style>
+
+	<script type="text/javascript" src="../../dojo/dojo.js"
+		djConfig="isDebug: false, parseOnLoad: true, defaultTestTheme: 'soria'"></script>
+	<script type="text/javascript" src="../tests/_testCommon.js"></script>
+	<!--
+	<script type="text/javascript" src="../dijit.js"></script>
+	<script type="text/javascript" src="../dijit-all.js" charset="utf-8"></script>
+	-->
+	<script type="text/javascript">
+		// Use profile builds, if available.  Since we use pretty much all of the widgets, just use dijit-all.
+		// A custom profile would provide some additional savings.
+		dojo.require("dijit.dijit");
+		dojo.require("dijit.dijit-all");
+
+		dojo.require("dojo.parser");
+		dojo.require("dojo.data.ItemFileWriteStore");
+
+		dojo.require("dijit.dijit");
+		dojo.require("dijit.Declaration");
+		dojo.require("dijit.form.Button");
+		dojo.require("dijit.Menu");
+		dojo.require("dijit.Tree");
+		dojo.require("dijit.Tooltip");
+		dojo.require("dijit.Dialog");
+		dojo.require("dijit.Toolbar");
+		dojo.require("dijit._Calendar");
+		dojo.require("dijit.ColorPalette");
+		dojo.require("dijit.Editor");
+		dojo.require("dijit._editor.plugins.LinkDialog");
+		dojo.require("dijit.ProgressBar");
+
+		dojo.require("dijit.form.ComboBox");
+		dojo.require("dijit.form.CheckBox");
+		dojo.require("dijit.form.FilteringSelect");
+		dojo.require("dijit.form.Textarea");
+
+		dojo.require("dijit.layout.BorderContainer");
+		dojo.require("dijit.layout.AccordionContainer");
+		dojo.require("dijit.layout.TabContainer");
+		dojo.require("dijit.layout.ContentPane");
+
+		dojo.addOnLoad(function(){
+			dijit.setWaiRole(dojo.body(), "application");
+		});
+		
+		var paneId=1;
+
+		// for "new message" tab closing
+		function testClose(pane,tab){
+		  return confirm("Are you sure you want to leave your changes?");
+		}
+
+		// fake mail download code:
+		var numMails;
+		var updateFetchStatus = function(x){
+			if (x == 0) {
+				dijit.byId('fakeFetch').update({ indeterminate: false });
+				return;
+			}
+			dijit.byId('fakeFetch').update({ progress: x });
+			if (x == numMails){
+				dojo.fadeOut({ node: 'fetchMail', duration:800,
+					// set progress back to indeterminate. we're cheating, because this
+					// doesn't actually have any data to "progress"
+					onEnd: function(){ 
+						dijit.byId('fakeFetch').update({ indeterminate: true });
+						dojo.byId('fetchMail').style.visibility='hidden'; // remove progress bar from tab order
+					}
+				}).play();
+			}
+		}
+		var fakeReport = function(percent){
+			// FIXME: can't set a label on an indeterminate progress bar
+			// like if(this.indeterminate) { return " connecting."; }
+			return dojo.string.substitute("Fetching: ${0} of ${1} messages.", [percent*this.maximum, this.maximum]);
+		}
+		var fakeDownload = function(){
+			dojo.byId('fetchMail').style.visibility='visible';
+			numMails = Math.floor(Math.random()*10)+1;
+			dijit.byId('fakeFetch').update({ maximum: numMails, progress:0 });
+			dojo.fadeIn({ node: 'fetchMail', duration:300 }).play();
+			for (var i=0; i<=numMails; i++){
+				setTimeout(function(){updateFetchStatus(i);},((i+1)*(Math.floor(Math.random()*100)+400)));
+			}
+		}
+		// fake sending dialog progress bar 
+		var stopSendBar = function(){
+			dijit.byId('fakeSend').update({indeterminate: false});
+			dijit.byId('sendDialog').hide();
+			tabs.selectedChildWidget.onClose = function(){return true;};  // don't want confirm message 
+			tabs.closeChild(tabs.selectedChildWidget);
+		}
+			 
+		var showSendBar = function(){
+			dijit.byId('fakeSend').update({ indeterminate: true });
+			dijit.byId('sendDialog').show();
+			setTimeout(function(){stopSendBar();}, 3000);
+		}
+
+	</script>
+</head>
+<body class="soria">
+	<div dojoType="dojo.data.ItemFileWriteStore" jsId="mailStore"
+		url="mail/mail.json"></div>
+
+	<!-- Inline declaration of a table widget (thanks Alex!) -->
+
+	<table dojoType="dijit.Declaration"
+		widgetClass="demo.Table" class="demoTable"
+		defaults="{ store: null, query: { query: { type: 'message' } }, columns: [ { name: 'From', attribute: 'sender' }, { name: 'Subject', attribute: 'label' }, { name: 'Sent on', attribute: 'sent',
+		format: function(v){ return dojo.date.locale.format(dojo.date.stamp.fromISOString(v), {selector: 'date'}); }
+		} ] }">
+		<thead dojoAttachPoint="head">
+			<tr dojoAttachPoint="headRow"></tr>
+		</thead>
+		<tbody dojoAttachPoint="body">
+			<tr dojoAttachPoint="row"></tr>
+		</tbody>
+
+		<script type="dojo/method">
+			dojo.forEach(this.columns, function(item, idx){
+				var icn = item.className||"";
+				// add a header for each column
+				var tth = document.createElement("th");
+				tth.innerHTML = "<span class='arrowNode'></span> "+ item.name;
+				tth.className = icn;
+				dojo.connect(tth, "onclick", dojo.hitch(this, "onSort", idx));
+				this.headRow.appendChild(tth);
+
+				// and fill in the column cell in the template row
+				this.row.appendChild(document.createElement("td"));
+				this.row.lastChild.className = icn;
+			}, this);
+			this.runQuery();
+		</script>
+		<script type="dojo/method" event="onSort" args="index">
+			var ca = this.columns[index].attribute;
+			var qs = this.query.sort;
+			// clobber an existing sort arrow
+			dojo.query("> th", this.headRow).removeClass("arrowUp").removeClass("arrowDown");
+			if(qs && qs[0].attribute == ca){
+				qs[0].descending = !qs[0].descending;
+			}else{
+				this.query.sort = [{
+					attribute: ca,
+					descending: false
+				}];
+			}
+			var th = dojo.query("> th", this.headRow)[index];
+			dojo.addClass(th, (this.query.sort[0].descending ? "arrowUp" : "arrowDown"));
+			this.runQuery();
+		</script>
+		<script type="dojo/method" event="runQuery">
+			this.query.onBegin = dojo.hitch(this, function(){ dojo.query("tr", this.body).orphan(); });
+			this.query.onItem = dojo.hitch(this, "onItem");
+			this.query.onComplete = dojo.hitch(this, function(){
+				dojo.query("tr:nth-child(odd)", this.body).addClass("oddRow");
+				dojo.query("tr:nth-child(even)", this.body).removeClass("oddRow");
+			});
+			this.store.fetch(this.query);
+		</script>
+		<script type="dojo/method" event="onItem" args="item">
+			var tr = this.row.cloneNode(true);
+			dojo.query("td", tr).forEach(function(n, i, a){
+				var tc = this.columns[i];
+				var tv = this.store.getValue(item, tc.attribute)||"";
+				if(tc.format){ tv = tc.format(tv, item, this.store); }
+				n.innerHTML = tv;
+			}, this);
+			this.body.appendChild(tr);
+			dojo.connect(tr, "onclick", this, function(){ this.onClick(item); });
+		</script>
+	</table>
+
+	<!-- Inline declaration for programmatically created "New Message" tabs -->
+	<div dojoType="dijit.Declaration"
+		widgetClass="mail.NewMessage">
+		<div dojoType="dijit.layout.BorderContainer" dojoAttachPoint="container" title="Composing..." closeable="true">
+			<div dojoType="dijit.layout.ContentPane" region="top" style="height:60px; overflow: visible; z-index: 10; color:#666;">
+				<table width="100%">
+					<tr style="padding-top:5px;">
+						<td style="padding-left:20px; padding-right: 8px; text-align:right;"><label for="${id}_to">To:</label></td>
+						<td width=100%>
+							<select dojoType="dijit.form.ComboBox" id="${id}_to" hasDownArrow="false">
+								<option></option>
+								<option>adam@xxxxxxxxx</option>
+								<option>barry@xxxxxxxxx</option>
+								<option>bob@xxxxxxxxx</option>
+								<option>cal@xxxxxxxxx</option>
+								<option>chris@xxxxxxxxx</option>
+								<option>courtney@xxxxxxxxx</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<td style="padding-left: 20px; padding-right:8px; text-align:right;"><label for="${id}_subject">Subject:</label></td>
+						<td width=100%>
+							<select dojoType="dijit.form.ComboBox" id="${id}_subject" hasDownArrow="false">
+								<option></option>
+								<option>progress meeting</option>
+								<option>reports</option>
+								<option>lunch</option>
+								<option>vacation</option>
+								<option>status meeting</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				<hr noshade size="1">
+			</div>
+
+			<!-- new message part -->
+			<!-- FIXME: editor as direct widget here doesn't init -->
+			<div dojoType="dijit.layout.ContentPane" region="center" href="mail/newMail.html"></div>
+			
+			<div dojoType="dijit.layout.ContentPane" region="bottom" style="height:32px" align="center">
+				<button dojoType="dijit.form.Button" iconClass="mailIconOk"
+				>Send
+				<script type="dojo/method" event="onClick">
+					var toField = dojo.byId("${id}_to");
+					if (toField.value == ""){
+						alert("Please enter a recipient address");
+					}else{
+						showSendBar();
+					}
+				</script>
+				</button>
+				<button dojoType="dijit.form.Button" iconClass="mailIconCancel" 
+				>Cancel
+				<script type="dojo/method" event="onClick">
+					tabs.closeChild(tabs.selectedChildWidget);
+				</script>
+				</button>
+			</div>
+		</div>
+	</div>
+
+
+	<div dojoType="dijit.layout.BorderContainer" id="main">
+
+		<!-- toolbar with new mail button, etc. -->
+		<div dojoType="dijit.Toolbar" region="top" style="height:25px;">
+			<div id="getMail" dojoType="dijit.form.ComboButton"
+				iconClass="mailIconGetMail" optionsTitle="Mail Source Options">
+				<script type="dojo/method" event="onClick">
+					fakeDownload();
+				</script>
+				<span>Get Mail</span>
+				<ul dojoType="dijit.Menu">
+					<li dojoType="dijit.MenuItem" iconClass="mailIconGetMail">Yahoo</li>
+					<li dojoType="dijit.MenuItem" iconClass="mailIconGetMail">GMail</li>
+				</ul>
+			</div>
+			<span dojoType="dijit.Tooltip" connectId="getMail">Click to download new mail.</span>
+
+			<button
+				id="newMsg" dojoType="dijit.form.Button"
+				iconClass="mailIconNewMessage">
+				New Message
+				<script type="dojo/method" event="onClick">
+					/* make a new tab for composing the message */
+					var newTab = new mail.NewMessage({id: "new"+paneId  }).container;
+					dojo.mixin(newTab,
+						{
+							title: "New Message #" + paneId++,
+							closable: true,
+							onClose: testClose
+						}
+					);
+					tabs.addChild(newTab);
+					tabs.selectChild(newTab);
+				</script>
+			</button>
+			<span dojoType="dijit.Tooltip" connectId="newMsg">Click to compose new message.</span>
+
+			<button id="options" dojoType="dijit.form.Button" iconClass="mailIconOptions">
+			 &nbsp;Options	
+				<script type="dojo/method" event="onClick">
+					dijit.byId('optionsDialog').show();
+				</script>
+			</button>
+			<div dojoType="dijit.Tooltip" connectId="options">Set various options</div>
+		</div>
+		
+		<div dojoType="dijit.layout.TabContainer" id="tabs" jsId="tabs" region="center">
+			<!-- main section with tree, table, and preview -->
+			<div dojoType="dijit.layout.BorderContainer" id="inbox" title="Inbox" design="sidebar">
+				<div dojoType="dijit.layout.AccordionContainer" region="leading" minSize="20" style="width:20%;" splitter="true">
+					<div dojoType="dijit.layout.AccordionPane" title="Folders">
+						<div dojoType="dijit.Tree" id="mytree" store="mailStore"
+							childrenAttr="folders" query="{type:'folder'}" label="Folders">
+							<script type="dojo/method" event="onClick" args="item">
+								if(!item){
+									return;	// top level node in tree doesn't correspond to any item
+								}
+								/* filter the message list to messages in this folder */
+								table.query.query = {
+									type: "message",
+									folder: mailStore.getValue(item, "id")
+								};
+								table.runQuery();
+							</script>
+							<script type="dojo/method" event="getIconClass" args="item">
+								return (item && mailStore.getValue(item, "icon")) || "mailIconFolderDocuments";
+							</script>
+						</div>
+					</div>
+					<div dojoType="dijit.layout.AccordionPane" title="Address Book">
+						<span dojoType="demo.Table" store="mailStore"
+							query="{ query: { type: 'address' }, columns: [ {name: 'User name', attribute: 'label'} ], sort: [ { attribute: 'label' } ]  }"
+							id="addresses" style="width: 100%">
+							<script type="dojo/method" event="preamble">
+								this.query = { type: "address" };
+								this.columns = [
+									{
+										name: "Name",
+										attribute: "label"
+									}
+								];
+							</script>
+							<script type="dojo/method" event="onClick" args="item">
+								table.query.query.sender = mailStore.getValue(item, "sender");
+								delete table.query.query.folder;
+								table.runQuery();
+							</script>
+						</span>
+					</div>
+				</div>  <!-- end of Accordion -->
+
+				<!-- list of messages pane -->
+				<div id="listPane" dojoType="dijit.layout.ContentPane" region="top" minSize="20" style="height:134px;" splitter="true">
+					<span dojoType="demo.Table" store="mailStore"
+						query="{ query: { type: 'message' }, sort: [ { attribute: 'label' } ]  }"
+						id="foo" jsId="table" style="width: 100%">
+						<script type="dojo/method" event="onClick" args="item">
+							var sender = this.store.getValue(item, "sender");
+							var subject = this.store.getValue(item, "label");
+							var sent = dojo.date.locale.format(
+								dojo.date.stamp.fromISOString(this.store.getValue(item, "sent")),
+								{formatLength: "long", selector: "date"});
+							var text = this.store.getValue(item, "text");
+							var messageInner = "<span class='messageHeader'>From: " + sender + "<br>" +
+								"Subject: "+ subject + "<br>" +
+								"Date: " + sent + "<br><br></span>" +
+								text;
+							dijit.byId("message").setContent(messageInner);
+						</script>
+					</span>
+				</div> <!-- end of listPane -->
+
+				<!-- message preview pane -->
+				<div id="message" dojoType="dijit.layout.ContentPane" region="center" minSize="20">
+					<p>
+					This is a simple application mockup showing some of the dojo widgets:
+					</p>
+					<ul>
+					  <li>layout widgets: BorderContainer, AccordionContainer</li>
+					  <li>TooltipDialog, Tooltip</li>
+					  <li>Tree</li>
+					  <li>form widgets: Button, DropDownButton, ComboButton, FilteringSelect, ComboBox</li>
+					  <li>Editor</li>
+					</ul>
+					<p>
+					The message list above originally contains all the messages, but you can filter it
+					by clicking on items in the left Accordion.
+					Then click on the messages in the above list to display them.
+					There's no server running, so the app is just a facade and it doesn't really do anything.
+					<!-- TODO: delete button (we can delete since we are using ItemFileWriteStore -->
+					</p>
+					<p>
+					<span style="font-family: 'Comic Sans MS',Textile,cursive; color: blue; font-style: italic;">-- Bill</span>
+					</p>
+				</div> <!-- end of "message" -->
+
+			</div> <!-- end of inbox -->
+		</div> <!-- end of TabContainer -->
+
+		<div dojoType="dijit.layout.ContentPane" region="bottom" id="footer" align="left">
+			<span style="float:right;">DojoMail v1.0 (demo only)</span>
+			<div id="fetchMail" style="opacity:0;visibility:hidden">
+				<div annotate="true" id="fakeFetch" dojoType="dijit.ProgressBar" style="height:15px; width:275px;" indeterminate="true" report="fakeReport"></div>
+			</div>
+		</div> 
+	</div> <!-- end of main -->
+
+	<div dojoType="dijit.Dialog" id="optionsDialog" title="Options:">
+		<table>	
+		<tr><td style="text-align:right;"><label for="option1">Transport type:</label></td><td>
+		<select id="option1" dojoType="dijit.form.FilteringSelect">
+			<option value="pop3">POP3</option>
+			<option value="imap">IMAP</option>
+		</select></td></tr>
+		<tr><td style="text-align:right;"><label for="option2">Server:</label></td><td><input id="option2" dojoType="dijit.form.TextBox" type="text">
+		</td></tr>
+
+		<tr><td style="text-align:right;"><input type="checkbox" id="fooCB" dojoType="dijit.form.CheckBox"></td><td><label for="fooCB">Leave messages on Server</label></td></tr>
+		<tr><td style="text-align:right;"><input type="checkbox" id="fooCB2" dojoType="dijit.form.CheckBox"></td><td><label for="fooCB2">Remember Password</label></td></tr>
+
+		<tr><td colspan="2" style="text-align:center;">
+		<button dojoType="dijit.form.Button" type="submit" iconClass="mailIconOk">OK</button>
+		<button dojoType="dijit.form.Button" type="submit" iconClass="mailIconCancel">Abort</button>
+		</td></tr>
+		</table>
+	</div>
+	<div dojoType="dijit.Dialog" id="sendDialog" title="Sending Mail">
+		<div id="sendMailBar" style="text-align:center">
+			<div  id="fakeSend" dojoType="dijit.ProgressBar" style="height:15px; width:175px;" indeterminate="true" ></div>
+		</div>
+	<div>	
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/en/helloworld.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/en/helloworld.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/en/helloworld.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/fr/helloworld.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/fr/helloworld.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/fr/helloworld.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/helloworld.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/helloworld.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/helloworld.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/zh/helloworld.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/zh/helloworld.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao/nls/zh/helloworld.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"localeSelect":"区域:","contentStr":"你好Dojo全球化! 今天是${0}。","dateSelect":"选择一个日期:","dateStr":"距离现在还有${0}秒。"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/demos/nihao.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+	"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<title>Dojo Globalization Hello World</title>
+
+		<script language="JavaScript" type="text/javascript">
+			// set the global locale for Dojo from the request parameter
+			var result = location.href.match(/[\?\&]locale=([^\&]+)/);
+			djConfig = {locale: result && result[1] || "en-us"}; // default locale is en-us
+	 	</script>
+
+		<script type="text/javascript" isDebug="true" src="../../dojo/dojo.js"></script>
+	
+		<style type="text/css">
+	 		@import "../../dojo/resources/dojo.css";
+			@import "../themes/tundra/tundra.css";
+			@import "../themes/tundra/tundra_rtl.css";
+
+			body {padding:1em}
+		</style>
+
+		<script language="JavaScript" type="text/javascript">
+			dojo.require("dojo.date.locale");
+			dojo.require("dojo.number");
+			dojo.require("dojo.string");
+			dojo.require("dojo.parser");
+			dojo.require("dijit.form.DateTextBox");
+
+			// load the resource bundle for HelloWorld
+			dojo.requireLocalization("dijit.demos.nihao", "helloworld");
+
+			var resourceBundle;
+
+			dojo.addOnLoad(function(){
+				// create the DateTextBox from the HTML segment with the dojoType set
+				dojo.parser.parse();
+			
+				// make current locale selected
+				dojo.byId('langList').value = dojo.locale;
+
+				// get the resource bundle object of the current global locale
+				resourceBundle = dojo.i18n.getLocalization("dijit.demos.nihao", "helloworld");
+
+				// do formatting and update the resource strings
+				dojo.byId('locale').innerHTML = resourceBundle.localeSelect;
+				dojo.byId('content').innerHTML = dojo.string.substitute(
+					resourceBundle.contentStr,
+					[dojo.date.locale.format(new Date(), {selector:'date', formatLength:'long'})]);
+				dojo.byId('date').innerHTML = resourceBundle.dateSelect;
+
+				dateChanged();
+			});
+
+			function localeChanged(){
+				open("nihao.html?locale=" + dojo.byId("langList").value, "_self");
+			}
+		
+			function dateChanged(){
+				if(resourceBundle){
+					var stamp = dijit.byId("dateBox").getValue();
+					if(stamp){
+						dojo.byId('secondsToGo').innerHTML = dojo.string.substitute(
+							resourceBundle.dateStr,
+							[dojo.number.format((stamp - new Date()) / 1000)]);
+					}
+				}
+			}
+		</script>
+	</head>
+
+	<body class="tundra">
+		<h1>Dojo Globalization Hello World</h1>
+		<p>
+			<span id="locale"></span>
+			<select id="langList" onchange="localeChanged();" >
+				<option value="en-us">en-US</option>
+				<option value="fr-fr">fr-FR</option>
+				<option value="zh-cn">zh-CN</option>
+			</select>
+		</p>		
+		<hr>
+		<p id="content"></p>			
+		<p>
+			<span id="date"></span>
+			<input id="dateBox" type="text" dojoType="dijit.form.DateTextBox" constraints="{formatLength:'long'}" onchange="dateChanged();">
+		</p>
+		<p id="secondsToGo"></p>
+	</body>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/dijit-all.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/dijit-all.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/dijit-all.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,20 @@
+/*
+	Copyright (c) 2004-2008, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing
+*/
+
+/*
+	This is a compiled version of Dojo, built for deployment and not for
+	development. To get an editable version, please visit:
+
+		http://dojotoolkit.org
+
+	for documentation and information on getting the source.
+*/
+
+if(!dojo._hasResource["dojo.colors"]){dojo._hasResource["dojo.colors"]=true;dojo.provide("dojo.colors");(function(){var _1=function(m1,m2,h){if(h<0){++h;}if(h>1){--h;}var h6=6*h;if(h6<1){return m1+(m2-m1)*h6;}if(2*h<1){return m2;}if(3*h<2){return m1+(m2-m1)*(2/3-h)*6;}return m1;};dojo.colorFromRgb=function(_6,_7){var m=_6.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1];if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r.charAt(r.length-1)=="%"){var a=dojo.map(c,function(x){return parseFloat(x)*2.56;});if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,_7);}return dojo.colorFromArray(c,_7);}if((t=="hsl"&&l==3)||(t=="hsla"&&l==4)){var H=((parseFloat(c[0])%360)+360)%360/360,S=parseFloat(c[1])/100,L=parseFloat(c[2])/100,m2=L<=0.5?L*(S+1):L+S-L*S,m1=2*L-m2,a=[_1(m1,m2,H+1/3)*256,_1(m1,m2,H)*256,_1(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,_7);}}return null;};var _14=function(c,low,_17){c=Number(c);return isNaN(c)?_17:c<low?low:c>_17?_17:c;};dojo.Color.prototype.sanitize=function(){var t=this;t.r=Math.round(_14(t.r,0,255));t.g=Math.round(_14(t.g,0,255));t.b=Math.round(_14(t.b,0,255));t.a=_14(t.a,0,1);return this;};})();dojo.colors.makeGrey=function(g,a){return dojo.colorFromArray([g,g,g,a]);};dojo.Color.named=dojo.mixin({aliceblue:[240,248,255],antiquewhite:[250,235,215],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],blanchedalmond:[255,235,205],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],oldlace:[253,245,230],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],thistle:[216,191,216],tomato:[255,99,71],transparent:[0,0,0,0],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],whitesmoke:[245,245,245],yellowgreen:[154,205,50]},dojo.Color.named);}if(!dojo._hasResource["dojo.i18n"]){dojo._hasResource["dojo.i18n"]=true;dojo.provide("dojo.i18n");dojo.i18n.getLocalization=function(_1b,_1c,_1d){_1d=dojo.i18n.normalizeLocale(_1d);var _1e=_1d.split("-");var _1f=[_1b,"nls",_1c].join(".");var _20=dojo._loadedModules[_1f];if(_20){var _21;for(var i=_1e.length;i>0;i--){var loc=_1e.slice(0,i).join("_");if(_20[loc]){_21=_20[loc];break;}}if(!_21){_21=_20.ROOT;}if(_21){var _24=function(){};_24.prototype=_21;return new _24();}}throw new Error("Bundle not found: "+_1c+" in "+_1b+" , locale="+_1d);};dojo.i18n.normalizeLocale=function(_25){var _26=_25?_25.toLowerCase():dojo.locale;if(_26=="root"){_26="ROOT";}return _26;};dojo.i18n._requireLocalization=function(_27,_28,_29,_2a){var _2b=dojo.i18n.normalizeLocale(_29);var _2c=[_27,"nls",_28].join(".");var _2d="";if(_2a){var _2e=_2a.split(",");for(var i=0;i<_2e.length;i++){if(_2b.indexOf(_2e[i])==0){if(_2e[i].length>_2d.length){_2d=_2e[i];}}}if(!_2d){_2d="ROOT";}}var _30=_2a?_2d:_2b;var _31=dojo._loadedModules[_2c];var _32=null;if(_31){if(dojo.config.localizationComplete&&_31._built){return;}var _33=_30.replace(/-/g,"_");var _34=_2c+"."+_33;_32=dojo._loadedModules[_34];}if(!_32){_31=dojo["provide"](_2c);var _35=dojo._getModuleSymbols(_27);var _36=_35.concat("nls").join("/");var _37;dojo.i18n._searchLocalePath(_30,_2a,function(loc){var _39=loc.replace(/-/g,"_");var _3a=_2c+"."+_39;var _3b=false;if(!dojo._loadedModules[_3a]){dojo["provide"](_3a);var _3c=[_36];if(loc!="ROOT"){_3c.push(loc);}_3c.push(_28);var _3d=_3c.join("/")+".js";_3b=dojo._loadPath(_3d,null,function(_3e){var _3f=function(){};_3f.prototype=_37;_31[_39]=new _3f();for(var j in _3e){_31[_39][j]=_3e[j];}});}else{_3b=true;}if(_3b&&_31[_39]){_37=_31[_39];}else{_31[_39]=_37;}if(_2a){return true;}});}if(_2a&&_2b!=_2d){_31[_2b.replace(/-/g,"_")]=_31[_2d.replace(/-/g,"_")];}};(function(){var _41=dojo.config.extraLocale;if(_41){if(!_41 instanceof Array){_41=[_41];}var req=dojo.i18n._requireLocalization;dojo.i18n._requireLocalization=function(m,b,_45,_46){req(m,b,_45,_46);if(_45){return;}for(var i=0;i<_41.length;i++){req(m,b,_41[i],_46);}};}})();dojo.i18n._searchLocalePath=function(_48,_49,_4a){_48=dojo.i18n.normalizeLocale(_48);var _4b=_48.split("-");var _4c=[];for(var i=_4b.length;i>0;i--){_4c.push(_4b.slice(0,i).join("-"));}_4c.push(false);if(_49){_4c.reverse();}for(var j=_4c.length-1;j>=0;j--){var loc=_4c[j]||"ROOT";var _50=_4a(loc);if(_50){break;}}};dojo.i18n._preloadLocalizations=function(_51,_52){function preload(_53){_53=dojo.i18n.normalizeLocale(_53);dojo.i18n._searchLocalePath(_53,true,function(loc){for(var i=0;i<_52.length;i++){if(_52[i]==loc){dojo["require"](_51+"_"+loc);return true;}}return false;});};preload();var _56=dojo.config.extraLocale||[];for(var i=0;i<_56.length;i++){preload(_56[i]);}};}if(!dojo._hasResource["dijit.ColorPalette"]){dojo._hasResource["dijit.ColorPalette"]=true;dojo.provide("dijit.ColorPalette");dojo.declare("dijit.ColorPalette",[dijit._Widget,dijit._Templated],{defaultTimeout:500,timeoutChangeRate:0.9,palette:"7x10",value:null,_currentFocus:0,_xDim:null,_yDim:null,_palettes:{"7x10":[["white","seashell","cornsilk","lemonchiffon","lightyellow","palegreen","paleturquoise","lightcyan","lavender","plum"],["lightgray","pink","bisque","moccasin","khaki","lightgreen","lightseagreen","lightskyblue","cornflowerblue","violet"],["silver","lightcoral","sandybrown","orange","palegoldenrod","chartreuse","mediumturquoise","skyblue","mediumslateblue","orchid"],["gray","red","orangered","darkorange","yellow","limegreen","darkseagreen","royalblue","slateblue","mediumorchid"],["dimgray","crimson","chocolate","coral","gold","forestgreen","seagreen","blue","blueviolet","darkorchid"],["darkslategray","firebrick","saddlebrown","sienna","olive","green","darkcyan","mediumblue","darkslateblue","darkmagenta"],["black","darkred","maroon","brown","darkolivegreen","darkgreen","midnightblue","navy","indigo","purple"]],"3x4":[["white","lime","green","blue"],["silver","yellow","fuchsia","navy"],["gray","red","purple","black"]]},_imagePaths:{"7x10":dojo.moduleUrl("dijit","templates/colors7x10.png"),"3x4":dojo.moduleUrl("dijit","templates/colors3x4.png")},_paletteCoords:{"leftOffset":3,"topOffset":3,"cWidth":20,"cHeight":20},templateString:"<div class=\"dijitInline dijitColorPalette\">\n\t<div class=\"dijitColorPaletteInner\" dojoAttachPoint=\"divNode\" waiRole=\"grid\" tabIndex=\"${tabIndex}\">\n\t\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\">\n\t</div>\t\n</div>\n",_paletteDims:{"7x10":{"width":"206px","height":"145px"},"3x4":{"width":"86px","height":"64px"}},tabIndex:"0",postCreate:function(){dojo.mixin(this.divNode.style,this._paletteDims[this.palette]);this.imageNode.setAttribute("src",this._imagePaths[this.palette]);var _58=this._palettes[this.palette];this.domNode.style.position="relative";this._cellNodes=[];this.colorNames=dojo.i18n.getLocalization("dojo","colors",this.lang);var url=dojo.moduleUrl("dojo","resources/blank.gif"),_5a=new dojo.Color(),_5b=this._paletteCoords;for(var row=0;row<_58.length;row++){for(var col=0;col<_58[row].length;col++){var _5e=dojo.doc.createElement("img");_5e.src=url;dojo.addClass(_5e,"dijitPaletteImg");var _5f=_58[row][col],_60=_5a.setColor(dojo.Color.named[_5f]);_5e.alt=this.colorNames[_5f];_5e.color=_60.toHex();var _61=_5e.style;_61.color=_61.backgroundColor=_5e.color;var _62=dojo.doc.createElement("span");_62.appendChild(_5e);dojo.forEach(["Dijitclick","MouseEnter","Focus","Blur"],function(_63){this.connect(_62,"on"+_63.toLowerCase(),"_onCell"+_63);},this);this.divNode.appendChild(_62);var _64=_62.style;_64.top=_5b.topOffset+(row*_5b.cHeight)+"px";_64.left=_5b.leftOffset+(col*_5b.cWidth)+"px";dojo.attr(_62,"tabindex","-1");_62.title=this.colorNames[_5f];dojo.addClass(_62,"dijitPaletteCell");dijit.setWaiRole(_62,"gridcell");_62.index=this._cellNodes.length;this._cellNodes.push(_62);}}this._xDim=_58[0].length;this._yDim=_58.length;this.connect(this.divNode,"onfocus","_onDivNodeFocus");var _65={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:1,LEFT_ARROW:-1};for(var key in _65){this._connects.push(dijit.typematic.addKeyListener(this.domNode,{keyCode:dojo.keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _67=_65[key];return function(_68){this._navigateByKey(_67,_68);};}(),this.timeoutChangeRate,this.defaultTimeout));}},focus:function(){this._focusFirst();},onChange:function(_69){},_focusFirst:function(){this._currentFocus=0;var _6a=this._cellNodes[this._currentFocus];window.setTimeout(function(){dijit.focus(_6a);},0);},_onDivNodeFocus:function(evt){if(evt.target===this.divNode){this._focusFirst();}},_onFocus:function(){dojo.attr(this.divNode,"tabindex","-1");},_onBlur:function(){this._removeCellHighlight(this._currentFocus);dojo.attr(this.divNode,"tabindex",this.tabIndex);},_onCellDijitclick:function(evt){var _6d=evt.currentTarget;if(this._currentFocus!=_6d.index){this._currentFocus=_6d.index;window.setTimeout(function(){dijit.focus(_6d);},0);}this._selectColor(_6d);dojo.stopEvent(evt);},_onCellMouseEnter:function(evt){var _6f=evt.currentTarget;window.setTimeout(function(){dijit.focus(_6f);},0);},_onCellFocus:function(evt){this._removeCellHighlight(this._currentFocus);this._currentFocus=evt.currentTarget.index;dojo.addClass(evt.currentTarget,"dijitPaletteCellHighlight");},_onCellBlur:function(evt){this._removeCellHighlight(this._currentFocus);},_removeCellHighlight:function(_72){dojo.removeClass(this._cellNodes[_72],"dijitPaletteCellHighlight");},_selectColor:function(_73){var img=_73.getElementsByTagName("img")[0];this.onChange(this.value=img.color);},_navigateByKey:function(_75,_76){if(_76==-1){return;}var _77=this._currentFocus+_75;if(_77<this._cellNodes.length&&_77>-1){var _78=this._cellNodes[_77];_78.focus();}}});}if(!dojo._hasResource["dijit.Declaration"]){dojo._hasResource["dijit.Declaration"]=true;dojo.provide("dijit.Declaration");dojo.declare("dijit.Declaration",dijit._Widget,{_noScript:true,widgetClass:"",replaceVars:true,defaults:null,mixins:[],buildRendering:function(){var src=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef);var _7a=dojo.query("> script[type='dojo/method'][event='preamble']",src).orphan();var _7b=dojo.query("> script[type^='dojo/']",src).orphan();var _7c=src.nodeName;var _7d=this.defaults||{};this.mixins=this.mixins.length?dojo.map(this.mixins,function(_7e){return dojo.getObject(_7e);}):[dijit._Widget,dijit._Templated];if(_7a.length){_7d.preamble=dojo.parser._functionFromScript(_7a[0]);}var _7f=dojo.map(_7b,function(s){var evt=s.getAttribute("event")||"postscript";return {event:evt,func:dojo.parser._functionFromScript(s)};});this.mixins.push(function(){dojo.forEach(_7f,function(s){dojo.connect(this,s.event,this,s.func);},this);});_7d.widgetsInTemplate=true;_7d._skipNodeCache=true;_7d.templateString="<"+_7c+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint")||"")+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent")||"")+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_7c+">";dojo.query("[dojoType]",src).forEach(function(_83){_83.removeAttribute("dojoType");});dojo.declare(this.widgetClass,this.mixins,_7d);}});}if(!dojo._hasResource["dojo.dnd.common"]){dojo._hasResource["dojo.dnd.common"]=true;dojo.provide("dojo.dnd.common");dojo.dnd._copyKey=navigator.appVersion.indexOf("Macintosh")<0?"ctrlKey":"metaKey";dojo.dnd.getCopyKeyState=function(e){return e[dojo.dnd._copyKey];};dojo.dnd._uniqueId=0;dojo.dnd.getUniqueId=function(){var id;do{id=dojo._scopeName+"Unique"+(++dojo.dnd._uniqueId);}while(dojo.byId(id));return id;};dojo.dnd._empty={};dojo.dnd.isFormElement=function(e){var t=e.target;if(t.nodeType==3){t=t.parentNode;}return " button textarea input select option ".indexOf(" "+t.tagName.toLowerCase()+" ")>=0;};}if(!dojo._hasResource["dojo.dnd.autoscroll"]){dojo._hasResource["dojo.dnd.autoscroll"]=true;dojo.provide("dojo.dnd.autoscroll");dojo.dnd.getViewport=function(){var d=dojo.doc,dd=d.documentElement,w=window,b=dojo.body();if(dojo.isMozilla){return {w:dd.clientWidth,h:w.innerHeight};}else{if(!dojo.isOpera&&w.innerWidth){return {w:w.innerWidth,h:w.innerHeight};}else{if(!dojo.isOpera&&dd&&dd.clientWidth){return {w:dd.clientWidth,h:dd.clientHeight};}else{if(b.clientWidth){return {w:b.clientWidth,h:b.clientHeight};}}}}return null;};dojo.dnd.V_TRIGGER_AUTOSCROLL=32;dojo.dnd.H_TRIGGER_AUTOSCROLL=32;dojo.dnd.V_AUTOSCROLL_VALUE=16;dojo.dnd.H_AUTOSCROLL_VALUE=16;dojo.dnd.autoScroll=function(e){var v=dojo.dnd.getViewport(),dx=0,dy=0;if(e.clientX<dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=-dojo.dnd.H_AUTOSCROLL_VALUE;}else{if(e.clientX>v.w-dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}if(e.clientY<dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=-dojo.dnd.V_AUTOSCROLL_VALUE;}else{if(e.clientY>v.h-dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=dojo.dnd.V_AUTOSCROLL_VALUE;}}window.scrollBy(dx,dy);};dojo.dnd._validNodes={"div":1,"p":1,"td":1};dojo.dnd._validOverflow={"auto":1,"scroll":1};dojo.dnd.autoScrollNodes=function(e){for(var n=e.target;n;){if(n.nodeType==1&&(n.tagName.toLowerCase() in dojo.dnd._validNodes)){var s=dojo.getComputedStyle(n);if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){var b=dojo._getContentBox(n,s),t=dojo._abs(n,true);b.l+=t.x+n.scrollLeft;b.t+=t.y+n.scrollTop;var w=Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL,b.w/2),h=Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL,b.h/2),rx=e.pageX-b.l,ry=e.pageY-b.t,dx=0,dy=0;if(rx>0&&rx<b.w){if(rx<w){dx=-dojo.dnd.H_AUTOSCROLL_VALUE;}else{if(rx>b.w-w){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}}if(ry>0&&ry<b.h){if(ry<h){dy=-dojo.dnd.V_AUTOSCROLL_VALUE;}else{if(ry>b.h-h){dy=dojo.dnd.V_AUTOSCROLL_VALUE;}}}var _9b=n.scrollLeft,_9c=n.scrollTop;n.scrollLeft=n.scrollLeft+dx;n.scrollTop=n.scrollTop+dy;if(_9b!=n.scrollLeft||_9c!=n.scrollTop){return;}}}try{n=n.parentNode;}catch(x){n=null;}}dojo.dnd.autoScroll(e);};}if(!dojo._hasResource["dojo.dnd.Mover"]){dojo._hasResource["dojo.dnd.Mover"]=true;dojo.provide("dojo.dnd.Mover");dojo.declare("dojo.dnd.Mover",null,{constructor:function(_9d,e,_9f){this.node=dojo.byId(_9d);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=this.host=_9f,d=_9d.ownerDocument,_a2=dojo.connect(d,"onmousemove",this,"onFirstMove");this.events=[dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo,"stopEvent"),dojo.connect(d,"onselectstart",dojo,"stopEvent"),_a2];if(h&&h.onMoveStart){h.onMoveStart(this);}},onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox;this.host.onMove(this,{l:m.l+e.pageX,t:m.t+e.pageY});},onMouseUp:function(e){if(this.mouseButton==e.button){this.destroy();}},onFirstMove:function(){var s=this.node.style,l,t;switch(s.position){case "relative":case "absolute":l=Math.round(parseFloat(s.left));t=Math.round(parseFloat(s.top));break;default:s.position="absolute";var m=dojo.marginBox(this.node);l=m.l;t=m.t;break;}this.marginBox.l=l-this.marginBox.l;this.marginBox.t=t-this.marginBox.t;this.host.onFirstMove(this);dojo.disconnect(this.events.pop());},destroy:function(){dojo.forEach(this.events,dojo.disconnect);var h=this.host;if(h&&h.onMoveStop){h.onMoveStop(this);}this.events=this.node=null;}});}if(!dojo._hasResource["dojo.dnd.Moveable"]){dojo._hasResource["dojo.dnd.Moveable"]=true;dojo.provide("dojo.dnd.Moveable");dojo.declare("dojo.dnd.Moveable",null,{handle:"",delay:0,skip:false,constructor:function(_ab,_ac){this.node=dojo.byId(_ab);if(!_ac){_ac={};}this.handle=_ac.handle?dojo.byId(_ac.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_ac.delay>0?_ac.delay:0;this.skip=_ac.skip;this.mover=_ac.mover?_ac.mover:dojo.dnd.Mover;this.events=[dojo.connect(this.handle,"onmousedown",this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_ad,_ae){return new dojo.dnd.Moveable(_ae,_ad);},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.events=this.node=this.handle=null;},onMouseDown:function(e){if(this.skip&&dojo.dnd.isFormElement(e)){return;}if(this.delay){this.events.push(dojo.connect(this.handle,"onmousemove",this,"onMouseMove"));this.events.push(dojo.connect(this.handle,"onmouseup",this,"onMouseUp"));this._lastX=e.pageX;this._lastY=e.pageY;}else{new this.mover(this.node,e,this);}dojo.stopEvent(e);},onMouseMove:function(e){if(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay){this.onMouseUp(e);new this.mover(this.node,e,this);}dojo.stopEvent(e);},onMouseUp:function(e){dojo.disconnect(this.events.pop());dojo.disconnect(this.events.pop());},onSelectStart:function(e){if(!this.skip||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onMoveStart:function(_b3){dojo.publish("/dnd/move/start",[_b3]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_b4){dojo.publish("/dnd/move/stop",[_b4]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_b5){},onMove:function(_b6,_b7){this.onMoving(_b6,_b7);var s=_b6.node.style;s.left=_b7.l+"px";s.top=_b7.t+"px";this.onMoved(_b6,_b7);},onMoving:function(_b9,_ba){},onMoved:function(_bb,_bc){}});}if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){dojo._hasResource["dojo.dnd.TimedMoveable"]=true;dojo.provide("dojo.dnd.TimedMoveable");(function(){var _bd=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(_be,_bf){if(!_bf){_bf={};}if(_bf.timeout&&typeof _bf.timeout=="number"&&_bf.timeout>=0){this.timeout=_bf.timeout;}},markupFactory:function(_c0,_c1){return new dojo.dnd.TimedMoveable(_c1,_c0);},onMoveStop:function(_c2){if(_c2._timer){clearTimeout(_c2._timer);_bd.call(this,_c2,_c2._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_c3,_c4){_c3._leftTop=_c4;if(!_c3._timer){var _t=this;_c3._timer=setTimeout(function(){_c3._timer=null;_bd.call(_t,_c3,_c3._leftTop);},this.timeout);}}});})();}if(!dojo._hasResource["dojo.fx"]){dojo._hasResource["dojo.fx"]=true;dojo.provide("dojo.fx");dojo.provide("dojo.fx.Toggler");(function(){var _c6={_fire:function(evt,_c8){if(this[evt]){this[evt].apply(this,_c8||[]);}return this;}};var _c9=function(_ca){this._index=-1;this._animations=_ca||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;dojo.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};dojo.extend(_c9,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){dojo.disconnect(this._onAnimateCtx);dojo.disconnect(this._onEndCtx);this._onAnimateCtx=this._onEndCtx=null;if(this._index+1==this._animations.length){this._fire("onEnd");}else{this._current=this._animations[++this._index];this._onAnimateCtx=dojo.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=dojo.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_cc,_cd){if(!this._current){this._current=this._animations[this._index=0];}if(!_cd&&this._current.status()=="playing"){return this;}var _ce=dojo.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_cf=dojo.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_d1=dojo.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);dojo.disconnect(_ce);dojo.disconnect(_cf);dojo.disconnect(_d1);});if(this._onAnimateCtx){dojo.disconnect(this._onAnimateCtx);}this._onAnimateCtx=dojo.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){dojo.disconnect(this._onEndCtx);}this._onEndCtx=dojo.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=dojo.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);dojo.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_d5,_d6){this.pause();var _d7=this.duration*_d5;this._current=null;dojo.some(this._animations,function(a){if(a.duration<=_d7){this._current=a;return true;}_d7-=a.duration;return false;});if(this._current){this._current.gotoPercent(_d7/_current.duration,_d6);}return this;},stop:function(_d9){if(this._current){if(_d9){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=dojo.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);dojo.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){dojo.disconnect(this._onAnimateCtx);}if(this._onEndCtx){dojo.disconnect(this._onEndCtx);}}});dojo.extend(_c9,_c6);dojo.fx.chain=function(_dc){return new _c9(_dc);};var _dd=function(_de){this._animations=_de||[];this._connects=[];this._finished=0;this.duration=0;dojo.forEach(_de,function(a){var _e0=a.duration;if(a.delay){_e0+=a.delay;}if(this.duration<_e0){this.duration=_e0;}this._connects.push(dojo.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new dojo._Animation({curve:[0,1],duration:this.duration});dojo.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop"],function(evt){this._connects.push(dojo.connect(this._pseudoAnimation,evt,dojo.hitch(this,"_fire",evt)));},this);};dojo.extend(_dd,{_doAction:function(_e2,_e3){dojo.forEach(this._animations,function(a){a[_e2].apply(a,_e3);});return this;},_onEnd:function(){if(++this._finished==this._animations.length){this._fire("onEnd");}},_call:function(_e5,_e6){var t=this._pseudoAnimation;t[_e5].apply(t,_e6);},play:function(_e8,_e9){this._finished=0;this._doAction("play",arguments);this._call("play",arguments);return this;},pause:function(){this._doAction("pause",arguments);this._call("pause",arguments);return this;},gotoPercent:function(_ea,_eb){var ms=this.duration*_ea;dojo.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_eb);});this._call("gotoProcent",arguments);return this;},stop:function(_ee){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){dojo.forEach(this._connects,dojo.disconnect);}});dojo.extend(_dd,_c6);dojo.fx.combine=function(_ef){return new _dd(_ef);};})();dojo.declare("dojo.fx.Toggler",null,{constructor:function(_f0){var _t=this;dojo.mixin(_t,_f0);_t.node=_f0.node;_t._showArgs=dojo.mixin({},_f0);_t._showArgs.node=_t.node;_t._showArgs.duration=_t.showDuration;_t.showAnim=_t.showFunc(_t._showArgs);_t._hideArgs=dojo.mixin({},_f0);_t._hideArgs.node=_t.node;_t._hideArgs.duration=_t.hideDuration;_t.hideAnim=_t.hideFunc(_t._hideArgs);dojo.connect(_t.showAnim,"beforeBegin",dojo.hitch(_t.hideAnim,"stop",true));dojo.connect(_t.hideAnim,"beforeBegin",dojo.hitch(_t.showAnim,"stop",true));},node:null,showFunc:dojo.fadeIn,hideFunc:dojo.fadeOut,showDuration:200,hideDuration:200,show:function(_f2){return this.showAnim.play(_f2||0);},hide:function(_f3){return this.hideAnim.play(_f3||0);}});dojo.fx.wipeIn=function(_f4){_f4.node=dojo.byId(_f4.node);var _f5=_f4.node,s=_f5.style;var _f7=dojo.animateProperty(dojo.mixin({properties:{height:{start:function(){s.overflow="hidden";if(s.visibility=="hidden"||s.display=="none"){s.height="1px";s.display="";s.visibility="";return 1;}else{var _f8=dojo.style(_f5,"height");return Math.max(_f8,1);}},end:function(){return _f5.scrollHeight;}}}},_f4));dojo.connect(_f7,"onEnd",function(){s.height="auto";});return _f7;};dojo.fx.wipeOut=function(_f9){var _fa=_f9.node=dojo.byId(_f9.node);var s=_fa.style;var _fc=dojo.animateProperty(dojo.mixin({properties:{height:{end:1}}},_f9));dojo.connect(_fc,"beforeBegin",function(){s.overflow="hidden";s.display="";});dojo.connect(_fc,"onEnd",function(){s.height="auto";s.display="none";});return _fc;};dojo.fx.slideTo=function(_fd){var _fe=(_fd.node=dojo.byId(_fd.node));var top=null;var left=null;var init=(function(n){return function(){var cs=dojo.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);left=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=dojo.coords(n,true);top=ret.y;left=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=left+"px";}};})(_fe);init();var anim=dojo.animateProperty(dojo.mixin({properties:{top:{end:_fd.top||0},left:{end:_fd.left||0}}},_fd));dojo.connect(anim,"beforeBegin",anim,init);return anim;};}if(!dojo._hasResource["dijit.layout.ContentPane"]){dojo._hasResource["dijit.layout.ContentPane"]=true;dojo.provide("dijit.layout.ContentPane");dojo.declare("dijit.layout.ContentPane",dijit._Widget,{href:"",extractContent:false,parseOnLoad:true,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,"class":"dijitContentPane",doLayout:"auto",postCreate:function(){this.domNode.title="";if(!this.containerNode){this.containerNode=this.domNode;}if(this.preload){this._loadCheck();}var _107=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_107);this.errorMessage=dojo.string.substitute(this.errorMessage,_107);var _108=dijit.getWaiRole(this.domNode);if(!_108){dijit.setWaiRole(this.domNode,"group");}dojo.addClass(this.domNode,this["class"]);},startup:function(){if(this._started){return;}if(this.doLayout!="false"&&this.doLayout!==false){this._checkIfSingleChild();if(this._singleChild){this._singleChild.startup();}}this._loadCheck();this.inherited(arguments);},_checkIfSingleChild:function(){var _109=dojo.query(">",this.containerNode||this.domNode),_10a=_109.filter("[widgetId]");if(_109.length==1&&_10a.length==1){this.isContainer=true;this._singleChild=dijit.byNode(_10a[0]);}else{delete this.isContainer;delete this._singleChild;}},refresh:function(){return this._prepareLoad(true);},setHref:function(href){this.href=href;return this._prepareLoad();},setContent:function(data){if(!this._isDownloaded){this.href="";this._onUnloadHandler();}this._setContent(data||"");this._isDownloaded=false;if(this.parseOnLoad){this._createSubWidgets();}if(this.doLayout!="false"&&this.doLayout!==false){this._checkIfSingleChild();if(this._singleChild&&this._singleChild.resize){this._singleChild.startup();this._singleChild.resize(this._contentBox||dojo.contentBox(this.containerNode||this.domNode));}}this._onLoadHandler();},cancel:function(){if(this._xhrDfd&&(this._xhrDfd.fired==-1)){this._xhrDfd.cancel();}delete this._xhrDfd;},destroy:function(){if(this._beingDestroyed){return;}this._onUnloadHandler();this._beingDestroyed=true;this.inherited("destroy",arguments);},resize:function(size){dojo.marginBox(this.domNode,size);var node=this.containerNode||this.domNode,mb=dojo.mixin(dojo.marginBox(node),size||{});this._contentBox=dijit.layout.marginBox2contentBox(node,mb);if(this._singleChild&&this._singleChild.resize){this._singleChild.resize(this._contentBox);}},_prepareLoad:function(_110){this.cancel();this.isLoaded=false;this._loadCheck(_110);},_isShown:function(){if("open" in this){return this.open;}else{var node=this.domNode;return (node.style.display!="none")&&(node.style.visibility!="hidden");}},_loadCheck:function(_112){var _113=this._isShown();if(this.href&&(_112||(this.preload&&!this._xhrDfd)||(this.refreshOnShow&&_113&&!this._xhrDfd)||(!this.isLoaded&&_113&&!this._xhrDfd))){this._downloadExternalContent();}},_downloadExternalContent:function(){this._onUnloadHandler();this._setContent(this.onDownloadStart.call(this));var self=this;var _115={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(dojo.isObject(this.ioArgs)){dojo.mixin(_115,this.ioArgs);}var hand=this._xhrDfd=(this.ioMethod||dojo.xhrGet)(_115);hand.addCallback(function(html){try{self.onDownloadEnd.call(self);self._isDownloaded=true;self.setContent.call(self,html);}catch(err){self._onError.call(self,"Content",err);}delete self._xhrDfd;return html;});hand.addErrback(function(err){if(!hand.cancelled){self._onError.call(self,"Download",err);}delete self._xhrDfd;return err;});},_onLoadHandler:function(){this.isLoaded=true;try{this.onLoad.call(this);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code");}},_onUnloadHandler:function(){this.isLoaded=false;this.cancel();try{this.onUnload.call(this);}catch(e){console.error("Error "+this.widgetId+" running custom onUnload code");}},_setContent:function(cont){this.destroyDescendants();try{var node=this.containerNode||this.domNode;while(node.firstChild){dojo._destroyElement(node.firstChild);}if(typeof cont=="string"){if(this.extractContent){match=cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(match){cont=match[1];}}node.innerHTML=cont;}else{if(cont.nodeType){node.appendChild(cont);}else{dojo.forEach(cont,function(n){node.appendChild(n.cloneNode(true));});}}}catch(e){var _11c=this.onContentError(e);try{node.innerHTML=_11c;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}}},_onError:function(type,err,_11f){var _120=this["on"+type+"Error"].call(this,err);if(_11f){console.error(_11f,err);}else{if(_120){this._setContent.call(this,_120);}}},_createSubWidgets:function(){var _121=this.containerNode||this.domNode;try{dojo.parser.parse(_121,true);}catch(e){this._onError("Content",e,"Couldn't create widgets in "+this.id+(this.href?" from "+this.href:""));}},onLoad:function(e){},onUnload:function(e){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(_124){},onDownloadError:function(_125){return this.errorMessage;},onDownloadEnd:function(){}});}if(!dojo._hasResource["dijit.form.Form"]){dojo._hasResource["dijit.form.Form"]=true;dojo.provide("dijit.form.Form");dojo.declare("dijit.form._FormMixin",null,{reset:function(){dojo.forEach(this.getDescendants(),function(_126){if(_126.reset){_126.reset();}});},validate:function(){var _127=false;return dojo.every(dojo.map(this.getDescendants(),function(_128){_128._hasBeenBlurred=true;var _129=!_128.validate||_128.validate();if(!_129&&!_127){dijit.scrollIntoView(_128.containerNode||_128.domNode);_128.focus();_127=true;}return _129;}),"return item;");},setValues:function(obj){var map={};dojo.forEach(this.getDescendants(),function(_12c){if(!_12c.name){return;}var _12d=map[_12c.name]||(map[_12c.name]=[]);_12d.push(_12c);});for(var name in map){var _12f=map[name],_130=dojo.getObject(name,false,obj);if(!dojo.isArray(_130)){_130=[_130];}if(typeof _12f[0].checked=="boolean"){dojo.forEach(_12f,function(w,i){w.setValue(dojo.indexOf(_130,w.value)!=-1);});}else{if(_12f[0]._multiValue){_12f[0].setValue(_130);}else{dojo.forEach(_12f,function(w,i){w.setValue(_130[i]);});}}}},getValues:function(){var obj={};dojo.forEach(this.getDescendants(),function(_136){var name=_136.name;if(!name){return;}var _138=(_136.getValue&&!_136._getValueDeprecated)?_136.getValue():_136.value;if(typeof _136.checked=="boolean"){if(/Radio/.test(_136.declaredClass)){if(_138!==false){dojo.setObject(name,_138,obj);}}else{var ary=dojo.getObject(name,false,obj);if(!ary){ary=[];dojo.setObject(name,ary,obj);}if(_138!==false){ary.push(_138);}}}else{dojo.setObject(name,_138,obj);}});return obj;},isValid:function(){return dojo.every(this.getDescendants(),function(_13a){return !_13a.isValid||_13a.isValid();});}});dojo.declare("dijit.form.Form",[dijit._Widget,dijit._Templated,dijit.form._FormMixin],{name:"",action:"",method:"",encType:"","accept-charset":"",accept:"",target:"",templateString:"<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' name='${name}'></form>",attributeMap:dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),{action:"",method:"",encType:"","accept-charset":"",accept:"",target:""}),execute:function(_13b){},onExecute:function(){},setAttribute:function(attr,_13d){this.inherited(arguments);switch(attr){case "encType":if(dojo.isIE){this.domNode.encoding=_13d;}}},postCreate:function(){if(dojo.isIE&&this.srcNodeRef&&this.srcNodeRef.attributes){var item=this.srcNodeRef.attributes.getNamedItem("encType");if(item&&!item.specified&&(typeof item.value=="string")){this.setAttribute("encType",item.value);}}this.inherited(arguments);},onReset:function(e){return true;},_onReset:function(e){var faux={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e.currentTarget,target:e.target};if(!(this.onReset(faux)===false)&&faux.returnValue){this.reset();}dojo.stopEvent(e);return false;},_onSubmit:function(e){var fp=dijit.form.Form.prototype;if(this.execute!=fp.execute||this.onExecute!=fp.onExecute){dojo.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.","","2.0");this.onExecute();this.execute(this.getValues());}if(this.onSubmit(e)===false){dojo.stopEvent(e);}},onSubmit:function(e){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});}if(!dojo._hasResource["dijit.Dialog"]){dojo._hasResource["dijit.Dialog"]=true;dojo.provide("dijit.Dialog");dojo.declare("dijit.DialogUnderlay",[dijit._Widget,dijit._Templated],{templateString:"<div class='dijitDialogUnderlayWrapper' id='${id}_wrapper'><div class='dijitDialogUnderlay ${class}' id='${id}' dojoAttachPoint='node'></div></div>",attributeMap:{},postCreate:function(){dojo.body().appendChild(this.domNode);this.bgIframe=new dijit.BackgroundIframe(this.domNode);},layout:function(){var _145=dijit.getViewport();var is=this.node.style,os=this.domNode.style;os.top=_145.t+"px";os.left=_145.l+"px";is.width=_145.w+"px";is.height=_145.h+"px";var _148=dijit.getViewport();if(_145.w!=_148.w){is.width=_148.w+"px";}if(_145.h!=_148.h){is.height=_148.h+"px";}},show:function(){this.domNode.style.display="block";this.layout();if(this.bgIframe.iframe){this.bgIframe.iframe.style.display="block";}this._resizeHandler=this.connect(window,"onresize","layout");},hide:function(){this.domNode.style.display="none";if(this.bgIframe.iframe){this.bgIframe.iframe.style.display="none";}this.disconnect(this._resizeHandler);},uninitialize:function(){if(this.bgIframe){this.bgIframe.destroy();}}});dojo.declare("dijit._DialogMixin",null,{attributeMap:dijit._Widget.prototype.attributeMap,execute:function(_149){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.getValues());},_getFocusItems:function(_14a){var _14b=dijit.getFirstInTabbingOrder(_14a);this._firstFocusItem=_14b?_14b:_14a;_14b=dijit.getLastInTabbingOrder(_14a);this._lastFocusItem=_14b?_14b:this._firstFocusItem;if(dojo.isMoz&&this._firstFocusItem.tagName.toLowerCase()=="input"&&dojo.attr(this._firstFocusItem,"type").toLowerCase()=="file"){dojo.attr(_14a,"tabindex","0");this._firstFocusItem=_14a;}}});dojo.declare("dijit.Dialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{templateString:null,templateString:"<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\">${title}</span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n",open:false,duration:400,refocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,attributeMap:dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),{title:"titleBar"}),postCreate:function(){dojo.body().appendChild(this.domNode);this.inherited(arguments);var _14c=dojo.i18n.getLocalization("dijit","common");if(this.closeButtonNode){this.closeButtonNode.setAttribute("title",_14c.buttonCancel);}if(this.closeText){this.closeText.setAttribute("title",_14c.buttonCancel);}var s=this.domNode.style;s.visibility="hidden";s.position="absolute";s.display="";s.top="-9999px";this.connect(this,"onExecute","hide");this.connect(this,"onCancel","hide");this._modalconnects=[];},onLoad:function(){this._position();this.inherited(arguments);},_setup:function(){if(this.titleBar){this._moveable=new dojo.dnd.TimedMoveable(this.domNode,{handle:this.titleBar,timeout:0});}this._underlay=new dijit.DialogUnderlay({id:this.id+"_underlay","class":dojo.map(this["class"].split(/\s/),function(s){return s+"_underlay";}).join(" ")});var node=this.domNode;this._fadeIn=dojo.fx.combine([dojo.fadeIn({node:node,duration:this.duration}),dojo.fadeIn({node:this._underlay.domNode,duration:this.duration,onBegin:dojo.hitch(this._underlay,"show")})]);this._fadeOut=dojo.fx.combine([dojo.fadeOut({node:node,duration:this.duration,onEnd:function(){node.style.visibility="hidden";node.style.top="-9999px";}}),dojo.fadeOut({node:this._underlay.domNode,duration:this.duration,onEnd:dojo.hitch(this._underlay,"hide")})]);},uninitialize:function(){if(this._fadeIn&&this._fadeIn.status()=="playing"){this._fadeIn.stop();}if(this._fadeOut&&this._fadeOut.status()=="playing"){this._fadeOut.stop();}if(this._underlay){this._underlay.destroy();}},_position:function(){if(dojo.hasClass(dojo.body(),"dojoMove")){return;}var _150=dijit.getViewport();var mb=dojo.marginBox(this.domNode);var _152=this.domNode.style;_152.left=Math.floor((_150.l+(_150.w-mb.w)/2))+"px";_152.top=Math.floor((_150.t+(_150.h-mb.h)/2))+"px";},_onKey:function(evt){if(evt.keyCode){var node=evt.target;if(evt.keyCode==dojo.keys.TAB){this._getFocusItems(this.domNode);}var _155=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.keyCode==dojo.keys.TAB){if(!_155){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.keyCode==dojo.keys.TAB&&!evt.shiftKey){if(!_155){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{while(node){if(node==this.domNode){if(evt.keyCode==dojo.keys.ESCAPE){this.hide();}else{return;}}node=node.parentNode;}if(evt.keyCode!=dojo.keys.TAB){dojo.stopEvent(evt);}else{if(!dojo.isOpera){try{this._firstFocusItem.focus();}catch(e){}}}}}}},show:function(){if(this.open){return;}if(!this._alreadyInitialized){this._setup();this._alreadyInitialized=true;}if(this._fadeOut.status()=="playing"){this._fadeOut.stop();}this._modalconnects.push(dojo.connect(window,"onscroll",this,"layout"));this._modalconnects.push(dojo.connect(dojo.doc.documentElement,"onkeypress",this,"_onKey"));dojo.style(this.domNode,"opacity",0);this.domNode.style.visibility="";this.open=true;this._loadCheck();this._position();this._fadeIn.play();this._savedFocus=dijit.getFocus(this);this._getFocusItems(this.domNode);setTimeout(dojo.hitch(this,function(){dijit.focus(this._firstFocusItem);}),50);},hide:function(){if(!this._alreadyInitialized){return;}if(this._fadeIn.status()=="playing"){this._fadeIn.stop();}this._fadeOut.play();if(this._scrollConnected){this._scrollConnected=false;}dojo.forEach(this._modalconnects,dojo.disconnect);this._modalconnects=[];if(this.refocus){this.connect(this._fadeOut,"onEnd",dojo.hitch(dijit,"focus",this._savedFocus));}this.open=false;},layout:function(){if(this.domNode.style.visibility!="hidden"){this._underlay.layout();this._position();}},destroy:function(){dojo.forEach(this._modalconnects,dojo.disconnect);if(this.refocus&&this.open){var fo=this._savedFocus;setTimeout(dojo.hitch(dijit,"focus",fo),25);}this.inherited(arguments);}});dojo.declare("dijit.TooltipDialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{title:"",doLayout:false,_firstFocusItem:null,_lastFocusItem:null,templateString:null,templateString:"<div class=\"dijitTooltipDialog\" waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presenation\"></div>\n</div>\n",postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");this.containerNode.title=this.title;},orient:function(node,_158,_159){this.domNode.className="dijitTooltipDialog "+" dijitTooltipAB"+(_159.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_159.charAt(0)=="T"?"Below":"Above");},onOpen:function(pos){this._getFocusItems(this.containerNode);this.orient(this.domNode,pos.aroundCorner,pos.corner);this._loadCheck();dijit.focus(this._firstFocusItem);},_onKey:function(evt){var node=evt.target;if(evt.keyCode==dojo.keys.TAB){this._getFocusItems(this.containerNode);}var _15d=(this._firstFocusItem==this._lastFocusItem);if(evt.keyCode==dojo.keys.ESCAPE){this.onCancel();}else{if(node==this._firstFocusItem&&evt.shiftKey&&evt.keyCode==dojo.keys.TAB){if(!_15d){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.keyCode==dojo.keys.TAB&&!evt.shiftKey){if(!_15d){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{if(evt.keyCode==dojo.keys.TAB){evt.stopPropagation();}}}}}});}if(!dojo._hasResource["dijit._editor.selection"]){dojo._hasResource["dijit._editor.selection"]=true;dojo.provide("dijit._editor.selection");dojo.mixin(dijit._editor.selection,{getType:function(){if(dojo.doc.selection){return dojo.doc.selection.type.toLowerCase();}else{var _15e="text";var oSel;try{oSel=dojo.global.getSelection();}catch(e){}if(oSel&&oSel.rangeCount==1){var _160=oSel.getRangeAt(0);if((_160.startContainer==_160.endContainer)&&((_160.endOffset-_160.startOffset)==1)&&(_160.startContainer.nodeType!=3)){_15e="control";}}return _15e;}},getSelectedText:function(){if(dojo.doc.selection){if(dijit._editor.selection.getType()=="control"){return null;}return dojo.doc.selection.createRange().text;}else{var _161=dojo.global.getSelection();if(_161){return _161.toString();}}return "";},getSelectedHtml:function(){if(dojo.doc.selection){if(dijit._editor.selection.getType()=="control"){return null;}return dojo.doc.selection.createRange().htmlText;}else{var _162=dojo.global.getSelection();if(_162&&_162.rangeCount){var frag=_162.getRangeAt(0).cloneContents();var div=dojo.doc.createElement("div");div.appendChild(frag);return div.innerHTML;}return null;}},getSelectedElement:function(){if(this.getType()=="control"){if(dojo.doc.selection){var _165=dojo.doc.selection.createRange();if(_165&&_165.item){return dojo.doc.selection.createRange().item(0);}}else{var _166=dojo.global.getSelection();return _166.anchorNode.childNodes[_166.anchorOffset];}}return null;},getParentElement:function(){if(this.getType()=="control"){var p=this.getSelectedElement();if(p){return p.parentNode;}}else{if(dojo.doc.selection){return dojo.doc.selection.createRange().parentElement();}else{var _168=dojo.global.getSelection();if(_168){var node=_168.anchorNode;while(node&&(node.nodeType!=1)){node=node.parentNode;}return node;}}}return null;},hasAncestorElement:function(_16a){return this.getAncestorElement.apply(this,arguments)!=null;},getAncestorElement:function(_16b){var node=this.getSelectedElement()||this.getParentElement();return this.getParentOfType(node,arguments);},isTag:function(node,tags){if(node&&node.tagName){var _nlc=node.tagName.toLowerCase();for(var i=0;i<tags.length;i++){var _tlc=String(tags[i]).toLowerCase();if(_nlc==_tlc){return _tlc;}}}return "";},getParentOfType:function(node,tags){while(node){if(this.isTag(node,tags).length){return node;}node=node.parentNode;}return null;},collapse:function(_174){if(window["getSelection"]){var _175=dojo.global.getSelection();if(_175.removeAllRanges){if(_174){_175.collapseToStart();}else{_175.collapseToEnd();}}else{_175.collapse(_174);}}else{if(dojo.doc.selection){var _176=dojo.doc.selection.createRange();_176.collapse(_174);_176.select();}}},remove:function(){var _s=dojo.doc.selection;if(_s){if(_s.type.toLowerCase()!="none"){_s.clear();}return _s;}else{_s=dojo.global.getSelection();_s.deleteFromDocument();return _s;}},selectElementChildren:function(_178,_179){var _17a=dojo.global;var _17b=dojo.doc;_178=dojo.byId(_178);if(_17b.selection&&dojo.body().createTextRange){var _17c=_178.ownerDocument.body.createTextRange();_17c.moveToElementText(_178);if(!_179){try{_17c.select();}catch(e){}}}else{if(_17a.getSelection){var _17d=_17a.getSelection();if(_17d.setBaseAndExtent){_17d.setBaseAndExtent(_178,0,_178,_178.innerText.length-1);}else{if(_17d.selectAllChildren){_17d.selectAllChildren(_178);}}}}},selectElement:function(_17e,_17f){var _180,_181=dojo.doc;_17e=dojo.byId(_17e);if(_181.selection&&dojo.body().createTextRange){try{_180=dojo.body().createControlRange();_180.addElement(_17e);if(!_17f){_180.select();}}catch(e){this.selectElementChildren(_17e,_17f);}}else{if(dojo.global.getSelection){var _182=dojo.global.getSelection();if(_182.removeAllRanges){_180=_181.createRange();_180.selectNode(_17e);_182.removeAllRanges();_182.addRange(_180);}}}}});}if(!dojo._hasResource["dijit._editor.html"]){dojo._hasResource["dijit._editor.html"]=true;dojo.provide("dijit._editor.html");dijit._editor.escapeXml=function(str,_184){str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_184){str=str.replace(/'/gm,"&#39;");}return str;};dijit._editor.getNodeHtml=function(node){var _186;switch(node.nodeType){case 1:_186="<"+node.nodeName.toLowerCase();var _187=[];if(dojo.isIE&&node.outerHTML){var s=node.outerHTML;s=s.substr(0,s.indexOf(">"));s=s.replace(/(['"])[^"']*\1/g,"");var reg=/([^\s=]+)=/g;var m,key;while((m=reg.exec(s))){key=m[1];if(key.substr(0,3)!="_dj"){if(key=="src"||key=="href"){if(node.getAttribute("_djrealurl")){_187.push([key,node.getAttribute("_djrealurl")]);continue;}}if(key=="style"){_187.push([key,node.style.cssText.toLowerCase()]);}else{_187.push([key,key=="class"?node.className:node.getAttribute(key)]);}}}}else{var attr,i=0,_18e=node.attributes;while((attr=_18e[i++])){var n=attr.name;if(n.substr(0,3)!="_dj"){var v=attr.value;if(n=="src"||n=="href"){if(node.getAttribute("_djrealurl")){v=node.getAttribute("_djrealurl");}}_187.push([n,v]);}}}_187.sort(function(a,b){return a[0]<b[0]?-1:(a[0]==b[0]?0:1);});i=0;while((attr=_187[i++])){_186+=" "+attr[0]+"=\""+(dojo.isString(attr[1])?dijit._editor.escapeXml(attr[1],true):attr[1])+"\"";}if(node.childNodes.length){_186+=">"+dijit._editor.getChildrenHtml(node)+"</"+node.nodeName.toLowerCase()+">";}else{_186+=" />";}break;case 3:_186=dijit._editor.escapeXml(node.nodeValue,true);break;case 8:_186="<!--"+dijit._editor.escapeXml(node.nodeValue,true)+"-->";break;default:_186="Element not recognized - Type: "+node.nodeType+" Name: "+node.nodeName;}return _186;};dijit._editor.getChildrenHtml=function(dom){var out="";if(!dom){return out;}var _195=dom["childNodes"]||dom;var i=0;var node;while((node=_195[i++])){out+=dijit._editor.getNodeHtml(node);}return out;};}if(!dojo._hasResource["dijit._editor.RichText"]){dojo._hasResource["dijit._editor.RichText"]=true;dojo.provide("dijit._editor.RichText");if(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"]){if(dojo._postLoad){(function(){var _198=dojo.doc.createElement("textarea");_198.id=dijit._scopeName+"._editor.RichText.savedContent";var s=_198.style;s.display="none";s.position="absolute";s.top="-100px";s.left="-100px";s.height="3px";s.width="3px";dojo.body().appendChild(_198);})();}else{try{dojo.doc.write("<textarea id=\""+dijit._scopeName+"._editor.RichText.savedContent\" "+"style=\"display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;\"></textarea>");}catch(e){}}}dojo.declare("dijit._editor.RichText",dijit._Widget,{constructor:function(){this.contentPreFilters=[];this.contentPostFilters=[];this.contentDomPreFilters=[];this.contentDomPostFilters=[];this.editingAreaStyleSheets=[];this._keyHandlers={};this.contentPreFilters.push(dojo.hitch(this,"_preFixUrlAttributes"));if(dojo.isMoz){this.contentPreFilters.push(this._fixContentForMoz);this.contentPostFilters.push(this._removeMozBogus);}else{if(dojo.isSafari){this.contentPostFilters.push(this._removeSafariBogus);}}this.onLoadDeferred=new dojo.Deferred();},inheritWidth:false,focusOnLoad:false,name:"",styleSheets:"",_content:"",height:"300px",minHeight:"1em",isClosed:true,isLoaded:false,_SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@",onLoadDeferred:null,postCreate:function(){dojo.publish(dijit._scopeName+"._editor.RichText::init",[this]);this.open();this.setupDefaultShortcuts();},setupDefaultShortcuts:function(){var exec=function(cmd,arg){return arguments.length==1?function(){this.execCommand(cmd);}:function(){this.execCommand(cmd,arg);};};var _19d={b:exec("bold"),i:exec("italic"),u:exec("underline"),a:exec("selectall"),s:function(){this.save(true);},"1":exec("formatblock","h1"),"2":exec("formatblock","h2"),"3":exec("formatblock","h3"),"4":exec("formatblock","h4"),"\\":exec("insertunorderedlist")};if(!dojo.isIE){_19d.Z=exec("redo");}for(var key in _19d){this.addKeyHandler(key,this.KEY_CTRL,_19d[key]);}},events:["onKeyPress","onKeyDown","onKeyUp","onClick"],captureEvents:[],_editorCommandsLocalized:false,_localizeEditorCommands:function(){if(this._editorCommandsLocalized){return;}this._editorCommandsLocalized=true;var _19f=["p","pre","address","h1","h2","h3","h4","h5","h6","ol","div","ul"];var _1a0="",_1a1,i=0;while((_1a1=_19f[i++])){if(_1a1.charAt(1)!="l"){_1a0+="<"+_1a1+"><span>content</span></"+_1a1+">";}else{_1a0+="<"+_1a1+"><li>content</li></"+_1a1+">";}}var div=dojo.doc.createElement("div");div.style.position="absolute";div.style.left="-2000px";div.style.top="-2000px";dojo.doc.body.appendChild(div);div.innerHTML=_1a0;var node=div.firstChild;while(node){dijit._editor.selection.selectElement(node.firstChild);dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[node.firstChild]);var _1a5=node.tagName.toLowerCase();this._local2NativeFormatNames[_1a5]=dojo.doc.queryCommandValue("formatblock");this._native2LocalFormatNames[this._local2NativeFormatNames[_1a5]]=_1a5;node=node.nextSibling;}dojo.doc.body.removeChild(div);},open:function(_1a6){if((!this.onLoadDeferred)||(this.onLoadDeferred.fired>=0)){this.onLoadDeferred=new dojo.Deferred();}if(!this.isClosed){this.close();}dojo.publish(dijit._scopeName+"._editor.RichText::open",[this]);this._content="";if((arguments.length==1)&&(_1a6["nodeName"])){this.domNode=_1a6;}var html;if((this.domNode["nodeName"])&&(this.domNode.nodeName.toLowerCase()=="textarea")){this.textarea=this.domNode;this.name=this.textarea.name;html=this._preFilterContent(this.textarea.value);this.domNode=dojo.doc.createElement("div");this.domNode.setAttribute("widgetId",this.id);this.textarea.removeAttribute("widgetId");this.domNode.cssText=this.textarea.cssText;this.domNode.className+=" "+this.textarea.className;dojo.place(this.domNode,this.textarea,"before");var _1a8=dojo.hitch(this,function(){dojo.attr(this.textarea,"tabIndex","-1");with(this.textarea.style){display="block";position="absolute";left=top="-1000px";if(dojo.isIE){this.__overflow=overflow;overflow="hidden";}}});if(dojo.isIE){setTimeout(_1a8,10);}else{_1a8();}}else{html=this._preFilterContent(dijit._editor.getChildrenHtml(this.domNode));this.domNode.innerHTML="";}if(html==""){html="&nbsp;";}var _1a9=dojo.contentBox(this.domNode);this._oldHeight=_1a9.h;this._oldWidth=_1a9.w;if((this.domNode["nodeName"])&&(this.domNode.nodeName=="LI")){this.domNode.innerHTML=" <br>";}this.editingArea=dojo.doc.createElement("div");this.domNode.appendChild(this.editingArea);if(this.name!=""&&(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"])){var _1aa=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");if(_1aa.value!=""){var _1ab=_1aa.value.split(this._SEPARATOR),i=0,dat;while((dat=_1ab[i++])){var data=dat.split(":");if(data[0]==this.name){html=data[1];_1ab.splice(i,1);break;}}}this.connect(window,"onbeforeunload","_saveContent");}this.isClosed=false;if(dojo.isIE||dojo.isSafari||dojo.isOpera){if(dojo.config["useXDomain"]&&!dojo.config["dojoBlankHtmlUrl"]){console.debug("dijit._editor.RichText: When using cross-domain Dojo builds,"+" please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"+" to the path on your domain to blank.html");}var burl=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"");var ifr=this.editorObject=this.iframe=dojo.doc.createElement("iframe");ifr.id=this.id+"_iframe";ifr.src=burl;ifr.style.border="none";ifr.style.width="100%";ifr.frameBorder=0;this.editingArea.appendChild(ifr);var h=null;var _1b2=dojo.hitch(this,function(){if(h){dojo.disconnect(h);h=null;}this.window=ifr.contentWindow;var d=this.document=this.window.document;d.open();d.write(this._getIframeDocTxt(html));d.close();if(dojo.isIE>=7){if(this.height){ifr.style.height=this.height;}if(this.minHeight){ifr.style.minHeight=this.minHeight;}}else{ifr.style.height=this.height?this.height:this.minHeight;}if(dojo.isIE){this._localizeEditorCommands();}this.onLoad();this.savedContent=this.getValue(true);});if(dojo.isIE&&dojo.isIE<7){var t=setInterval(function(){if(ifr.contentWindow.isLoaded){clearInterval(t);_1b2();}},100);}else{h=dojo.connect(((dojo.isIE)?ifr.contentWindow:ifr),"onload",_1b2);}}else{this._drawIframe(html);this.savedContent=this.getValue(true);}if(this.domNode.nodeName=="LI"){this.domNode.lastChild.style.marginTop="-1.2em";}this.domNode.className+=" RichTextEditable";},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_localizedIframeTitles:null,_getIframeDocTxt:function(html){var _cs=dojo.getComputedStyle(this.domNode);if(dojo.isIE||(!this.height&&!dojo.isMoz)){html="<div>"+html+"</div>";}var font=[_cs.fontWeight,_cs.fontSize,_cs.fontFamily].join(" ");var _1b8=_cs.lineHeight;if(_1b8.indexOf("px")>=0){_1b8=parseFloat(_1b8)/parseFloat(_cs.fontSize);}else{if(_1b8.indexOf("em")>=0){_1b8=parseFloat(_1b8);}else{_1b8="1.0";}}return [this.isLeftToRight()?"<html><head>":"<html dir='rtl'><head>",(dojo.isMoz?"<title>"+this._localizedIframeTitles.iframeEditTitle+"</title>":""),"<style>","body,html {","\tbackground:transparent;","\tfont:",font,";","\tpadding: 1em 0 0 0;","\tmargin: -1em 0 0 0;","\theight: 100%;","}","body{","\ttop:0px; left:0px; right:0px;",((this.height||dojo.isOpera)?"":"position: fixed;"),"\tmin-height:",this.minHeight,";","\tline-height:",_1b8,"}","p{ margin: 1em 0 !important; }",(this.height?"":"body,html{height:auto;overflow-y:hidden;/*for IE*/} body > div {overflow-x:auto;/*for FF to show vertical scrollbar*/}"),"li > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; } ","li{ min-height:1.2em; }","</style>",this._applyEditingAreaStyleSheets(),"</head><body>"+html+"</body></html>"].join("");},_drawIframe:function(html){if(!this.iframe){var ifr=this.iframe=dojo.doc.createElement("iframe");ifr.id=this.id;var ifrs=ifr.style;ifrs.border="none";ifrs.lineHeight="0";ifrs.verticalAlign="bottom";this.editorObject=this.iframe;this._localizedIframeTitles=dojo.i18n.getLocalization("dijit.form","Textarea");var _1bc=dojo.query("label[for=\""+this.id+"\"]");if(_1bc.length){this._localizedIframeTitles.iframeEditTitle=_1bc[0].innerHTML+" "+this._localizedIframeTitles.iframeEditTitle;}}this.iframe.style.width=this.inheritWidth?this._oldWidth:"100%";if(this.height){this.iframe.style.height=this.height;}else{this.iframe.height=this._oldHeight;}var _1bd;if(this.textarea){_1bd=this.srcNodeRef;}else{_1bd=dojo.doc.createElement("div");_1bd.style.display="none";_1bd.innerHTML=html;this.editingArea.appendChild(_1bd);}this.editingArea.appendChild(this.iframe);var _1be=false;var _1bf=this.iframe.contentDocument;_1bf.open();if(dojo.isAIR){_1bf.body.innerHTML=html;}else{_1bf.write(this._getIframeDocTxt(html));}_1bf.close();var _1c0=dojo.hitch(this,function(){if(!_1be){_1be=true;}else{return;}if(!this.editNode){try{if(this.iframe.contentWindow){this.window=this.iframe.contentWindow;this.document=this.iframe.contentWindow.document;}else{if(this.iframe.contentDocument){this.window=this.iframe.contentDocument.window;this.document=this.iframe.contentDocument;}}if(!this.document.body){throw "Error";}}catch(e){setTimeout(_1c0,500);_1be=false;return;}dojo._destroyElement(_1bd);this.onLoad();}else{dojo._destroyElement(_1bd);this.editNode.innerHTML=html;this.onDisplayChanged();}this._preDomFilterContent(this.editNode);});_1c0();},_applyEditingAreaStyleSheets:function(){var _1c1=[];if(this.styleSheets){_1c1=this.styleSheets.split(";");this.styleSheets="";}_1c1=_1c1.concat(this.editingAreaStyleSheets);this.editingAreaStyleSheets=[];var text="",i=0,url;while((url=_1c1[i++])){var _1c5=(new dojo._Url(dojo.global.location,url)).toString();this.editingAreaStyleSheets.push(_1c5);text+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_1c5+"\"/>";}return text;},addStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)=="."||(url.charAt(0)!="/"&&!uri.host)){url=(new dojo._Url(dojo.global.location,url)).toString();}if(dojo.indexOf(this.editingAreaStyleSheets,url)>-1){return;}this.editingAreaStyleSheets.push(url);if(this.document.createStyleSheet){this.document.createStyleSheet(url);}else{var head=this.document.getElementsByTagName("head")[0];var _1c9=this.document.createElement("link");with(_1c9){rel="stylesheet";type="text/css";href=url;}head.appendChild(_1c9);}},removeStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)=="."||(url.charAt(0)!="/"&&!uri.host)){url=(new dojo._Url(dojo.global.location,url)).toString();}var _1cc=dojo.indexOf(this.editingAreaStyleSheets,url);if(_1cc==-1){return;}delete this.editingAreaStyleSheets[_1cc];dojo.withGlobal(this.window,"query",dojo,["link:[href=\""+url+"\"]"]).orphan();},disabled:true,_mozSettingProps:["styleWithCSS","insertBrOnReturn"],setDisabled:function(_1cd){if(dojo.isIE||dojo.isSafari||dojo.isOpera){if(dojo.isIE){this.editNode.unselectable="on";}this.editNode.contentEditable=!_1cd;if(dojo.isIE){var _1ce=this;setTimeout(function(){_1ce.editNode.unselectable="off";},0);}}else{if(_1cd){this._mozSettings=[false,this.blockNodeForEnter==="BR"];}this.document.designMode=(_1cd?"off":"on");if(!_1cd&&this._mozSettings){dojo.forEach(this._mozSettingProps,function(s,i){this.document.execCommand(s,false,this._mozSettings[i]);},this);}}this.disabled=_1cd;},_isResized:function(){return false;},onLoad:function(e){this.isLoaded=true;if(!this.window.__registeredWindow){this.window.__registeredWindow=true;dijit.registerWin(this.window);}if(!dojo.isIE&&(this.height||dojo.isMoz)){this.editNode=this.document.body;}else{this.editNode=this.document.body.firstChild;var _1d2=this;if(dojo.isIE){var _1d3=this.tabStop=dojo.doc.createElement("<div tabIndex=-1>");this.editingArea.appendChild(_1d3);this.iframe.onfocus=function(){_1d2.editNode.setActive();};}}try{this.setDisabled(false);}catch(e){var _1d4=dojo.connect(this,"onClick",this,function(){this.setDisabled(false);dojo.disconnect(_1d4);});}this._preDomFilterContent(this.editNode);var _1d5=this.events.concat(this.captureEvents),i=0,et;while((et=_1d5[i++])){this.connect(this.document,et.toLowerCase(),et);}if(!dojo.isIE){try{this.document.execCommand("styleWithCSS",false,false);}catch(e2){}}else{this.connect(this.document,"onmousedown","_onMouseDown");this.editNode.style.zoom=1;}if(this.focusOnLoad){setTimeout(dojo.hitch(this,"focus"),0);}this.onDisplayChanged(e);if(this.onLoadDeferred){this.onLoadDeferred.callback(true);}},onKeyDown:function(e){if(dojo.isIE){if(e.keyCode==dojo.keys.TAB&&e.shiftKey&&!e.ctrlKey&&!e.altKey){this.iframe.focus();}else{if(e.keyCode==dojo.keys.TAB&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){this.tabStop.focus();}else{if(e.keyCode===dojo.keys.BACKSPACE&&this.document.selection.type==="Control"){dojo.stopEvent(e);this.execCommand("delete");}else{if((65<=e.keyCode&&e.keyCode<=90)||(e.keyCode>=37&&e.keyCode<=40)){e.charCode=e.keyCode;this.onKeyPress(e);}}}}}else{if(dojo.isMoz){if(e.keyCode==dojo.keys.TAB&&!e.shiftKey&&!e.ctrlKey&&!e.altKey&&this.iframe){this.iframe.contentDocument.title=this._localizedIframeTitles.iframeFocusTitle;this.iframe.focus();dojo.stopEvent(e);}else{if(e.keyCode==dojo.keys.TAB&&e.shiftKey){if(this.toolbar){this.toolbar.focus();}dojo.stopEvent(e);}}}}},onKeyUp:function(e){return;},KEY_CTRL:1,KEY_SHIFT:2,onKeyPress:function(e){var _1db=(e.ctrlKey&&!e.altKey)?this.KEY_CTRL:0|e.shiftKey?this.KEY_SHIFT:0;var key=e.keyChar||e.keyCode;if(this._keyHandlers[key]){var _1dd=this._keyHandlers[key],i=0,h;while((h=_1dd[i++])){if(_1db==h.modifiers){if(!h.handler.apply(this,arguments)){e.preventDefault();}break;}}}setTimeout(dojo.hitch(this,function(){this.onKeyPressed(e);}),1);},addKeyHandler:function(key,_1e1,_1e2){if(!dojo.isArray(this._keyHandlers[key])){this._keyHandlers[key]=[];}this._keyHandlers[key].push({modifiers:_1e1||0,handler:_1e2});},onKeyPressed:function(e){this.onDisplayChanged();},onClick:function(e){this.onDisplayChanged(e);},_onMouseDown:function(e){if(!this._focused&&!this.disabled){this.focus();}},_onBlur:function(e){this.inherited(arguments);var _c=this.getValue(true);if(_c!=this.savedContent){this.onChange(_c);this.savedContent=_c;}if(dojo.isMoz&&this.iframe){this.iframe.contentDocument.title=this._localizedIframeTitles.iframeEditTitle;}},_initialFocus:true,_onFocus:function(e){this.inherited(arguments);if(dojo.isMoz&&this._initialFocus){this._initialFocus=false;if(this.editNode.innerHTML.replace(/^\s+|\s+$/g,"")=="&nbsp;"){this.placeCursorAtStart();}}},blur:function(){if(!dojo.isIE&&this.window.document.documentElement&&this.window.document.documentElement.focus){this.window.document.documentElement.focus();}else{if(dojo.doc.body.focus){dojo.doc.body.focus();}}},focus:function(){if(!dojo.isIE){dijit.focus(this.iframe);}else{if(this.editNode&&this.editNode.focus){this.iframe.fireEvent("onfocus",document.createEventObject());}}},updateInterval:200,_updateTimer:null,onDisplayChanged:function(e){if(!this._updateTimer){if(this._updateTimer){clearTimeout(this._updateTimer);}this._updateTimer=setTimeout(dojo.hitch(this,this.onNormalizedDisplayChanged),this.updateInterval);}},onNormalizedDisplayChanged:function(){this._updateTimer=null;},onChange:function(_1ea){},_normalizeCommand:function(cmd){var _1ec=cmd.toLowerCase();if(_1ec=="hilitecolor"&&!dojo.isMoz){_1ec="backcolor";}return _1ec;},queryCommandAvailable:function(_1ed){var ie=1;var _1ef=1<<1;var _1f0=1<<2;var _1f1=1<<3;var _1f2=1<<4;var _1f3=dojo.isSafari;function isSupportedBy(_1f4){return {ie:Boolean(_1f4&ie),mozilla:Boolean(_1f4&_1ef),safari:Boolean(_1f4&_1f0),safari420:Boolean(_1f4&_1f2),opera:Boolean(_1f4&_1f1)};};var _1f5=null;switch(_1ed.toLowerCase()){case "bold":case "italic":case "underline":case "subscript":case "superscript":case "fontname":case "fontsize":case "forecolor":case "hilitecolor":case "justifycenter":case "justifyfull":case "justifyleft":case "justifyright":case "delete":case "selectall":case "toggledir":_1f5=isSupportedBy(_1ef|ie|_1f0|_1f1);break;case "createlink":case "unlink":case "removeformat":case "inserthorizontalrule":case "insertimage":case "insertorderedlist":case "insertunorderedlist":case "indent":case "outdent":case "formatblock":case "inserthtml":case "undo":case "redo":case "strikethrough":_1f5=isSupportedBy(_1ef|ie|_1f1|_1f2);break;case "blockdirltr":case "blockdirrtl":case "dirltr":case "dirrtl":case "inlinedirltr":case "inlinedirrtl":_1f5=isSupportedBy(ie);break;case "cut":case "copy":case "paste":_1f5=isSupportedBy(ie|_1ef|_1f2);break;case "inserttable":_1f5=isSupportedBy(_1ef|ie);break;case "insertcell":case "insertcol":case "insertrow":case "deletecells":case "deletecols":case "deleterows":case "mergecells":case "splitcell":_1f5=isSupportedBy(ie|_1ef);break;default:return false;}return (dojo.isIE&&_1f5.ie)||(dojo.isMoz&&_1f5.mozilla)||(dojo.isSafari&&_1f5.safari)||(_1f3&&_1f5.safari420)||(dojo.isOpera&&_1f5.opera);},execCommand:function(_1f6,_1f7){var _1f8;this.focus();_1f6=this._normalizeCommand(_1f6);if(_1f7!=undefined){if(_1f6=="heading"){throw new Error("unimplemented");}else{if((_1f6=="formatblock")&&dojo.isIE){_1f7="<"+_1f7+">";}}}if(_1f6=="inserthtml"){_1f7=this._preFilterContent(_1f7);if(dojo.isIE){var _1f9=this.document.selection.createRange();if(this.document.selection.type.toUpperCase()=="CONTROL"){var n=_1f9.item(0);while(_1f9.length){_1f9.remove(_1f9.item(0));}n.outerHTML=_1f7;}else{_1f9.pasteHTML(_1f7);}_1f9.select();_1f8=true;}else{if(dojo.isMoz&&!_1f7.length){dojo.withGlobal(this.window,"remove",dijit._editor.selection);_1f8=true;}else{_1f8=this.document.execCommand(_1f6,false,_1f7);}}}else{if((_1f6=="unlink")&&(this.queryCommandEnabled("unlink"))&&(dojo.isMoz||dojo.isSafari)){var _1fb=this.window.getSelection();var a=dojo.withGlobal(this.window,"getAncestorElement",dijit._editor.selection,["a"]);dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[a]);_1f8=this.document.execCommand("unlink",false,null);}else{if((_1f6=="hilitecolor")&&(dojo.isMoz)){this.document.execCommand("styleWithCSS",false,true);_1f8=this.document.execCommand(_1f6,false,_1f7);this.document.execCommand("styleWithCSS",false,false);}else{if((dojo.isIE)&&((_1f6=="backcolor")||(_1f6=="forecolor"))){_1f7=arguments.length>1?_1f7:null;_1f8=this.document.execCommand(_1f6,false,_1f7);}else{_1f7=arguments.length>1?_1f7:null;if(_1f7||_1f6!="createlink"){_1f8=this.document.execCommand(_1f6,false,_1f7);}}}}}this.onDisplayChanged();return _1f8;},queryCommandEnabled:function(_1fd){if(this.disabled){return false;}_1fd=this._normalizeCommand(_1fd);if(dojo.isMoz||dojo.isSafari){if(_1fd=="unlink"){return dojo.withGlobal(this.window,"hasAncestorElement",dijit._editor.selection,["a"]);}else{if(_1fd=="inserttable"){return true;}}}if(dojo.isSafari){if(_1fd=="copy"){_1fd="cut";}else{if(_1fd=="paste"){return true;}}}var elem=dojo.isIE?this.document.selection.createRange():this.document;return elem.queryCommandEnabled(_1fd);},queryCommandState:function(_1ff){if(this.disabled){return false;}_1ff=this._normalizeCommand(_1ff);return this.document.queryCommandState(_1ff);},queryCommandValue:function(_200){if(this.disabled){return false;}_200=this._normalizeCommand(_200);if(dojo.isIE&&_200=="formatblock"){return this._local2NativeFormatNames[this.document.queryCommandValue(_200)];}return this.document.queryCommandValue(_200);},placeCursorAtStart:function(){this.focus();var _201=false;if(dojo.isMoz){var _202=this.editNode.firstChild;while(_202){if(_202.nodeType==3){if(_202.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_201=true;dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[_202]);break;}}else{if(_202.nodeType==1){_201=true;dojo.withGlobal(this.window,"selectElementChildren",dijit._editor.selection,[_202]);break;}}_202=_202.nextSibling;}}else{_201=true;dojo.withGlobal(this.window,"selectElementChildren",dijit._editor.selection,[this.editNode]);}if(_201){dojo.withGlobal(this.window,"collapse",dijit._editor.selection,[true]);}},placeCursorAtEnd:function(){this.focus();var _203=false;if(dojo.isMoz){var last=this.editNode.lastChild;while(last){if(last.nodeType==3){if(last.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_203=true;dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[last]);break;}}else{if(last.nodeType==1){_203=true;if(last.lastChild){dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[last.lastChild]);}else{dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[last]);}break;}}last=last.previousSibling;}}else{_203=true;dojo.withGlobal(this.window,"selectElementChildren",dijit._editor.selection,[this.editNode]);}if(_203){dojo.withGlobal(this.window,"collapse",dijit._editor.selection,[false]);}},getValue:function(_205){if(this.textarea){if(this.isClosed||!this.isLoaded){return this.textarea.value;}}return this._postFilterContent(null,_205);},setValue:function(html){if(!this.isLoaded){this.onLoadDeferred.addCallback(dojo.hitch(this,function(){this.setValue(html);}));return;}if(this.textarea&&(this.isClosed||!this.isLoaded)){this.textarea.value=html;}else{html=this._preFilterContent(html);var node=this.isClosed?this.domNode:this.editNode;node.innerHTML=html;this._preDomFilterContent(node);}this.onDisplayChanged();},replaceValue:function(html){if(this.isClosed){this.setValue(html);}else{if(this.window&&this.window.getSelection&&!dojo.isMoz){this.setValue(html);}else{if(this.window&&this.window.getSelection){html=this._preFilterContent(html);this.execCommand("selectall");if(dojo.isMoz&&!html){html="&nbsp;";}this.execCommand("inserthtml",html);this._preDomFilterContent(this.editNode);}else{if(this.document&&this.document.selection){this.setValue(html);}}}}},_preFilterContent:function(html){var ec=html;dojo.forEach(this.contentPreFilters,function(ef){if(ef){ec=ef(ec);}});return ec;},_preDomFilterContent:function(dom){dom=dom||this.editNode;dojo.forEach(this.contentDomPreFilters,function(ef){if(ef&&dojo.isFunction(ef)){ef(dom);}},this);},_postFilterContent:function(dom,_20f){var ec;if(!dojo.isString(dom)){dom=dom||this.editNode;if(this.contentDomPostFilters.length){if(_20f&&dom["cloneNode"]){dom=dom.cloneNode(true);}dojo.forEach(this.contentDomPostFilters,function(ef){dom=ef(dom);});}ec=dijit._editor.getChildrenHtml(dom);}else{ec=dom;}if(!ec.replace(/^(?:\s|\xA0)+/g,"").replace(/(?:\s|\xA0)+$/g,"").length){ec="";}dojo.forEach(this.contentPostFilters,function(ef){ec=ef(ec);});return ec;},_saveContent:function(e){var _214=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");_214.value+=this._SEPARATOR+this.name+":"+this.getValue();},escapeXml:function(str,_216){dojo.deprecated("dijit.Editor::escapeXml is deprecated","use dijit._editor.escapeXml instead",2);return dijit._editor.escapeXml(str,_216);},getNodeHtml:function(node){dojo.deprecated("dijit.Editor::getNodeHtml is deprecated","use dijit._editor.getNodeHtml instead",2);return dijit._editor.getNodeHtml(node);},getNodeChildrenHtml:function(dom){dojo.deprecated("dijit.Editor::getNodeChildrenHtml is deprecated","use dijit._editor.getChildrenHtml instead",2);return dijit._editor.getChildrenHtml(dom);},close:function(save,_21a){if(this.isClosed){return false;}if(!arguments.length){save=true;}this._content=this.getValue();var _21b=(this.savedContent!=this._content);if(this.interval){clearInterval(this.interval);}if(this.textarea){with(this.textarea.style){position="";left=top="";if(dojo.isIE){overflow=this.__overflow;this.__overflow=null;}}this.textarea.value=save?this._content:this.savedContent;dojo._destroyElement(this.domNode);this.domNode=this.textarea;}else{this.domNode.innerHTML=save?this._content:this.savedContent;}dojo.removeClass(this.domNode,"RichTextEditable");this.isClosed=true;this.isLoaded=false;delete this.editNode;if(this.window&&this.window._frameElement){this.window._frameElement=null;}this.window=null;this.document=null;this.editingArea=null;this.editorObject=null;return _21b;},destroyRendering:function(){},destroy:function(){this.destroyRendering();if(!this.isClosed){this.close(false);}this.inherited("destroy",arguments);},_removeMozBogus:function(html){return html.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"");},_removeSafariBogus:function(html){return html.replace(/\sclass="webkit-block-placeholder"/gi,"");},_fixContentForMoz:function(html){return html.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");},_srcInImgRegex:/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,_hrefInARegex:/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,_preFixUrlAttributes:function(html){return html.replace(this._hrefInARegex,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2").replace(this._srcInImgRegex,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2");}});}if(!dojo._hasResource["dijit.Toolbar"]){dojo._hasResource["dijit.Toolbar"]=true;dojo.provide("dijit.Toolbar");dojo.declare("dijit.Toolbar",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{templateString:"<div class=\"dijit dijitToolbar\" waiRole=\"toolbar\" tabIndex=\"${tabIndex}\" dojoAttachPoint=\"containerNode\">"+"</div>",tabIndex:"0",postCreate:function(){this.connectKeyNavHandlers(this.isLeftToRight()?[dojo.keys.LEFT_ARROW]:[dojo.keys.RIGHT_ARROW],this.isLeftToRight()?[dojo.keys.RIGHT_ARROW]:[dojo.keys.LEFT_ARROW]);},startup:function(){if(this._started){return;}this.startupKeyNavChildren();this.inherited(arguments);}});dojo.declare("dijit.ToolbarSeparator",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitToolbarSeparator dijitInline\"></div>",postCreate:function(){dojo.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}if(!dojo._hasResource["dijit.form.Button"]){dojo._hasResource["dijit.form.Button"]=true;dojo.provide("dijit.form.Button");dojo.declare("dijit.form.Button",dijit.form._FormWidget,{label:"",showLabel:true,iconClass:"",type:"button",baseClass:"dijitButton",templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\twaiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" dojoAttachPoint=\"focusNode,titleNode\"\n\t\ttype=\"${type}\" waiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t><span class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" \n \t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#10003;</span \n\t\t></span\n\t\t><div class=\"dijitReset dijitInline\"><center class=\"dijitReset dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\">${label}</center></div\n\t></button\n></div>\n",_onChangeMonitor:"",_onClick:function(e){if(this.disabled||this.readOnly){dojo.stopEvent(e);return false;}this._clicked();return this.onClick(e);},_onButtonClick:function(e){if(this._onClick(e)===false){dojo.stopEvent(e);}else{if(this.type=="submit"&&!this.focusNode.form){for(var node=this.domNode;node.parentNode;node=node.parentNode){var _223=dijit.byNode(node);if(_223&&typeof _223._onSubmit=="function"){_223._onSubmit(e);break;}}}}},postCreate:function(){if(this.showLabel==false){var _224="";this.label=this.containerNode.innerHTML;_224=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");this.titleNode.title=_224;dojo.addClass(this.containerNode,"dijitDisplayNone");}dojo.setSelectable(this.focusNode,false);this.inherited(arguments);},onClick:function(e){return true;},_clicked:function(e){},setLabel:function(_227){this.containerNode.innerHTML=this.label=_227;this._layoutHack();if(this.showLabel==false){this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});dojo.declare("dijit.form.DropDownButton",[dijit.form.Button,dijit._Container],{baseClass:"dijitDropDownButton",templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey\"\n\twaiRole=\"presentation\"\n\t><div class='dijitReset dijitRight' waiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" type=\"${type}\"\n\t\tdojoAttachPoint=\"focusNode,titleNode\" waiRole=\"button\" waiState=\"haspopup-true,labelledby-${id}_label\"\n\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t><div class=\"dijitReset dijitInline dijitButtonText\"  dojoAttachPoint=\"containerNode,popupStateNode\" waiRole=\"presentation\"\n\t\t\tid=\"${id}_label\">${label}</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t></button\n></div></div>\n",_fillContent:function(){if(this.srcNodeRef){var _228=dojo.query("*",this.srcNodeRef);dijit.form.DropDownButton.superclass._fillContent.call(this,_228[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown){var _229=dojo.query("[widgetId]",this.dropDownContainer)[0];this.dropDown=dijit.byNode(_229);delete this.dropDownContainer;}dijit.popup.prepare(this.dropDown.domNode);this.inherited(arguments);},destroyDescendants:function(){if(this.dropDown){this.dropDown.destroyRecursive();delete this.dropDown;}this.inherited(arguments);},_onArrowClick:function(e){if(this.disabled||this.readOnly){return;}this._toggleDropDown();},_onDropDownClick:function(e){var _22c=dojo.isFF&&dojo.isFF<3&&navigator.appVersion.indexOf("Macintosh")!=-1;if(!_22c||e.detail!=0||this._seenKeydown){this._onArrowClick(e);}this._seenKeydown=false;},_onDropDownKeydown:function(e){this._seenKeydown=true;},_onDropDownBlur:function(e){this._seenKeydown=false;},_onKey:function(e){if(this.disabled||this.readOnly){return;}if(e.keyCode==dojo.keys.DOWN_ARROW){if(!this.dropDown||this.dropDown.domNode.style.visibility=="hidden"){dojo.stopEvent(e);this._toggleDropDown();}}},_onBlur:function(){this._closeDropDown();this.inherited(arguments);},_toggleDropDown:function(){if(this.disabled||this.readOnly){return;}dijit.focus(this.popupStateNode);var _230=this.dropDown;if(!_230){return;}if(!this._opened){if(_230.href&&!_230.isLoaded){var self=this;var _232=dojo.connect(_230,"onLoad",function(){dojo.disconnect(_232);self._openDropDown();});_230._loadCheck(true);return;}else{this._openDropDown();}}else{this._closeDropDown();}},_openDropDown:function(){var _233=this.dropDown;var _234=_233.domNode.style.width;var self=this;dijit.popup.open({parent:this,popup:_233,around:this.domNode,orient:this.isLeftToRight()?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"},onExecute:function(){self._closeDropDown(true);},onCancel:function(){self._closeDropDown(true);},onClose:function(){_233.domNode.style.width=_234;self.popupStateNode.removeAttribute("popupActive");this._opened=false;}});if(this.domNode.offsetWidth>_233.domNode.offsetWidth){var _236=null;if(!this.isLeftToRight()){_236=_233.domNode.parentNode;var _237=_236.offsetLeft+_236.offsetWidth;}dojo.marginBox(_233.domNode,{w:this.domNode.offsetWidth});if(_236){_236.style.left=_237-this.domNode.offsetWidth+"px";}}this.popupStateNode.setAttribute("popupActive","true");this._opened=true;if(_233.focus){_233.focus();}},_closeDropDown:function(_238){if(this._opened){dijit.popup.close(this.dropDown);if(_238){this.focus();}this._opened=false;}}});dojo.declare("dijit.form.ComboButton",dijit.form.DropDownButton,{templateString:"<table class='dijit dijitReset dijitInline dijitLeft'\n\tcellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td\tclass=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\"\n\t\t\ttabIndex=\"${tabIndex}\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"  dojoAttachPoint=\"titleNode\"\n\t\t\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"presentation\">${label}</div\n\t\t></td\n\t\t><td class='dijitReset dijitStretch dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"popupStateNode,focusNode\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onArrowClick, onkeypress:_onKey,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\tstateModifier=\"DownArrow\"\n\t\t\ttitle=\"${optionsTitle}\" name=\"${name}\"\n\t\t\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t\t></td\n\t></tr></tbody\n></table>\n",attributeMap:dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),{id:"",name:""}),optionsTitle:"",baseClass:"dijitComboButton",_focusedNode:null,postCreate:function(){this.inherited(arguments);this._focalNodes=[this.titleNode,this.popupStateNode];dojo.forEach(this._focalNodes,dojo.hitch(this,function(node){if(dojo.isIE){this.connect(node,"onactivate",this._onNodeFocus);this.connect(node,"ondeactivate",this._onNodeBlur);}else{this.connect(node,"onfocus",this._onNodeFocus);this.connect(node,"onblur",this._onNodeBlur);}}));},focusFocalNode:function(node){this._focusedNode=node;dijit.focus(node);},hasNextFocalNode:function(){return this._focusedNode!==this.getFocalNodes()[1];},focusNext:function(){this._focusedNode=this.getFocalNodes()[this._focusedNode?1:0];dijit.focus(this._focusedNode);},hasPrevFocalNode:function(){return this._focusedNode!==this.getFocalNodes()[0];},focusPrev:function(){this._focusedNode=this.getFocalNodes()[this._focusedNode?0:1];dijit.focus(this._focusedNode);},getFocalNodes:function(){return this._focalNodes;},_onNodeFocus:function(evt){this._focusedNode=evt.currentTarget;var fnc=this._focusedNode==this.focusNode?"dijitDownArrowButtonFocused":"dijitButtonContentsFocused";dojo.addClass(this._focusedNode,fnc);},_onNodeBlur:function(evt){var fnc=evt.currentTarget==this.focusNode?"dijitDownArrowButtonFocused":"dijitButtonContentsFocused";dojo.removeClass(evt.currentTarget,fnc);},_onBlur:function(){this.inherited(arguments);this._focusedNode=null;}});dojo.declare("dijit.form.ToggleButton",dijit.form.Button,{baseClass:"dijitToggleButton",checked:false,_onChangeMonitor:"checked",attributeMap:dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),{checked:"focusNode"}),_clicked:function(evt){this.setAttribute("checked",!this.checked);},setAttribute:function(attr,_241){this.inherited(arguments);switch(attr){case "checked":dijit.setWaiState(this.focusNode||this.domNode,"pressed",this.checked);this._setStateClass();this._handleOnChange(this.checked,true);}},setChecked:function(_242){dojo.deprecated("setChecked("+_242+") is deprecated. Use setAttribute('checked',"+_242+") instead.","","2.0");this.setAttribute("checked",_242);},postCreate:function(){this.inherited(arguments);this.setAttribute("checked",this.checked);}});}if(!dojo._hasResource["dijit._editor._Plugin"]){dojo._hasResource["dijit._editor._Plugin"]=true;dojo.provide("dijit._editor._Plugin");dojo.declare("dijit._editor._Plugin",null,{constructor:function(args,node){if(args){dojo.mixin(this,args);}this._connects=[];},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,queryCommand:null,command:"",commandArg:null,useDefaultCommand:true,buttonClass:dijit.form.Button,getLabel:function(key){return this.editor.commands[key];},_initButton:function(_246){if(this.command.length){var _247=this.getLabel(this.command);var _248=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);if(!this.button){_246=dojo.mixin({label:_247,showLabel:false,iconClass:_248,dropDown:this.dropDown,tabIndex:"-1"},_246||{});this.button=new this.buttonClass(_246);}}},destroy:function(f){dojo.forEach(this._connects,dojo.disconnect);},connect:function(o,f,tf){this._connects.push(dojo.connect(o,f,this,tf));},updateState:function(){var _e=this.editor;var _c=this.command;if(!_e){return;}if(!_e.isLoaded){return;}if(!_c.length){return;}if(this.button){try{var _24f=_e.queryCommandEnabled(_c);this.button.setAttribute("disabled",!_24f);if(typeof this.button.checked=="boolean"){this.button.setAttribute("checked",_e.queryCommandState(_c));}}catch(e){console.debug(e);}}},setEditor:function(_250){this.editor=_250;this._initButton();if(this.command.length&&!this.editor.queryCommandAvailable(this.command)){if(this.button){this.button.domNode.style.display="none";}}if(this.button&&this.useDefaultCommand){this.connect(this.button,"onClick",dojo.hitch(this.editor,"execCommand",this.command,this.commandArg));}this.connect(this.editor,"onNormalizedDisplayChanged","updateState");},setToolbar:function(_251){if(this.button){_251.addChild(this.button);}}});}if(!dojo._hasResource["dijit.Editor"]){dojo._hasResource["dijit.Editor"]=true;dojo.provide("dijit.Editor");dojo.declare("dijit.Editor",dijit._editor.RichText,{plugins:null,extraPlugins:null,constructor:function(){if(!dojo.isArray(this.plugins)){this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|","insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull"];}this._plugins=[];this._editInterval=this.editActionInterval*1000;},postCreate:function(){if(this.customUndo){dojo["require"]("dijit._editor.range");this._steps=this._steps.slice(0);this._undoedSteps=this._undoedSteps.slice(0);}if(dojo.isArray(this.extraPlugins)){this.plugins=this.plugins.concat(this.extraPlugins);}this.inherited(arguments);this.commands=dojo.i18n.getLocalization("dijit._editor","commands",this.lang);if(!this.toolbar){this.toolbar=new dijit.Toolbar({});dojo.place(this.toolbar.domNode,this.editingArea,"before");}dojo.forEach(this.plugins,this.addPlugin,this);this.onNormalizedDisplayChanged();},destroy:function(){dojo.forEach(this._plugins,function(p){if(p&&p.destroy){p.destroy();}});this._plugins=[];this.toolbar.destroy();delete this.toolbar;this.inherited(arguments);},addPlugin:function(_253,_254){var args=dojo.isString(_253)?{name:_253}:_253;if(!args.setEditor){var o={"args":args,"plugin":null,"editor":this};dojo.publish(dijit._scopeName+".Editor.getPlugin",[o]);if(!o.plugin){var pc=dojo.getObject(args.name);if(pc){o.plugin=new pc(args);}}if(!o.plugin){console.warn("Cannot find plugin",_253);return;}_253=o.plugin;}if(arguments.length>1){this._plugins[_254]=_253;}else{this._plugins.push(_253);}_253.setEditor(this);if(dojo.isFunction(_253.setToolbar)){_253.setToolbar(this.toolbar);}},customUndo:dojo.isIE,editActionInterval:3,beginEditing:function(cmd){if(!this._inEditing){this._inEditing=true;this._beginEditing(cmd);}if(this.editActionInterval>0){if(this._editTimer){clearTimeout(this._editTimer);}this._editTimer=setTimeout(dojo.hitch(this,this.endEditing),this._editInterval);}},_steps:[],_undoedSteps:[],execCommand:function(cmd){if(this.customUndo&&(cmd=="undo"||cmd=="redo")){return this[cmd]();}else{try{if(this.customUndo){this.endEditing();this._beginEditing();}var r=this.inherited("execCommand",arguments);if(this.customUndo){this._endEditing();}return r;}catch(e){if(dojo.isMoz&&/copy|cut|paste/.test(cmd)){var sub=dojo.string.substitute,_25c={cut:"X",copy:"C",paste:"V"},_25d=navigator.userAgent.indexOf("Macintosh")!=-1;alert(sub(this.commands.systemShortcutFF,[this.commands[cmd],sub(this.commands[_25d?"appleKey":"ctrlKey"],[_25c[cmd]])]));}return false;}}},queryCommandEnabled:function(cmd){if(this.customUndo&&(cmd=="undo"||cmd=="redo")){return cmd=="undo"?(this._steps.length>1):(this._undoedSteps.length>0);}else{return this.inherited("queryCommandEnabled",arguments);}},_moveToBookmark:function(b){var _260=b;if(dojo.isIE){if(dojo.isArray(b)){_260=[];dojo.forEach(b,function(n){_260.push(dijit.range.getNode(n,this.editNode));},this);}}else{var r=dijit.range.create();r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset);r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset);_260=r;}dojo.withGlobal(this.window,"moveToBookmark",dijit,[_260]);},_changeToStep:function(from,to){this.setValue(to.text);var b=to.bookmark;if(!b){return;}this._moveToBookmark(b);},undo:function(){this.endEditing(true);var s=this._steps.pop();if(this._steps.length>0){this.focus();this._changeToStep(s,this._steps[this._steps.length-1]);this._undoedSteps.push(s);this.onDisplayChanged();return true;}return false;},redo:function(){this.endEditing(true);var s=this._undoedSteps.pop();if(s&&this._steps.length>0){this.focus();this._changeToStep(this._steps[this._steps.length-1],s);this._steps.push(s);this.onDisplayChanged();return true;}return false;},endEditing:function(_268){if(this._editTimer){clearTimeout(this._editTimer);}if(this._inEditing){this._endEditing(_268);this._inEditing=false;}},_getBookmark:function(){var b=dojo.withGlobal(this.window,dijit.getBookmark);var tmp=[];if(dojo.isIE){if(dojo.isArray(b)){dojo.forEach(b,function(n){tmp.push(dijit.range.getIndex(n,this.editNode).o);},this);b=tmp;}}else{tmp=dijit.range.getIndex(b.startContainer,this.editNode).o;b={startContainer:tmp,startOffset:b.startOffset,endContainer:b.endContainer===b.startContainer?tmp:dijit.range.getIndex(b.endContainer,this.editNode).o,endOffset:b.endOffset};}return b;},_beginEditing:function(cmd){if(this._steps.length===0){this._steps.push({"text":this.savedContent,"bookmark":this._getBookmark()});}},_endEditing:function(_26d){var v=this.getValue(true);this._undoedSteps=[];this._steps.push({text:v,bookmark:this._getBookmark()});},onKeyDown:function(e){if(!this.customUndo){this.inherited("onKeyDown",arguments);return;}var k=e.keyCode,ks=dojo.keys;if(e.ctrlKey&&!e.altKey){if(k==90||k==122){dojo.stopEvent(e);this.undo();return;}else{if(k==89||k==121){dojo.stopEvent(e);this.redo();return;}}}this.inherited("onKeyDown",arguments);switch(k){case ks.ENTER:case ks.BACKSPACE:case ks.DELETE:this.beginEditing();break;case 88:case 86:if(e.ctrlKey&&!e.altKey&&!e.metaKey){this.endEditing();if(e.keyCode==88){this.beginEditing("cut");setTimeout(dojo.hitch(this,this.endEditing),1);}else{this.beginEditing("paste");setTimeout(dojo.hitch(this,this.endEditing),1);}break;}default:if(!e.ctrlKey&&!e.altKey&&!e.metaKey&&(e.keyCode<dojo.keys.F1||e.keyCode>dojo.keys.F15)){this.beginEditing();break;}case ks.ALT:this.endEditing();break;case ks.UP_ARROW:case ks.DOWN_ARROW:case ks.LEFT_ARROW:case ks.RIGHT_ARROW:case ks.HOME:case ks.END:case ks.PAGE_UP:case ks.PAGE_DOWN:this.endEditing(true);break;case ks.CTRL:case ks.SHIFT:case ks.TAB:break;}},_onBlur:function(){this.inherited("_onBlur",arguments);this.endEditing(true);},onClick:function(){this.endEditing(true);this.inherited("onClick",arguments);}});dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){if(o.plugin){return;}var args=o.args,p;var _p=dijit._editor._Plugin;var name=args.name;switch(name){case "undo":case "redo":case "cut":case "copy":case "paste":case "insertOrderedList":case "insertUnorderedList":case "indent":case "outdent":case "justifyCenter":case "justifyFull":case "justifyLeft":case "justifyRight":case "delete":case "selectAll":case "removeFormat":case "insertHorizontalRule":p=new _p({command:name});break;case "bold":case "italic":case "underline":case "strikethrough":case "subscript":case "superscript":p=new _p({buttonClass:dijit.form.ToggleButton,command:name});break;case "|":p=new _p({button:new dijit.ToolbarSeparator()});}o.plugin=p;});}if(!dojo._hasResource["dijit.Menu"]){dojo._hasResource["dijit.Menu"]=true;dojo.provide("dijit.Menu");dojo.declare("dijit.Menu",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{constructor:function(){this._bindings=[];},templateString:"<table class=\"dijit dijitMenu dijitReset dijitMenuTable\" waiRole=\"menu\" dojoAttachEvent=\"onkeypress:_onKeyPress\">"+"<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>"+"</table>",targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,parentMenu:null,popupDelay:500,_contextMenuWithMouse:false,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(dojo.body());}else{dojo.forEach(this.targetNodeIds,this.bindDomNode,this);}this.connectKeyNavHandlers([dojo.keys.UP_ARROW],[dojo.keys.DOWN_ARROW]);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_277){_277.startup();});this.startupKeyNavChildren();this.inherited(arguments);},onExecute:function(){},onCancel:function(_278){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}},_onKeyPress:function(evt){if(evt.ctrlKey||evt.altKey){return;}switch(evt.keyCode){case dojo.keys.RIGHT_ARROW:this._moveToPopup(evt);dojo.stopEvent(evt);break;case dojo.keys.LEFT_ARROW:if(this.parentMenu){this.onCancel(false);}else{dojo.stopEvent(evt);}break;}},onItemHover:function(item){this.focusChild(item);if(this.focusedChild.popup&&!this.focusedChild.disabled&&!this.hover_timer){this.hover_timer=setTimeout(dojo.hitch(this,"_openPopup"),this.popupDelay);}},_onChildBlur:function(item){dijit.popup.close(item.popup);item._blur();this._stopPopupTimer();},onItemUnhover:function(item){},_stopPopupTimer:function(){if(this.hover_timer){clearTimeout(this.hover_timer);this.hover_timer=null;}},_getTopMenu:function(){for(var top=this;top.parentMenu;top=top.parentMenu){}return top;},onItemClick:function(item,evt){if(item.disabled){return false;}if(item.popup){if(!this.is_open){this._openPopup();}}else{this.onExecute();item.onClick(evt);}},_iframeContentWindow:function(_281){var win=dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(_281))||dijit.Menu._iframeContentDocument(_281)["__parent__"]||(_281.name&&dojo.doc.frames[_281.name])||null;return win;},_iframeContentDocument:function(_283){var doc=_283.contentDocument||(_283.contentWindow&&_283.contentWindow.document)||(_283.name&&dojo.doc.frames[_283.name]&&dojo.doc.frames[_283.name].document)||null;return doc;},bindDomNode:function(node){node=dojo.byId(node);var win=dijit.getDocumentWindow(node.ownerDocument);if(node.tagName.toLowerCase()=="iframe"){win=this._iframeContentWindow(node);node=dojo.withGlobal(win,dojo.body);}var cn=(node==dojo.body()?dojo.doc:node);node[this.id]=this._bindings.push([dojo.connect(cn,(this.leftClickToOpen)?"onclick":"oncontextmenu",this,"_openMyself"),dojo.connect(cn,"onkeydown",this,"_contextKey"),dojo.connect(cn,"onmousedown",this,"_contextMouse")]);},unBindDomNode:function(_288){var node=dojo.byId(_288);if(node){var bid=node[this.id]-1,b=this._bindings[bid];dojo.forEach(b,dojo.disconnect);delete this._bindings[bid];}},_contextKey:function(e){this._contextMenuWithMouse=false;if(e.keyCode==dojo.keys.F10){dojo.stopEvent(e);if(e.shiftKey&&e.type=="keydown"){var _e={target:e.target,pageX:e.pageX,pageY:e.pageY};_e.preventDefault=_e.stopPropagation=function(){};window.setTimeout(dojo.hitch(this,function(){this._openMyself(_e);}),1);}}},_contextMouse:function(e){this._contextMenuWithMouse=true;},_openMyself:function(e){if(this.leftClickToOpen&&e.button>0){return;}dojo.stopEvent(e);var x,y;if(dojo.isSafari||this._contextMenuWithMouse){x=e.pageX;y=e.pageY;}else{var _292=dojo.coords(e.target,true);x=_292.x+10;y=_292.y+10;}var self=this;var _294=dijit.getFocus(this);function closeAndRestoreFocus(){dijit.focus(_294);dijit.popup.close(self);};dijit.popup.open({popup:this,x:x,y:y,onExecute:closeAndRestoreFocus,onCancel:closeAndRestoreFocus,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);dijit.popup.close(this);};},onOpen:function(e){this.isShowingNow=true;},onClose:function(){this._stopPopupTimer();this.parentMenu=null;this.isShowingNow=false;this.currentPopup=null;if(this.focusedChild){this._onChildBlur(this.focusedChild);this.focusedChild=null;}},_openPopup:function(){this._stopPopupTimer();var _296=this.focusedChild;var _297=_296.popup;if(_297.isShowingNow){return;}_297.parentMenu=this;var self=this;dijit.popup.open({parent:this,popup:_297,around:_296.arrowCell,orient:this.isLeftToRight()?{"TR":"TL","TL":"TR"}:{"TL":"TR","TR":"TL"},onCancel:function(){dijit.popup.close(_297);_296.focus();self.currentPopup=null;}});this.currentPopup=_297;if(_297.focus){_297.focus();}},uninitialize:function(){dojo.forEach(this.targetNodeIds,this.unBindDomNode,this);this.inherited(arguments);}});dojo.declare("dijit.MenuItem",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:"<tr class=\"dijitReset dijitMenuItem\" "+"dojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">"+"<td class=\"dijitReset\"><div class=\"dijitMenuItemIcon ${iconClass}\" dojoAttachPoint=\"iconNode\"></div></td>"+"<td tabIndex=\"-1\" class=\"dijitReset dijitMenuItemLabel\" dojoAttachPoint=\"containerNode,focusNode\" waiRole=\"menuitem\"></td>"+"<td class=\"dijitReset\" dojoAttachPoint=\"arrowCell\">"+"<div class=\"dijitMenuExpand\" dojoAttachPoint=\"expand\" style=\"display:none\">"+"<span class=\"dijitInline dijitArrowNode dijitMenuExpandInner\">+</span>"+"</div>"+"</td>"+"</tr>",label:"",iconClass:"",disabled:false,postCreate:function(){dojo.setSelectable(this.domNode,false);this.setDisabled(this.disabled);if(this.label){this.setLabel(this.label);}},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);},_onClick:function(evt){this.getParent().onItemClick(this,evt);dojo.stopEvent(evt);},onClick:function(evt){},focus:function(){dojo.addClass(this.domNode,"dijitMenuItemHover");try{dijit.focus(this.containerNode);}catch(e){}},_blur:function(){dojo.removeClass(this.domNode,"dijitMenuItemHover");},setLabel:function(_29b){this.containerNode.innerHTML=this.label=_29b;},setDisabled:function(_29c){this.disabled=_29c;dojo[_29c?"addClass":"removeClass"](this.domNode,"dijitMenuItemDisabled");dijit.setWaiState(this.containerNode,"disabled",_29c?"true":"false");}});dojo.declare("dijit.PopupMenuItem",dijit.MenuItem,{_fillContent:function(){if(this.srcNodeRef){var _29d=dojo.query("*",this.srcNodeRef);dijit.PopupMenuItem.superclass._fillContent.call(this,_29d[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}this.inherited(arguments);if(!this.popup){var node=dojo.query("[widgetId]",this.dropDownContainer)[0];this.popup=dijit.byNode(node);}dojo.body().appendChild(this.popup.domNode);this.popup.domNode.style.display="none";dojo.addClass(this.expand,"dijitMenuExpandEnabled");dojo.style(this.expand,"display","");dijit.setWaiState(this.containerNode,"haspopup","true");},destroyDescendants:function(){if(this.popup){this.popup.destroyRecursive();delete this.popup;}this.inherited(arguments);}});dojo.declare("dijit.MenuSeparator",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:"<tr class=\"dijitMenuSeparator\"><td colspan=3>"+"<div class=\"dijitMenuSeparatorTop\"></div>"+"<div class=\"dijitMenuSeparatorBottom\"></div>"+"</td></tr>",postCreate:function(){dojo.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}if(!dojo._hasResource["dojo.regexp"]){dojo._hasResource["dojo.regexp"]=true;dojo.provide("dojo.regexp");dojo.regexp.escapeString=function(str,_2a0){return str.replace(/([\.$?*!=:|{}\(\)\[\]\\\/^])/g,function(ch){if(_2a0&&_2a0.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_2a4){if(!(arr instanceof Array)){return re(arr);}var b=[];for(var i=0;i<arr.length;i++){b.push(re(arr[i]));}return dojo.regexp.group(b.join("|"),_2a4);};dojo.regexp.group=function(_2a7,_2a8){return "("+(_2a8?"?:":"")+_2a7+")";};}if(!dojo._hasResource["dojo.number"]){dojo._hasResource["dojo.number"]=true;dojo.provide("dojo.number");dojo.number.format=function(_2a9,_2aa){_2aa=dojo.mixin({},_2aa||{});var _2ab=dojo.i18n.normalizeLocale(_2aa.locale);var _2ac=dojo.i18n.getLocalization("dojo.cldr","number",_2ab);_2aa.customs=_2ac;var _2ad=_2aa.pattern||_2ac[(_2aa.type||"decimal")+"Format"];if(isNaN(_2a9)){return null;}return dojo.number._applyPattern(_2a9,_2ad,_2aa);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_2ae,_2af,_2b0){_2b0=_2b0||{};var _2b1=_2b0.customs.group;var _2b2=_2b0.customs.decimal;var _2b3=_2af.split(";");var _2b4=_2b3[0];_2af=_2b3[(_2ae<0)?1:0]||("-"+_2b4);if(_2af.indexOf("%")!=-1){_2ae*=100;}else{if(_2af.indexOf("‰")!=-1){_2ae*=1000;}else{if(_2af.indexOf("¤")!=-1){_2b1=_2b0.customs.currencyGroup||_2b1;_2b2=_2b0.customs.currencyDecimal||_2b2;_2af=_2af.replace(/\u00a4{1,3}/,function(_2b5){var prop=["symbol","currency","displayName"][_2b5.length-1];return _2b0[prop]||_2b0.currency||"";});}else{if(_2af.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _2b7=dojo.number._numberPatternRE;var _2b8=_2b4.match(_2b7);if(!_2b8){throw new Error("unable to find a number expression in pattern: "+_2af);}return _2af.replace(_2b7,dojo.number._formatAbsolute(_2ae,_2b8[0],{decimal:_2b2,group:_2b1,places:_2b0.places}));};dojo.number.round=function(_2b9,_2ba,_2bb){var _2bc=String(_2b9).split(".");var _2bd=(_2bc[1]&&_2bc[1].length)||0;if(_2bd>_2ba){var _2be=Math.pow(10,_2ba);if(_2bb>0){_2be*=10/_2bb;_2ba++;}_2b9=Math.round(_2b9*_2be)/_2be;_2bc=String(_2b9).split(".");_2bd=(_2bc[1]&&_2bc[1].length)||0;if(_2bd>_2ba){_2bc[1]=_2bc[1].substr(0,_2ba);_2b9=Number(_2bc.join("."));}}return _2b9;};dojo.number._formatAbsolute=function(_2bf,_2c0,_2c1){_2c1=_2c1||{};if(_2c1.places===true){_2c1.places=0;}if(_2c1.places===Infinity){_2c1.places=6;}var _2c2=_2c0.split(".");var _2c3=(_2c1.places>=0)?_2c1.places:(_2c2[1]&&_2c2[1].length)||0;if(!(_2c1.round<0)){_2bf=dojo.number.round(_2bf,_2c3,_2c1.round);}var _2c4=String(Math.abs(_2bf)).split(".");var _2c5=_2c4[1]||"";if(_2c1.places){_2c4[1]=dojo.string.pad(_2c5.substr(0,_2c1.places),_2c1.places,"0",true);}else{if(_2c2[1]&&_2c1.places!==0){var pad=_2c2[1].lastIndexOf("0")+1;if(pad>_2c5.length){_2c4[1]=dojo.string.pad(_2c5,pad,"0",true);}var _2c7=_2c2[1].length;if(_2c7<_2c5.length){_2c4[1]=_2c5.substr(0,_2c7);}}else{if(_2c4[1]){_2c4.pop();}}}var _2c8=_2c2[0].replace(",","");pad=_2c8.indexOf("0");if(pad!=-1){pad=_2c8.length-pad;if(pad>_2c4[0].length){_2c4[0]=dojo.string.pad(_2c4[0],pad);}if(_2c8.indexOf("#")==-1){_2c4[0]=_2c4[0].substr(_2c4[0].length-pad);}}var _2c9=_2c2[0].lastIndexOf(",");var _2ca,_2cb;if(_2c9!=-1){_2ca=_2c2[0].length-_2c9-1;var _2cc=_2c2[0].substr(0,_2c9);_2c9=_2cc.lastIndexOf(",");if(_2c9!=-1){_2cb=_2cc.length-_2c9-1;}}var _2cd=[];for(var _2ce=_2c4[0];_2ce;){var off=_2ce.length-_2ca;_2cd.push((off>0)?_2ce.substr(off):_2ce);_2ce=(off>0)?_2ce.slice(0,off):"";if(_2cb){_2ca=_2cb;delete _2cb;}}_2c4[0]=_2cd.reverse().join(_2c1.group||",");return _2c4.join(_2c1.decimal||".");};dojo.number.regexp=function(_2d0){return dojo.number._parseInfo(_2d0).regexp;};dojo.number._parseInfo=function(_2d1){_2d1=_2d1||{};var _2d2=dojo.i18n.normalizeLocale(_2d1.locale);var _2d3=dojo.i18n.getLocalization("dojo.cldr","number",_2d2);var _2d4=_2d1.pattern||_2d3[(_2d1.type||"decimal")+"Format"];var _2d5=_2d3.group;var _2d6=_2d3.decimal;var _2d7=1;if(_2d4.indexOf("%")!=-1){_2d7/=100;}else{if(_2d4.indexOf("‰")!=-1){_2d7/=1000;}else{var _2d8=_2d4.indexOf("¤")!=-1;if(_2d8){_2d5=_2d3.currencyGroup||_2d5;_2d6=_2d3.currencyDecimal||_2d6;}}}var _2d9=_2d4.split(";");if(_2d9.length==1){_2d9.push("-"+_2d9[0]);}var re=dojo.regexp.buildGroupRE(_2d9,function(_2db){_2db="(?:"+dojo.regexp.escapeString(_2db,".")+")";return _2db.replace(dojo.number._numberPatternRE,function(_2dc){var _2dd={signed:false,separator:_2d1.strict?_2d5:[_2d5,""],fractional:_2d1.fractional,decimal:_2d6,exponent:false};var _2de=_2dc.split(".");var _2df=_2d1.places;if(_2de.length==1||_2df===0){_2dd.fractional=false;}else{if(_2df===undefined){_2df=_2de[1].lastIndexOf("0")+1;}if(_2df&&_2d1.fractional==undefined){_2dd.fractional=true;}if(!_2d1.places&&(_2df<_2de[1].length)){_2df+=","+_2de[1].length;}_2dd.places=_2df;}var _2e0=_2de[0].split(",");if(_2e0.length>1){_2dd.groupSize=_2e0.pop().length;if(_2e0.length>1){_2dd.groupSize2=_2e0.pop().length;}}return "("+dojo.number._realNumberRegexp(_2dd)+")";});},true);if(_2d8){re=re.replace(/(\s*)(\u00a4{1,3})(\s*)/g,function(_2e1,_2e2,_2e3,_2e4){var prop=["symbol","currency","displayName"][_2e3.length-1];var _2e6=dojo.regexp.escapeString(_2d1[prop]||_2d1.currency||"");_2e2=_2e2?"\\s":"";_2e4=_2e4?"\\s":"";if(!_2d1.strict){if(_2e2){_2e2+="*";}if(_2e4){_2e4+="*";}return "(?:"+_2e2+_2e6+_2e4+")?";}return _2e2+_2e6+_2e4;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_2d5,decimal:_2d6,factor:_2d7};};dojo.number.parse=function(_2e7,_2e8){var info=dojo.number._parseInfo(_2e8);var _2ea=(new RegExp("^"+info.regexp+"$")).exec(_2e7);if(!_2ea){return NaN;}var _2eb=_2ea[1];if(!_2ea[1]){if(!_2ea[2]){return NaN;}_2eb=_2ea[2];info.factor*=-1;}_2eb=_2eb.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return Number(_2eb)*info.factor;};dojo.number._realNumberRegexp=function(_2ec){_2ec=_2ec||{};if(!("places" in _2ec)){_2ec.places=Infinity;}if(typeof _2ec.decimal!="string"){_2ec.decimal=".";}if(!("fractional" in _2ec)||/^0/.test(_2ec.places)){_2ec.fractional=[true,false];}if(!("exponent" in _2ec)){_2ec.exponent=[true,false];}if(!("eSigned" in _2ec)){_2ec.eSigned=[true,false];}var _2ed=dojo.number._integerRegexp(_2ec);var _2ee=dojo.regexp.buildGroupRE(_2ec.fractional,function(q){var re="";if(q&&(_2ec.places!==0)){re="\\"+_2ec.decimal;if(_2ec.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_2ec.places+"}";}}return re;},true);var _2f1=dojo.regexp.buildGroupRE(_2ec.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_2ec.eSigned})+")";}return "";});var _2f3=_2ed+_2ee;if(_2ee){_2f3="(?:(?:"+_2f3+")|(?:"+_2ee+"))";}return _2f3+_2f1;};dojo.number._integerRegexp=function(_2f4){_2f4=_2f4||{};if(!("signed" in _2f4)){_2f4.signed=[true,false];}if(!("separator" in _2f4)){_2f4.separator="";}else{if(!("groupSize" in _2f4)){_2f4.groupSize=3;}}var _2f5=dojo.regexp.buildGroupRE(_2f4.signed,function(q){return q?"[-+]":"";},true);var _2f7=dojo.regexp.buildGroupRE(_2f4.separator,function(sep){if(!sep){return "(?:0|[1-9]\\d*)";}sep=dojo.regexp.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_2f4.groupSize,grp2=_2f4.groupSize2;if(grp2){var _2fb="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_2fb+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_2fb;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _2f5+_2f7;};}if(!dojo._hasResource["dijit.ProgressBar"]){dojo._hasResource["dijit.ProgressBar"]=true;dojo.provide("dijit.ProgressBar");dojo.declare("dijit.ProgressBar",[dijit._Widget,dijit._Templated],{progress:"0",maximum:100,places:0,indeterminate:false,templateString:"<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" tabindex=\"0\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</div\n\t><img dojoAttachPoint=\"inteterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\"\n\t></img\n></div>\n",_indeterminateHighContrastImagePath:dojo.moduleUrl("dijit","themes/a11y/indeterminate_progress.gif"),postCreate:function(){this.inherited("postCreate",arguments);this.inteterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath);this.update();},update:function(_2fc){dojo.mixin(this,_2fc||{});var _2fd=1,_2fe;if(this.indeterminate){_2fe="addClass";dijit.removeWaiState(this.internalProgress,"valuenow");dijit.removeWaiState(this.internalProgress,"valuemin");dijit.removeWaiState(this.internalProgress,"valuemax");}else{_2fe="removeClass";if(String(this.progress).indexOf("%")!=-1){_2fd=Math.min(parseFloat(this.progress)/100,1);this.progress=_2fd*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_2fd=this.progress/this.maximum;}var text=this.report(_2fd);this.label.firstChild.nodeValue=text;dijit.setWaiState(this.internalProgress,"describedby",this.label.id);dijit.setWaiState(this.internalProgress,"valuenow",this.progress);dijit.setWaiState(this.internalProgress,"valuemin",0);dijit.setWaiState(this.internalProgress,"valuemax",this.maximum);}dojo[_2fe](this.domNode,"dijitProgressBarIndeterminate");this.internalProgress.style.width=(_2fd*100)+"%";this.onChange();},report:function(_300){return dojo.number.format(_300,{type:"percent",places:this.places,locale:this.lang});},onChange:function(){}});}if(!dojo._hasResource["dijit.TitlePane"]){dojo._hasResource["dijit.TitlePane"]=true;dojo.provide("dijit.TitlePane");dojo.declare("dijit.TitlePane",[dijit.layout.ContentPane,dijit._Templated],{title:"",open:true,duration:250,baseClass:"dijitTitlePane",templateString:"<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus\" tabindex=\"0\"\n\t\t\twaiRole=\"button\" class=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<div dojoAttachPoint=\"arrowNode\" class=\"dijitInline dijitArrowNode\"><span dojoAttachPoint=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span></div>\n\t\t<div dojoAttachPoint=\"titleNode\" class=\"dijitTitlePaneTextNode\"></div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" dojoAttachPoint=\"hideNode\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\">\n\t\t\t\t<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc.  Put padding on inner div. -->\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n",postCreate:function(){this.setTitle(this.title);if(!this.open){this.hideNode.style.display=this.wipeNode.style.display="none";}this._setCss();dojo.setSelectable(this.titleNode,false);this.inherited(arguments);dijit.setWaiState(this.containerNode,"labelledby",this.titleNode.id);dijit.setWaiState(this.focusNode,"haspopup","true");var _301=this.hideNode,_302=this.wipeNode;this._wipeIn=dojo.fx.wipeIn({node:this.wipeNode,duration:this.duration,beforeBegin:function(){_301.style.display="";}});this._wipeOut=dojo.fx.wipeOut({node:this.wipeNode,duration:this.duration,onEnd:function(){_301.style.display="none";}});},setContent:function(_303){if(!this.open||this._wipeOut.status()=="playing"){this.inherited(arguments);}else{if(this._wipeIn.status()=="playing"){this._wipeIn.stop();}dojo.marginBox(this.wipeNode,{h:dojo.marginBox(this.wipeNode).h});this.inherited(arguments);this._wipeIn.play();}},toggle:function(){dojo.forEach([this._wipeIn,this._wipeOut],function(_304){if(_304.status()=="playing"){_304.stop();}});this[this.open?"_wipeOut":"_wipeIn"].play();this.open=!this.open;this._loadCheck();this._setCss();},_setCss:function(){var _305=["dijitClosed","dijitOpen"];var _306=this.open;var node=this.titleBarNode||this.focusNode;dojo.removeClass(node,_305[!_306+0]);node.className+=" "+_305[_306+0];this.arrowNodeInner.innerHTML=this.open?"-":"+";},_onTitleKey:function(e){if(e.keyCode==dojo.keys.ENTER||e.charCode==dojo.keys.SPACE){this.toggle();}else{if(e.keyCode==dojo.keys.DOWN_ARROW&&this.open){this.containerNode.focus();e.preventDefault();}}},_handleFocus:function(e){dojo[(e.type=="focus"?"addClass":"removeClass")](this.focusNode,this.baseClass+"Focused");},setTitle:function(_30a){this.titleNode.innerHTML=_30a;}});}if(!dojo._hasResource["dijit.Tooltip"]){dojo._hasResource["dijit.Tooltip"]=true;dojo.provide("dijit.Tooltip");dojo.declare("dijit._MasterTooltip",[dijit._Widget,dijit._Templated],{duration:200,templateString:"<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\">\n\t<div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></div>\n</div>\n",postCreate:function(){dojo.body().appendChild(this.domNode);this.bgIframe=new dijit.BackgroundIframe(this.domNode);this.fadeIn=dojo.fadeIn({node:this.domNode,duration:this.duration,onEnd:dojo.hitch(this,"_onShow")});this.fadeOut=dojo.fadeOut({node:this.domNode,duration:this.duration,onEnd:dojo.hitch(this,"_onHide")});},show:function(_30b,_30c,_30d){if(this.aroundNode&&this.aroundNode===_30c){return;}if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_30b;this.domNode.style.top=(this.domNode.offsetTop+1)+"px";var _30e={};var ltr=this.isLeftToRight();dojo.forEach((_30d&&_30d.length)?_30d:dijit.Tooltip.defaultPosition,function(pos){switch(pos){case "after":_30e[ltr?"BR":"BL"]=ltr?"BL":"BR";break;case "before":_30e[ltr?"BL":"BR"]=ltr?"BR":"BL";break;case "below":_30e[ltr?"BL":"BR"]=ltr?"TL":"TR";_30e[ltr?"BR":"BL"]=ltr?"TR":"TL";break;case "above":default:_30e[ltr?"TL":"TR"]=ltr?"BL":"BR";_30e[ltr?"TR":"TL"]=ltr?"BR":"BL";break;}});var pos=dijit.placeOnScreenAroundElement(this.domNode,_30c,_30e,dojo.hitch(this,"orient"));dojo.style(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_30c;},orient:function(node,_313,_314){node.className="dijitTooltip "+{"BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_313+"-"+_314];},_onShow:function(){if(dojo.isIE){this.domNode.style.filter="";}},hide:function(_315){if(!this.aroundNode||this.aroundNode!==_315){return;}if(this._onDeck){this._onDeck=null;return;}this.fadeIn.stop();this.isShowingNow=false;this.aroundNode=null;this.fadeOut.play();},_onHide:function(){this.domNode.style.cssText="";if(this._onDeck){this.show.apply(this,this._onDeck);this._onDeck=null;}}});dijit.showTooltip=function(_316,_317,_318){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.show(_316,_317,_318);};dijit.hideTooltip=function(_319){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.hide(_319);};dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],postCreate:function(){if(this.srcNodeRef){this.srcNodeRef.style.display="none";}this._connectNodes=[];dojo.forEach(this.connectId,function(id){var node=dojo.byId(id);if(node){this._connectNodes.push(node);dojo.forEach(["onMouseOver","onMouseOut","onFocus","onBlur","onHover","onUnHover"],function(_31c){this.connect(node,_31c.toLowerCase(),"_"+_31c);},this);if(dojo.isIE){node.style.zoom=1;}}},this);},_onMouseOver:function(e){this._onHover(e);},_onMouseOut:function(e){if(dojo.isDescendant(e.relatedTarget,e.target)){return;}this._onUnHover(e);},_onFocus:function(e){this._focus=true;this._onHover(e);this.inherited(arguments);},_onBlur:function(e){this._focus=false;this._onUnHover(e);this.inherited(arguments);},_onHover:function(e){if(!this._showTimer){var _322=e.target;this._showTimer=setTimeout(dojo.hitch(this,function(){this.open(_322);}),this.showDelay);}},_onUnHover:function(e){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_324){_324=_324||this._connectNodes[0];if(!_324){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}dijit.showTooltip(this.label||this.domNode.innerHTML,_324,this.position);this._connectNode=_324;},close:function(){dijit.hideTooltip(this._connectNode);delete this._connectNode;if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}},uninitialize:function(){this.close();}});dijit.Tooltip.defaultPosition=["after","before"];}if(!dojo._hasResource["dojo.cookie"]){dojo._hasResource["dojo.cookie"]=true;dojo.provide("dojo.cookie");dojo.cookie=function(name,_326,_327){var c=document.cookie;if(arguments.length==1){var _329=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(name)+"=([^;]*)"));return _329?decodeURIComponent(_329[1]):undefined;}else{_327=_327||{};var exp=_327.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_327.expires=d;}if(exp&&exp.toUTCString){_327.expires=exp.toUTCString();}_326=encodeURIComponent(_326);var _32c=name+"="+_326;for(propName in _327){_32c+="; "+propName;var _32d=_327[propName];if(_32d!==true){_32c+="="+_32d;}}document.cookie=_32c;}};dojo.cookie.isSupported=function(){if(!("cookieEnabled" in navigator)){this("__djCookieTest__","CookiesAllowed");navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";if(navigator.cookieEnabled){this("__djCookieTest__","",{expires:-1});}}return navigator.cookieEnabled;};}if(!dojo._hasResource["dijit.Tree"]){dojo._hasResource["dijit.Tree"]=true;dojo.provide("dijit.Tree");dojo.declare("dijit._TreeNode",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained],{item:null,isTreeNode:true,label:"",isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:"<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><div dojoAttachPoint=\"contentNode\" class=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"iconNode\" class=\"dijitInline dijitTreeIcon\" waiRole=\"presentation\"></div>\n\t\t\t<span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onNodeFocus\"></span>\n\t\t</div\n\t></div>\n</div>\n",postCreate:function(){this.setLabelNode(this.label);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);}},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_330=tree.model;if(tree._v10Compat&&item===_330.root){item=null;}this.iconNode.className="dijitInline dijitTreeIcon "+tree.getIconClass(item,this.isExpanded);this.labelNode.className="dijitTreeLabel "+tree.getLabelClass(item,this.isExpanded);},_updateLayout:function(){var _331=this.getParent();if(!_331||_331.rowNode.style.display=="none"){dojo.addClass(this.domNode,"dijitTreeIsRoot");}else{dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_332){var _333=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"];var idx=_332?0:(this.isExpandable?(this.isExpanded?1:2):3);dojo.forEach(_333,function(s){dojo.removeClass(this.expandoNode,s);},this);dojo.addClass(this.expandoNode,_333[idx]);this.expandoNodeText.innerHTML=_332?"*":(this.isExpandable?(this.isExpanded?"-":"+"):"*");},expand:function(){if(this.isExpanded){return;}if(this._wipeOut.status()=="playing"){this._wipeOut.stop();}this.isExpanded=true;dijit.setWaiState(this.labelNode,"expanded","true");dijit.setWaiRole(this.containerNode,"group");this.contentNode.className="dijitTreeContent dijitTreeContentExpanded";this._setExpando();this._updateItemClasses(this.item);this._wipeIn.play();},collapse:function(){if(!this.isExpanded){return;}if(this._wipeIn.status()=="playing"){this._wipeIn.stop();}this.isExpanded=false;dijit.setWaiState(this.labelNode,"expanded","false");this.contentNode.className="dijitTreeContent";this._setExpando();this._updateItemClasses(this.item);this._wipeOut.play();},setLabelNode:function(_336){this.labelNode.innerHTML="";this.labelNode.appendChild(dojo.doc.createTextNode(_336));},setChildItems:function(_337){var tree=this.tree,_339=tree.model;this.getChildren().forEach(function(_33a){dijit._Container.prototype.removeChild.call(this,_33a);},this);this.state="LOADED";if(_337&&_337.length>0){this.isExpandable=true;if(!this.containerNode){this.containerNode=this.tree.containerNodeTemplate.cloneNode(true);this.domNode.appendChild(this.containerNode);}dojo.forEach(_337,function(item){var id=_339.getIdentity(item),_33d=tree._itemNodeMap[id],node=(_33d&&!_33d.getParent())?_33d:new dijit._TreeNode({item:item,tree:tree,isExpandable:_339.mayHaveChildren(item),label:tree.getLabel(item)});this.addChild(node);tree._itemNodeMap[id]=node;if(this.tree.persist){if(tree._openedItemIds[id]){tree._expandNode(node);}}},this);dojo.forEach(this.getChildren(),function(_33f,idx){_33f._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}if(!this.parent){var fc=this.tree.showRoot?this:this.getChildren()[0],_342=fc?fc.labelNode:this.domNode;_342.setAttribute("tabIndex","0");}if(this.containerNode&&!this._wipeIn){this._wipeIn=dojo.fx.wipeIn({node:this.containerNode,duration:150});this._wipeOut=dojo.fx.wipeOut({node:this.containerNode,duration:150});}},removeChild:function(node){this.inherited(arguments);var _344=this.getChildren();if(_344.length==0){this.isExpandable=false;this.collapse();}dojo.forEach(_344,function(_345){_345._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onNodeFocus:function(evt){var node=dijit.getEnclosingWidget(evt.target);this.tree._onTreeFocus(node);}});dojo.declare("dijit.Tree",[dijit._Widget,dijit._Templated],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],openOnClick:false,templateString:"<div class=\"dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onclick:_onClick,onkeypress:_onKeyPress\">\n</div>\n",isExpandable:true,isTree:true,persist:true,dndController:null,dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAcceptance"],onDndDrop:null,itemCreator:null,onDndCancel:null,checkAcceptance:null,checkItemAcceptance:null,_publish:function(_348,_349){dojo.publish(this.id,[dojo.mixin({tree:this,event:_348},_349||{})]);},postMixInProperties:function(){this.tree=this;this._itemNodeMap={};if(!this.cookieName){this.cookieName=this.id+"SaveStateCookie";}},postCreate:function(){if(this.persist){var _34a=dojo.cookie(this.cookieName);this._openedItemIds={};if(_34a){dojo.forEach(_34a.split(","),function(item){this._openedItemIds[item]=true;},this);}}var div=dojo.doc.createElement("div");div.style.display="none";div.className="dijitTreeContainer";dijit.setWaiRole(div,"presentation");this.containerNodeTemplate=div;if(!this.model){this._store2model();}this.connect(this.model,"onChange","_onItemChange");this.connect(this.model,"onChildrenChange","_onItemChildrenChange");this._load();this.inherited("postCreate",arguments);if(this.dndController){if(dojo.isString(this.dndController)){this.dndController=dojo.getObject(this.dndController);}var _34d={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_34d[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_34d);}},_store2model:function(){this._v10Compat=true;dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _34f={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_34f.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_34f.getChildren=dojo.hitch(this,function(item,_351,_352){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_351,_352);});}this.model=new dijit.tree.ForestStoreModel(_34f);this.showRoot=Boolean(this.label);},_load:function(){this.model.getRoot(dojo.hitch(this,function(item){var rn=this.rootNode=new dijit._TreeNode({item:item,tree:this,isExpandable:true,label:this.label||this.getLabel(item)});if(!this.showRoot){rn.rowNode.style.display="none";}this.domNode.appendChild(rn.domNode);this._itemNodeMap[this.model.getIdentity(item)]=rn;rn._updateLayout();this._expandNode(rn);}),function(err){console.error(this,": error loading root: ",err);});},mayHaveChildren:function(item){},getItemChildren:function(_357,_358){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_35b){return (!item||this.model.mayHaveChildren(item))?(_35b?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(item,_35d){},_onKeyPress:function(e){if(e.altKey){return;}var _35f=dijit.getEnclosingWidget(e.target);if(!_35f){return;}if(e.charCode){var _360=e.charCode;if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){_360=(String.fromCharCode(_360)).toLowerCase();this._onLetterKeyNav({node:_35f,key:_360});dojo.stopEvent(e);}}else{var map=this._keyHandlerMap;if(!map){map={};map[dojo.keys.ENTER]="_onEnterKey";map[this.isLeftToRight()?dojo.keys.LEFT_ARROW:dojo.keys.RIGHT_ARROW]="_onLeftArrow";map[this.isLeftToRight()?dojo.keys.RIGHT_ARROW:dojo.keys.LEFT_ARROW]="_onRightArrow";map[dojo.keys.UP_ARROW]="_onUpArrow";map[dojo.keys.DOWN_ARROW]="_onDownArrow";map[dojo.keys.HOME]="_onHomeKey";map[dojo.keys.END]="_onEndKey";this._keyHandlerMap=map;}if(this._keyHandlerMap[e.keyCode]){this[this._keyHandlerMap[e.keyCode]]({node:_35f,item:_35f.item});dojo.stopEvent(e);}}},_onEnterKey:function(_362){this._publish("execute",{item:_362.item,node:_362.node});this.onClick(_362.item,_362.node);},_onDownArrow:function(_363){var node=this._getNextNode(_363.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_365){var node=_365.node;var _367=node.getPreviousSibling();if(_367){node=_367;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _368=node.getChildren();node=_368[_368.length-1];}}else{var _369=node.getParent();if(!(!this.showRoot&&_369===this.rootNode)){node=_369;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_36a){var node=_36a.node;if(node.isExpandable&&!node.isExpanded){this._expandNode(node);}else{if(node.hasChildren()){node=node.getChildren()[0];if(node&&node.isTreeNode){this.focusNode(node);}}}},_onLeftArrow:function(_36c){var node=_36c.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{node=node.getParent();if(node&&node.isTreeNode){this.focusNode(node);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(_36f){var node=this;while(node.isExpanded){var c=node.getChildren();node=c[c.length-1];}if(node&&node.isTreeNode){this.focusNode(node);}},_onLetterKeyNav:function(_372){var node=startNode=_372.node,key=_372.key;do{node=this._getNextNode(node);if(!node){node=this._getRootOrFirstNode();}}while(node!==startNode&&(node.label.charAt(0).toLowerCase()!=key));if(node&&node.isTreeNode){if(node!==startNode){this.focusNode(node);}}},_onClick:function(e){var _376=e.target;var _377=dijit.getEnclosingWidget(_376);if(!_377||!_377.isTreeNode){return;}if((this.openOnClick&&_377.isExpandable)||(_376==_377.expandoNode||_376==_377.expandoNodeText)){if(_377.isExpandable){this._onExpandoClick({node:_377});}}else{this._publish("execute",{item:_377.item,node:_377});this.onClick(_377.item,_377);this.focusNode(_377);}dojo.stopEvent(e);},_onExpandoClick:function(_378){var node=_378.node;this.focusNode(node);if(node.isExpanded){this._collapseNode(node);}else{this._expandNode(node);}},onClick:function(item,node){},_getNextNode:function(node){if(node.isExpandable&&node.isExpanded&&node.hasChildren()){return node.getChildren()[0];}else{while(node&&node.isTreeNode){var _37d=node.getNextSibling();if(_37d){return _37d;}node=node.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(node){if(node.isExpandable){if(node.state=="LOADING"){return;}node.collapse();if(this.persist&&node.item){delete this._openedItemIds[this.model.getIdentity(node.item)];this._saveState();}}},_expandNode:function(node){if(!node.isExpandable){return;}var _380=this.model,item=node.item;switch(node.state){case "LOADING":return;case "UNCHECKED":node.markProcessing();var _382=this;_380.getChildren(item,function(_383){node.unmarkProcessing();node.setChildItems(_383);_382._expandNode(node);},function(err){console.error(_382,": error loading root children: ",err);});break;default:node.expand();if(this.persist&&item){this._openedItemIds[_380.getIdentity(item)]=true;this._saveState();}}},blurNode:function(){var node=this.lastFocused;if(!node){return;}var _386=node.labelNode;dojo.removeClass(_386,"dijitTreeLabelFocused");_386.setAttribute("tabIndex","-1");dijit.setWaiState(_386,"selected",false);this.lastFocused=null;},focusNode:function(node){node.labelNode.focus();},_onBlur:function(){this.inherited(arguments);if(this.lastFocused){var _388=this.lastFocused.labelNode;dojo.removeClass(_388,"dijitTreeLabelFocused");}},_onTreeFocus:function(node){if(node){if(node!=this.lastFocused){this.blurNode();}var _38a=node.labelNode;_38a.setAttribute("tabIndex","0");dijit.setWaiState(_38a,"selected",true);dojo.addClass(_38a,"dijitTreeLabelFocused");this.lastFocused=node;}},_onItemDelete:function(item){var _38c=this.model.getIdentity(item);var node=this._itemNodeMap[_38c];if(node){var _38e=node.getParent();if(_38e){_38e.removeChild(node);}delete this._itemNodeMap[_38c];node.destroyRecursive();}},_onItemChange:function(item){var _390=this.model,_391=_390.getIdentity(item),node=this._itemNodeMap[_391];if(node){node.setLabelNode(this.getLabel(item));node._updateItemClasses(item);}},_onItemChildrenChange:function(_393,_394){var _395=this.model,_396=_395.getIdentity(_393),_397=this._itemNodeMap[_396];if(_397){_397.setChildItems(_394);}},_saveState:function(){if(!this.persist){return;}var ary=[];for(var id in this._openedItemIds){ary.push(id);}dojo.cookie(this.cookieName,ary.join(","));},destroy:function(){if(this.rootNode){this.rootNode.destroyRecursive();}this.rootNode=null;this.inherited(arguments);},destroyRecursive:function(){this.destroy();}});dojo.declare("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],root:null,query:null,constructor:function(args){dojo.mixin(this,args);this.connects=[];var _39b=this.store;if(!_39b.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_39b.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([dojo.connect(_39b,"onNew",this,"_onNewItem"),dojo.connect(_39b,"onDelete",this,"_onDeleteItem"),dojo.connect(_39b,"onSet",this,"_onSetItem")]);}},destroy:function(){dojo.forEach(this.connects,dojo.disconnect);},getRoot:function(_39c,_39d){if(this.root){_39c(this.root);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_39e){if(_39e.length!=1){throw new Error(this.declaredClass+": query "+query+" returned "+_39e.length+" items, but must return exactly one item");}this.root=_39e[0];_39c(this.root);}),onError:_39d});}},mayHaveChildren:function(item){return dojo.some(this.childrenAttrs,function(attr){return this.store.hasAttribute(item,attr);},this);},getChildren:function(_3a1,_3a2,_3a3){var _3a4=this.store;var _3a5=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_3a4.getValues(_3a1,this.childrenAttrs[i]);_3a5=_3a5.concat(vals);}var _3a8=0;dojo.forEach(_3a5,function(item){if(!_3a4.isItemLoaded(item)){_3a8++;}});if(_3a8==0){_3a2(_3a5);}else{var _3aa=function _3aa(item){if(--_3a8==0){_3a2(_3a5);}};dojo.forEach(_3a5,function(item){if(!_3a4.isItemLoaded(item)){_3a4.loadItem({item:item,onItem:_3aa,onError:_3a3});}});}},getIdentity:function(item){return this.store.getIdentity(item);},getLabel:function(item){return this.store.getLabel(item);},newItem:function(args,_3b0){var _3b1={parent:_3b0,attribute:this.childrenAttrs[0]};return this.store.newItem(args,_3b1);},pasteItem:function(_3b2,_3b3,_3b4,_3b5){var _3b6=this.store,_3b7=this.childrenAttrs[0];if(_3b3){dojo.forEach(this.childrenAttrs,function(attr){if(_3b6.containsValue(_3b3,attr,_3b2)){if(!_3b5){var _3b9=dojo.filter(_3b6.getValues(_3b3,attr),function(x){return x!=_3b2;});_3b6.setValues(_3b3,attr,_3b9);}_3b7=attr;}});}if(_3b4){_3b6.setValues(_3b4,_3b7,_3b6.getValues(_3b4,_3b7).concat(_3b2));}},onChange:function(item){},onChildrenChange:function(_3bc,_3bd){},_onNewItem:function(item,_3bf){if(!_3bf){return;}this.getChildren(_3bf.item,dojo.hitch(this,function(_3c0){this.onChildrenChange(_3bf.item,_3c0);}));},_onDeleteItem:function(item){},_onSetItem:function(item,_3c3,_3c4,_3c5){if(dojo.indexOf(this.childrenAttrs,_3c3)!=-1){this.getChildren(item,dojo.hitch(this,function(_3c6){this.onChildrenChange(item,_3c6);}));}else{this.onChange(item);}}});dojo.declare("dijit.tree.ForestStoreModel",dijit.tree.TreeStoreModel,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_3c7){this.root={store:this,root:true,id:_3c7.rootId,label:_3c7.rootLabel,children:_3c7.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_3c9,_3ca,_3cb){if(_3c9===this.root){if(this.root.children){_3ca(this.root.children);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_3cc){this.root.children=_3cc;_3ca(_3cc);}),onError:_3cb});}}else{this.inherited(arguments);}},getIdentity:function(item){return (item===this.root)?this.root.id:this.inherited(arguments);},getLabel:function(item){return (item===this.root)?this.root.label:this.inherited(arguments);},newItem:function(args,_3d0){if(_3d0===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(args){},pasteItem:function(_3d2,_3d3,_3d4,_3d5){if(_3d3===this.root){if(!_3d5){this.onLeaveRoot(_3d2);}}dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_3d2,_3d3===this.root?null:_3d3,_3d4===this.root?null:_3d4);if(_3d4===this.root){this.onAddToRoot(_3d2);}},onAddToRoot:function(item){console.log(this,": item ",item," added to root");},onLeaveRoot:function(item){console.log(this,": item ",item," removed from root");},_requeryTop:function(){var _3d8=this,_3d9=this.root.children;this.store.fetch({query:this.query,onComplete:function(_3da){_3d8.root.children=_3da;if(_3d9.length!=_3da.length||dojo.some(_3d9,function(item,idx){return _3da[idx]!=item;})){_3d8.onChildrenChange(_3d8.root,_3da);}}});},_onNewItem:function(item,_3de){this._requeryTop();this.inherited(arguments);},_onDeleteItem:function(item){if(dojo.indexOf(this.root.children,item)!=-1){this._requeryTop();}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.TextBox"]){dojo._hasResource["dijit.form.TextBox"]=true;dojo.provide("dijit.form.TextBox");dojo.declare("dijit.form.TextBox",dijit.form._FormValueWidget,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",templateString:"<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode' name=\"${name}\"\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse,onfocus:_onMouse,onblur:_onMouse,onkeypress:_onKeyPress,onkeyup'\n\tautocomplete=\"off\" type=\"${type}\"\n\t/>\n",baseClass:"dijitTextBox",attributeMap:dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),{maxLength:"focusNode"}),getDisplayedValue:function(){return this.filter(this.textbox.value);},getValue:function(){return this.parse(this.getDisplayedValue(),this.constraints);},setValue:function(_3e0,_3e1,_3e2){var _3e3=this.filter(_3e0);if((((typeof _3e3==typeof _3e0)&&(_3e0!==undefined))||(_3e0===null))&&(_3e2==null||_3e2==undefined)){_3e2=this.format(_3e3,this.constraints);}if(_3e2!=null&&_3e2!=undefined){this.textbox.value=_3e2;}dijit.form.TextBox.superclass.setValue.call(this,_3e3,_3e1);},setDisplayedValue:function(_3e4,_3e5){this.textbox.value=_3e4;this.setValue(this.getValue(),_3e5);},format:function(_3e6,_3e7){return ((_3e6==null||_3e6==undefined)?"":(_3e6.toString?_3e6.toString():_3e6));},parse:function(_3e8,_3e9){return _3e8;},postCreate:function(){this.textbox.setAttribute("value",this.getDisplayedValue());this.inherited(arguments);this._layoutHack();},filter:function(val){if(val===null||val===undefined){return "";}else{if(typeof val!="string"){return val;}}if(this.trim){val=dojo.trim(val);}if(this.uppercase){val=val.toUpperCase();}if(this.lowercase){val=val.toLowerCase();}if(this.propercase){val=val.replace(/[^\s]+/g,function(word){return word.substring(0,1).toUpperCase()+word.substring(1);});}return val;},_setBlurValue:function(){this.setValue(this.getValue(),(this.isValid?this.isValid():true));},_onBlur:function(){this._setBlurValue();this.inherited(arguments);},onkeyup:function(){}});dijit.selectInputText=function(_3ec,_3ed,stop){var _3ef=dojo.global;var _3f0=dojo.doc;_3ec=dojo.byId(_3ec);if(isNaN(_3ed)){_3ed=0;}if(isNaN(stop)){stop=_3ec.value?_3ec.value.length:0;}_3ec.focus();if(_3f0["selection"]&&dojo.body()["createTextRange"]){if(_3ec.createTextRange){var _3f1=_3ec.createTextRange();with(_3f1){collapse(true);moveStart("character",_3ed);moveEnd("character",stop);select();}}}else{if(_3ef["getSelection"]){var _3f2=_3ef.getSelection();if(_3ec.setSelectionRange){_3ec.setSelectionRange(_3ed,stop);}}}};}if(!dojo._hasResource["dijit.InlineEditBox"]){dojo._hasResource["dijit.InlineEditBox"]=true;dojo.provide("dijit.InlineEditBox");dojo.declare("dijit.InlineEditBox",dijit._Widget,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:"dijit.form.TextBox",editorParams:{},onChange:function(_3f3){},width:"100%",value:"",noValueIndicator:"<span style='font-family: wingdings; text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>",postMixInProperties:function(){this.inherited("postMixInProperties",arguments);this.displayNode=this.srcNodeRef;var _3f4={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _3f4){this.connect(this.displayNode,name,_3f4[name]);}dijit.setWaiRole(this.displayNode,"button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}this.setValue(this.value||this.displayNode.innerHTML);},setDisabled:function(_3f6){this.disabled=_3f6;dijit.setWaiState(this.focusNode||this.domNode,"disabled",_3f6);},_onMouseOver:function(){dojo.addClass(this.displayNode,this.disabled?"dijitDisabledClickableRegion":"dijitClickableRegion");},_onMouseOut:function(){dojo.removeClass(this.displayNode,this.disabled?"dijitDisabledClickableRegion":"dijitClickableRegion");},_onClick:function(e){if(this.disabled){return;}if(e){dojo.stopEvent(e);}this._onMouseOut();setTimeout(dojo.hitch(this,"_edit"),0);},_edit:function(){this.editing=true;var _3f8=(this.renderAsHtml?this.value:this.value.replace(/\s*\r?\n\s*/g,"").replace(/<br\/?>/gi,"\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&"));var _3f9=dojo.doc.createElement("span");dojo.place(_3f9,this.domNode,"before");var ew=this.editWidget=new dijit._InlineEditor({value:dojo.trim(_3f8),autoSave:this.autoSave,buttonSave:this.buttonSave,buttonCancel:this.buttonCancel,renderAsHtml:this.renderAsHtml,editor:this.editor,editorParams:this.editorParams,style:dojo.getComputedStyle(this.displayNode),save:dojo.hitch(this,"save"),cancel:dojo.hitch(this,"cancel"),width:this.width},_3f9);var ews=ew.domNode.style;this.displayNode.style.display="none";ews.position="static";ews.visibility="visible";this.domNode=ew.domNode;setTimeout(function(){ew.focus();},100);},_showText:function(_3fc){this.displayNode.style.display="";var ew=this.editWidget;var ews=ew.domNode.style;ews.position="absolute";ews.visibility="hidden";this.domNode=this.displayNode;if(_3fc){dijit.focus(this.displayNode);}ews.display="none";setTimeout(function(){ew.destroy();delete ew;if(dojo.isIE){dijit.focus(dijit.getFocus());}},1000);},save:function(_3ff){this.editing=false;var _400=this.editWidget.getValue()+"";if(!this.renderAsHtml){_400=_400.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");}this.setValue(_400);this.onChange(_400);this._showText(_3ff);},setValue:function(val){this.value=val;this.displayNode.innerHTML=dojo.trim(val)||this.noValueIndicator;},getValue:function(){return this.value;},cancel:function(_402){this.editing=false;this._showText(_402);}});dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:"<fieldset dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\" \n\t><input dojoAttachPoint=\"editorPlaceholder\"\n\t/><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" disabled=\"true\">${buttonSave}</button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\">${buttonCancel}</button\n\t></span\n></fieldset>\n",widgetsInTemplate:true,postMixInProperties:function(){this.inherited("postMixInProperties",arguments);this.messages=dojo.i18n.getLocalization("dijit","common",this.lang);dojo.forEach(["buttonSave","buttonCancel"],function(prop){if(!this[prop]){this[prop]=this.messages[prop];}},this);},postCreate:function(){var cls=dojo.getObject(this.editor);var ew=this.editWidget=new cls(this.editorParams,this.editorPlaceholder);var _406=this.style;dojo.forEach(["fontWeight","fontFamily","fontSize","fontStyle"],function(prop){ew.focusNode.style[prop]=_406[prop];},this);dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_406[prop];},this);if(this.width=="100%"){ew.domNode.style.width="100%";this.domNode.style.display="block";}else{ew.domNode.style.width=this.width+(Number(this.width)==this.width?"px":"");}this.connect(ew,"onChange","_onChange");this.connect(ew.focusNode||ew.domNode,"onkeypress","_onKeyPress");(this.editWidget.setDisplayedValue||this.editWidget.setValue).call(this.editWidget,this.value,false);this._initialText=this.getValue();if(this.autoSave){this.buttonContainer.style.display="none";}},destroy:function(){this.editWidget.destroy();this.inherited(arguments);},getValue:function(){var ew=this.editWidget;return ew.getDisplayedValue?ew.getDisplayedValue():ew.getValue();},_onKeyPress:function(e){if(this._exitInProgress){return;}if(this.autoSave){if(e.altKey||e.ctrlKey){return;}if(e.keyCode==dojo.keys.ESCAPE){dojo.stopEvent(e);this._exitInProgress=true;this.cancel(true);}else{if(e.keyCode==dojo.keys.ENTER){dojo.stopEvent(e);this._exitInProgress=true;this.save(true);}else{if(e.keyCode==dojo.keys.TAB){this._exitInProgress=true;setTimeout(dojo.hitch(this,"save",false),0);}}}}else{var _40b=this;setTimeout(function(){_40b.saveButton.setAttribute("disabled",_40b.getValue()==_40b._initialText);},100);}},_onBlur:function(){this.inherited(arguments);if(this._exitInProgress){return;}if(this.autoSave){this._exitInProgress=true;if(this.getValue()==this._initialText){this.cancel(false);}else{this.save(false);}}},enableSave:function(){return this.editWidget.isValid?this.editWidget.isValid():true;},_onChange:function(){if(this._exitInProgress){return;}if(this.autoSave){this._exitInProgress=true;this.save(true);}else{this.saveButton.setAttribute("disabled",(this.getValue()==this._initialText)||!this.enableSave());}},enableSave:function(){return this.editWidget.isValid?this.editWidget.isValid():true;},focus:function(){this.editWidget.focus();dijit.selectInputText(this.editWidget.focusNode);}});}if(!dojo._hasResource["dijit.form.CheckBox"]){dojo._hasResource["dijit.form.CheckBox"]=true;dojo.provide("dijit.form.CheckBox");dojo.declare("dijit.form.CheckBox",dijit.form.ToggleButton,{templateString:"<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \ttype=\"${type}\" name=\"${name}\"\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n",baseClass:"dijitCheckBox",type:"checkbox",value:"on",setValue:function(_40c){if(typeof _40c=="string"){this.setAttribute("value",_40c);_40c=true;}this.setAttribute("checked",_40c);},_getValueDeprecated:false,getValue:function(){return (this.checked?this.value:false);},reset:function(){this.inherited(arguments);this.setAttribute("value",this._resetValueAttr);},postCreate:function(){this.inherited(arguments);this._resetValueAttr=this.value;}});dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_groups:{},postCreate:function(){(this._groups[this.name]=this._groups[this.name]||[]).push(this);this.inherited(arguments);},uninitialize:function(){dojo.forEach(this._groups[this.name],function(_40d,i,arr){if(_40d===this){arr.splice(i,1);return;}},this);},setAttribute:function(attr,_411){this.inherited(arguments);switch(attr){case "checked":if(this.checked){dojo.forEach(this._groups[this.name],function(_412){if(_412!=this&&_412.checked){_412.setAttribute("checked",false);}},this);}}},_clicked:function(e){if(!this.checked){this.setAttribute("checked",true);}}});}if(!dojo._hasResource["dijit.form.ValidationTextBox"]){dojo._hasResource["dijit.form.ValidationTextBox"]=true;dojo.provide("dijit.form.ValidationTextBox");dojo.declare("dijit.form.ValidationTextBox",dijit.form.TextBox,{templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class=\"dijitReset\" dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus:_update,onkeyup:_onkeyup,onblur:_onMouse,onkeypress:_onKeyPress' autocomplete=\"off\"\n\t\t\ttype='${type}' name='${name}'\n\t\t/></div\n\t></div\n></div>\n",baseClass:"dijitTextBox",required:false,promptMessage:"",invalidMessage:"$_unset_$",constraints:{},regExp:".*",regExpGen:function(_414){return this.regExp;},state:"",tooltipPosition:[],setValue:function(){this.inherited(arguments);this.validate(this._focused);},validator:function(_415,_416){return (new RegExp("^("+this.regExpGen(_416)+")"+(this.required?"":"?")+"$")).test(_415)&&(!this.required||!this._isEmpty(_415))&&(this._isEmpty(_415)||this.parse(_415,_416)!==undefined);},isValid:function(_417){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_418){return /^\s*$/.test(_418);},getErrorMessage:function(_419){return this.invalidMessage;},getPromptMessage:function(_41a){return this.promptMessage;},validate:function(_41b){var _41c="";var _41d=this.isValid(_41b);var _41e=this._isEmpty(this.textbox.value);this.state=(_41d||(!this._hasBeenBlurred&&_41e))?"":"Error";this._setStateClass();dijit.setWaiState(this.focusNode,"invalid",_41d?"false":"true");if(_41b){if(_41e){_41c=this.getPromptMessage(true);}if(!_41c&&this.state=="Error"){_41c=this.getErrorMessage(true);}}this.displayMessage(_41c);return _41d;},_message:"",displayMessage:function(_41f){if(this._message==_41f){return;}this._message=_41f;dijit.hideTooltip(this.domNode);if(_41f){dijit.showTooltip(_41f,this.domNode,this.tooltipPosition);}},_refreshState:function(){this.validate(this._focused);},_update:function(e){this._refreshState();this._onMouse(e);},_onkeyup:function(e){this._update(e);this.onkeyup(e);},constructor:function(){this.constraints={};},postMixInProperties:function(){this.inherited(arguments);this.constraints.locale=this.lang;this.messages=dojo.i18n.getLocalization("dijit.form","validate",this.lang);if(this.invalidMessage=="$_unset_$"){this.invalidMessage=this.messages.invalidMessage;}var p=this.regExpGen(this.constraints);this.regExp=p;}});dojo.declare("dijit.form.MappedTextBox",dijit.form.ValidationTextBox,{serialize:function(val,_424){return val.toString?val.toString():"";},toString:function(){var val=this.filter(this.getValue());return val!=null?(typeof val=="string"?val:this.serialize(val,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},setAttribute:function(attr,_427){this.inherited(arguments);switch(attr){case "disabled":if(this.valueNode){this.valueNode.disabled=this.disabled;}}},postCreate:function(){var _428=this.textbox;var _429=(this.valueNode=dojo.doc.createElement("input"));_429.setAttribute("type",_428.type);_429.setAttribute("value",this.toString());dojo.style(_429,"display","none");_429.name=this.textbox.name;_429.disabled=this.textbox.disabled;this.textbox.name=this.textbox.name+"_displayed_";this.textbox.removeAttribute("name");dojo.place(_429,_428,"after");this.inherited(arguments);}});dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",compare:function(val1,val2){return val1-val2;},rangeCheck:function(_42c,_42d){var _42e="min" in _42d;var _42f="max" in _42d;if(_42e||_42f){return (!_42e||this.compare(_42c,_42d.min)>=0)&&(!_42f||this.compare(_42c,_42d.max)<=0);}return true;},isInRange:function(_430){return this.rangeCheck(this.getValue(),this.constraints);},isValid:function(_431){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_431));},getErrorMessage:function(_432){if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this,false)&&!this.isInRange(_432)){return this.rangeMessage;}return this.inherited(arguments);},postMixInProperties:function(){this.inherited(arguments);if(!this.rangeMessage){this.messages=dojo.i18n.getLocalization("dijit.form","validate",this.lang);this.rangeMessage=this.messages.rangeMessage;}},postCreate:function(){this.inherited(arguments);if(this.constraints.min!==undefined){dijit.setWaiState(this.focusNode,"valuemin",this.constraints.min);}if(this.constraints.max!==undefined){dijit.setWaiState(this.focusNode,"valuemax",this.constraints.max);}},setValue:function(_433,_434){dijit.setWaiState(this.focusNode,"valuenow",_433);this.inherited("setValue",arguments);}});}if(!dojo._hasResource["dijit.form.ComboBox"]){dojo._hasResource["dijit.form.ComboBox"]=true;dojo.provide("dijit.form.ComboBox");dojo.declare("dijit.form.ComboBoxMixin",null,{item:null,pageSize:Infinity,store:null,query:{},autoComplete:true,searchDelay:100,searchAttr:"name",queryExpr:"${0}*",ignoreCase:true,hasDownArrow:true,templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"comboNode\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input type=\"text\" autocomplete=\"off\" name=\"${name}\" class='dijitReset'\n\t\t\tdojoAttachEvent=\"onkeypress:_onKeyPress, onfocus:_update, compositionend,onkeyup\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t\t/></div\n\t></div\n></div>\n",baseClass:"dijitComboBox",_getCaretPos:function(_435){var pos=0;if(typeof (_435.selectionStart)=="number"){pos=_435.selectionStart;}else{if(dojo.isIE){var tr=dojo.doc.selection.createRange().duplicate();var ntr=_435.createTextRange();tr.move("character",0);ntr.move("character",0);try{ntr.setEndPoint("EndToEnd",tr);pos=String(ntr.text).replace(/\r/g,"").length;}catch(e){}}}return pos;},_setCaretPos:function(_439,_43a){_43a=parseInt(_43a);dijit.selectInputText(_439,_43a,_43a);},_setAttribute:function(attr,_43c){if(attr=="disabled"){dijit.setWaiState(this.comboNode,"disabled",_43c);}},_onKeyPress:function(evt){if(evt.altKey||(evt.ctrlKey&&evt.charCode!=118)){return;}var _43e=false;var pw=this._popupWidget;var dk=dojo.keys;if(this._isShowingNow){pw.handleKey(evt);}switch(evt.keyCode){case dk.PAGE_DOWN:case dk.DOWN_ARROW:if(!this._isShowingNow||this._prev_key_esc){this._arrowPressed();_43e=true;}else{this._announceOption(pw.getHighlightedOption());}dojo.stopEvent(evt);this._prev_key_backspace=false;this._prev_key_esc=false;break;case dk.PAGE_UP:case dk.UP_ARROW:if(this._isShowingNow){this._announceOption(pw.getHighlightedOption());}dojo.stopEvent(evt);this._prev_key_backspace=false;this._prev_key_esc=false;break;case dk.ENTER:var _441;if(this._isShowingNow&&(_441=pw.getHighlightedOption())){if(_441==pw.nextButton){this._nextSearch(1);dojo.stopEvent(evt);break;}else{if(_441==pw.previousButton){this._nextSearch(-1);dojo.stopEvent(evt);break;}}}else{this.setDisplayedValue(this.getDisplayedValue());}evt.preventDefault();case dk.TAB:var _442=this.getDisplayedValue();if(pw&&(_442==pw._messages["previousMessage"]||_442==pw._messages["nextMessage"])){break;}if(this._isShowingNow){this._prev_key_backspace=false;this._prev_key_esc=false;if(pw.getHighlightedOption()){pw.setValue({target:pw.getHighlightedOption()},true);}this._hideResultList();}break;case dk.SPACE:this._prev_key_backspace=false;this._prev_key_esc=false;if(this._isShowingNow&&pw.getHighlightedOption()){dojo.stopEvent(evt);this._selectOption();this._hideResultList();}else{_43e=true;}break;case dk.ESCAPE:this._prev_key_backspace=false;this._prev_key_esc=true;if(this._isShowingNow){dojo.stopEvent(evt);this._hideResultList();}this.inherited(arguments);break;case dk.DELETE:case dk.BACKSPACE:this._prev_key_esc=false;this._prev_key_backspace=true;_43e=true;break;case dk.RIGHT_ARROW:case dk.LEFT_ARROW:this._prev_key_backspace=false;this._prev_key_esc=false;break;default:this._prev_key_backspace=false;this._prev_key_esc=false;if(dojo.isIE||evt.charCode!=0){_43e=true;}}if(this.searchTimer){clearTimeout(this.searchTimer);}if(_43e){setTimeout(dojo.hitch(this,"_startSearchFromInput"),1);}},_autoCompleteText:function(text){var fn=this.focusNode;dijit.selectInputText(fn,fn.value.length);var _445=this.ignoreCase?"toLowerCase":"substr";if(text[_445](0).indexOf(this.focusNode.value[_445](0))==0){var cpos=this._getCaretPos(fn);if((cpos+1)>fn.value.length){fn.value=text;dijit.selectInputText(fn,cpos);}}else{fn.value=text;dijit.selectInputText(fn);}},_openResultList:function(_447,_448){if(this.disabled||this.readOnly||(_448.query[this.searchAttr]!=this._lastQuery)){return;}this._popupWidget.clearResultList();if(!_447.length){this._hideResultList();return;}var _449=new String(this.store.getValue(_447[0],this.searchAttr));if(_449&&this.autoComplete&&!this._prev_key_backspace&&(_448.query[this.searchAttr]!="*")){this._autoCompleteText(_449);}this._popupWidget.createOptions(_447,_448,dojo.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_448.direction){if(1==_448.direction){this._popupWidget.highlightFirstOption();}else{if(-1==_448.direction){this._popupWidget.highlightLastOption();}}this._announceOption(this._popupWidget.getHighlightedOption());}},_showResultList:function(){this._hideResultList();var _44a=this._popupWidget.getItems(),_44b=Math.min(_44a.length,this.maxListLength);this._arrowPressed();this.displayMessage("");with(this._popupWidget.domNode.style){width="";height="";}var best=this.open();var _44d=dojo.marginBox(this._popupWidget.domNode);this._popupWidget.domNode.style.overflow=((best.h==_44d.h)&&(best.w==_44d.w))?"hidden":"auto";var _44e=best.w;if(best.h<this._popupWidget.domNode.scrollHeight){_44e+=16;}dojo.marginBox(this._popupWidget.domNode,{h:best.h,w:Math.max(_44e,this.domNode.offsetWidth)});dijit.setWaiState(this.comboNode,"expanded","true");},_hideResultList:function(){if(this._isShowingNow){dijit.popup.close(this._popupWidget);this._arrowIdle();this._isShowingNow=false;dijit.setWaiState(this.comboNode,"expanded","false");dijit.removeWaiState(this.focusNode,"activedescendant");}},_setBlurValue:function(){var _44f=this.getDisplayedValue();var pw=this._popupWidget;if(pw&&(_44f==pw._messages["previousMessage"]||_44f==pw._messages["nextMessage"])){this.setValue(this._lastValueReported,true);}else{this.setDisplayedValue(_44f);}},_onBlur:function(){this._hideResultList();this._arrowIdle();this.inherited(arguments);},_announceOption:function(node){if(node==null){return;}var _452;if(node==this._popupWidget.nextButton||node==this._popupWidget.previousButton){_452=node.innerHTML;}else{_452=this.store.getValue(node.item,this.searchAttr);}this.focusNode.value=this.focusNode.value.substring(0,this._getCaretPos(this.focusNode));dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(node,"id"));this._autoCompleteText(_452);},_selectOption:function(evt){var tgt=null;if(!evt){evt={target:this._popupWidget.getHighlightedOption()};}if(!evt.target){this.setDisplayedValue(this.getDisplayedValue());return;}else{tgt=evt.target;}if(!evt.noHide){this._hideResultList();this._setCaretPos(this.focusNode,this.store.getValue(tgt.item,this.searchAttr).length);}this._doSelect(tgt);},_doSelect:function(tgt){this.item=tgt.item;this.setValue(this.store.getValue(tgt.item,this.searchAttr),true);},_onArrowMouseDown:function(evt){if(this.disabled||this.readOnly){return;}dojo.stopEvent(evt);this.focus();if(this._isShowingNow){this._hideResultList();}else{this._startSearch("");}},_startSearchFromInput:function(){this._startSearch(this.focusNode.value);},_getQueryString:function(text){return dojo.string.substitute(this.queryExpr,[text]);},_startSearch:function(key){if(!this._popupWidget){var _459=this.id+"_popup";this._popupWidget=new dijit.form._ComboBoxMenu({onChange:dojo.hitch(this,this._selectOption),id:_459});dijit.removeWaiState(this.focusNode,"activedescendant");dijit.setWaiState(this.textbox,"owns",_459);}this.item=null;var _45a=dojo.clone(this.query);this._lastQuery=_45a[this.searchAttr]=this._getQueryString(key);this.searchTimer=setTimeout(dojo.hitch(this,function(_45b,_45c){var _45d=this.store.fetch({queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_45b,onComplete:dojo.hitch(this,"_openResultList"),onError:function(_45e){console.error("dijit.form.ComboBox: "+_45e);dojo.hitch(_45c,"_hideResultList")();},start:0,count:this.pageSize});var _45f=function(_460,_461){_460.start+=_460.count*_461;_460.direction=_461;this.store.fetch(_460);};this._nextSearch=this._popupWidget.onPage=dojo.hitch(this,_45f,_45d);},_45a,this),this.searchDelay);},_getValueField:function(){return this.searchAttr;},_arrowPressed:function(){if(!this.disabled&&!this.readOnly&&this.hasDownArrow){dojo.addClass(this.downArrowNode,"dijitArrowButtonActive");}},_arrowIdle:function(){if(!this.disabled&&!this.readOnly&&this.hasDownArrow){dojo.removeClass(this.downArrowNode,"dojoArrowButtonPushed");}},compositionend:function(evt){this.onkeypress({charCode:-1});},constructor:function(){this.query={};},postMixInProperties:function(){if(!this.hasDownArrow){this.baseClass="dijitTextBox";}if(!this.store){var _463=this.srcNodeRef;this.store=new dijit.form._ComboBoxDataStore(_463);if(!this.value||((typeof _463.selectedIndex=="number")&&_463.selectedIndex.toString()===this.value)){var item=this.store.fetchSelectedItem();if(item){this.value=this.store.getValue(item,this._getValueField());}}}},_postCreate:function(){var _465=dojo.query("label[for=\""+this.id+"\"]");if(_465.length){_465[0].id=(this.id+"_label");var cn=this.comboNode;dijit.setWaiState(cn,"labelledby",_465[0].id);dijit.setWaiState(cn,"disabled",this.disabled);}},uninitialize:function(){if(this._popupWidget){this._hideResultList();this._popupWidget.destroy();}},_getMenuLabelFromItem:function(item){return {html:false,label:this.store.getValue(item,this.searchAttr)};},open:function(){this._isShowingNow=true;return dijit.popup.open({popup:this._popupWidget,around:this.domNode,parent:this});},reset:function(){this.item=null;this.inherited(arguments);}});dojo.declare("dijit.form._ComboBoxMenu",[dijit._Widget,dijit._Templated],{templateString:"<ul class='dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow:\"auto\";'>"+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton'></li>"+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton'></li>"+"</ul>",_messages:null,postMixInProperties:function(){this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang);this.inherited("postMixInProperties",arguments);},setValue:function(_468){this.value=_468;this.onChange(_468);},onChange:function(_469){},onPage:function(_46a){},postCreate:function(){this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];this.inherited("postCreate",arguments);},onClose:function(){this._blurOptionNode();},_createOption:function(item,_46c){var _46d=_46c(item);var _46e=dojo.doc.createElement("li");dijit.setWaiRole(_46e,"option");if(_46d.html){_46e.innerHTML=_46d.label;}else{_46e.appendChild(dojo.doc.createTextNode(_46d.label));}if(_46e.innerHTML==""){_46e.innerHTML="&nbsp;";}_46e.item=item;return _46e;},createOptions:function(_46f,_470,_471){this.previousButton.style.display=(_470.start==0)?"none":"";dojo.attr(this.previousButton,"id",this.id+"_prev");dojo.forEach(_46f,function(item,i){var _474=this._createOption(item,_471);_474.className="dijitMenuItem";dojo.attr(_474,"id",this.id+i);this.domNode.insertBefore(_474,this.nextButton);},this);this.nextButton.style.display=(_470.count==_46f.length)?"":"none";dojo.attr(this.nextButton,"id",this.id+"_next");},clearResultList:function(){while(this.domNode.childNodes.length>2){this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);}},getItems:function(){return this.domNode.childNodes;},getListLength:function(){return this.domNode.childNodes.length-2;},_onMouseDown:function(evt){dojo.stopEvent(evt);},_onMouseUp:function(evt){if(evt.target===this.domNode){return;}else{if(evt.target==this.previousButton){this.onPage(-1);}else{if(evt.target==this.nextButton){this.onPage(1);}else{var tgt=evt.target;while(!tgt.item){tgt=tgt.parentNode;}this.setValue({target:tgt},true);}}}},_onMouseOver:function(evt){if(evt.target===this.domNode){return;}var tgt=evt.target;if(!(tgt==this.previousButton||tgt==this.nextButton)){while(!tgt.item){tgt=tgt.parentNode;}}this._focusOptionNode(tgt);},_onMouseOut:function(evt){if(evt.target===this.domNode){return;}this._blurOptionNode();},_focusOptionNode:function(node){if(this._highlighted_option!=node){this._blurOptionNode();this._highlighted_option=node;dojo.addClass(this._highlighted_option,"dijitMenuItemHover");}},_blurOptionNode:function(){if(this._highlighted_option){dojo.removeClass(this._highlighted_option,"dijitMenuItemHover");this._highlighted_option=null;}},_highlightNextOption:function(){var fc=this.domNode.firstChild;if(!this.getHighlightedOption()){this._focusOptionNode(fc.style.display=="none"?fc.nextSibling:fc);}else{var ns=this._highlighted_option.nextSibling;if(ns&&ns.style.display!="none"){this._focusOptionNode(ns);}}dijit.scrollIntoView(this._highlighted_option);},highlightFirstOption:function(){this._focusOptionNode(this.domNode.firstChild.nextSibling);dijit.scrollIntoView(this._highlighted_option);},highlightLastOption:function(){this._focusOptionNode(this.domNode.lastChild.previousSibling);dijit.scrollIntoView(this._highlighted_option);},_highlightPrevOption:function(){var lc=this.domNode.lastChild;if(!this.getHighlightedOption()){this._focusOptionNode(lc.style.display=="none"?lc.previousSibling:lc);}else{var ps=this._highlighted_option.previousSibling;if(ps&&ps.style.display!="none"){this._focusOptionNode(ps);}}dijit.scrollIntoView(this._highlighted_option);},_page:function(up){var _481=0;var _482=this.domNode.scrollTop;var _483=dojo.style(this.domNode,"height");if(!this.getHighlightedOption()){this._highlightNextOption();}while(_481<_483){if(up){if(!this.getHighlightedOption().previousSibling||this._highlighted_option.previousSibling.style.display=="none"){break;}this._highlightPrevOption();}else{if(!this.getHighlightedOption().nextSibling||this._highlighted_option.nextSibling.style.display=="none"){break;}this._highlightNextOption();}var _484=this.domNode.scrollTop;_481+=(_484-_482)*(up?-1:1);_482=_484;}},pageUp:function(){this._page(true);},pageDown:function(){this._page(false);},getHighlightedOption:function(){var ho=this._highlighted_option;return (ho&&ho.parentNode)?ho:null;},handleKey:function(evt){switch(evt.keyCode){case dojo.keys.DOWN_ARROW:this._highlightNextOption();break;case dojo.keys.PAGE_DOWN:this.pageDown();break;case dojo.keys.UP_ARROW:this._highlightPrevOption();break;case dojo.keys.PAGE_UP:this.pageUp();break;}}});dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{postMixInProperties:function(){dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this,arguments);dijit.form.ValidationTextBox.prototype.postMixInProperties.apply(this,arguments);},postCreate:function(){dijit.form.ComboBoxMixin.prototype._postCreate.apply(this,arguments);dijit.form.ValidationTextBox.prototype.postCreate.apply(this,arguments);},setAttribute:function(attr,_488){dijit.form.ValidationTextBox.prototype.setAttribute.apply(this,arguments);dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this,arguments);}});dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(root){this.root=root;},getValue:function(item,_48b,_48c){return (_48b=="value")?item.value:(item.innerText||item.textContent||"");},isItemLoaded:function(_48d){return true;},fetch:function(args){var _48f="^"+args.query.name.replace(/([\\\|\(\)\[\{\^\$\+\?\.\<\>])/g,"\\$1").replace("*",".*")+"$",_490=new RegExp(_48f,args.queryOptions.ignoreCase?"i":""),_491=dojo.query("> option",this.root).filter(function(_492){return (_492.innerText||_492.textContent||"").match(_490);});var _493=args.start||0,end=("count" in args&&args.count!=Infinity)?(_493+args.count):_491.length;args.onComplete(_491.slice(_493,end),args);return args;},close:function(_495){return;},getLabel:function(item){return item.innerHTML;},getIdentity:function(item){return dojo.attr(item,"value");},fetchItemByIdentity:function(args){var item=dojo.query("option[value='"+args.identity+"']",this.root)[0];args.onItem(item);},fetchSelectedItem:function(){var root=this.root,si=root.selectedIndex;return dojo.query("> option:nth-child("+(si!=-1?si+1:1)+")",root)[0];}});}if(!dojo._hasResource["dojo.cldr.monetary"]){dojo._hasResource["dojo.cldr.monetary"]=true;dojo.provide("dojo.cldr.monetary");dojo.cldr.monetary.getData=function(code){var _49d={ADP:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,DJF:0,ESP:0,GNF:0,IQD:3,ITL:0,JOD:3,JPY:0,KMF:0,KRW:0,KWD:3,LUF:0,LYD:3,MGA:0,MGF:0,OMR:3,PYG:0,RWF:0,TND:3,TRL:0,VUV:0,XAF:0,XOF:0,XPF:0};var _49e={CHF:5};var _49f=_49d[code],_4a0=_49e[code];if(typeof _49f=="undefined"){_49f=2;}if(typeof _4a0=="undefined"){_4a0=0;}return {places:_49f,round:_4a0};};}if(!dojo._hasResource["dojo.currency"]){dojo._hasResource["dojo.currency"]=true;dojo.provide("dojo.currency");dojo.currency._mixInDefaults=function(_4a1){_4a1=_4a1||{};_4a1.type="currency";var _4a2=dojo.i18n.getLocalization("dojo.cldr","currency",_4a1.locale)||{};var iso=_4a1.currency;var data=dojo.cldr.monetary.getData(iso);dojo.forEach(["displayName","symbol","group","decimal"],function(prop){data[prop]=_4a2[iso+"_"+prop];});data.fractional=[true,false];return dojo.mixin(data,_4a1);};dojo.currency.format=function(_4a6,_4a7){return dojo.number.format(_4a6,dojo.currency._mixInDefaults(_4a7));};dojo.currency.regexp=function(_4a8){return dojo.number.regexp(dojo.currency._mixInDefaults(_4a8));};dojo.currency.parse=function(_4a9,_4aa){return dojo.number.parse(_4a9,dojo.currency._mixInDefaults(_4aa));};}if(!dojo._hasResource["dijit.form.NumberTextBox"]){dojo._hasResource["dijit.form.NumberTextBox"]=true;dojo.provide("dijit.form.NumberTextBox");dojo.declare("dijit.form.NumberTextBoxMixin",null,{regExpGen:dojo.number.regexp,editOptions:{pattern:"#.######"},_onFocus:function(){this.setValue(this.getValue(),false);this.inherited(arguments);},_formatter:dojo.number.format,format:function(_4ab,_4ac){if(typeof _4ab=="string"){return _4ab;}if(isNaN(_4ab)){return "";}if(this.editOptions&&this._focused){_4ac=dojo.mixin(dojo.mixin({},this.editOptions),this.constraints);}return this._formatter(_4ab,_4ac);},parse:dojo.number.parse,filter:function(_4ad){if(typeof _4ad=="string"){return this.inherited("filter",arguments);}return isNaN(_4ad)?"":_4ad;},value:NaN});dojo.declare("dijit.form.NumberTextBox",[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],{});}if(!dojo._hasResource["dijit.form.CurrencyTextBox"]){dojo._hasResource["dijit.form.CurrencyTextBox"]=true;dojo.provide("dijit.form.CurrencyTextBox");dojo.declare("dijit.form.CurrencyTextBox",dijit.form.NumberTextBox,{currency:"",regExpGen:dojo.currency.regexp,_formatter:dojo.currency.format,parse:dojo.currency.parse,postMixInProperties:function(){if(this.constraints===dijit.form.ValidationTextBox.prototype.constraints){this.constraints={};}this.constraints.currency=this.currency;dijit.form.CurrencyTextBox.superclass.postMixInProperties.apply(this,arguments);}});}if(!dojo._hasResource["dojo.cldr.supplemental"]){dojo._hasResource["dojo.cldr.supplemental"]=true;dojo.provide("dojo.cldr.supplemental");dojo.cldr.supplemental.getFirstDayOfWeek=function(_4ae){var _4af={mv:5,ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,lb:6,ly:6,ma:6,om:6,qa:6,sa:6,sd:6,so:6,tn:6,ye:6,as:0,au:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,ie:0,il:0,is:0,jm:0,jp:0,kg:0,kr:0,la:0,mh:0,mo:0,mp:0,mt:0,nz:0,ph:0,pk:0,sg:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,vi:0,za:0,zw:0,et:0,mw:0,ng:0,tj:0,sy:4};var _4b0=dojo.cldr.supplemental._region(_4ae);var dow=_4af[_4b0];return (dow===undefined)?1:dow;};dojo.cldr.supplemental._region=function(_4b2){_4b2=dojo.i18n.normalizeLocale(_4b2);var tags=_4b2.split("-");var _4b4=tags[1];if(!_4b4){_4b4={de:"de",en:"us",es:"es",fi:"fi",fr:"fr",hu:"hu",it:"it",ja:"jp",ko:"kr",nl:"nl",pt:"br",sv:"se",zh:"cn"}[tags[0]];}else{if(_4b4.length==4){_4b4=tags[2];}}return _4b4;};dojo.cldr.supplemental.getWeekend=function(_4b5){var _4b6={eg:5,il:5,sy:5,"in":0,ae:4,bh:4,dz:4,iq:4,jo:4,kw:4,lb:4,ly:4,ma:4,om:4,qa:4,sa:4,sd:4,tn:4,ye:4};var _4b7={ae:5,bh:5,dz:5,iq:5,jo:5,kw:5,lb:5,ly:5,ma:5,om:5,qa:5,sa:5,sd:5,tn:5,ye:5,af:5,ir:5,eg:6,il:6,sy:6};var _4b8=dojo.cldr.supplemental._region(_4b5);var _4b9=_4b6[_4b8];var end=_4b7[_4b8];if(_4b9===undefined){_4b9=6;}if(end===undefined){end=0;}return {start:_4b9,end:end};};}if(!dojo._hasResource["dojo.date"]){dojo._hasResource["dojo.date"]=true;dojo.provide("dojo.date");dojo.date.getDaysInMonth=function(_4bb){var _4bc=_4bb.getMonth();var days=[31,28,31,30,31,30,31,31,30,31,30,31];if(_4bc==1&&dojo.date.isLeapYear(_4bb)){return 29;}return days[_4bc];};dojo.date.isLeapYear=function(_4be){var year=_4be.getFullYear();return !(year%400)||(!(year%4)&&!!(year%100));};dojo.date.getTimezoneName=function(_4c0){var str=_4c0.toString();var tz="";var _4c3;var pos=str.indexOf("(");if(pos>-1){tz=str.substring(++pos,str.indexOf(")"));}else{var pat=/([A-Z\/]+) \d{4}$/;if((_4c3=str.match(pat))){tz=_4c3[1];}else{str=_4c0.toLocaleString();pat=/ ([A-Z\/]+)$/;if((_4c3=str.match(pat))){tz=_4c3[1];}}}return (tz=="AM"||tz=="PM")?"":tz;};dojo.date.compare=function(_4c6,_4c7,_4c8){_4c6=new Date(Number(_4c6));_4c7=new Date(Number(_4c7||new Date()));if(_4c8!=="undefined"){if(_4c8=="date"){_4c6.setHours(0,0,0,0);_4c7.setHours(0,0,0,0);}else{if(_4c8=="time"){_4c6.setFullYear(0,0,0);_4c7.setFullYear(0,0,0);}}}if(_4c6>_4c7){return 1;}if(_4c6<_4c7){return -1;}return 0;};dojo.date.add=function(date,_4ca,_4cb){var sum=new Date(Number(date));var _4cd=false;var _4ce="Date";switch(_4ca){case "day":break;case "weekday":var days,_4d0;var mod=_4cb%5;if(!mod){days=(_4cb>0)?5:-5;_4d0=(_4cb>0)?((_4cb-5)/5):((_4cb+5)/5);}else{days=mod;_4d0=parseInt(_4cb/5);}var strt=date.getDay();var adj=0;if(strt==6&&_4cb>0){adj=1;}else{if(strt==0&&_4cb<0){adj=-1;}}var trgt=strt+days;if(trgt==0||trgt==6){adj=(_4cb>0)?2:-2;}_4cb=(7*_4d0)+days+adj;break;case "year":_4ce="FullYear";_4cd=true;break;case "week":_4cb*=7;break;case "quarter":_4cb*=3;case "month":_4cd=true;_4ce="Month";break;case "hour":case "minute":case "second":case "millisecond":_4ce="UTC"+_4ca.charAt(0).toUpperCase()+_4ca.substring(1)+"s";}if(_4ce){sum["set"+_4ce](sum["get"+_4ce]()+_4cb);}if(_4cd&&(sum.getDate()<date.getDate())){sum.setDate(0);}return sum;};dojo.date.difference=function(_4d5,_4d6,_4d7){_4d6=_4d6||new Date();_4d7=_4d7||"day";var _4d8=_4d6.getFullYear()-_4d5.getFullYear();var _4d9=1;switch(_4d7){case "quarter":var m1=_4d5.getMonth();var m2=_4d6.getMonth();var q1=Math.floor(m1/3)+1;var q2=Math.floor(m2/3)+1;q2+=(_4d8*4);_4d9=q2-q1;break;case "weekday":var days=Math.round(dojo.date.difference(_4d5,_4d6,"day"));var _4df=parseInt(dojo.date.difference(_4d5,_4d6,"week"));var mod=days%7;if(mod==0){days=_4df*5;}else{var adj=0;var aDay=_4d5.getDay();var bDay=_4d6.getDay();_4df=parseInt(days/7);mod=days%7;var _4e4=new Date(_4d5);_4e4.setDate(_4e4.getDate()+(_4df*7));var _4e5=_4e4.getDay();if(days>0){switch(true){case aDay==6:adj=-1;break;case aDay==0:adj=0;break;case bDay==6:adj=-1;break;case bDay==0:adj=-2;break;case (_4e5+mod)>5:adj=-2;}}else{if(days<0){switch(true){case aDay==6:adj=0;break;case aDay==0:adj=1;break;case bDay==6:adj=2;break;case bDay==0:adj=1;break;case (_4e5+mod)<0:adj=2;}}}days+=adj;days-=(_4df*2);}_4d9=days;break;case "year":_4d9=_4d8;break;case "month":_4d9=(_4d6.getMonth()-_4d5.getMonth())+(_4d8*12);break;case "week":_4d9=parseInt(dojo.date.difference(_4d5,_4d6,"day")/7);break;case "day":_4d9/=24;case "hour":_4d9/=60;case "minute":_4d9/=60;case "second":_4d9/=1000;case "millisecond":_4d9*=_4d6.getTime()-_4d5.getTime();}return Math.round(_4d9);};}if(!dojo._hasResource["dojo.date.locale"]){dojo._hasResource["dojo.date.locale"]=true;dojo.provide("dojo.date.locale");(function(){function formatPattern(_4e6,_4e7,_4e8,_4e9){return _4e9.replace(/([a-z])\1*/ig,function(_4ea){var s,pad;var c=_4ea.charAt(0);var l=_4ea.length;var _4ef=["abbr","wide","narrow"];switch(c){case "G":s=_4e7[(l<4)?"eraAbbr":"eraNames"][_4e6.getFullYear()<0?0:1];break;case "y":s=_4e6.getFullYear();switch(l){case 1:break;case 2:if(!_4e8){s=String(s);s=s.substr(s.length-2);break;}default:pad=true;}break;case "Q":case "q":s=Math.ceil((_4e6.getMonth()+1)/3);pad=true;break;case "M":case "L":var m=_4e6.getMonth();var _4f1;switch(l){case 1:case 2:s=m+1;pad=true;break;case 3:case 4:case 5:_4f1=_4ef[l-3];break;}if(_4f1){var _4f2=(c=="L")?"standalone":"format";var _4f3=["months",_4f2,_4f1].join("-");s=_4e7[_4f3][m];}break;case "w":var _4f4=0;s=dojo.date.locale._getWeekOfYear(_4e6,_4f4);pad=true;break;case "d":s=_4e6.getDate();pad=true;break;case "D":s=dojo.date.locale._getDayOfYear(_4e6);pad=true;break;case "E":case "e":case "c":var d=_4e6.getDay();var _4f6;switch(l){case 1:case 2:if(c=="e"){var _4f7=dojo.cldr.supplemental.getFirstDayOfWeek(options.locale);d=(d-_4f7+7)%7;}if(c!="c"){s=d+1;pad=true;break;}case 3:case 4:case 5:_4f6=_4ef[l-3];break;}if(_4f6){var _4f8=(c=="c")?"standalone":"format";var _4f9=["days",_4f8,_4f6].join("-");s=_4e7[_4f9][d];}break;case "a":var _4fa=(_4e6.getHours()<12)?"am":"pm";s=_4e7[_4fa];break;case "h":case "H":case "K":case "k":var h=_4e6.getHours();switch(c){case "h":s=(h%12)||12;break;case "H":s=h;break;case "K":s=(h%12);break;case "k":s=h||24;break;}pad=true;break;case "m":s=_4e6.getMinutes();pad=true;break;case "s":s=_4e6.getSeconds();pad=true;break;case "S":s=Math.round(_4e6.getMilliseconds()*Math.pow(10,l-3));pad=true;break;case "v":case "z":s=dojo.date.getTimezoneName(_4e6);if(s){break;}l=4;case "Z":var _4fc=_4e6.getTimezoneOffset();var tz=[(_4fc<=0?"+":"-"),dojo.string.pad(Math.floor(Math.abs(_4fc)/60),2),dojo.string.pad(Math.abs(_4fc)%60,2)];if(l==4){tz.splice(0,0,"GMT");tz.splice(3,0,":");}s=tz.join("");break;default:throw new Error("dojo.date.locale.format: invalid pattern char: "+_4e9);}if(pad){s=dojo.string.pad(s,l);}return s;});};dojo.date.locale.format=function(_4fe,_4ff){_4ff=_4ff||{};var _500=dojo.i18n.normalizeLocale(_4ff.locale);var _501=_4ff.formatLength||"short";var _502=dojo.date.locale._getGregorianBundle(_500);var str=[];var _504=dojo.hitch(this,formatPattern,_4fe,_502,_4ff.fullYear);if(_4ff.selector=="year"){var year=_4fe.getFullYear();if(_500.match(/^zh|^ja/)){year+="年";}return year;}if(_4ff.selector!="time"){var _506=_4ff.datePattern||_502["dateFormat-"+_501];if(_506){str.push(_processPattern(_506,_504));}}if(_4ff.selector!="date"){var _507=_4ff.timePattern||_502["timeFormat-"+_501];if(_507){str.push(_processPattern(_507,_504));}}var _508=str.join(" ");return _508;};dojo.date.locale.regexp=function(_509){return dojo.date.locale._parseInfo(_509).regexp;};dojo.date.locale._parseInfo=function(_50a){_50a=_50a||{};var _50b=dojo.i18n.normalizeLocale(_50a.locale);var _50c=dojo.date.locale._getGregorianBundle(_50b);var _50d=_50a.formatLength||"short";var _50e=_50a.datePattern||_50c["dateFormat-"+_50d];var _50f=_50a.timePattern||_50c["timeFormat-"+_50d];var _510;if(_50a.selector=="date"){_510=_50e;}else{if(_50a.selector=="time"){_510=_50f;}else{_510=_50e+" "+_50f;}}var _511=[];var re=_processPattern(_510,dojo.hitch(this,_buildDateTimeRE,_511,_50c,_50a));return {regexp:re,tokens:_511,bundle:_50c};};dojo.date.locale.parse=function(_513,_514){var info=dojo.date.locale._parseInfo(_514);var _516=info.tokens,_517=info.bundle;var re=new RegExp("^"+info.regexp+"$");var _519=re.exec(_513);if(!_519){return null;}var _51a=["abbr","wide","narrow"];var _51b=[1970,0,1,0,0,0,0];var amPm="";var _51d=dojo.every(_519,function(v,i){if(!i){return true;}var _520=_516[i-1];var l=_520.length;switch(_520.charAt(0)){case "y":if(l!=2&&_514.strict){_51b[0]=v;}else{if(v<100){v=Number(v);var year=""+new Date().getFullYear();var _523=year.substring(0,2)*100;var _524=Math.min(Number(year.substring(2,4))+20,99);var num=(v<_524)?_523+v:_523-100+v;_51b[0]=num;}else{if(_514.strict){return false;}_51b[0]=v;}}break;case "M":if(l>2){var _526=_517["months-format-"+_51a[l-3]].concat();if(!_514.strict){v=v.replace(".","").toLowerCase();_526=dojo.map(_526,function(s){return s.replace(".","").toLowerCase();});}v=dojo.indexOf(_526,v);if(v==-1){return false;}}else{v--;}_51b[1]=v;break;case "E":case "e":var days=_517["days-format-"+_51a[l-3]].concat();if(!_514.strict){v=v.toLowerCase();days=dojo.map(days,function(d){return d.toLowerCase();});}v=dojo.indexOf(days,v);if(v==-1){return false;}break;case "D":_51b[1]=0;case "d":_51b[2]=v;break;case "a":var am=_514.am||_517.am;var pm=_514.pm||_517.pm;if(!_514.strict){var _52c=/\./g;v=v.replace(_52c,"").toLowerCase();am=am.replace(_52c,"").toLowerCase();pm=pm.replace(_52c,"").toLowerCase();}if(_514.strict&&v!=am&&v!=pm){return false;}amPm=(v==pm)?"p":(v==am)?"a":"";break;case "K":if(v==24){v=0;}case "h":case "H":case "k":if(v>23){return false;}_51b[3]=v;break;case "m":_51b[4]=v;break;case "s":_51b[5]=v;break;case "S":_51b[6]=v;}return true;});var _52d=+_51b[3];if(amPm==="p"&&_52d<12){_51b[3]=_52d+12;}else{if(amPm==="a"&&_52d==12){_51b[3]=0;}}var _52e=new Date(_51b[0],_51b[1],_51b[2],_51b[3],_51b[4],_51b[5],_51b[6]);if(_514.strict){_52e.setFullYear(_51b[0]);}var _52f=_516.join("");if(!_51d||(_52f.indexOf("M")!=-1&&_52e.getMonth()!=_51b[1])||(_52f.indexOf("d")!=-1&&_52e.getDate()!=_51b[2])){return null;}return _52e;};function _processPattern(_530,_531,_532,_533){var _534=function(x){return x;};_531=_531||_534;_532=_532||_534;_533=_533||_534;var _536=_530.match(/(''|[^'])+/g);var _537=false;dojo.forEach(_536,function(_538,i){if(!_538){_536[i]="";}else{_536[i]=(_537?_532:_531)(_538);_537=!_537;}});return _533(_536.join(""));};function _buildDateTimeRE(_53a,_53b,_53c,_53d){_53d=dojo.regexp.escapeString(_53d);if(!_53c.strict){_53d=_53d.replace(" a"," ?a");}return _53d.replace(/([a-z])\1*/ig,function(_53e){var s;var c=_53e.charAt(0);var l=_53e.length;var p2="",p3="";if(_53c.strict){if(l>1){p2="0"+"{"+(l-1)+"}";}if(l>2){p3="0"+"{"+(l-2)+"}";}}else{p2="0?";p3="0{0,2}";}switch(c){case "y":s="\\d{2,4}";break;case "M":s=(l>2)?"\\S+":p2+"[1-9]|1[0-2]";break;case "D":s=p2+"[1-9]|"+p3+"[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]";break;case "d":s=p2+"[1-9]|[12]\\d|3[01]";break;case "w":s=p2+"[1-9]|[1-4][0-9]|5[0-3]";break;case "E":s="\\S+";break;case "h":s=p2+"[1-9]|1[0-2]";break;case "k":s=p2+"\\d|1[01]";break;case "H":s=p2+"\\d|1\\d|2[0-3]";break;case "K":s=p2+"[1-9]|1\\d|2[0-4]";break;case "m":case "s":s="[0-5]\\d";break;case "S":s="\\d{"+l+"}";break;case "a":var am=_53c.am||_53b.am||"AM";var pm=_53c.pm||_53b.pm||"PM";if(_53c.strict){s=am+"|"+pm;}else{s=am+"|"+pm;if(am!=am.toLowerCase()){s+="|"+am.toLowerCase();}if(pm!=pm.toLowerCase()){s+="|"+pm.toLowerCase();}}break;default:s=".*";}if(_53a){_53a.push(_53e);}return "("+s+")";}).replace(/[\xa0 ]/g,"[\\s\\xa0]");};})();(function(){var _546=[];dojo.date.locale.addCustomFormats=function(_547,_548){_546.push({pkg:_547,name:_548});};dojo.date.locale._getGregorianBundle=function(_549){var _54a={};dojo.forEach(_546,function(desc){var _54c=dojo.i18n.getLocalization(desc.pkg,desc.name,_549);_54a=dojo.mixin(_54a,_54c);},this);return _54a;};})();dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");dojo.date.locale.getNames=function(item,type,use,_550){var _551;var _552=dojo.date.locale._getGregorianBundle(_550);var _553=[item,use,type];if(use=="standAlone"){_551=_552[_553.join("-")];}_553[1]="format";return (_551||_552[_553.join("-")]).concat();};dojo.date.locale.isWeekend=function(_554,_555){var _556=dojo.cldr.supplemental.getWeekend(_555);var day=(_554||new Date()).getDay();if(_556.end<_556.start){_556.end+=7;if(day<_556.start){day+=7;}}return day>=_556.start&&day<=_556.end;};dojo.date.locale._getDayOfYear=function(_558){return dojo.date.difference(new Date(_558.getFullYear(),0,1),_558)+1;};dojo.date.locale._getWeekOfYear=function(_559,_55a){if(arguments.length==1){_55a=0;}var _55b=new Date(_559.getFullYear(),0,1).getDay();var adj=(_55b-_55a+7)%7;var week=Math.floor((dojo.date.locale._getDayOfYear(_559)+adj-1)/7);if(_55b==_55a){week++;}return week;};}if(!dojo._hasResource["dijit._Calendar"]){dojo._hasResource["dijit._Calendar"]=true;dojo.provide("dijit._Calendar");dojo.declare("dijit._Calendar",[dijit._Widget,dijit._Templated],{templateString:"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarDecrease\"><span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner\">-</span></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitCalendarMonthLabelSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel\"></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarIncrease\"><span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner\">+</span></div>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\"><span class=\"dijitCalendarDateLabel\"></span></td>\n\t\t</tr>\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\">\n\t\t\t\t<h3 class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span dojoAttachPoint=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\"></span>\n\t\t\t\t</h3>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\t\n",value:new Date(),dayWidth:"narrow",setValue:function(_55e){if(!this.value||dojo.date.compare(_55e,this.value)){_55e=new Date(_55e);this.displayMonth=new Date(_55e);if(!this.isDisabledDate(_55e,this.lang)){this.value=_55e;this.value.setHours(0,0,0,0);this.onChange(this.value);}this._populateGrid();}},_setText:function(node,text){while(node.firstChild){node.removeChild(node.firstChild);}node.appendChild(dojo.doc.createTextNode(text));},_populateGrid:function(){var _561=this.displayMonth;_561.setDate(1);var _562=_561.getDay();var _563=dojo.date.getDaysInMonth(_561);var _564=dojo.date.getDaysInMonth(dojo.date.add(_561,"month",-1));var _565=new Date();var _566=this.value;var _567=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);if(_567>_562){_567-=7;}dojo.query(".dijitCalendarDateTemplate",this.domNode).forEach(function(_568,i){i+=_567;var date=new Date(_561);var _56b,_56c="dijitCalendar",adj=0;if(i<_562){_56b=_564-_562+i+1;adj=-1;_56c+="Previous";}else{if(i>=(_562+_563)){_56b=i-_562-_563+1;adj=1;_56c+="Next";}else{_56b=i-_562+1;_56c+="Current";}}if(adj){date=dojo.date.add(date,"month",adj);}date.setDate(_56b);if(!dojo.date.compare(date,_565,"date")){_56c="dijitCalendarCurrentDate "+_56c;}if(!dojo.date.compare(date,_566,"date")){_56c="dijitCalendarSelectedDate "+_56c;}if(this.isDisabledDate(date,this.lang)){_56c="dijitCalendarDisabledDate "+_56c;}var _56e=this.getClassForDate(date,this.lang);if(_56e){_56c+=_56e+" "+_56c;}_568.className=_56c+"Month dijitCalendarDateTemplate";_568.dijitDateValue=date.valueOf();var _56f=dojo.query(".dijitCalendarDateLabel",_568)[0];this._setText(_56f,date.getDate());},this);var _570=dojo.date.locale.getNames("months","wide","standAlone",this.lang);this._setText(this.monthLabelNode,_570[_561.getMonth()]);var y=_561.getFullYear()-1;var d=new Date();dojo.forEach(["previous","current","next"],function(name){d.setFullYear(y++);this._setText(this[name+"YearLabelNode"],dojo.date.locale.format(d,{selector:"year",locale:this.lang}));},this);var _574=this;var _575=function(_576,_577,adj){dijit.typematic.addMouseListener(_574[_576],_574,function(_579){if(_579>=0){_574._adjustDisplay(_577,adj);}},0.8,500);};_575("incrementMonth","month",1);_575("decrementMonth","month",-1);_575("nextYearLabelNode","year",1);_575("previousYearLabelNode","year",-1);},goToToday:function(){this.setValue(new Date());},postCreate:function(){this.inherited(arguments);var _57a=dojo.hitch(this,function(_57b,n){var _57d=dojo.query(_57b,this.domNode)[0];for(var i=0;i<n;i++){_57d.parentNode.appendChild(_57d.cloneNode(true));}});_57a(".dijitCalendarDayLabelTemplate",6);_57a(".dijitCalendarDateTemplate",6);_57a(".dijitCalendarWeekTemplate",5);var _57f=dojo.date.locale.getNames("days",this.dayWidth,"standAlone",this.lang);var _580=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_581,i){this._setText(_581,_57f[(i+_580)%7]);},this);var _583=dojo.date.locale.getNames("months","wide","standAlone",this.lang);dojo.forEach(_583,function(name){var _585=dojo.doc.createElement("div");this._setText(_585,name);this.monthLabelSpacer.appendChild(_585);},this);this.value=null;this.setValue(new Date());},_adjustDisplay:function(part,_587){this.displayMonth=dojo.date.add(this.displayMonth,part,_587);this._populateGrid();},_onDayClick:function(evt){var node=evt.target;dojo.stopEvent(evt);while(!node.dijitDateValue){node=node.parentNode;}if(!dojo.hasClass(node,"dijitCalendarDisabledDate")){this.setValue(node.dijitDateValue);this.onValueSelected(this.value);}},onValueSelected:function(date){},onChange:function(date){},isDisabledDate:function(_58c,_58d){},getClassForDate:function(_58e,_58f){}});}if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){dojo._hasResource["dijit.form._DateTimeTextBox"]=true;dojo.provide("dijit.form._DateTimeTextBox");dojo.declare("dijit.form._DateTimeTextBox",dijit.form.RangeBoundTextBox,{regExpGen:dojo.date.locale.regexp,compare:dojo.date.compare,format:function(_590,_591){if(!_590){return "";}return dojo.date.locale.format(_590,_591);},parse:function(_592,_593){return dojo.date.locale.parse(_592,_593)||undefined;},serialize:dojo.date.stamp.toISOString,value:new Date(""),popupClass:"",_selector:"",postMixInProperties:function(){this.inherited(arguments);if(!this.value||this.value.toString()==dijit.form._DateTimeTextBox.prototype.value.toString()){this.value=undefined;}var _594=this.constraints;_594.selector=this._selector;_594.fullYear=true;var _595=dojo.date.stamp.fromISOString;if(typeof _594.min=="string"){_594.min=_595(_594.min);}if(typeof _594.max=="string"){_594.max=_595(_594.max);}},_onFocus:function(evt){this._open();},setValue:function(_597,_598,_599){this.inherited(arguments);if(this._picker){if(!_597){_597=new Date();}this._picker.setValue(_597);}},_open:function(){if(this.disabled||this.readOnly||!this.popupClass){return;}var _59a=this;if(!this._picker){var _59b=dojo.getObject(this.popupClass,false);this._picker=new _59b({onValueSelected:function(_59c){_59a.focus();setTimeout(dojo.hitch(_59a,"_close"),1);dijit.form._DateTimeTextBox.superclass.setValue.call(_59a,_59c,true);},lang:_59a.lang,constraints:_59a.constraints,isDisabledDate:function(date){var _59e=dojo.date.compare;var _59f=_59a.constraints;return _59f&&(_59f.min&&(_59e(_59f.min,date,"date")>0)||(_59f.max&&_59e(_59f.max,date,"date")<0));}});this._picker.setValue(this.getValue()||new Date());}if(!this._opened){dijit.popup.open({parent:this,popup:this._picker,around:this.domNode,onCancel:dojo.hitch(this,this._close),onClose:function(){_59a._opened=false;}});this._opened=true;}dojo.marginBox(this._picker.domNode,{w:this.domNode.offsetWidth});},_close:function(){if(this._opened){dijit.popup.close(this._picker);this._opened=false;}},_onBlur:function(){this._close();if(this._picker){this._picker.destroy();delete this._picker;}this.inherited(arguments);},getDisplayedValue:function(){return this.textbox.value;},setDisplayedValue:function(_5a0,_5a1){this.setValue(this.parse(_5a0,this.constraints),_5a1,_5a0);},destroy:function(){if(this._picker){this._picker.destroy();delete this._picker;}this.inherited(arguments);},_onKeyPress:function(e){if(dijit.form._DateTimeTextBox.superclass._onKeyPress.apply(this,arguments)){if(this._opened&&e.keyCode==dojo.keys.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){this._close();dojo.stopEvent(e);}}}});}if(!dojo._hasResource["dijit.form.DateTextBox"]){dojo._hasResource["dijit.form.DateTextBox"]=true;dojo.provide("dijit.form.DateTextBox");dojo.declare("dijit.form.DateTextBox",dijit.form._DateTimeTextBox,{popupClass:"dijit._Calendar",_selector:"date"});}if(!dojo._hasResource["dijit.form.FilteringSelect"]){dojo._hasResource["dijit.form.FilteringSelect"]=true;dojo.provide("dijit.form.FilteringSelect");dojo.declare("dijit.form.FilteringSelect",[dijit.form.MappedTextBox,dijit.form.ComboBoxMixin],{labelAttr:"",labelType:"text",_isvalid:true,_lastDisplayedValue:"",isValid:function(){return this._isvalid;},_callbackSetLabel:function(_5a3,_5a4,_5a5){if(_5a4&&_5a4.query[this.searchAttr]!=this._lastQuery){return;}if(!_5a3.length){if(!this._focused){this.valueNode.value="";}dijit.form.TextBox.superclass.setValue.call(this,undefined,!this._focused);this._isvalid=false;this.validate(this._focused);}else{this._setValueFromItem(_5a3[0],_5a5);}},_openResultList:function(_5a6,_5a7){if(_5a7.query[this.searchAttr]!=this._lastQuery){return;}this._isvalid=_5a6.length!=0;this.validate(true);dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);},getValue:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValue:function(_5a8,_5a9,_5aa){this.valueNode.value=_5a8;dijit.form.FilteringSelect.superclass.setValue.call(this,_5a8,_5aa,_5a9);this._lastDisplayedValue=_5a9;},setValue:function(_5ab,_5ac){var self=this;var _5ae=function(item,_5b0){if(item){if(self.store.isItemLoaded(item)){self._callbackSetLabel([item],undefined,_5b0);}else{self.store.loadItem({item:item,onItem:function(_5b1,_5b2){self._callbackSetLabel(_5b1,_5b2,_5b0);}});}}else{self._isvalid=false;self.validate(false);}};this.store.fetchItemByIdentity({identity:_5ab,onItem:function(item){_5ae(item,_5ac);}});},_setValueFromItem:function(item,_5b5){this._isvalid=true;this._setValue(this.store.getIdentity(item),this.labelFunc(item,this.store),_5b5);},labelFunc:function(item,_5b7){return _5b7.getValue(item,this.searchAttr);},_doSelect:function(tgt){this.item=tgt.item;this._setValueFromItem(tgt.item,true);},setDisplayedValue:function(_5b9,_5ba){if(this.store){var _5bb=dojo.clone(this.query);this._lastQuery=_5bb[this.searchAttr]=_5b9;this.textbox.value=_5b9;this._lastDisplayedValue=_5b9;var _5bc=this;this.store.fetch({query:_5bb,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_5bd,_5be){dojo.hitch(_5bc,"_callbackSetLabel")(_5bd,_5be,_5ba);},onError:function(_5bf){console.error("dijit.form.FilteringSelect: "+_5bf);dojo.hitch(_5bc,"_setValue")(undefined,_5b9,false);}});}},_getMenuLabelFromItem:function(item){if(this.labelAttr){return {html:this.labelType=="html",label:this.store.getValue(item,this.labelAttr)};}else{return dijit.form.ComboBoxMixin.prototype._getMenuLabelFromItem.apply(this,arguments);}},postMixInProperties:function(){dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this,arguments);dijit.form.MappedTextBox.prototype.postMixInProperties.apply(this,arguments);},postCreate:function(){dijit.form.ComboBoxMixin.prototype._postCreate.apply(this,arguments);dijit.form.MappedTextBox.prototype.postCreate.apply(this,arguments);},setAttribute:function(attr,_5c2){dijit.form.MappedTextBox.prototype.setAttribute.apply(this,arguments);dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this,arguments);},undo:function(){this.setDisplayedValue(this._lastDisplayedValue);},_valueChanged:function(){return this.getDisplayedValue()!=this._lastDisplayedValue;}});}if(!dojo._hasResource["dijit.form._Spinner"]){dojo._hasResource["dijit.form._Spinner"]=true;dojo.provide("dijit.form._Spinner");dojo.declare("dijit.form._Spinner",dijit.form.RangeBoundTextBox,{defaultTimeout:500,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div class=\"dijitInputLayoutContainer\"\n\t\t><div class=\"dijitReset dijitSpinnerButtonContainer\"\n\t\t\t>&nbsp;<div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"UpArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div\n\t\t\t></div\n\t\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"downArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"DownArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t\t></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class='dijitReset' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onfocus:_update,onkeyup:_onkeyup,onkeypress:_onKeyPress\"\n\t\t\t\twaiRole=\"spinbutton\" autocomplete=\"off\" name=\"${name}\"\n\t\t/></div\n\t></div\n></div>\n",baseClass:"dijitSpinner",adjust:function(val,_5c4){return val;},_arrowState:function(node,_5c6){this._active=_5c6;this.stateModifier=node.getAttribute("stateModifier")||"";this._setStateClass();},_arrowPressed:function(_5c7,_5c8){if(this.disabled||this.readOnly){return;}this._arrowState(_5c7,true);this.setValue(this.adjust(this.getValue(),_5c8*this.smallDelta),false);dijit.selectInputText(this.textbox,this.textbox.value.length);},_arrowReleased:function(node){this._wheelTimer=null;if(this.disabled||this.readOnly){return;}this._arrowState(node,false);},_typematicCallback:function(_5ca,node,evt){if(node==this.textbox){node=(evt.keyCode==dojo.keys.UP_ARROW)?this.upArrowNode:this.downArrowNode;}if(_5ca==-1){this._arrowReleased(node);}else{this._arrowPressed(node,(node==this.upArrowNode)?1:-1);}},_wheelTimer:null,_mouseWheeled:function(evt){dojo.stopEvent(evt);var _5ce=0;if(typeof evt.wheelDelta=="number"){_5ce=evt.wheelDelta;}else{if(typeof evt.detail=="number"){_5ce=-evt.detail;}}var node,dir;if(_5ce>0){node=this.upArrowNode;dir=+1;}else{if(_5ce<0){node=this.downArrowNode;dir=-1;}else{return;}}this._arrowPressed(node,dir);if(this._wheelTimer!=null){clearTimeout(this._wheelTimer);}var _5d1=this;this._wheelTimer=setTimeout(function(){_5d1._arrowReleased(node);},50);},postCreate:function(){this.inherited("postCreate",arguments);this.connect(this.textbox,dojo.isIE?"onmousewheel":"DOMMouseScroll","_mouseWheeled");this._connects.push(dijit.typematic.addListener(this.upArrowNode,this.textbox,{keyCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));this._connects.push(dijit.typematic.addListener(this.downArrowNode,this.textbox,{keyCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));if(dojo.isIE){var _5d2=this;this.connect(this.domNode,"onresize",function(){setTimeout(dojo.hitch(_5d2,function(){this.upArrowNode.style.behavior="";this.downArrowNode.style.behavior="";this._setStateClass();}),0);});}}});}if(!dojo._hasResource["dijit.form.NumberSpinner"]){dojo._hasResource["dijit.form.NumberSpinner"]=true;dojo.provide("dijit.form.NumberSpinner");dojo.declare("dijit.form.NumberSpinner",[dijit.form._Spinner,dijit.form.NumberTextBoxMixin],{required:true,adjust:function(val,_5d4){var _5d5=val+_5d4;if(isNaN(val)||isNaN(_5d5)){return val;}if((typeof this.constraints.max=="number")&&(_5d5>this.constraints.max)){_5d5=this.constraints.max;}if((typeof this.constraints.min=="number")&&(_5d5<this.constraints.min)){_5d5=this.constraints.min;}return _5d5;}});}if(!dojo._hasResource["dojo.dnd.move"]){dojo._hasResource["dojo.dnd.move"]=true;dojo.provide("dojo.dnd.move");dojo.declare("dojo.dnd.move.constrainedMoveable",dojo.dnd.Moveable,{constraints:function(){},within:false,markupFactory:function(_5d6,node){return new dojo.dnd.move.constrainedMoveable(node,_5d6);},constructor:function(node,_5d9){if(!_5d9){_5d9={};}this.constraints=_5d9.constraints;this.within=_5d9.within;},onFirstMove:function(_5da){var c=this.constraintBox=this.constraints.call(this,_5da);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo.marginBox(_5da.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_5dd,_5de){var c=this.constraintBox,s=_5dd.node.style;s.left=(_5de.l<c.l?c.l:c.r<_5de.l?c.r:_5de.l)+"px";s.top=(_5de.t<c.t?c.t:c.b<_5de.t?c.b:_5de.t)+"px";}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_5e1,node){return new dojo.dnd.move.boxConstrainedMoveable(node,_5e1);},constructor:function(node,_5e4){var box=_5e4&&_5e4.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_5e6,node){return new dojo.dnd.move.parentConstrainedMoveable(node,_5e6);},constructor:function(node,_5e9){var area=_5e9&&_5e9.area;this.constraints=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(area=="margin"){return mb;}var t=dojo._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="border"){return mb;}t=dojo._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="padding"){return mb;}t=dojo._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};}});dojo.dnd.move.constrainedMover=function(fun,_5f0){dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");var _5f1=function(node,e,_5f4){dojo.dnd.Mover.call(this,node,e,_5f4);};dojo.extend(_5f1,dojo.dnd.Mover.prototype);dojo.extend(_5f1,{onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox,c=this.constraintBox,l=m.l+e.pageX,t=m.t+e.pageY;l=l<c.l?c.l:c.r<l?c.r:l;t=t<c.t?c.t:c.b<t?c.b:t;this.host.onMove(this,{l:l,t:t});},onFirstMove:function(){dojo.dnd.Mover.prototype.onFirstMove.call(this);var c=this.constraintBox=fun.call(this);c.r=c.l+c.w;c.b=c.t+c.h;if(_5f0){var mb=dojo.marginBox(this.node);c.r-=mb.w;c.b-=mb.h;}}});return _5f1;};dojo.dnd.move.boxConstrainedMover=function(box,_5fd){dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");return dojo.dnd.move.constrainedMover(function(){return box;},_5fd);};dojo.dnd.move.parentConstrainedMover=function(area,_5ff){dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");var fun=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(area=="margin"){return mb;}var t=dojo._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="border"){return mb;}t=dojo._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="padding"){return mb;}t=dojo._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};return dojo.dnd.move.constrainedMover(fun,_5ff);};dojo.dnd.constrainedMover=dojo.dnd.move.constrainedMover;dojo.dnd.boxConstrainedMover=dojo.dnd.move.boxConstrainedMover;dojo.dnd.parentConstrainedMover=dojo.dnd.move.parentConstrainedMover;}if(!dojo._hasResource["dijit.form.Slider"]){dojo._hasResource["dijit.form.Slider"]=true;dojo.provide("dijit.form.Slider");dojo.declare("dijit.form.HorizontalSlider",[dijit.form._FormValueWidget,dijit._Container],{templateString:"<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"decrementButton\" dojoAttachEvent=\"onclick: decrement\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper dijitSliderLeftBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><div waiRole=\"presentation\" style=\"position:relative;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable dijitSliderMoveableH\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleH\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" dojoAttachEvent=\"onclick:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper dijitSliderRightBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\" style=\"right:0px;\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick: increment\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,bottomDecoration\" class=\"dijitReset\" style=\"text-align:center;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n",value:0,showButtons:true,minimum:0,maximum:100,discreteValues:Infinity,pageIncrement:2,clickSelect:true,slideDuration:1000,widgetsInTemplate:true,attributeMap:dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),{id:"",name:"valueNode"}),baseClass:"dijitSlider",_mousePixelCoord:"pageX",_pixelCount:"w",_startingPixelCoord:"x",_startingPixelCount:"l",_handleOffsetCoord:"left",_progressPixelSize:"width",_onKeyPress:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey){return;}switch(e.keyCode){case dojo.keys.HOME:this.setValue(this.minimum,true);break;case dojo.keys.END:this.setValue(this.maximum,true);break;case ((this._descending||this.isLeftToRight())?dojo.keys.RIGHT_ARROW:dojo.keys.LEFT_ARROW):case (this._descending===false?dojo.keys.DOWN_ARROW:dojo.keys.UP_ARROW):case (this._descending===false?dojo.keys.PAGE_DOWN:dojo.keys.PAGE_UP):this.increment(e);break;case ((this._descending||this.isLeftToRight())?dojo.keys.LEFT_ARROW:dojo.keys.RIGHT_ARROW):case (this._descending===false?dojo.keys.UP_ARROW:dojo.keys.DOWN_ARROW):case (this._descending===false?dojo.keys.PAGE_UP:dojo.keys.PAGE_DOWN):this.decrement(e);break;default:this.inherited(arguments);return;}dojo.stopEvent(e);},_onHandleClick:function(e){if(this.disabled||this.readOnly){return;}if(!dojo.isIE){dijit.focus(this.sliderHandle);}dojo.stopEvent(e);},_isReversed:function(){return !this.isLeftToRight();},_onBarClick:function(e){if(this.disabled||this.readOnly||!this.clickSelect){return;}dijit.focus(this.sliderHandle);dojo.stopEvent(e);var _608=dojo.coords(this.sliderBarContainer,true);var _609=e[this._mousePixelCoord]-_608[this._startingPixelCoord];this._setPixelValue(this._isReversed()?(_608[this._pixelCount]-_609):_609,_608[this._pixelCount],true);},_setPixelValue:function(_60a,_60b,_60c){if(this.disabled||this.readOnly){return;}_60a=_60a<0?0:_60b<_60a?_60b:_60a;var _60d=this.discreteValues;if(_60d<=1||_60d==Infinity){_60d=_60b;}_60d--;var _60e=_60b/_60d;var _60f=Math.round(_60a/_60e);this.setValue((this.maximum-this.minimum)*_60f/_60d+this.minimum,_60c);},setValue:function(_610,_611){this.valueNode.value=this.value=_610;dijit.setWaiState(this.focusNode,"valuenow",_610);this.inherited(arguments);var _612=(_610-this.minimum)/(this.maximum-this.minimum);var _613=(this._descending===false)?this.remainingBar:this.progressBar;var _614=(this._descending===false)?this.progressBar:this.remainingBar;if(_611&&this.slideDuration>0&&_613.style[this._progressPixelSize]){var _615=this;var _616={};var _617=parseFloat(_613.style[this._progressPixelSize]);var _618=this.slideDuration*(_612-_617/100);if(_618==0){return;}if(_618<0){_618=0-_618;}_616[this._progressPixelSize]={start:_617,end:_612*100,units:"%"};dojo.animateProperty({node:_613,duration:_618,onAnimate:function(v){_614.style[_615._progressPixelSize]=(100-parseFloat(v[_615._progressPixelSize]))+"%";},properties:_616}).play();}else{_613.style[this._progressPixelSize]=(_612*100)+"%";_614.style[this._progressPixelSize]=((1-_612)*100)+"%";}},_bumpValue:function(_61a){if(this.disabled||this.readOnly){return;}var s=dojo.getComputedStyle(this.sliderBarContainer);var c=dojo._getContentBox(this.sliderBarContainer,s);var _61d=this.discreteValues;if(_61d<=1||_61d==Infinity){_61d=c[this._pixelCount];}_61d--;var _61e=(this.value-this.minimum)*_61d/(this.maximum-this.minimum)+_61a;if(_61e<0){_61e=0;}if(_61e>_61d){_61e=_61d;}_61e=_61e*(this.maximum-this.minimum)/_61d+this.minimum;this.setValue(_61e,true);},_onClkIncBumper:function(){this.setValue(this._descending===false?this.minimum:this.maximum,true);},_onClkDecBumper:function(){this.setValue(this._descending===false?this.maximum:this.minimum,true);},decrement:function(e){this._bumpValue(e.keyCode==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);},increment:function(e){this._bumpValue(e.keyCode==dojo.keys.PAGE_UP?this.pageIncrement:1);},_mouseWheeled:function(evt){dojo.stopEvent(evt);var _622=0;if(typeof evt.wheelDelta=="number"){_622=evt.wheelDelta;}else{if(typeof evt.detail=="number"){_622=-evt.detail;}}if(_622>0){this.increment(evt);}else{if(_622<0){this.decrement(evt);}}},startup:function(){dojo.forEach(this.getChildren(),function(_623){if(this[_623.container]!=this.containerNode){this[_623.container].appendChild(_623.domNode);}},this);},postCreate:function(){if(this.showButtons){this.incrementButton.style.display="";this.decrementButton.style.display="";}this.connect(this.domNode,dojo.isIE?"onmousewheel":"DOMMouseScroll","_mouseWheeled");var _624=this;var _625=function(){dijit.form._SliderMover.apply(this,arguments);this.widget=_624;};dojo.extend(_625,dijit.form._SliderMover.prototype);this._movable=new dojo.dnd.Moveable(this.sliderHandle,{mover:_625});dijit.setWaiState(this.focusNode,"valuemin",this.minimum);dijit.setWaiState(this.focusNode,"valuemax",this.maximum);this.inherited(arguments);},destroy:function(){this._movable.destroy();this.inherited(arguments);}});dojo.declare("dijit.form.VerticalSlider",dijit.form.HorizontalSlider,{templateString:"<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n><tbody class=\"dijitReset\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick:_topButtonClicked\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper dijitSliderTopBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td dojoAttachPoint=\"leftDecoration\" class=\"dijitReset\" style=\"text-align:center;height:100%;\"></td\n\t\t><td class=\"dijitReset\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><center waiRole=\"presentation\" style=\"position:relative;height:100%;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onclick:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" style=\"vertical-align:top;\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleV\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td dojoAttachPoint=\"containerNode,rightDecoration\" class=\"dijitReset\" style=\"text-align:center;height:100%;\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper dijitSliderBottomBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"decrementButton\" dojoAttachEvent=\"onclick:_bottomButtonClicked\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></tbody></table>\n",_mousePixelCoord:"pageY",_pixelCount:"h",_startingPixelCoord:"y",_startingPixelCount:"t",_handleOffsetCoord:"top",_progressPixelSize:"height",_descending:true,startup:function(){if(this._started){return;}if(!this.isLeftToRight()&&dojo.isMoz){if(this.leftDecoration){this._rtlRectify(this.leftDecoration);}if(this.rightDecoration){this._rtlRectify(this.rightDecoration);}}this.inherited(arguments);},_isReversed:function(){return this._descending;},_topButtonClicked:function(e){if(this._descending){this.increment(e);}else{this.decrement(e);}},_bottomButtonClicked:function(e){if(this._descending){this.decrement(e);}else{this.increment(e);}},_rtlRectify:function(_628){var _629=[];while(_628.firstChild){_629.push(_628.firstChild);_628.removeChild(_628.firstChild);}for(var i=_629.length-1;i>=0;i--){if(_629[i]){_628.appendChild(_629[i]);}}}});dojo.declare("dijit.form._SliderMover",dojo.dnd.Mover,{onMouseMove:function(e){var _62c=this.widget;var _62d=_62c._abspos;if(!_62d){_62d=_62c._abspos=dojo.coords(_62c.sliderBarContainer,true);_62c._setPixelValue_=dojo.hitch(_62c,"_setPixelValue");_62c._isReversed_=_62c._isReversed();}var _62e=e[_62c._mousePixelCoord]-_62d[_62c._startingPixelCoord];_62c._setPixelValue_(_62c._isReversed_?(_62d[_62c._pixelCount]-_62e):_62e,_62d[_62c._pixelCount],false);},destroy:function(e){dojo.dnd.Mover.prototype.destroy.apply(this,arguments);var _630=this.widget;_630.setValue(_630.value,true);}});dojo.declare("dijit.form.HorizontalRule",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH\"></div>",count:3,container:"containerNode",ruleStyle:"",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkH\" style=\"left:",_positionSuffix:"%;",_suffix:"\"></div>",_genHTML:function(pos,ndx){return this._positionPrefix+pos+this._positionSuffix+this.ruleStyle+this._suffix;},_isHorizontal:true,postCreate:function(){var _633;if(this.count==1){_633=this._genHTML(50,0);}else{var i;var _635=100/(this.count-1);if(!this._isHorizontal||this.isLeftToRight()){_633=this._genHTML(0,0);for(i=1;i<this.count-1;i++){_633+=this._genHTML(_635*i,i);}_633+=this._genHTML(100,this.count-1);}else{_633=this._genHTML(100,0);for(i=1;i<this.count-1;i++){_633+=this._genHTML(100-_635*i,i);}_633+=this._genHTML(0,this.count-1);}}this.domNode.innerHTML=_633;}});dojo.declare("dijit.form.VerticalRule",dijit.form.HorizontalRule,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkV\" style=\"top:",_isHorizontal:false});dojo.declare("dijit.form.HorizontalRuleLabels",dijit.form.HorizontalRule,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH\"></div>",labelStyle:"",labels:[],numericMargin:0,minimum:0,maximum:1,constraints:{pattern:"#%"},_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerH\" style=\"left:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelH\">",_suffix:"</span></div>",_calcPosition:function(pos){return pos;},_genHTML:function(pos,ndx){return this._positionPrefix+this._calcPosition(pos)+this._positionSuffix+this.labelStyle+this._labelPrefix+this.labels[ndx]+this._suffix;},getLabels:function(){var _639=this.labels;if(!_639.length){_639=dojo.query("> li",this.srcNodeRef).map(function(node){return String(node.innerHTML);});}this.srcNodeRef.innerHTML="";if(!_639.length&&this.count>1){var _63b=this.minimum;var inc=(this.maximum-_63b)/(this.count-1);for(var i=0;i<this.count;i++){_639.push((i<this.numericMargin||i>=(this.count-this.numericMargin))?"":dojo.number.format(_63b,this.constraints));_63b+=inc;}}return _639;},postMixInProperties:function(){this.inherited(arguments);this.labels=this.getLabels();this.count=this.labels.length;}});dojo.declare("dijit.form.VerticalRuleLabels",dijit.form.HorizontalRuleLabels,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerV\" style=\"top:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelV\">",_calcPosition:function(pos){return 100-pos;},_isHorizontal:false});}if(!dojo._hasResource["dijit.form.Textarea"]){dojo._hasResource["dijit.form.Textarea"]=true;dojo.provide("dijit.form.Textarea");dojo.declare("dijit.form.Textarea",dijit.form._FormValueWidget,{attributeMap:dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),{style:"styleNode","class":"styleNode"}),templateString:(dojo.isIE||dojo.isSafari||dojo.isFF)?((dojo.isIE||dojo.isSafari||dojo.isFF>=3)?"<fieldset id=\"${id}\" class=\"dijitInline dijitInputField dijitTextArea\" dojoAttachPoint=\"styleNode\" waiRole=\"presentation\"><div dojoAttachPoint=\"editNode,focusNode,eventNode\" dojoAttachEvent=\"onpaste:_changing,oncut:_changing\" waiRole=\"textarea\" style=\"text-decoration:none;display:block;overflow:auto;\" contentEditable=\"true\"></div>":"<span id=\"${id}\" class=\"dijitReset\">"+"<iframe src=\"javascript:<html><head><title>${_iframeEditTitle}</title></head><body><script>var _postCreate=window.frameElement?window.frameElement.postCreate:null;if(_postCreate)_postCreate();</script></body></html>\""+" dojoAttachPoint=\"iframe,styleNode\" dojoAttachEvent=\"onblur:_onIframeBlur\" class=\"dijitInline dijitInputField dijitTextArea\"></iframe>")+"<textarea name=\"${name}\" value=\"${value}\" dojoAttachPoint=\"formValueNode\" style=\"display:none;\"></textarea>"+((dojo.isIE||dojo.isSafari||dojo.isFF>=3)?"</fieldset>":"</span>"):"<textarea id=\"${id}\" name=\"${name}\" value=\"${value}\" dojoAttachPoint=\"formValueNode,editNode,focusNode,styleNode\" class=\"dijitInputField dijitTextArea\">"+dojo.isFF+"</textarea>",setAttribute:function(attr,_640){this.inherited(arguments);switch(attr){case "disabled":this.formValueNode.disabled=this.disabled;case "readOnly":if(dojo.isIE||dojo.isSafari||dojo.isFF>=3){this.editNode.contentEditable=(!this.disabled&&!this.readOnly);}else{if(dojo.isFF){this.iframe.contentDocument.designMode=(this.disabled||this.readOnly)?"off":"on";}}}},focus:function(){if(!this.disabled&&!this.readOnly){this._changing();}dijit.focus(this.iframe||this.focusNode);},setValue:function(_641,_642){var _643=this.editNode;if(typeof _641=="string"){_643.innerHTML="";if(_641.split){var _644=this;var _645=true;dojo.forEach(_641.split("\n"),function(line){if(_645){_645=false;}else{_643.appendChild(dojo.doc.createElement("BR"));}if(line){_643.appendChild(dojo.doc.createTextNode(line));}});}else{if(_641){_643.appendChild(dojo.doc.createTextNode(_641));}}if(!dojo.isIE){_643.appendChild(dojo.doc.createElement("BR"));}}else{_641=_643.innerHTML;if(this.iframe){_641=_641.replace(/<div><\/div>\r?\n?$/i,"");}_641=_641.replace(/\s*\r?\n|^\s+|\s+$|&nbsp;/g,"").replace(/>\s+</g,"><").replace(/<\/(p|div)>$|^<(p|div)[^>]*>/gi,"").replace(/([^>])<div>/g,"$1\n").replace(/<\/p>\s*<p[^>]*>|<br[^>]*>|<\/div>\s*<div[^>]*>/gi,"\n").replace(/<[^>]*>/g,"").replace(/&amp;/gi,"&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">");if(!dojo.isIE){_641=_641.replace(/\n$/,"");}}this.value=this.formValueNode.value=_641;if(this.iframe){var _647=dojo.doc.createElement("div");_643.appendChild(_647);var _648=_647.offsetTop;if(_643.scrollWidth>_643.clientWidth){_648+=16;}if(this.lastHeight!=_648){if(_648==0){_648=16;}dojo.contentBox(this.iframe,{h:_648});this.lastHeight=_648;}_643.removeChild(_647);}dijit.form.Textarea.superclass.setValue.call(this,this.getValue(),_642);},getValue:function(){return this.value.replace(/\r/g,"");},postMixInProperties:function(){this.inherited(arguments);if(this.srcNodeRef&&this.srcNodeRef.innerHTML!=""){this.value=this.srcNodeRef.innerHTML;this.srcNodeRef.innerHTML="";}if((!this.value||this.value=="")&&this.srcNodeRef&&this.srcNodeRef.value){this.value=this.srcNodeRef.value;}if(!this.value){this.value="";}this.value=this.value.replace(/\r\n/g,"\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&");if(dojo.isFF==2){var _649=dojo.i18n.getLocalization("dijit.form","Textarea");this._iframeEditTitle=_649.iframeEditTitle;this._iframeFocusTitle=_649.iframeFocusTitle;var _64a=dojo.query("label[for=\""+this.id+"\"]");if(_64a.length){this._iframeEditTitle=_64a[0].innerHTML+" "+this._iframeEditTitle;}var body=this.focusNode=this.editNode=dojo.doc.createElement("BODY");body.style.margin="0px";body.style.padding="0px";body.style.border="0px";}},postCreate:function(){if(dojo.isIE||dojo.isSafari||dojo.isFF>=3){this.domNode.style.overflowY="hidden";}else{if(dojo.isFF){var w=this.iframe.contentWindow;var _64d="";try{_64d=this.iframe.contentDocument.title;}catch(e){}if(!w||!_64d){this.iframe.postCreate=dojo.hitch(this,this.postCreate);return;}var d=w.document;d.getElementsByTagName("HTML")[0].replaceChild(this.editNode,d.getElementsByTagName("BODY")[0]);if(!this.isLeftToRight()){d.getElementsByTagName("HTML")[0].dir="rtl";}this.iframe.style.overflowY="hidden";this.eventNode=d;w.addEventListener("resize",dojo.hitch(this,this._changed),false);}else{this.focusNode=this.domNode;}}if(this.eventNode){this.connect(this.eventNode,"keypress",this._onKeyPress);this.connect(this.eventNode,"mousemove",this._changed);this.connect(this.eventNode,"focus",this._focused);this.connect(this.eventNode,"blur",this._blurred);}if(this.editNode){this.connect(this.editNode,"change",this._changed);}this.inherited("postCreate",arguments);},_focused:function(e){dojo.addClass(this.iframe||this.domNode,"dijitInputFieldFocused");this._changed(e);},_blurred:function(e){dojo.removeClass(this.iframe||this.domNode,"dijitInputFieldFocused");this._changed(e,true);},_onIframeBlur:function(){this.iframe.contentDocument.title=this._iframeEditTitle;},_onKeyPress:function(e){if(e.keyCode==dojo.keys.TAB&&!e.shiftKey&&!e.ctrlKey&&!e.altKey&&this.iframe){this.iframe.contentDocument.title=this._iframeFocusTitle;this.iframe.focus();dojo.stopEvent(e);}else{if(e.keyCode==dojo.keys.ENTER){e.stopPropagation();}else{if(this.inherited("_onKeyPress",arguments)&&this.iframe){var te=dojo.doc.createEvent("KeyEvents");te.initKeyEvent("keypress",true,true,null,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.keyCode,e.charCode);this.iframe.dispatchEvent(te);}}}this._changing();},_changing:function(e){setTimeout(dojo.hitch(this,"_changed",e,false),1);},_changed:function(e,_655){if(this.iframe&&this.iframe.contentDocument.designMode!="on"&&!this.disabled&&!this.readOnly){this.iframe.contentDocument.designMode="on";}this.setValue(null,_655||false);}});}if(!dojo._hasResource["dijit.layout.StackContainer"]){dojo._hasResource["dijit.layout.StackContainer"]=true;dojo.provide("dijit.layout.StackContainer");dojo.declare("dijit.layout.StackContainer",dijit.layout._LayoutWidget,{doLayout:true,_started:false,postCreate:function(){dijit.setWaiRole((this.containerNode||this.domNode),"tabpanel");this.connect(this.domNode,"onkeypress",this._onKeyPress);},startup:function(){if(this._started){return;}var _656=this.getChildren();dojo.forEach(_656,this._setupChild,this);dojo.some(_656,function(_657){if(_657.selected){this.selectedChildWidget=_657;}return _657.selected;},this);var _658=this.selectedChildWidget;if(!_658&&_656[0]){_658=this.selectedChildWidget=_656[0];_658.selected=true;}if(_658){this._showChild(_658);}dojo.publish(this.id+"-startup",[{children:_656,selected:_658}]);this.inherited(arguments);},_setupChild:function(page){page.domNode.style.display="none";page.domNode.style.position="relative";return page;},addChild:function(_65a,_65b){dijit._Container.prototype.addChild.apply(this,arguments);_65a=this._setupChild(_65a);if(this._started){this.layout();dojo.publish(this.id+"-addChild",[_65a,_65b]);if(!this.selectedChildWidget){this.selectChild(_65a);}}},removeChild:function(page){dijit._Container.prototype.removeChild.apply(this,arguments);if(this._beingDestroyed){return;}if(this._started){dojo.publish(this.id+"-removeChild",[page]);this.layout();}if(this.selectedChildWidget===page){this.selectedChildWidget=undefined;if(this._started){var _65d=this.getChildren();if(_65d.length){this.selectChild(_65d[0]);}}}},selectChild:function(page){page=dijit.byId(page);if(this.selectedChildWidget!=page){this._transition(page,this.selectedChildWidget);this.selectedChildWidget=page;dojo.publish(this.id+"-selectChild",[page]);}},_transition:function(_65f,_660){if(_660){this._hideChild(_660);}this._showChild(_65f);if(this.doLayout&&_65f.resize){_65f.resize(this._containerContentBox||this._contentBox);}},_adjacent:function(_661){var _662=this.getChildren();var _663=dojo.indexOf(_662,this.selectedChildWidget);_663+=_661?1:_662.length-1;return _662[_663%_662.length];},forward:function(){this.selectChild(this._adjacent(true));},back:function(){this.selectChild(this._adjacent(false));},_onKeyPress:function(e){dojo.publish(this.id+"-containerKeyPress",[{e:e,page:this}]);},layout:function(){if(this.doLayout&&this.selectedChildWidget&&this.selectedChildWidget.resize){this.selectedChildWidget.resize(this._contentBox);}},_showChild:function(page){var _666=this.getChildren();page.isFirstChild=(page==_666[0]);page.isLastChild=(page==_666[_666.length-1]);page.selected=true;page.domNode.style.display="";if(page._loadCheck){page._loadCheck();}if(page.onShow){page.onShow();}},_hideChild:function(page){page.selected=false;page.domNode.style.display="none";if(page.onHide){page.onHide();}},closeChild:function(page){var _669=page.onClose(this,page);if(_669){this.removeChild(page);page.destroyRecursive();}},destroy:function(){this._beingDestroyed=true;this.inherited(arguments);}});dojo.declare("dijit.layout.StackController",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:"<span wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",containerId:"",buttonWidget:"dijit.layout._StackButton",postCreate:function(){dijit.setWaiRole(this.domNode,"tablist");this.pane2button={};this.pane2menu={};this._subscriptions=[dojo.subscribe(this.containerId+"-startup",this,"onStartup"),dojo.subscribe(this.containerId+"-addChild",this,"onAddChild"),dojo.subscribe(this.containerId+"-removeChild",this,"onRemoveChild"),dojo.subscribe(this.containerId+"-selectChild",this,"onSelectChild"),dojo.subscribe(this.containerId+"-containerKeyPress",this,"onContainerKeyPress")];},onStartup:function(info){dojo.forEach(info.children,this.onAddChild,this);this.onSelectChild(info.selected);},destroy:function(){for(var pane in this.pane2button){this.onRemoveChild(pane);}dojo.forEach(this._subscriptions,dojo.unsubscribe);this.inherited(arguments);},onAddChild:function(page,_66d){var _66e=dojo.doc.createElement("span");this.domNode.appendChild(_66e);var cls=dojo.getObject(this.buttonWidget);var _670=new cls({label:page.title,closeButton:page.closable},_66e);this.addChild(_670,_66d);this.pane2button[page]=_670;page.controlButton=_670;dojo.connect(_670,"onClick",dojo.hitch(this,"onButtonClick",page));if(page.closable){dojo.connect(_670,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",page));var _671=dojo.i18n.getLocalization("dijit","common");var _672=new dijit.Menu({targetNodeIds:[_670.id],id:_670.id+"_Menu"});var _673=new dijit.MenuItem({label:_671.itemClose});dojo.connect(_673,"onClick",dojo.hitch(this,"onCloseButtonClick",page));_672.addChild(_673);this.pane2menu[page]=_672;}if(!this._currentChild){_670.focusNode.setAttribute("tabIndex","0");this._currentChild=page;}if(!this.isLeftToRight()&&dojo.isIE&&this._rectifyRtlTabList){this._rectifyRtlTabList();}},onRemoveChild:function(page){if(this._currentChild===page){this._currentChild=null;}var _675=this.pane2button[page];var menu=this.pane2menu[page];if(menu){menu.destroy();}if(_675){_675.destroy();}this.pane2button[page]=null;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _678=this.pane2button[this._currentChild];_678.setAttribute("checked",false);_678.focusNode.setAttribute("tabIndex","-1");}var _679=this.pane2button[page];_679.setAttribute("checked",true);this._currentChild=page;_679.focusNode.setAttribute("tabIndex","0");var _67a=dijit.byId(this.containerId);dijit.setWaiState(_67a.containerNode||_67a.domNode,"labelledby",_679.id);},onButtonClick:function(page){var _67c=dijit.byId(this.containerId);_67c.selectChild(page);},onCloseButtonClick:function(page){var _67e=dijit.byId(this.containerId);_67e.closeChild(page);var b=this.pane2button[this._currentChild];if(b){dijit.focus(b.focusNode||b.domNode);}},adjacent:function(_680){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_680=!_680;}var _681=this.getChildren();var _682=dojo.indexOf(_681,this.pane2button[this._currentChild]);var _683=_680?1:_681.length-1;return _681[(_682+_683)%_681.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _685=null;if(e.ctrlKey||!e._djpage){var k=dojo.keys;switch(e.keyCode){case k.LEFT_ARROW:case k.UP_ARROW:if(!e._djpage){_685=false;}break;case k.PAGE_UP:if(e.ctrlKey){_685=false;}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(!e._djpage){_685=true;}break;case k.PAGE_DOWN:if(e.ctrlKey){_685=true;}break;case k.DELETE:if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}dojo.stopEvent(e);break;default:if(e.ctrlKey){if(e.keyCode==k.TAB){this.adjacent(!e.shiftKey).onClick();dojo.stopEvent(e);}else{if(e.keyChar=="w"){if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}dojo.stopEvent(e);}}}}if(_685!==null){this.adjacent(_685).onClick();dojo.stopEvent(e);}}},onContainerKeyPress:function(info){info.e._djpage=info.page;this.onkeypress(info.e);}});dojo.declare("dijit.layout._StackButton",dijit.form.ToggleButton,{tabIndex:"-1",postCreate:function(evt){dijit.setWaiRole((this.focusNode||this.domNode),"tab");this.inherited(arguments);},onClick:function(evt){dijit.focus(this.focusNode);},onClickCloseButton:function(evt){evt.stopPropagation();}});dojo.extend(dijit._Widget,{title:"",selected:false,closable:false,onClose:function(){return true;}});}if(!dojo._hasResource["dijit.layout.AccordionContainer"]){dojo._hasResource["dijit.layout.AccordionContainer"]=true;dojo.provide("dijit.layout.AccordionContainer");dojo.declare("dijit.layout.AccordionContainer",dijit.layout.StackContainer,{duration:250,_verticalSpace:0,postCreate:function(){this.domNode.style.overflow="hidden";this.inherited("postCreate",arguments);dijit.setWaiRole(this.domNode,"tablist");dojo.addClass(this.domNode,"dijitAccordionContainer");},startup:function(){if(this._started){return;}this.inherited("startup",arguments);if(this.selectedChildWidget){var _68b=this.selectedChildWidget.containerNode.style;_68b.display="";_68b.overflow="auto";this.selectedChildWidget._setSelectedState(true);}},layout:function(){var _68c=0;var _68d=this.selectedChildWidget;dojo.forEach(this.getChildren(),function(_68e){_68c+=_68e.getTitleHeight();});var _68f=this._contentBox;this._verticalSpace=(_68f.h-_68c);if(_68d){_68d.containerNode.style.height=this._verticalSpace+"px";}},_setupChild:function(page){return page;},_transition:function(_691,_692){if(this._inTransition){return;}this._inTransition=true;var _693=[];var _694=this._verticalSpace;if(_691){_691.setSelected(true);var _695=_691.containerNode;_695.style.display="";_693.push(dojo.animateProperty({node:_695,duration:this.duration,properties:{height:{start:"1",end:_694}},onEnd:function(){_695.style.overflow="auto";}}));}if(_692){_692.setSelected(false);var _696=_692.containerNode;_696.style.overflow="hidden";_693.push(dojo.animateProperty({node:_696,duration:this.duration,properties:{height:{start:_694,end:"1"}},onEnd:function(){_696.style.display="none";}}));}this._inTransition=false;dojo.fx.combine(_693).play();},_onKeyPress:function(e){if(this.disabled||e.altKey||!(e._dijitWidget||e.ctrlKey)){return;}var k=dojo.keys;var _699=e._dijitWidget;switch(e.keyCode){case k.LEFT_ARROW:case k.UP_ARROW:if(_699){this._adjacent(false)._onTitleClick();dojo.stopEvent(e);}break;case k.PAGE_UP:if(e.ctrlKey){this._adjacent(false)._onTitleClick();dojo.stopEvent(e);}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(_699){this._adjacent(true)._onTitleClick();dojo.stopEvent(e);}break;case k.PAGE_DOWN:if(e.ctrlKey){this._adjacent(true)._onTitleClick();dojo.stopEvent(e);}break;default:if(e.ctrlKey&&e.keyCode==k.TAB){this._adjacent(e._dijitWidget,!e.shiftKey)._onTitleClick();dojo.stopEvent(e);}}}});dojo.declare("dijit.layout.AccordionPane",[dijit.layout.ContentPane,dijit._Templated,dijit._Contained],{templateString:"<div class='dijitAccordionPane'\n\t><div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\"\n\t\t><div class='dijitAccordionArrow' waiRole=\"presentation\"></div\n\t\t><div class='arrowTextUp' waiRole=\"presentation\">&#9650;</div\n\t\t><div class='arrowTextDown' waiRole=\"presentation\">&#9660;</div\n\t\t><div waiRole=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'>${title}</div></div\n\t><div><div dojoAttachPoint='containerNode' style='overflow: hidden; height: 1px; display: none'\n\t\tclass='dijitAccordionBody' wairole=\"tabpanel\"\n\t></div></div>\n</div>\n",postCreate:function(){this.inherited("postCreate",arguments);dojo.setSelectable(this.titleNode,false);this.setSelected(this.selected);},getTitleHeight:function(){return dojo.marginBox(this.titleNode).h;},_onTitleClick:function(){var _69a=this.getParent();if(!_69a._inTransition){_69a.selectChild(this);dijit.focus(this.focusNode);}},_onTitleKeyPress:function(evt){evt._dijitWidget=this;return this.getParent()._onKeyPress(evt);},_setSelectedState:function(_69c){this.selected=_69c;dojo[(_69c?"addClass":"removeClass")](this.titleNode,"dijitAccordionTitle-selected");this.focusNode.setAttribute("tabIndex",_69c?"0":"-1");},_handleFocus:function(e){dojo[(e.type=="focus"?"addClass":"removeClass")](this.focusNode,"dijitAccordionFocused");},setSelected:function(_69e){this._setSelectedState(_69e);if(_69e){this.onSelected();this._loadCheck(true);}},onSelected:function(){}});}if(!dojo._hasResource["dijit.layout.BorderContainer"]){dojo._hasResource["dijit.layout.BorderContainer"]=true;dojo.provide("dijit.layout.BorderContainer");dojo.declare("dijit.layout.BorderContainer",dijit.layout._LayoutWidget,{design:"headline",liveSplitters:true,persist:false,_splitterClass:"dijit.layout._Splitter",postCreate:function(){this.inherited(arguments);this._splitters={};this._splitterThickness={};dojo.addClass(this.domNode,"dijitBorderContainer");},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_69f){var _6a0=_69f.region;if(_6a0){_69f.domNode.style.position="absolute";var ltr=this.isLeftToRight();if(_6a0=="leading"){_6a0=ltr?"left":"right";}if(_6a0=="trailing"){_6a0=ltr?"right":"left";}this["_"+_6a0]=_69f.domNode;this["_"+_6a0+"Widget"]=_69f;if(_69f.splitter){var _6a2=dojo.getObject(this._splitterClass);var flip={left:"right",right:"left",top:"bottom",bottom:"top",leading:"trailing",trailing:"leading"};var _6a4=dojo.query("[region="+flip[_69f.region]+"]",this.domNode);var _6a5=new _6a2({container:this,child:_69f,region:_6a0,oppNode:_6a4[0],live:this.liveSplitters});this._splitters[_6a0]=_6a5.domNode;dojo.place(_6a5.domNode,_69f.domNode,"after");this._computeSplitterThickness(_6a0);}_69f.region=_6a0;}},_computeSplitterThickness:function(_6a6){var re=new RegExp("top|bottom");this._splitterThickness[_6a6]=dojo.marginBox(this._splitters[_6a6])[(re.test(_6a6)?"h":"w")];},layout:function(){this._layoutChildren();},addChild:function(_6a8,_6a9){this.inherited(arguments);this._setupChild(_6a8);if(this._started){this._layoutChildren();}},removeChild:function(_6aa){var _6ab=_6aa.region;var _6ac=this._splitters[_6ab];if(_6ac){dijit.byNode(_6ac).destroy();delete this._splitters[_6ab];delete this._splitterThickness[_6ab];}this.inherited(arguments);delete this["_"+_6ab];delete this["_"+_6ab+"Widget"];if(this._started){this._layoutChildren(_6aa.region);}},_layoutChildren:function(_6ad){var _6ae=(this.design=="sidebar");var _6af=0,_6b0=0,_6b1=0,_6b2=0;var _6b3={},_6b4={},_6b5={},_6b6={},_6b7=(this._center&&this._center.style)||{};var _6b8=/left|right/.test(_6ad);var _6b9=!_6ad||(!_6b8&&!_6ae);var _6ba=!_6ad||(_6b8&&_6ae);if(this._top){_6b3=_6ba&&this._top.style;_6af=dojo.marginBox(this._top).h;}if(this._left){_6b4=_6b9&&this._left.style;_6b1=dojo.marginBox(this._left).w;}if(this._right){_6b5=_6b9&&this._right.style;_6b2=dojo.marginBox(this._right).w;}if(this._bottom){_6b6=_6ba&&this._bottom.style;_6b0=dojo.marginBox(this._bottom).h;}var _6bb=this._splitters;var _6bc=_6bb.top;var _6bd=_6bb.bottom;var _6be=_6bb.left;var _6bf=_6bb.right;var _6c0=this._splitterThickness;var _6c1=_6c0.top||0;var _6c2=_6c0.left||0;var _6c3=_6c0.right||0;var _6c4=_6c0.bottom||0;if(_6c2>50||_6c3>50){setTimeout(dojo.hitch(this,function(){for(var _6c5 in this._splitters){this._computeSplitterThickness(_6c5);}this._layoutChildren();}),50);return false;}var _6c6={left:(_6ae?_6b1+_6c2:"0")+"px",right:(_6ae?_6b2+_6c3:"0")+"px"};if(_6bc){dojo.mixin(_6bc.style,_6c6);_6bc.style.top=_6af+"px";}if(_6bd){dojo.mixin(_6bd.style,_6c6);_6bd.style.bottom=_6b0+"px";}_6c6={top:(_6ae?"0":_6af+_6c1)+"px",bottom:(_6ae?"0":_6b0+_6c4)+"px"};if(_6be){dojo.mixin(_6be.style,_6c6);_6be.style.left=_6b1+"px";}if(_6bf){dojo.mixin(_6bf.style,_6c6);_6bf.style.right=_6b2+"px";}dojo.mixin(_6b7,{top:_6af+_6c1+"px",left:_6b1+_6c2+"px",right:_6b2+_6c3+"px",bottom:_6b0+_6c4+"px"});var _6c7={top:_6ae?"0":_6b7.top,bottom:_6ae?"0":_6b7.bottom};dojo.mixin(_6b4,_6c7);dojo.mixin(_6b5,_6c7);_6b4.left=_6b5.right=_6b3.top=_6b6.bottom="0";if(_6ae){_6b3.left=_6b6.left=_6b1+(this.isLeftToRight()?_6c2:0)+"px";_6b3.right=_6b6.right=_6b2+(this.isLeftToRight()?0:_6c3)+"px";}else{_6b3.left=_6b3.right=_6b6.left=_6b6.right="0";}var _6c8=dojo.isIE||dojo.some(this.getChildren(),function(_6c9){return _6c9.domNode.tagName=="TEXTAREA";});if(_6c8){var _6ca=function(n,b){n=dojo.byId(n);var s=dojo.getComputedStyle(n);if(!b){return dojo._getBorderBox(n,s);}var me=dojo._getMarginExtents(n,s);dojo._setMarginBox(n,b.l,b.t,b.w+me.w,b.h+me.h,s);return null;};var _6cf=function(_6d0,dim){if(_6d0){_6d0.resize?_6d0.resize(dim):dojo.marginBox(_6d0.domNode,dim);}};var _6d2=_6ca(this.domNode);var _6d3=_6d2.h;var _6d4=_6d3;if(this._top){_6d4-=_6af;}if(this._bottom){_6d4-=_6b0;}if(_6bc){_6d4-=_6c1;}if(_6bd){_6d4-=_6c4;}var _6d5={h:_6d4};var _6d6=_6ae?_6d3:_6d4;if(_6be){_6be.style.height=_6d6;}if(_6bf){_6bf.style.height=_6d6;}_6cf(this._leftWidget,{h:_6d6});_6cf(this._rightWidget,{h:_6d6});var _6d7=_6d2.w;var _6d8=_6d7;if(this._left){_6d8-=_6b1;}if(this._right){_6d8-=_6b2;}if(_6be){_6d8-=_6c2;}if(_6bf){_6d8-=_6c3;}_6d5.w=_6d8;var _6d9=_6ae?_6d8:_6d7;if(_6bc){_6bc.style.width=_6d9;}if(_6bd){_6bd.style.width=_6d9;}_6cf(this._topWidget,{w:_6d9});_6cf(this._bottomWidget,{w:_6d9});_6cf(this._centerWidget,_6d5);}else{var _6da={};if(_6ad){_6da[_6ad]=_6da.center=true;if(/top|bottom/.test(_6ad)&&this.design!="sidebar"){_6da.left=_6da.right=true;}else{if(/left|right/.test(_6ad)&&this.design=="sidebar"){_6da.top=_6da.bottom=true;}}}dojo.forEach(this.getChildren(),function(_6db){if(_6db.resize&&(!_6ad||_6db.region in _6da)){_6db.resize();}},this);}}});dojo.extend(dijit._Widget,{region:"",splitter:false,minSize:0,maxSize:Infinity});dojo.declare("dijit.layout._Splitter",[dijit._Widget,dijit._Templated],{live:true,templateString:"<div class=\"dijitSplitter\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_startDrag\" tabIndex=\"0\" waiRole=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",postCreate:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));this._factor=/top|left/.test(this.region)?1:-1;this._minSize=this.child.minSize;this._computeMaxSize();this.connect(this.container,"layout",dojo.hitch(this,this._computeMaxSize));this._cookieName=this.container.id+"_"+this.region;if(this.container.persist){var _6dc=dojo.cookie(this._cookieName);if(_6dc){this.child.domNode.style[this.horizontal?"height":"width"]=_6dc;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w";var _6de=dojo.contentBox(this.container.domNode)[dim]-(this.oppNode?dojo.marginBox(this.oppNode)[dim]:0);this._maxSize=Math.min(this.child.maxSize,_6de);},_startDrag:function(e){if(!this.cover){this.cover=dojo.doc.createElement("div");dojo.addClass(this.cover,"dijitSplitterCover");dojo.place(this.cover,this.child.domNode,"after");}else{this.cover.style.zIndex=1;}if(this.fake){dojo._destroyElement(this.fake);}if(!(this._resize=this.live)){(this.fake=this.domNode.cloneNode(true)).removeAttribute("id");dojo.addClass(this.domNode,"dijitSplitterShadow");dojo.place(this.fake,this.domNode,"after");}dojo.addClass(this.domNode,"dijitSplitterActive");var _6e0=this._factor,max=this._maxSize,min=this._minSize||10;var axis=this.horizontal?"pageY":"pageX";var _6e4=e[axis];var _6e5=this.domNode.style;var dim=this.horizontal?"h":"w";var _6e7=dojo.marginBox(this.child.domNode)[dim];var _6e8=parseInt(this.domNode.style[this.region]);var _6e9=this._resize;var _6ea=this.region;var mb={};var _6ec=this.child.domNode;var _6ed=dojo.hitch(this.container,this.container._layoutChildren);var de=dojo.doc.body;this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_6f0){var _6f1=e[axis]-_6e4,_6f2=_6e0*_6f1+_6e7,_6f3=Math.max(Math.min(_6f2,max),min);if(_6e9||_6f0){mb[dim]=_6f3;dojo.marginBox(_6ec,mb);_6ed(_6ea);}_6e5[_6ea]=_6e0*_6f1+_6e8+(_6f3-_6f2)+"px";}),dojo.connect(de,"onmouseup",this,"_stopDrag")]);dojo.stopEvent(e);},_stopDrag:function(e){try{if(this.cover){this.cover.style.zIndex=-1;}if(this.fake){dojo._destroyElement(this.fake);}dojo.removeClass(this.domNode,"dijitSplitterActive");dojo.removeClass(this.domNode,"dijitSplitterShadow");this._drag(e);this._drag(e,true);}finally{this._cleanupHandlers();delete this._drag;}if(this.container.persist){dojo.cookie(this._cookieName,this.child.domNode.style[this.horizontal?"height":"width"]);}},_cleanupHandlers:function(){dojo.forEach(this._handlers,dojo.disconnect);delete this._handlers;},_onKeyPress:function(e){this._resize=true;var _6f6=this.horizontal;var tick=1;var dk=dojo.keys;switch(e.keyCode){case _6f6?dk.UP_ARROW:dk.LEFT_ARROW:tick*=-1;break;case _6f6?dk.DOWN_ARROW:dk.RIGHT_ARROW:break;default:return;}var _6f9=dojo.marginBox(this.child.domNode)[_6f6?"h":"w"]+this._factor*tick;var mb={};mb[this.horizontal?"h":"w"]=Math.max(Math.min(_6f9,this._maxSize),this._minSize);dojo.marginBox(this.child.domNode,mb);this.container._layoutChildren(this.region);dojo.stopEvent(e);},destroy:function(){this._cleanupHandlers();delete this.child;delete this.container;delete this.fake;this.inherited(arguments);}});}if(!dojo._hasResource["dijit.layout.LayoutContainer"]){dojo._hasResource["dijit.layout.LayoutContainer"]=true;dojo.provide("dijit.layout.LayoutContainer");dojo.declare("dijit.layout.LayoutContainer",dijit.layout._LayoutWidget,{constructor:function(){dojo.deprecated("dijit.layout.LayoutContainer is deprecated","use BorderContainer instead",2);},layout:function(){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());},addChild:function(_6fb,_6fc){dijit._Container.prototype.addChild.apply(this,arguments);if(this._started){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());}},removeChild:function(_6fd){dijit._Container.prototype.removeChild.apply(this,arguments);if(this._started){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());}}});dojo.extend(dijit._Widget,{layoutAlign:"none"});}if(!dojo._hasResource["dijit.layout.LinkPane"]){dojo._hasResource["dijit.layout.LinkPane"]=true;dojo.provide("dijit.layout.LinkPane");dojo.declare("dijit.layout.LinkPane",[dijit.layout.ContentPane,dijit._Templated],{templateString:"<div class=\"dijitLinkPane\"></div>",postCreate:function(){if(this.srcNodeRef){this.title+=this.srcNodeRef.innerHTML;}this.inherited("postCreate",arguments);}});}if(!dojo._hasResource["dijit.layout.SplitContainer"]){dojo._hasResource["dijit.layout.SplitContainer"]=true;dojo.provide("dijit.layout.SplitContainer");dojo.declare("dijit.layout.SplitContainer",dijit.layout._LayoutWidget,{constructor:function(){dojo.deprecated("dijit.layout.SplitContainer is deprecated","use BorderContainer with splitter instead",2);},activeSizing:false,sizerWidth:7,orientation:"horizontal",persist:true,postMixInProperties:function(){this.inherited("postMixInProperties",arguments);this.isHorizontal=(this.orientation=="horizontal");},postCreate:function(){this.inherited("postCreate",arguments);this.sizers=[];dojo.addClass(this.domNode,"dijitSplitContainer");if(dojo.isMozilla){this.domNode.style.overflow="-moz-scrollbars-none";}if(typeof this.sizerWidth=="object"){try{this.sizerWidth=parseInt(this.sizerWidth.toString());}catch(e){this.sizerWidth=7;}}var _6fe=this.virtualSizer=dojo.doc.createElement("div");_6fe.style.position="relative";_6fe.style.zIndex=10;_6fe.className=this.isHorizontal?"dijitSplitContainerVirtualSizerH":"dijitSplitContainerVirtualSizerV";this.domNode.appendChild(_6fe);dojo.setSelectable(_6fe,false);},destroy:function(){delete this.virtualSizer;dojo.forEach(this._ownconnects,dojo.disconnect);this.inherited(arguments);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_6ff,i,_701){this._injectChild(_6ff);if(i<_701.length-1){this._addSizer();}},this);if(this.persist){this._restoreState();}this.inherited(arguments);},_injectChild:function(_702){_702.domNode.style.position="absolute";dojo.addClass(_702.domNode,"dijitSplitPane");},_addSizer:function(){var i=this.sizers.length;var _704=this.sizers[i]=dojo.doc.createElement("div");this.domNode.appendChild(_704);_704.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";var _705=dojo.doc.createElement("div");_705.className="thumb";_704.appendChild(_705);var self=this;var _707=(function(){var _708=i;return function(e){self.beginSizing(e,_708);};})();this.connect(_704,"onmousedown",_707);dojo.setSelectable(_704,false);},removeChild:function(_70a){if(this.sizers.length){var i=dojo.indexOf(this.getChildren(),_70a);if(i!=-1){if(i==this.sizers.length){i--;}dojo._destroyElement(this.sizers[i]);this.sizers.splice(i,1);}}this.inherited(arguments);if(this._started){this.layout();}},addChild:function(_70c,_70d){this.inherited("addChild",arguments);if(this._started){this._injectChild(_70c);var _70e=this.getChildren();if(_70e.length>1){this._addSizer();}this.layout();}},layout:function(){this.paneWidth=this._contentBox.w;this.paneHeight=this._contentBox.h;var _70f=this.getChildren();if(!_70f.length){return;}var _710=this.isHorizontal?this.paneWidth:this.paneHeight;if(_70f.length>1){_710-=this.sizerWidth*(_70f.length-1);}var _711=0;dojo.forEach(_70f,function(_712){_711+=_712.sizeShare;});var _713=_710/_711;var _714=0;dojo.forEach(_70f.slice(0,_70f.length-1),function(_715){var size=Math.round(_713*_715.sizeShare);_715.sizeActual=size;_714+=size;});_70f[_70f.length-1].sizeActual=_710-_714;this._checkSizes();var pos=0;var size=_70f[0].sizeActual;this._movePanel(_70f[0],pos,size);_70f[0].position=pos;pos+=size;if(!this.sizers){return;}dojo.some(_70f.slice(1),function(_719,i){if(!this.sizers[i]){return true;}this._moveSlider(this.sizers[i],pos,this.sizerWidth);this.sizers[i].position=pos;pos+=this.sizerWidth;size=_719.sizeActual;this._movePanel(_719,pos,size);_719.position=pos;pos+=size;},this);},_movePanel:function(_71b,pos,size){if(this.isHorizontal){_71b.domNode.style.left=pos+"px";_71b.domNode.style.top=0;var box={w:size,h:this.paneHeight};if(_71b.resize){_71b.resize(box);}else{dojo.marginBox(_71b.domNode,box);}}else{_71b.domNode.style.left=0;_71b.domNode.style.top=pos+"px";var box={w:this.paneWidth,h:size};if(_71b.resize){_71b.resize(box);}else{dojo.marginBox(_71b.domNode,box);}}},_moveSlider:function(_71f,pos,size){if(this.isHorizontal){_71f.style.left=pos+"px";_71f.style.top=0;dojo.marginBox(_71f,{w:size,h:this.paneHeight});}else{_71f.style.left=0;_71f.style.top=pos+"px";dojo.marginBox(_71f,{w:this.paneWidth,h:size});}},_growPane:function(_722,pane){if(_722>0){if(pane.sizeActual>pane.sizeMin){if((pane.sizeActual-pane.sizeMin)>_722){pane.sizeActual=pane.sizeActual-_722;_722=0;}else{_722-=pane.sizeActual-pane.sizeMin;pane.sizeActual=pane.sizeMin;}}}return _722;},_checkSizes:function(){var _724=0;var _725=0;var _726=this.getChildren();dojo.forEach(_726,function(_727){_725+=_727.sizeActual;_724+=_727.sizeMin;});if(_724<=_725){var _728=0;dojo.forEach(_726,function(_729){if(_729.sizeActual<_729.sizeMin){_728+=_729.sizeMin-_729.sizeActual;_729.sizeActual=_729.sizeMin;}});if(_728>0){var list=this.isDraggingLeft?_726.reverse():_726;dojo.forEach(list,function(_72b){_728=this._growPane(_728,_72b);},this);}}else{dojo.forEach(_726,function(_72c){_72c.sizeActual=Math.round(_725*(_72c.sizeMin/_724));});}},beginSizing:function(e,i){var _72f=this.getChildren();this.paneBefore=_72f[i];this.paneAfter=_72f[i+1];this.isSizing=true;this.sizingSplitter=this.sizers[i];if(!this.cover){this.cover=dojo.doc.createElement("div");this.domNode.appendChild(this.cover);var s=this.cover.style;s.position="absolute";s.zIndex=1;s.top=0;s.left=0;s.width="100%";s.height="100%";}else{this.cover.style.zIndex=1;}this.sizingSplitter.style.zIndex=2;this.originPos=dojo.coords(_72f[0].domNode,true);if(this.isHorizontal){var _731=(e.layerX?e.layerX:e.offsetX);var _732=e.pageX;this.originPos=this.originPos.x;}else{var _731=(e.layerY?e.layerY:e.offsetY);var _732=e.pageY;this.originPos=this.originPos.y;}this.startPoint=this.lastPoint=_732;this.screenToClientOffset=_732-_731;this.dragOffset=this.lastPoint-this.paneBefore.sizeActual-this.originPos-this.paneBefore.position;if(!this.activeSizing){this._showSizingLine();}this._ownconnects=[];this._ownconnects.push(dojo.connect(dojo.doc.documentElement,"onmousemove",this,"changeSizing"));this._ownconnects.push(dojo.connect(dojo.doc.documentElement,"onmouseup",this,"endSizing"));dojo.stopEvent(e);},changeSizing:function(e){if(!this.isSizing){return;}this.lastPoint=this.isHorizontal?e.pageX:e.pageY;this.movePoint();if(this.activeSizing){this._updateSize();}else{this._moveSizingLine();}dojo.stopEvent(e);},endSizing:function(e){if(!this.isSizing){return;}if(this.cover){this.cover.style.zIndex=-1;}if(!this.activeSizing){this._hideSizingLine();}this._updateSize();this.isSizing=false;if(this.persist){this._saveState(this);}dojo.forEach(this._ownconnects,dojo.disconnect);},movePoint:function(){var p=this.lastPoint-this.screenToClientOffset;var a=p-this.dragOffset;a=this.legaliseSplitPoint(a);p=a+this.dragOffset;this.lastPoint=p+this.screenToClientOffset;},legaliseSplitPoint:function(a){a+=this.sizingSplitter.position;this.isDraggingLeft=!!(a>0);if(!this.activeSizing){var min=this.paneBefore.position+this.paneBefore.sizeMin;if(a<min){a=min;}var max=this.paneAfter.position+(this.paneAfter.sizeActual-(this.sizerWidth+this.paneAfter.sizeMin));if(a>max){a=max;}}a-=this.sizingSplitter.position;this._checkSizes();return a;},_updateSize:function(){var pos=this.lastPoint-this.dragOffset-this.originPos;var _73b=this.paneBefore.position;var _73c=this.paneAfter.position+this.paneAfter.sizeActual;this.paneBefore.sizeActual=pos-_73b;this.paneAfter.position=pos+this.sizerWidth;this.paneAfter.sizeActual=_73c-this.paneAfter.position;dojo.forEach(this.getChildren(),function(_73d){_73d.sizeShare=_73d.sizeActual;});if(this._started){this.layout();}},_showSizingLine:function(){this._moveSizingLine();dojo.marginBox(this.virtualSizer,this.isHorizontal?{w:this.sizerWidth,h:this.paneHeight}:{w:this.paneWidth,h:this.sizerWidth});this.virtualSizer.style.display="block";},_hideSizingLine:function(){this.virtualSizer.style.display="none";},_moveSizingLine:function(){var pos=(this.lastPoint-this.startPoint)+this.sizingSplitter.position;dojo.style(this.virtualSizer,(this.isHorizontal?"left":"top"),pos+"px");},_getCookieName:function(i){return this.id+"_"+i;},_restoreState:function(){dojo.forEach(this.getChildren(),function(_740,i){var _742=this._getCookieName(i);var _743=dojo.cookie(_742);if(_743){var pos=parseInt(_743);if(typeof pos=="number"){_740.sizeShare=pos;}}},this);},_saveState:function(){dojo.forEach(this.getChildren(),function(_745,i){dojo.cookie(this._getCookieName(i),_745.sizeShare);},this);}});dojo.extend(dijit._Widget,{sizeMin:10,sizeShare:10});}if(!dojo._hasResource["dijit.layout.TabContainer"]){dojo._hasResource["dijit.layout.TabContainer"]=true;dojo.provide("dijit.layout.TabContainer");dojo.declare("dijit.layout.TabContainer",[dijit.layout.StackContainer,dijit._Templated],{tabPosition:"top",templateString:null,templateString:"<div class=\"dijitTabContainer\">\n\t<div dojoAttachPoint=\"tablistNode\"></div>\n\t<div class=\"dijitTabPaneWrapper\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n",_controllerWidget:"dijit.layout.TabController",postCreate:function(){this.inherited(arguments);var _747=dojo.getObject(this._controllerWidget);this.tablist=new _747({id:this.id+"_tablist",tabPosition:this.tabPosition,doLayout:this.doLayout,containerId:this.id},this.tablistNode);},_setupChild:function(tab){dojo.addClass(tab.domNode,"dijitTabPane");this.inherited(arguments);return tab;},startup:function(){if(this._started){return;}this.tablist.startup();this.inherited(arguments);if(dojo.isSafari){setTimeout(dojo.hitch(this,"layout"),0);}if(dojo.isIE&&!this.isLeftToRight()&&this.tabPosition=="right-h"&&this.tablist&&this.tablist.pane2button){for(var pane in this.tablist.pane2button){var _74a=this.tablist.pane2button[pane];if(!_74a.closeButton){continue;}tabButtonStyle=_74a.closeButtonNode.style;tabButtonStyle.position="absolute";if(dojo.isIE<7){tabButtonStyle.left=_74a.domNode.offsetWidth+"px";}else{tabButtonStyle.padding="0px";}}}},layout:function(){if(!this.doLayout){return;}var _74b=this.tabPosition.replace(/-h/,"");var _74c=[{domNode:this.tablist.domNode,layoutAlign:_74b},{domNode:this.containerNode,layoutAlign:"client"}];dijit.layout.layoutChildren(this.domNode,this._contentBox,_74c);this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_74c[1]);if(this.selectedChildWidget){this._showChild(this.selectedChildWidget);if(this.doLayout&&this.selectedChildWidget.resize){this.selectedChildWidget.resize(this._containerContentBox);}}},destroy:function(){if(this.tablist){this.tablist.destroy();}this.inherited(arguments);}});dojo.declare("dijit.layout.TabController",dijit.layout.StackController,{templateString:"<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",tabPosition:"top",doLayout:true,buttonWidget:"dijit.layout._TabButton",postMixInProperties:function(){this["class"]="dijitTabLabels-"+this.tabPosition+(this.doLayout?"":" dijitTabNoLayout");this.inherited(arguments);},_rectifyRtlTabList:function(){if(0>=this.tabPosition.indexOf("-h")){return;}if(!this.pane2button){return;}var _74d=0;for(var pane in this.pane2button){_74d=Math.max(_74d,dojo.marginBox(this.pane2button[pane].innerDiv).w);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_74d+"px";}}});dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",templateString:"<div waiRole=\"presentation\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n    <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n        <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n\t        <span dojoAttachPoint='containerNode,focusNode' class='tabLabel'>${!label}</span>\n\t        <span dojoAttachPoint='closeButtonNode' class='closeImage' dojoAttachEvent='onmouseenter:_onMouse, onmouseleave:_onMouse, onclick:onClickCloseButton' stateModifier='CloseButton'>\n\t            <span dojoAttachPoint='closeText' class='closeText'>x</span>\n\t        </span>\n        </div>\n    </div>\n</div>\n",postCreate:function(){if(this.closeButton){dojo.addClass(this.innerDiv,"dijitClosable");}else{this.closeButtonNode.style.display="none";}this.inherited(arguments);dojo.setSelectable(this.containerNode,false);}});}if(!dojo._hasResource["dijit.dijit-all"]){dojo._hasResource["dijit.dijit-all"]=true;console.warn("dijit-all may include much more code than your application actually requires. We strongly recommend that you investigate a custom build or the web build tool");dojo.provide("dijit.dijit-all");}dojo.i18n._preloadLocalizations("dijit.nls.dijit-all",["he","nl","tr","no","ko","el","en","en-gb","ROOT","zh-cn","hu","es","fi-fi","pt-br","fi","he-il","xx","ru","it","fr","cs","de-de","fr-fr","it-it","es-es","ja","da","pl","de","sv","pt","zh-tw","pt-pt","nl-nl","ko-kr","ar","en-us","zh","ja-jp"]);

Added: branches/vhffs-design/vhffs-panel/js/dijit/dijit-all.js.uncompressed.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/dijit-all.js.uncompressed.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/dijit-all.js.uncompressed.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,16235 @@
+/*
+	Copyright (c) 2004-2008, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing
+*/
+
+/*
+	This is a compiled version of Dojo, built for deployment and not for
+	development. To get an editable version, please visit:
+
+		http://dojotoolkit.org
+
+	for documentation and information on getting the source.
+*/
+
+if(!dojo._hasResource["dojo.colors"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.colors"] = true;
+dojo.provide("dojo.colors");
+
+//TODO: this module appears to break naming conventions
+
+/*=====
+dojo.colors = {
+	// summary: Color utilities
+}
+=====*/
+
+(function(){
+	// this is a standard conversion prescribed by the CSS3 Color Module
+	var hue2rgb = function(m1, m2, h){
+		if(h < 0){ ++h; }
+		if(h > 1){ --h; }
+		var h6 = 6 * h;
+		if(h6 < 1){ return m1 + (m2 - m1) * h6; }
+		if(2 * h < 1){ return m2; }
+		if(3 * h < 2){ return m1 + (m2 - m1) * (2 / 3 - h) * 6; }
+		return m1;
+	};
+	
+	dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
+		// summary:
+		//		get rgb(a) array from css-style color declarations
+		// description:
+		//		this function can handle all 4 CSS3 Color Module formats: rgb,
+		//		rgba, hsl, hsla, including rgb(a) with percentage values.
+		var m = color.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);
+		if(m){
+			var c = m[2].split(/\s*,\s*/), l = c.length, t = m[1];
+			if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){
+				var r = c[0];
+				if(r.charAt(r.length - 1) == "%"){
+					// 3 rgb percentage values
+					var a = dojo.map(c, function(x){
+						return parseFloat(x) * 2.56;
+					});
+					if(l == 4){ a[3] = c[3]; }
+					return dojo.colorFromArray(a, obj);	// dojo.Color
+				}
+				return dojo.colorFromArray(c, obj);	// dojo.Color
+			}
+			if((t == "hsl" && l == 3) || (t == "hsla" && l == 4)){
+				// normalize hsl values
+				var H = ((parseFloat(c[0]) % 360) + 360) % 360 / 360,
+					S = parseFloat(c[1]) / 100,
+					L = parseFloat(c[2]) / 100,
+					// calculate rgb according to the algorithm 
+					// recommended by the CSS3 Color Module 
+					m2 = L <= 0.5 ? L * (S + 1) : L + S - L * S, 
+					m1 = 2 * L - m2,
+					a = [hue2rgb(m1, m2, H + 1 / 3) * 256,
+						hue2rgb(m1, m2, H) * 256, hue2rgb(m1, m2, H - 1 / 3) * 256, 1];
+				if(l == 4){ a[3] = c[3]; }
+				return dojo.colorFromArray(a, obj);	// dojo.Color
+			}
+		}
+		return null;	// dojo.Color
+	};
+	
+	var confine = function(c, low, high){
+		// summary:
+		//		sanitize a color component by making sure it is a number,
+		//		and clamping it to valid values
+		c = Number(c);
+		return isNaN(c) ? high : c < low ? low : c > high ? high : c;	// Number
+	};
+	
+	dojo.Color.prototype.sanitize = function(){
+		// summary: makes sure that the object has correct attributes
+		var t = this;
+		t.r = Math.round(confine(t.r, 0, 255));
+		t.g = Math.round(confine(t.g, 0, 255));
+		t.b = Math.round(confine(t.b, 0, 255));
+		t.a = confine(t.a, 0, 1);
+		return this;	// dojo.Color
+	};
+})();
+
+
+dojo.colors.makeGrey = function(/*Number*/ g, /*Number?*/ a){
+	// summary: creates a greyscale color with an optional alpha
+	return dojo.colorFromArray([g, g, g, a]);
+};
+
+// mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings
+dojo.Color.named = dojo.mixin({
+	aliceblue:	[240,248,255],
+	antiquewhite:	[250,235,215],
+	aquamarine:	[127,255,212],
+	azure:	[240,255,255],
+	beige:	[245,245,220],
+	bisque:	[255,228,196],
+	blanchedalmond:	[255,235,205],
+	blueviolet:	[138,43,226],
+	brown:	[165,42,42],
+	burlywood:	[222,184,135],
+	cadetblue:	[95,158,160],
+	chartreuse:	[127,255,0],
+	chocolate:	[210,105,30],
+	coral:	[255,127,80],
+	cornflowerblue:	[100,149,237],
+	cornsilk:	[255,248,220],
+	crimson:	[220,20,60],
+	cyan:	[0,255,255],
+	darkblue:	[0,0,139],
+	darkcyan:	[0,139,139],
+	darkgoldenrod:	[184,134,11],
+	darkgray:	[169,169,169],
+	darkgreen:	[0,100,0],
+	darkgrey:	[169,169,169],
+	darkkhaki:	[189,183,107],
+	darkmagenta:	[139,0,139],
+	darkolivegreen:	[85,107,47],
+	darkorange:	[255,140,0],
+	darkorchid:	[153,50,204],
+	darkred:	[139,0,0],
+	darksalmon:	[233,150,122],
+	darkseagreen:	[143,188,143],
+	darkslateblue:	[72,61,139],
+	darkslategray:	[47,79,79],
+	darkslategrey:	[47,79,79],
+	darkturquoise:	[0,206,209],
+	darkviolet:	[148,0,211],
+	deeppink:	[255,20,147],
+	deepskyblue:	[0,191,255],
+	dimgray:	[105,105,105],
+	dimgrey:	[105,105,105],
+	dodgerblue:	[30,144,255],
+	firebrick:	[178,34,34],
+	floralwhite:	[255,250,240],
+	forestgreen:	[34,139,34],
+	gainsboro:	[220,220,220],
+	ghostwhite:	[248,248,255],
+	gold:	[255,215,0],
+	goldenrod:	[218,165,32],
+	greenyellow:	[173,255,47],
+	grey:	[128,128,128],
+	honeydew:	[240,255,240],
+	hotpink:	[255,105,180],
+	indianred:	[205,92,92],
+	indigo:	[75,0,130],
+	ivory:	[255,255,240],
+	khaki:	[240,230,140],
+	lavender:	[230,230,250],
+	lavenderblush:	[255,240,245],
+	lawngreen:	[124,252,0],
+	lemonchiffon:	[255,250,205],
+	lightblue:	[173,216,230],
+	lightcoral:	[240,128,128],
+	lightcyan:	[224,255,255],
+	lightgoldenrodyellow:	[250,250,210],
+	lightgray:	[211,211,211],
+	lightgreen:	[144,238,144],
+	lightgrey:	[211,211,211],
+	lightpink:	[255,182,193],
+	lightsalmon:	[255,160,122],
+	lightseagreen:	[32,178,170],
+	lightskyblue:	[135,206,250],
+	lightslategray:	[119,136,153],
+	lightslategrey:	[119,136,153],
+	lightsteelblue:	[176,196,222],
+	lightyellow:	[255,255,224],
+	limegreen:	[50,205,50],
+	linen:	[250,240,230],
+	magenta:	[255,0,255],
+	mediumaquamarine:	[102,205,170],
+	mediumblue:	[0,0,205],
+	mediumorchid:	[186,85,211],
+	mediumpurple:	[147,112,219],
+	mediumseagreen:	[60,179,113],
+	mediumslateblue:	[123,104,238],
+	mediumspringgreen:	[0,250,154],
+	mediumturquoise:	[72,209,204],
+	mediumvioletred:	[199,21,133],
+	midnightblue:	[25,25,112],
+	mintcream:	[245,255,250],
+	mistyrose:	[255,228,225],
+	moccasin:	[255,228,181],
+	navajowhite:	[255,222,173],
+	oldlace:	[253,245,230],
+	olivedrab:	[107,142,35],
+	orange:	[255,165,0],
+	orangered:	[255,69,0],
+	orchid:	[218,112,214],
+	palegoldenrod:	[238,232,170],
+	palegreen:	[152,251,152],
+	paleturquoise:	[175,238,238],
+	palevioletred:	[219,112,147],
+	papayawhip:	[255,239,213],
+	peachpuff:	[255,218,185],
+	peru:	[205,133,63],
+	pink:	[255,192,203],
+	plum:	[221,160,221],
+	powderblue:	[176,224,230],
+	rosybrown:	[188,143,143],
+	royalblue:	[65,105,225],
+	saddlebrown:	[139,69,19],
+	salmon:	[250,128,114],
+	sandybrown:	[244,164,96],
+	seagreen:	[46,139,87],
+	seashell:	[255,245,238],
+	sienna:	[160,82,45],
+	skyblue:	[135,206,235],
+	slateblue:	[106,90,205],
+	slategray:	[112,128,144],
+	slategrey:	[112,128,144],
+	snow:	[255,250,250],
+	springgreen:	[0,255,127],
+	steelblue:	[70,130,180],
+	tan:	[210,180,140],
+	thistle:	[216,191,216],
+	tomato:	[255,99,71],
+	transparent: [0, 0, 0, 0],
+	turquoise:	[64,224,208],
+	violet:	[238,130,238],
+	wheat:	[245,222,179],
+	whitesmoke:	[245,245,245],
+	yellowgreen:	[154,205,50]
+}, dojo.Color.named);
+
+}
+
+if(!dojo._hasResource["dojo.i18n"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.i18n"] = true;
+dojo.provide("dojo.i18n");
+
+/*=====
+dojo.i18n = {
+	// summary: Utility classes to enable loading of resources for internationalization (i18n)
+};
+=====*/
+
+dojo.i18n.getLocalization = function(/*String*/packageName, /*String*/bundleName, /*String?*/locale){
+	//	summary:
+	//		Returns an Object containing the localization for a given resource
+	//		bundle in a package, matching the specified locale.
+	//	description:
+	//		Returns a hash containing name/value pairs in its prototypesuch
+	//		that values can be easily overridden.  Throws an exception if the
+	//		bundle is not found.  Bundle must have already been loaded by
+	//		`dojo.requireLocalization()` or by a build optimization step.  NOTE:
+	//		try not to call this method as part of an object property
+	//		definition (`var foo = { bar: dojo.i18n.getLocalization() }`).  In
+	//		some loading situations, the bundle may not be available in time
+	//		for the object definition.  Instead, call this method inside a
+	//		function that is run after all modules load or the page loads (like
+	//		in `dojo.addOnLoad()`), or in a widget lifecycle method.
+	//	packageName:
+	//		package which is associated with this resource
+	//	bundleName:
+	//		the base filename of the resource bundle (without the ".js" suffix)
+	//	locale:
+	//		the variant to load (optional).  By default, the locale defined by
+	//		the host environment: dojo.locale
+
+	locale = dojo.i18n.normalizeLocale(locale);
+
+	// look for nearest locale match
+	var elements = locale.split('-');
+	var module = [packageName,"nls",bundleName].join('.');
+	var bundle = dojo._loadedModules[module];
+	if(bundle){
+		var localization;
+		for(var i = elements.length; i > 0; i--){
+			var loc = elements.slice(0, i).join('_');
+			if(bundle[loc]){
+				localization = bundle[loc];
+				break;
+			}
+		}
+		if(!localization){
+			localization = bundle.ROOT;
+		}
+
+		// make a singleton prototype so that the caller won't accidentally change the values globally
+		if(localization){
+			var clazz = function(){};
+			clazz.prototype = localization;
+			return new clazz(); // Object
+		}
+	}
+
+	throw new Error("Bundle not found: " + bundleName + " in " + packageName+" , locale=" + locale);
+};
+
+dojo.i18n.normalizeLocale = function(/*String?*/locale){
+	//	summary:
+	//		Returns canonical form of locale, as used by Dojo.
+	//
+	//  description:
+	//		All variants are case-insensitive and are separated by '-' as specified in [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
+	//		If no locale is specified, the dojo.locale is returned.  dojo.locale is defined by
+	//		the user agent's locale unless overridden by djConfig.
+
+	var result = locale ? locale.toLowerCase() : dojo.locale;
+	if(result == "root"){
+		result = "ROOT";
+	}
+	return result; // String
+};
+
+dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
+	//	summary:
+	//		See dojo.requireLocalization()
+	//	description:
+	// 		Called by the bootstrap, but factored out so that it is only
+	// 		included in the build when needed.
+
+	var targetLocale = dojo.i18n.normalizeLocale(locale);
+ 	var bundlePackage = [moduleName, "nls", bundleName].join(".");
+	// NOTE: 
+	//		When loading these resources, the packaging does not match what is
+	//		on disk.  This is an implementation detail, as this is just a
+	//		private data structure to hold the loaded resources.  e.g.
+	//		`tests/hello/nls/en-us/salutations.js` is loaded as the object
+	//		`tests.hello.nls.salutations.en_us={...}` The structure on disk is
+	//		intended to be most convenient for developers and translators, but
+	//		in memory it is more logical and efficient to store in a different
+	//		order.  Locales cannot use dashes, since the resulting path will
+	//		not evaluate as valid JS, so we translate them to underscores.
+	
+	//Find the best-match locale to load if we have available flat locales.
+	var bestLocale = "";
+	if(availableFlatLocales){
+		var flatLocales = availableFlatLocales.split(",");
+		for(var i = 0; i < flatLocales.length; i++){
+			//Locale must match from start of string.
+			if(targetLocale.indexOf(flatLocales[i]) == 0){
+				if(flatLocales[i].length > bestLocale.length){
+					bestLocale = flatLocales[i];
+				}
+			}
+		}
+		if(!bestLocale){
+			bestLocale = "ROOT";
+		}		
+	}
+
+	//See if the desired locale is already loaded.
+	var tempLocale = availableFlatLocales ? bestLocale : targetLocale;
+	var bundle = dojo._loadedModules[bundlePackage];
+	var localizedBundle = null;
+	if(bundle){
+		if(dojo.config.localizationComplete && bundle._built){return;}
+		var jsLoc = tempLocale.replace(/-/g, '_');
+		var translationPackage = bundlePackage+"."+jsLoc;
+		localizedBundle = dojo._loadedModules[translationPackage];
+	}
+
+	if(!localizedBundle){
+		bundle = dojo["provide"](bundlePackage);
+		var syms = dojo._getModuleSymbols(moduleName);
+		var modpath = syms.concat("nls").join("/");
+		var parent;
+
+		dojo.i18n._searchLocalePath(tempLocale, availableFlatLocales, function(loc){
+			var jsLoc = loc.replace(/-/g, '_');
+			var translationPackage = bundlePackage + "." + jsLoc;
+			var loaded = false;
+			if(!dojo._loadedModules[translationPackage]){
+				// Mark loaded whether it's found or not, so that further load attempts will not be made
+				dojo["provide"](translationPackage);
+				var module = [modpath];
+				if(loc != "ROOT"){module.push(loc);}
+				module.push(bundleName);
+				var filespec = module.join("/") + '.js';
+				loaded = dojo._loadPath(filespec, null, function(hash){
+					// Use singleton with prototype to point to parent bundle, then mix-in result from loadPath
+					var clazz = function(){};
+					clazz.prototype = parent;
+					bundle[jsLoc] = new clazz();
+					for(var j in hash){ bundle[jsLoc][j] = hash[j]; }
+				});
+			}else{
+				loaded = true;
+			}
+			if(loaded && bundle[jsLoc]){
+				parent = bundle[jsLoc];
+			}else{
+				bundle[jsLoc] = parent;
+			}
+			
+			if(availableFlatLocales){
+				//Stop the locale path searching if we know the availableFlatLocales, since
+				//the first call to this function will load the only bundle that is needed.
+				return true;
+			}
+		});
+	}
+
+	//Save the best locale bundle as the target locale bundle when we know the
+	//the available bundles.
+	if(availableFlatLocales && targetLocale != bestLocale){
+		bundle[targetLocale.replace(/-/g, '_')] = bundle[bestLocale.replace(/-/g, '_')];
+	}
+};
+
+(function(){
+	// If other locales are used, dojo.requireLocalization should load them as
+	// well, by default. 
+	// 
+	// Override dojo.requireLocalization to do load the default bundle, then
+	// iterate through the extraLocale list and load those translations as
+	// well, unless a particular locale was requested.
+
+	var extra = dojo.config.extraLocale;
+	if(extra){
+		if(!extra instanceof Array){
+			extra = [extra];
+		}
+
+		var req = dojo.i18n._requireLocalization;
+		dojo.i18n._requireLocalization = function(m, b, locale, availableFlatLocales){
+			req(m,b,locale, availableFlatLocales);
+			if(locale){return;}
+			for(var i=0; i<extra.length; i++){
+				req(m,b,extra[i], availableFlatLocales);
+			}
+		};
+	}
+})();
+
+dojo.i18n._searchLocalePath = function(/*String*/locale, /*Boolean*/down, /*Function*/searchFunc){
+	//	summary:
+	//		A helper method to assist in searching for locale-based resources.
+	//		Will iterate through the variants of a particular locale, either up
+	//		or down, executing a callback function.  For example, "en-us" and
+	//		true will try "en-us" followed by "en" and finally "ROOT".
+
+	locale = dojo.i18n.normalizeLocale(locale);
+
+	var elements = locale.split('-');
+	var searchlist = [];
+	for(var i = elements.length; i > 0; i--){
+		searchlist.push(elements.slice(0, i).join('-'));
+	}
+	searchlist.push(false);
+	if(down){searchlist.reverse();}
+
+	for(var j = searchlist.length - 1; j >= 0; j--){
+		var loc = searchlist[j] || "ROOT";
+		var stop = searchFunc(loc);
+		if(stop){ break; }
+	}
+};
+
+dojo.i18n._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated){
+	//	summary:
+	//		Load built, flattened resource bundles, if available for all
+	//		locales used in the page. Only called by built layer files.
+
+	function preload(locale){
+		locale = dojo.i18n.normalizeLocale(locale);
+		dojo.i18n._searchLocalePath(locale, true, function(loc){
+			for(var i=0; i<localesGenerated.length;i++){
+				if(localesGenerated[i] == loc){
+					dojo["require"](bundlePrefix+"_"+loc);
+					return true; // Boolean
+				}
+			}
+			return false; // Boolean
+		});
+	}
+	preload();
+	var extra = dojo.config.extraLocale||[];
+	for(var i=0; i<extra.length; i++){
+		preload(extra[i]);
+	}
+};
+
+}
+
+if(!dojo._hasResource["dijit.ColorPalette"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.ColorPalette"] = true;
+dojo.provide("dijit.ColorPalette");
+
+
+
+
+
+
+
+dojo.declare("dijit.ColorPalette",
+	[dijit._Widget, dijit._Templated],
+	{
+	// summary: A keyboard accessible color-picking widget
+	// description:
+	//	Grid showing various colors, so the user can pick a certain color
+	//	Can be used standalone, or as a popup.
+	//
+	// example:
+	// |	<div dojoType="dijit.ColorPalette"></div>
+	//
+	// example:
+	// |    var picker = new dijit.ColorPalette({ },srcNode);
+	// |	picker.startup();
+	//
+	// defaultTimeout: Number
+	//		number of milliseconds before a held key or button becomes typematic
+	defaultTimeout: 500,
+
+	// timeoutChangeRate: Number
+	//		fraction of time used to change the typematic timer between events
+	//		1.0 means that each typematic event fires at defaultTimeout intervals
+	//		< 1.0 means that each typematic event fires at an increasing faster rate
+	timeoutChangeRate: 0.90,
+
+	// palette: String
+	//		Size of grid, either "7x10" or "3x4".
+	palette: "7x10",
+
+	//_value: String
+	//		The value of the selected color.
+	value: null,
+
+	//_currentFocus: Integer
+	//		Index of the currently focused color.
+	_currentFocus: 0,
+
+	// _xDim: Integer
+	//		This is the number of colors horizontally across.
+	_xDim: null,
+
+	// _yDim: Integer
+	///		This is the number of colors vertically down.
+	_yDim: null,
+
+	// _palettes: Map
+	// 		This represents the value of the colors.
+	//		The first level is a hashmap of the different arrays available
+	//		The next two dimensions represent the columns and rows of colors.
+	_palettes: {
+
+		"7x10":	[["white", "seashell", "cornsilk", "lemonchiffon","lightyellow", "palegreen", "paleturquoise", "lightcyan",	"lavender", "plum"],
+				["lightgray", "pink", "bisque", "moccasin", "khaki", "lightgreen", "lightseagreen", "lightskyblue", "cornflowerblue", "violet"],
+				["silver", "lightcoral", "sandybrown", "orange", "palegoldenrod", "chartreuse", "mediumturquoise", 	"skyblue", "mediumslateblue","orchid"],
+				["gray", "red", "orangered", "darkorange", "yellow", "limegreen", 	"darkseagreen", "royalblue", "slateblue", "mediumorchid"],
+				["dimgray", "crimson", 	"chocolate", "coral", "gold", "forestgreen", "seagreen", "blue", "blueviolet", "darkorchid"],
+				["darkslategray","firebrick","saddlebrown", "sienna", "olive", "green", "darkcyan", "mediumblue","darkslateblue", "darkmagenta" ],
+				["black", "darkred", "maroon", "brown", "darkolivegreen", "darkgreen", "midnightblue", "navy", "indigo", 	"purple"]],
+
+		"3x4": [["white", "lime", "green", "blue"],
+			["silver", "yellow", "fuchsia", "navy"],
+			["gray", "red", "purple", "black"]]	
+
+	},
+
+	// _imagePaths: Map
+	//		This is stores the path to the palette images
+	_imagePaths: {
+		"7x10": dojo.moduleUrl("dijit", "templates/colors7x10.png"),
+		"3x4": dojo.moduleUrl("dijit", "templates/colors3x4.png")
+	},
+
+	// _paletteCoords: Map
+	//		This is a map that is used to calculate the coordinates of the
+	//		images that make up the palette.
+	_paletteCoords: {
+		"leftOffset": 3, "topOffset": 3,
+		"cWidth": 20, "cHeight": 20
+		
+	},
+
+	// templatePath: String
+	//		Path to the template of this widget.
+	templateString:"<div class=\"dijitInline dijitColorPalette\">\n\t<div class=\"dijitColorPaletteInner\" dojoAttachPoint=\"divNode\" waiRole=\"grid\" tabIndex=\"${tabIndex}\">\n\t\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\">\n\t</div>\t\n</div>\n",
+
+	// _paletteDims: Object
+	//		Size of the supported palettes for alignment purposes.
+	_paletteDims: {
+		"7x10": {"width": "206px", "height": "145px"},
+		"3x4": {"width": "86px", "height": "64px"}
+	},
+
+	// tabIndex: String
+	//		Widget tabindex.
+	tabIndex: "0",
+
+	postCreate: function(){
+		// A name has to be given to the colorMap, this needs to be unique per Palette.
+		dojo.mixin(this.divNode.style, this._paletteDims[this.palette]);
+		this.imageNode.setAttribute("src", this._imagePaths[this.palette]);
+		var choices = this._palettes[this.palette];	
+		this.domNode.style.position = "relative";
+		this._cellNodes = [];	
+		this.colorNames = dojo.i18n.getLocalization("dojo", "colors", this.lang);
+		var url = dojo.moduleUrl("dojo", "resources/blank.gif"),
+            colorObject = new dojo.Color(),
+		    coords = this._paletteCoords;
+		for(var row=0; row < choices.length; row++){
+			for(var col=0; col < choices[row].length; col++) {
+                var imgNode = dojo.doc.createElement("img");
+                imgNode.src = url;
+                dojo.addClass(imgNode, "dijitPaletteImg");
+                var color = choices[row][col],
+                        colorValue = colorObject.setColor(dojo.Color.named[color]);
+                imgNode.alt = this.colorNames[color];
+                imgNode.color = colorValue.toHex();
+                var imgStyle = imgNode.style;
+                imgStyle.color = imgStyle.backgroundColor = imgNode.color;
+                var cellNode = dojo.doc.createElement("span");
+                cellNode.appendChild(imgNode);
+                dojo.forEach(["Dijitclick", "MouseEnter", "Focus", "Blur"], function(handler) {
+                    this.connect(cellNode, "on" + handler.toLowerCase(), "_onCell" + handler);
+                }, this);
+                this.divNode.appendChild(cellNode);
+                var cellStyle = cellNode.style;
+                cellStyle.top = coords.topOffset + (row * coords.cHeight) + "px";
+                cellStyle.left = coords.leftOffset + (col * coords.cWidth) + "px";
+                dojo.attr(cellNode, "tabindex", "-1");
+                cellNode.title = this.colorNames[color];
+                dojo.addClass(cellNode, "dijitPaletteCell");
+                dijit.setWaiRole(cellNode, "gridcell");
+                cellNode.index = this._cellNodes.length;
+                this._cellNodes.push(cellNode);
+            }
+		}
+		this._xDim = choices[0].length;
+		this._yDim = choices.length;
+		this.connect(this.divNode, "onfocus", "_onDivNodeFocus");
+
+		// Now set all events
+		// The palette itself is navigated to with the tab key on the keyboard
+		// Keyboard navigation within the Palette is with the arrow keys
+		// Spacebar selects the color.
+		// For the up key the index is changed by negative the x dimension.		
+
+		var keyIncrementMap = {
+			UP_ARROW: -this._xDim,
+			// The down key the index is increase by the x dimension.	
+			DOWN_ARROW: this._xDim,
+			// Right and left move the index by 1.
+			RIGHT_ARROW: 1,
+			LEFT_ARROW: -1
+		};
+		for(var key in keyIncrementMap){
+			this._connects.push(dijit.typematic.addKeyListener(this.domNode,
+				{keyCode:dojo.keys[key], ctrlKey:false, altKey:false, shiftKey:false},
+				this,
+				function(){
+					var increment = keyIncrementMap[key];
+					return function(count){ this._navigateByKey(increment, count); };
+				}(),
+				this.timeoutChangeRate, this.defaultTimeout));
+		}
+	},
+
+	focus: function(){
+		// summary:
+		//		Focus this ColorPalette.  Puts focus on the first swatch.
+		this._focusFirst();
+	},
+
+	onChange: function(color){
+		// summary:
+		//		Callback when a color is selected.
+		// color: String
+		//		Hex value corresponding to color.
+//		console.debug("Color selected is: "+color);
+	},
+
+	_focusFirst: function(){
+		this._currentFocus = 0;
+		var cellNode = this._cellNodes[this._currentFocus];
+		window.setTimeout(function(){dijit.focus(cellNode)}, 0);
+	},
+
+	_onDivNodeFocus: function(evt){
+		// focus bubbles on Firefox 2, so just make sure that focus has really
+		// gone to the container
+		if(evt.target === this.divNode){
+			this._focusFirst();
+		}
+	},
+
+	_onFocus: function(){
+		// while focus is on the palette, set its tabindex to -1 so that on a
+		// shift-tab from a cell, the container is not in the tab order
+		dojo.attr(this.divNode, "tabindex", "-1");
+	},
+
+	_onBlur: function(){
+		this._removeCellHighlight(this._currentFocus);
+		// when focus leaves the palette, restore its tabindex, since it was
+		// modified by _onFocus().
+		dojo.attr(this.divNode, "tabindex", this.tabIndex);
+	},
+
+	_onCellDijitclick: function(/*Event*/ evt){
+		// summary:
+		//		Handler for click, enter key & space key. Selects the color.
+		// evt:
+		//		The event.
+		var target = evt.currentTarget;
+		if (this._currentFocus != target.index){
+			this._currentFocus = target.index;
+			window.setTimeout(function(){dijit.focus(target)}, 0);
+		}
+		this._selectColor(target);
+		dojo.stopEvent(evt);
+	},
+
+	_onCellMouseEnter: function(/*Event*/ evt){
+		// summary:
+		//		Handler for onMouseOver. Put focus on the color under the mouse.
+		// evt:
+		//		The mouse event.
+		var target = evt.currentTarget;
+		window.setTimeout(function(){dijit.focus(target)}, 0);
+	},
+
+	_onCellFocus: function(/*Event*/ evt){
+		// summary:
+		//		Handler for onFocus. Removes highlight of
+		//		the color that just lost focus, and highlights
+		//		the new color.
+		// evt:
+		//		The focus event.
+		this._removeCellHighlight(this._currentFocus);
+		this._currentFocus = evt.currentTarget.index;
+		dojo.addClass(evt.currentTarget, "dijitPaletteCellHighlight");
+	},
+
+	_onCellBlur: function(/*Event*/ evt){
+		// summary:
+		//		needed for Firefox 2 on Mac OS X
+		this._removeCellHighlight(this._currentFocus);
+	},
+
+	_removeCellHighlight: function(index){
+		dojo.removeClass(this._cellNodes[index], "dijitPaletteCellHighlight");
+	},
+
+	_selectColor: function(selectNode){	
+		// summary:
+		// 		This selects a color. It triggers the onChange event
+		// area:
+		//		The area node that covers the color being selected.
+		var img = selectNode.getElementsByTagName("img")[0];
+		this.onChange(this.value = img.color);
+	},
+
+	_navigateByKey: function(increment, typeCount){
+		// summary:
+		// 	  	This is the callback for typematic.
+		// 		It changes the focus and the highlighed color.
+		// increment:
+		// 		How much the key is navigated.
+		// typeCount:
+		//		How many times typematic has fired.
+
+		// typecount == -1 means the key is released.
+		if(typeCount == -1){ return; }
+
+		var newFocusIndex = this._currentFocus + increment;
+		if(newFocusIndex < this._cellNodes.length && newFocusIndex > -1)
+		{
+			var focusNode = this._cellNodes[newFocusIndex];
+			focusNode.focus();
+		}
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.Declaration"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Declaration"] = true;
+dojo.provide("dijit.Declaration");
+
+
+
+dojo.declare(
+	"dijit.Declaration",
+	dijit._Widget,
+	{
+		// summary:
+		//		The Declaration widget allows a user to declare new widget
+		//		classes directly from a snippet of markup.
+
+		_noScript: true,
+		widgetClass: "",
+		replaceVars: true,
+		defaults: null,
+		mixins: [],
+		buildRendering: function(){
+			var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef);
+			var preambles = dojo.query("> script[type='dojo/method'][event='preamble']", src).orphan();
+			var scripts = dojo.query("> script[type^='dojo/']", src).orphan();
+			var srcType = src.nodeName;
+
+			var propList = this.defaults||{};
+
+			// map array of strings like [ "dijit.form.Button" ] to array of mixin objects
+			// (note that dojo.map(this.mixins, dojo.getObject) doesn't work because it passes
+			// a bogus third argument to getObject(), confusing it)
+			this.mixins = this.mixins.length ?
+				dojo.map(this.mixins, function(name){ return dojo.getObject(name); } ) :
+				[ dijit._Widget, dijit._Templated ];
+
+			if(preambles.length){
+				// we only support one preamble. So be it.
+				propList.preamble = dojo.parser._functionFromScript(preambles[0]);
+			}
+
+			var parsedScripts = dojo.map(scripts, function(s){
+				var evt = s.getAttribute("event")||"postscript";
+				return {
+					event: evt,
+					func: dojo.parser._functionFromScript(s)
+				};
+			});
+
+			// do the connects for each <script type="dojo/connect" event="foo"> block and make
+			// all <script type="dojo/method"> tags execute right after construction
+			this.mixins.push(function(){
+				dojo.forEach(parsedScripts, function(s){
+					dojo.connect(this, s.event, this, s.func);
+				}, this);
+			});
+
+			propList.widgetsInTemplate = true;
+			propList._skipNodeCache = true;
+			propList.templateString = "<"+srcType+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint")||'')+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent")||'')+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">";
+			// console.debug(propList.templateString);
+
+			// strip things so we don't create stuff under us in the initial setup phase
+			dojo.query("[dojoType]", src).forEach(function(node){
+				node.removeAttribute("dojoType");
+			});
+
+			// create the new widget class
+			dojo.declare(
+				this.widgetClass,
+				this.mixins,
+				propList
+			);
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.common"] = true;
+dojo.provide("dojo.dnd.common");
+
+dojo.dnd._copyKey = navigator.appVersion.indexOf("Macintosh") < 0 ? "ctrlKey" : "metaKey";
+
+dojo.dnd.getCopyKeyState = function(e) {
+	// summary: abstracts away the difference between selection on Mac and PC,
+	//	and returns the state of the "copy" key to be pressed.
+	// e: Event: mouse event
+	return e[dojo.dnd._copyKey];	// Boolean
+};
+
+dojo.dnd._uniqueId = 0;
+dojo.dnd.getUniqueId = function(){
+	// summary: returns a unique string for use with any DOM element
+	var id;
+	do{
+		id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
+	}while(dojo.byId(id));
+	return id;
+};
+
+dojo.dnd._empty = {};
+
+dojo.dnd.isFormElement = function(/*Event*/ e){
+	// summary: returns true, if user clicked on a form element
+	var t = e.target;
+	if(t.nodeType == 3 /*TEXT_NODE*/){
+		t = t.parentNode;
+	}
+	return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0;	// Boolean
+};
+
+}
+
+if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.autoscroll"] = true;
+dojo.provide("dojo.dnd.autoscroll");
+
+dojo.dnd.getViewport = function(){
+	// summary: returns a viewport size (visible part of the window)
+
+	// FIXME: need more docs!!
+	var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
+	if(dojo.isMozilla){
+		return {w: dd.clientWidth, h: w.innerHeight};	// Object
+	}else if(!dojo.isOpera && w.innerWidth){
+		return {w: w.innerWidth, h: w.innerHeight};		// Object
+	}else if (!dojo.isOpera && dd && dd.clientWidth){
+		return {w: dd.clientWidth, h: dd.clientHeight};	// Object
+	}else if (b.clientWidth){
+		return {w: b.clientWidth, h: b.clientHeight};	// Object
+	}
+	return null;	// Object
+};
+
+dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
+dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
+
+dojo.dnd.V_AUTOSCROLL_VALUE = 16;
+dojo.dnd.H_AUTOSCROLL_VALUE = 16;
+
+dojo.dnd.autoScroll = function(e){
+	// summary:
+	//		a handler for onmousemove event, which scrolls the window, if
+	//		necesary
+	// e: Event:
+	//		onmousemove event
+
+	// FIXME: needs more docs!
+	var v = dojo.dnd.getViewport(), dx = 0, dy = 0;
+	if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
+		dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
+	}else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
+		dx = dojo.dnd.H_AUTOSCROLL_VALUE;
+	}
+	if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
+		dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
+	}else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
+		dy = dojo.dnd.V_AUTOSCROLL_VALUE;
+	}
+	window.scrollBy(dx, dy);
+};
+
+dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
+dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
+
+dojo.dnd.autoScrollNodes = function(e){
+	// summary:
+	//		a handler for onmousemove event, which scrolls the first avaialble
+	//		Dom element, it falls back to dojo.dnd.autoScroll()
+	// e: Event:
+	//		onmousemove event
+
+	// FIXME: needs more docs!
+	for(var n = e.target; n;){
+		if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
+			var s = dojo.getComputedStyle(n);
+			if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){
+				var b = dojo._getContentBox(n, s), t = dojo._abs(n, true);
+				// console.debug(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
+				b.l += t.x + n.scrollLeft;
+				b.t += t.y + n.scrollTop;
+				var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2), 
+					h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
+					rx = e.pageX - b.l, ry = e.pageY - b.t, dx = 0, dy = 0;
+				if(rx > 0 && rx < b.w){
+					if(rx < w){
+						dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
+					}else if(rx > b.w - w){
+						dx = dojo.dnd.H_AUTOSCROLL_VALUE;
+					}
+				}
+				//console.debug("ry =", ry, "b.h =", b.h, "h =", h);
+				if(ry > 0 && ry < b.h){
+					if(ry < h){
+						dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
+					}else if(ry > b.h - h){
+						dy = dojo.dnd.V_AUTOSCROLL_VALUE;
+					}
+				}
+				var oldLeft = n.scrollLeft, oldTop = n.scrollTop;
+				n.scrollLeft = n.scrollLeft + dx;
+				n.scrollTop  = n.scrollTop  + dy;
+				// if(dx || dy){ console.debug(oldLeft + ", " + oldTop + "\n" + dx + ", " + dy + "\n" + n.scrollLeft + ", " + n.scrollTop); }
+				if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; }
+			}
+		}
+		try{
+			n = n.parentNode;
+		}catch(x){
+			n = null;
+		}
+	}
+	dojo.dnd.autoScroll(e);
+};
+
+}
+
+if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Mover"] = true;
+dojo.provide("dojo.dnd.Mover");
+
+
+
+
+dojo.declare("dojo.dnd.Mover", null, {
+	constructor: function(node, e, host){
+		// summary: an object, which makes a node follow the mouse, 
+		//	used as a default mover, and as a base class for custom movers
+		// node: Node: a node (or node's id) to be moved
+		// e: Event: a mouse event, which started the move;
+		//	only pageX and pageY properties are used
+		// host: Object?: object which implements the functionality of the move,
+		//	 and defines proper events (onMoveStart and onMoveStop)
+		this.node = dojo.byId(node);
+		this.marginBox = {l: e.pageX, t: e.pageY};
+		this.mouseButton = e.button;
+		var h = this.host = host, d = node.ownerDocument, 
+			firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
+		this.events = [
+			dojo.connect(d, "onmousemove", this, "onMouseMove"),
+			dojo.connect(d, "onmouseup",   this, "onMouseUp"),
+			// cancel text selection and text dragging
+			dojo.connect(d, "ondragstart",   dojo, "stopEvent"),
+			dojo.connect(d, "onselectstart", dojo, "stopEvent"),
+			firstEvent
+		];
+		// notify that the move has started
+		if(h && h.onMoveStart){
+			h.onMoveStart(this);
+		}
+	},
+	// mouse event processors
+	onMouseMove: function(e){
+		// summary: event processor for onmousemove
+		// e: Event: mouse event
+		dojo.dnd.autoScroll(e);
+		var m = this.marginBox;
+		this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY});
+	},
+	onMouseUp: function(e){
+		if(this.mouseButton == e.button){
+			this.destroy();
+		}
+	},
+	// utilities
+	onFirstMove: function(){
+		// summary: makes the node absolute; it is meant to be called only once
+		var s = this.node.style, l, t;
+		switch(s.position){
+			case "relative":
+			case "absolute":
+				// assume that left and top values are in pixels already
+				l = Math.round(parseFloat(s.left));
+				t = Math.round(parseFloat(s.top));
+				break;
+			default:
+				s.position = "absolute";	// enforcing the absolute mode
+				var m = dojo.marginBox(this.node);
+				l = m.l;
+				t = m.t;
+				break;
+		}
+		this.marginBox.l = l - this.marginBox.l;
+		this.marginBox.t = t - this.marginBox.t;
+		this.host.onFirstMove(this);
+		dojo.disconnect(this.events.pop());
+	},
+	destroy: function(){
+		// summary: stops the move, deletes all references, so the object can be garbage-collected
+		dojo.forEach(this.events, dojo.disconnect);
+		// undo global settings
+		var h = this.host;
+		if(h && h.onMoveStop){
+			h.onMoveStop(this);
+		}
+		// destroy objects
+		this.events = this.node = null;
+	}
+});
+
+}
+
+if(!dojo._hasResource["dojo.dnd.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Moveable"] = true;
+dojo.provide("dojo.dnd.Moveable");
+
+
+
+dojo.declare("dojo.dnd.Moveable", null, {
+	// object attributes (for markup)
+	handle: "",
+	delay: 0,
+	skip: false,
+	
+	constructor: function(node, params){
+		// summary: an object, which makes a node moveable
+		// node: Node: a node (or node's id) to be moved
+		// params: Object: an optional object with additional parameters;
+		//	following parameters are recognized:
+		//		handle: Node: a node (or node's id), which is used as a mouse handle
+		//			if omitted, the node itself is used as a handle
+		//		delay: Number: delay move by this number of pixels
+		//		skip: Boolean: skip move of form elements
+		//		mover: Object: a constructor of custom Mover
+		this.node = dojo.byId(node);
+		if(!params){ params = {}; }
+		this.handle = params.handle ? dojo.byId(params.handle) : null;
+		if(!this.handle){ this.handle = this.node; }
+		this.delay = params.delay > 0 ? params.delay : 0;
+		this.skip  = params.skip;
+		this.mover = params.mover ? params.mover : dojo.dnd.Mover;
+		this.events = [
+			dojo.connect(this.handle, "onmousedown", this, "onMouseDown"),
+			// cancel text selection and text dragging
+			dojo.connect(this.handle, "ondragstart",   this, "onSelectStart"),
+			dojo.connect(this.handle, "onselectstart", this, "onSelectStart")
+		];
+	},
+
+	// markup methods
+	markupFactory: function(params, node){
+		return new dojo.dnd.Moveable(node, params);
+	},
+
+	// methods
+	destroy: function(){
+		// summary: stops watching for possible move, deletes all references, so the object can be garbage-collected
+		dojo.forEach(this.events, dojo.disconnect);
+		this.events = this.node = this.handle = null;
+	},
+	
+	// mouse event processors
+	onMouseDown: function(e){
+		// summary: event processor for onmousedown, creates a Mover for the node
+		// e: Event: mouse event
+		if(this.skip && dojo.dnd.isFormElement(e)){ return; }
+		if(this.delay){
+			this.events.push(dojo.connect(this.handle, "onmousemove", this, "onMouseMove"));
+			this.events.push(dojo.connect(this.handle, "onmouseup", this, "onMouseUp"));
+			this._lastX = e.pageX;
+			this._lastY = e.pageY;
+		}else{
+			new this.mover(this.node, e, this);
+		}
+		dojo.stopEvent(e);
+	},
+	onMouseMove: function(e){
+		// summary: event processor for onmousemove, used only for delayed drags
+		// e: Event: mouse event
+		if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
+			this.onMouseUp(e);
+			new this.mover(this.node, e, this);
+		}
+		dojo.stopEvent(e);
+	},
+	onMouseUp: function(e){
+		// summary: event processor for onmouseup, used only for delayed delayed drags
+		// e: Event: mouse event
+		dojo.disconnect(this.events.pop());
+		dojo.disconnect(this.events.pop());
+	},
+	onSelectStart: function(e){
+		// summary: event processor for onselectevent and ondragevent
+		// e: Event: mouse event
+		if(!this.skip || !dojo.dnd.isFormElement(e)){
+			dojo.stopEvent(e);
+		}
+	},
+	
+	// local events
+	onMoveStart: function(/* dojo.dnd.Mover */ mover){
+		// summary: called before every move operation
+		dojo.publish("/dnd/move/start", [mover]);
+		dojo.addClass(dojo.body(), "dojoMove"); 
+		dojo.addClass(this.node, "dojoMoveItem"); 
+	},
+	onMoveStop: function(/* dojo.dnd.Mover */ mover){
+		// summary: called after every move operation
+		dojo.publish("/dnd/move/stop", [mover]);
+		dojo.removeClass(dojo.body(), "dojoMove");
+		dojo.removeClass(this.node, "dojoMoveItem");
+	},
+	onFirstMove: function(/* dojo.dnd.Mover */ mover){
+		// summary: called during the very first move notification,
+		//	can be used to initialize coordinates, can be overwritten.
+		
+		// default implementation does nothing
+	},
+	onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+		// summary: called during every move notification,
+		//	should actually move the node, can be overwritten.
+		this.onMoving(mover, leftTop);
+		var s = mover.node.style;
+		s.left = leftTop.l + "px";
+		s.top  = leftTop.t + "px";
+		this.onMoved(mover, leftTop);
+	},
+	onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+		// summary: called before every incremental move,
+		//	can be overwritten.
+		
+		// default implementation does nothing
+	},
+	onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+		// summary: called after every incremental move,
+		//	can be overwritten.
+		
+		// default implementation does nothing
+	}
+});
+
+}
+
+if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.TimedMoveable"] = true;
+dojo.provide("dojo.dnd.TimedMoveable");
+
+
+
+(function(){
+	// precalculate long expressions
+	var oldOnMove = dojo.dnd.Moveable.prototype.onMove;
+		
+	dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, {
+		// summary:
+		//	A specialized version of Moveable to support an FPS throttling.
+		//	This class puts an upper restriction on FPS, which may reduce 
+		//	the CPU load. The additional parameter "timeout" regulates
+		//	the delay before actually moving the moveable object.
+		
+		// object attributes (for markup)
+		timeout: 40,	// in ms, 40ms corresponds to 25 fps
+	
+		constructor: function(node, params){
+			// summary: an object, which makes a node moveable with a timer
+			// node: Node: a node (or node's id) to be moved
+			// params: Object: an optional object with additional parameters.
+			//	See dojo.dnd.Moveable for details on general parameters.
+			//	Following parameters are specific for this class:
+			//		timeout: Number: delay move by this number of ms
+			//			accumulating position changes during the timeout
+			
+			// sanitize parameters
+			if(!params){ params = {}; }
+			if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){
+				this.timeout = params.timeout;
+			}
+		},
+	
+		// markup methods
+		markupFactory: function(params, node){
+			return new dojo.dnd.TimedMoveable(node, params);
+		},
+	
+		onMoveStop: function(/* dojo.dnd.Mover */ mover){
+			if(mover._timer){
+				// stop timer
+				clearTimeout(mover._timer)
+				// reflect the last received position
+				oldOnMove.call(this, mover, mover._leftTop)
+			}
+			dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments);
+		},
+		onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+			mover._leftTop = leftTop;
+			if(!mover._timer){
+				var _t = this;	// to avoid using dojo.hitch()
+				mover._timer = setTimeout(function(){
+					// we don't have any pending requests
+					mover._timer = null;
+					// reflect the last received position
+					oldOnMove.call(_t, mover, mover._leftTop);
+				}, this.timeout);
+			}
+		}
+	});
+})();
+
+}
+
+if(!dojo._hasResource["dojo.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.fx"] = true;
+dojo.provide("dojo.fx");
+dojo.provide("dojo.fx.Toggler");
+
+/*=====
+dojo.fx = {
+	// summary: Effects library on top of Base animations
+};
+=====*/
+
+(function(){
+	var _baseObj = {
+			_fire: function(evt, args){
+				if(this[evt]){
+					this[evt].apply(this, args||[]);
+				}
+				return this;
+			}
+		};
+
+	var _chain = function(animations){
+		this._index = -1;
+		this._animations = animations||[];
+		this._current = this._onAnimateCtx = this._onEndCtx = null;
+
+		this.duration = 0;
+		dojo.forEach(this._animations, function(a){
+			this.duration += a.duration;
+			if(a.delay){ this.duration += a.delay; }
+		}, this);
+	};
+	dojo.extend(_chain, {
+		_onAnimate: function(){
+			this._fire("onAnimate", arguments);
+		},
+		_onEnd: function(){
+			dojo.disconnect(this._onAnimateCtx);
+			dojo.disconnect(this._onEndCtx);
+			this._onAnimateCtx = this._onEndCtx = null;
+			if(this._index + 1 == this._animations.length){
+				this._fire("onEnd");
+			}else{
+				// switch animations
+				this._current = this._animations[++this._index];
+				this._onAnimateCtx = dojo.connect(this._current, "onAnimate", this, "_onAnimate");
+				this._onEndCtx = dojo.connect(this._current, "onEnd", this, "_onEnd");
+				this._current.play(0, true);
+			}
+		},
+		play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+			if(!this._current){ this._current = this._animations[this._index = 0]; }
+			if(!gotoStart && this._current.status() == "playing"){ return this; }
+			var beforeBegin = dojo.connect(this._current, "beforeBegin", this, function(){
+					this._fire("beforeBegin");
+				}),
+				onBegin = dojo.connect(this._current, "onBegin", this, function(arg){
+					this._fire("onBegin", arguments);
+				}),
+				onPlay = dojo.connect(this._current, "onPlay", this, function(arg){
+					this._fire("onPlay", arguments);
+					dojo.disconnect(beforeBegin);
+					dojo.disconnect(onBegin);
+					dojo.disconnect(onPlay);
+				});
+			if(this._onAnimateCtx){
+				dojo.disconnect(this._onAnimateCtx);
+			}
+			this._onAnimateCtx = dojo.connect(this._current, "onAnimate", this, "_onAnimate");
+			if(this._onEndCtx){
+				dojo.disconnect(this._onEndCtx);
+			}
+			this._onEndCtx = dojo.connect(this._current, "onEnd", this, "_onEnd");
+			this._current.play.apply(this._current, arguments);
+			return this;
+		},
+		pause: function(){
+			if(this._current){
+				var e = dojo.connect(this._current, "onPause", this, function(arg){
+						this._fire("onPause", arguments);
+						dojo.disconnect(e);
+					});
+				this._current.pause();
+			}
+			return this;
+		},
+		gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
+			this.pause();
+			var offset = this.duration * percent;
+			this._current = null;
+			dojo.some(this._animations, function(a){
+				if(a.duration <= offset){
+					this._current = a;
+					return true;
+				}
+				offset -= a.duration;
+				return false;
+			});
+			if(this._current){
+				this._current.gotoPercent(offset / _current.duration, andPlay);
+			}
+			return this;
+		},
+		stop: function(/*boolean?*/ gotoEnd){
+			if(this._current){
+				if(gotoEnd){
+					for(; this._index + 1 < this._animations.length; ++this._index){
+						this._animations[this._index].stop(true);
+					}
+					this._current = this._animations[this._index];
+				}
+				var e = dojo.connect(this._current, "onStop", this, function(arg){
+						this._fire("onStop", arguments);
+						dojo.disconnect(e);
+					});
+				this._current.stop();
+			}
+			return this;
+		},
+		status: function(){
+			return this._current ? this._current.status() : "stopped";
+		},
+		destroy: function(){
+			if(this._onAnimateCtx){ dojo.disconnect(this._onAnimateCtx); }
+			if(this._onEndCtx){ dojo.disconnect(this._onEndCtx); }
+		}
+	});
+	dojo.extend(_chain, _baseObj);
+
+	dojo.fx.chain = function(/*dojo._Animation[]*/ animations){
+		// summary: Chain a list of dojo._Animation s to run in sequence
+		// example:
+		//	|	dojo.fx.chain([
+		//	|		dojo.fadeIn({ node:node }),
+		//	|		dojo.fadeOut({ node:otherNode })
+		//	|	]).play();
+		//
+		return new _chain(animations) // dojo._Animation
+	};
+
+	var _combine = function(animations){
+		this._animations = animations||[];
+		this._connects = [];
+		this._finished = 0;
+
+		this.duration = 0;
+		dojo.forEach(animations, function(a){
+			var duration = a.duration;
+			if(a.delay){ duration += a.delay; }
+			if(this.duration < duration){ this.duration = duration; }
+			this._connects.push(dojo.connect(a, "onEnd", this, "_onEnd"));
+		}, this);
+		
+		this._pseudoAnimation = new dojo._Animation({curve: [0, 1], duration: this.duration});
+		dojo.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop"], 
+			function(evt){
+				this._connects.push(dojo.connect(this._pseudoAnimation, evt, dojo.hitch(this, "_fire", evt)));
+			},
+			this
+		);
+	};
+	dojo.extend(_combine, {
+		_doAction: function(action, args){
+			dojo.forEach(this._animations, function(a){
+				a[action].apply(a, args);
+			});
+			return this;
+		},
+		_onEnd: function(){
+			if(++this._finished == this._animations.length){
+				this._fire("onEnd");
+			}
+		},
+		_call: function(action, args){
+			var t = this._pseudoAnimation;
+			t[action].apply(t, args);
+		},
+		play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+			this._finished = 0;
+			this._doAction("play", arguments);
+			this._call("play", arguments);
+			return this;
+		},
+		pause: function(){
+			this._doAction("pause", arguments);
+			this._call("pause", arguments);
+			return this;
+		},
+		gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
+			var ms = this.duration * percent;
+			dojo.forEach(this._animations, function(a){
+				a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay);
+			});
+			this._call("gotoProcent", arguments);
+			return this;
+		},
+		stop: function(/*boolean?*/ gotoEnd){
+			this._doAction("stop", arguments);
+			this._call("stop", arguments);
+			return this;
+		},
+		status: function(){
+			return this._pseudoAnimation.status();
+		},
+		destroy: function(){
+			dojo.forEach(this._connects, dojo.disconnect);
+		}
+	});
+	dojo.extend(_combine, _baseObj);
+
+	dojo.fx.combine = function(/*dojo._Animation[]*/ animations){
+		// summary: Combine a list of dojo._Animation s to run in parallel
+		// example:
+		//	|	dojo.fx.combine([
+		//	|		dojo.fadeIn({ node:node }),
+		//	|		dojo.fadeOut({ node:otherNode })
+		//	|	]).play();
+		return new _combine(animations); // dojo._Animation
+	};
+})();
+
+dojo.declare("dojo.fx.Toggler", null, {
+	// summary:
+	//		class constructor for an animation toggler. It accepts a packed
+	//		set of arguments about what type of animation to use in each
+	//		direction, duration, etc.
+	//
+	// example:
+	//	|	var t = new dojo.fx.Toggler({
+	//	|		node: "nodeId",
+	//	|		showDuration: 500,
+	//	|		// hideDuration will default to "200"
+	//	|		showFunc: dojo.wipeIn, 
+	//	|		// hideFunc will default to "fadeOut"
+	//	|	});
+	//	|	t.show(100); // delay showing for 100ms
+	//	|	// ...time passes...
+	//	|	t.hide();
+
+	// FIXME: need a policy for where the toggler should "be" the next
+	// time show/hide are called if we're stopped somewhere in the
+	// middle.
+
+	constructor: function(args){
+		var _t = this;
+
+		dojo.mixin(_t, args);
+		_t.node = args.node;
+		_t._showArgs = dojo.mixin({}, args);
+		_t._showArgs.node = _t.node;
+		_t._showArgs.duration = _t.showDuration;
+		_t.showAnim = _t.showFunc(_t._showArgs);
+
+		_t._hideArgs = dojo.mixin({}, args);
+		_t._hideArgs.node = _t.node;
+		_t._hideArgs.duration = _t.hideDuration;
+		_t.hideAnim = _t.hideFunc(_t._hideArgs);
+
+		dojo.connect(_t.showAnim, "beforeBegin", dojo.hitch(_t.hideAnim, "stop", true));
+		dojo.connect(_t.hideAnim, "beforeBegin", dojo.hitch(_t.showAnim, "stop", true));
+	},
+
+	// node: DomNode
+	//	the node to toggle
+	node: null,
+
+	// showFunc: Function
+	//	The function that returns the dojo._Animation to show the node
+	showFunc: dojo.fadeIn,
+
+	// hideFunc: Function	
+	//	The function that returns the dojo._Animation to hide the node
+	hideFunc: dojo.fadeOut,
+
+	// showDuration:
+	//	Time in milliseconds to run the show Animation
+	showDuration: 200,
+
+	// hideDuration:
+	//	Time in milliseconds to run the hide Animation
+	hideDuration: 200,
+
+	/*=====
+	_showArgs: null,
+	_showAnim: null,
+
+	_hideArgs: null,
+	_hideAnim: null,
+
+	_isShowing: false,
+	_isHiding: false,
+	=====*/
+
+	show: function(delay){
+		// summary: Toggle the node to showing
+		return this.showAnim.play(delay || 0);
+	},
+
+	hide: function(delay){
+		// summary: Toggle the node to hidden
+		return this.hideAnim.play(delay || 0);
+	}
+});
+
+dojo.fx.wipeIn = function(/*Object*/ args){
+	// summary
+	//		Returns an animation that will expand the
+	//		node defined in 'args' object from it's current height to
+	//		it's natural height (with no scrollbar).
+	//		Node must have no margin/border/padding.
+	args.node = dojo.byId(args.node);
+	var node = args.node, s = node.style;
+
+	var anim = dojo.animateProperty(dojo.mixin({
+		properties: {
+			height: {
+				// wrapped in functions so we wait till the last second to query (in case value has changed)
+				start: function(){
+					// start at current [computed] height, but use 1px rather than 0
+					// because 0 causes IE to display the whole panel
+					s.overflow="hidden";
+					if(s.visibility=="hidden"||s.display=="none"){
+						s.height="1px";
+						s.display="";
+						s.visibility="";
+						return 1;
+					}else{
+						var height = dojo.style(node, "height");
+						return Math.max(height, 1);
+					}
+				},
+				end: function(){
+					return node.scrollHeight;
+				}
+			}
+		}
+	}, args));
+
+	dojo.connect(anim, "onEnd", function(){ 
+		s.height = "auto";
+	});
+
+	return anim; // dojo._Animation
+}
+
+dojo.fx.wipeOut = function(/*Object*/ args){
+	// summary
+	//		Returns an animation that will shrink node defined in "args"
+	//		from it's current height to 1px, and then hide it.
+	var node = args.node = dojo.byId(args.node);
+	var s = node.style;
+
+	var anim = dojo.animateProperty(dojo.mixin({
+		properties: {
+			height: {
+				end: 1 // 0 causes IE to display the whole panel
+			}
+		}
+	}, args));
+
+	dojo.connect(anim, "beforeBegin", function(){
+		s.overflow = "hidden";
+		s.display = "";
+	});
+	dojo.connect(anim, "onEnd", function(){
+		s.height = "auto";
+		s.display = "none";
+	});
+
+	return anim; // dojo._Animation
+}
+
+dojo.fx.slideTo = function(/*Object?*/ args){
+	// summary
+	//		Returns an animation that will slide "node" 
+	//		defined in args Object from its current position to
+	//		the position defined by (args.left, args.top).
+	// example:
+	//	|	dojo.fx.slideTo({ node: node, left:"40", top:"50", unit:"px" }).play()
+
+	var node = (args.node = dojo.byId(args.node));
+	
+	var top = null;
+	var left = null;
+	
+	var init = (function(n){
+		return function(){
+			var cs = dojo.getComputedStyle(n);
+			var pos = cs.position;
+			top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0);
+			left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0);
+			if(pos != 'absolute' && pos != 'relative'){
+				var ret = dojo.coords(n, true);
+				top = ret.y;
+				left = ret.x;
+				n.style.position="absolute";
+				n.style.top=top+"px";
+				n.style.left=left+"px";
+			}
+		};
+	})(node);
+	init();
+
+	var anim = dojo.animateProperty(dojo.mixin({
+		properties: {
+			top: { end: args.top||0 },
+			left: { end: args.left||0 }
+		}
+	}, args));
+	dojo.connect(anim, "beforeBegin", anim, init);
+
+	return anim; // dojo._Animation
+}
+
+}
+
+if(!dojo._hasResource["dijit.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.ContentPane"] = true;
+dojo.provide("dijit.layout.ContentPane");
+
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit.layout.ContentPane",
+	dijit._Widget,
+{
+	// summary:
+	//		A widget that acts as a Container for other widgets, and includes a ajax interface
+	// description:
+	//		A widget that can be used as a standalone widget
+	//		or as a baseclass for other widgets
+	//		Handles replacement of document fragment using either external uri or javascript
+	//		generated markup or DOM content, instantiating widgets within that content.
+	//		Don't confuse it with an iframe, it only needs/wants document fragments.
+	//		It's useful as a child of LayoutContainer, SplitContainer, or TabContainer.
+	//		But note that those classes can contain any widget as a child.
+	// example:
+	//		Some quick samples:
+	//		To change the innerHTML use .setContent('<b>new content</b>')
+	//
+	//		Or you can send it a NodeList, .setContent(dojo.query('div [class=selected]', userSelection))
+	//		please note that the nodes in NodeList will copied, not moved
+	//
+	//		To do a ajax update use .setHref('url')
+	//
+	// href: String
+	//		The href of the content that displays now.
+	//		Set this at construction if you want to load data externally when the
+	//		pane is shown.  (Set preload=true to load it immediately.)
+	//		Changing href after creation doesn't have any effect; see setHref();
+	href: "",
+
+	// extractContent: Boolean
+	//	Extract visible content from inside of <body> .... </body>
+	extractContent: false,
+
+	// parseOnLoad: Boolean
+	//	parse content and create the widgets, if any
+	parseOnLoad:	true,
+
+	// preventCache: Boolean
+	//		Cache content retreived externally
+	preventCache:	false,
+
+	// preload: Boolean
+	//	Force load of data even if pane is hidden.
+	preload: false,
+
+	// refreshOnShow: Boolean
+	//		Refresh (re-download) content when pane goes from hidden to shown
+	refreshOnShow: false,
+
+	// loadingMessage: String
+	//	Message that shows while downloading
+	loadingMessage: "<span class='dijitContentPaneLoading'>${loadingState}</span>", 
+
+	// errorMessage: String
+	//	Message that shows if an error occurs
+	errorMessage: "<span class='dijitContentPaneError'>${errorState}</span>", 
+
+	// isLoaded: Boolean
+	//	Tells loading status see onLoad|onUnload for event hooks
+	isLoaded: false,
+
+	// class: String
+	//	Class name to apply to ContentPane dom nodes
+	// TODO: this should be called "baseClass" like in the other widgets
+	"class": "dijitContentPane",
+
+	// doLayout: String/Boolean
+	//	false - don't adjust size of children
+	//	true - looks for the first sizable child widget (ie, having resize() method) and sets it's size to
+	//			however big the ContentPane is (TODO: implement)
+	//	auto - if there is a single sizable child widget (ie, having resize() method), set it's size to
+	//			however big the ContentPane is
+	doLayout: "auto",
+
+	postCreate: function(){
+		// remove the title attribute so it doesn't show up when i hover
+		// over a node
+		this.domNode.title = "";
+
+		if(!this.containerNode){
+			// make getDescendants() work
+			this.containerNode = this.domNode;
+		}
+
+		if(this.preload){
+			this._loadCheck();
+		}
+
+		var messages = dojo.i18n.getLocalization("dijit", "loading", this.lang);
+		this.loadingMessage = dojo.string.substitute(this.loadingMessage, messages);
+		this.errorMessage = dojo.string.substitute(this.errorMessage, messages);
+		var curRole = dijit.getWaiRole(this.domNode);
+		if (!curRole){
+			dijit.setWaiRole(this.domNode, "group");
+		}
+
+		// for programatically created ContentPane (with <span> tag), need to muck w/CSS
+		// or it's as though overflow:visible is set
+		dojo.addClass(this.domNode, this["class"]);
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+		if(this.doLayout != "false" && this.doLayout !== false){
+			this._checkIfSingleChild();
+			if(this._singleChild){
+				this._singleChild.startup();
+			}
+		}
+		this._loadCheck();
+		this.inherited(arguments);
+	},
+
+	_checkIfSingleChild: function(){
+		// summary:
+		// 	Test if we have exactly one widget as a child, and if so assume that we are a container for that widget,
+		//	and should propogate startup() and resize() calls to it.
+
+		// TODO: if there are two child widgets (a data store and a TabContainer, for example),
+		//	should still find the TabContainer
+		var childNodes = dojo.query(">", this.containerNode || this.domNode),
+			childWidgets = childNodes.filter("[widgetId]");
+
+		if(childNodes.length == 1 && childWidgets.length == 1){
+			this.isContainer = true;
+			this._singleChild = dijit.byNode(childWidgets[0]);
+		}else{
+			delete this.isContainer;
+			delete this._singleChild;
+		}
+	},
+
+	refresh: function(){
+		// summary:
+		//	Force a refresh (re-download) of content, be sure to turn off cache
+
+		// we return result of _prepareLoad here to avoid code dup. in dojox.layout.ContentPane
+		return this._prepareLoad(true);
+	},
+
+	setHref: function(/*String|Uri*/ href){
+		// summary:
+		//		Reset the (external defined) content of this pane and replace with new url
+		//		Note: It delays the download until widget is shown if preload is false
+		//	href:
+		//		url to the page you want to get, must be within the same domain as your mainpage
+		this.href = href;
+
+		// we return result of _prepareLoad here to avoid code dup. in dojox.layout.ContentPane
+		return this._prepareLoad();
+	},
+
+	setContent: function(/*String|DomNode|Nodelist*/data){
+		// summary:
+		//		Replaces old content with data content, include style classes from old content
+		//	data:
+		//		the new Content may be String, DomNode or NodeList
+		//
+		//		if data is a NodeList (or an array of nodes) nodes are copied
+		//		so you can import nodes from another document implicitly
+
+		// clear href so we cant run refresh and clear content
+		// refresh should only work if we downloaded the content
+		if(!this._isDownloaded){
+			this.href = "";
+			this._onUnloadHandler();
+		}
+
+		this._setContent(data || "");
+
+		this._isDownloaded = false; // must be set after _setContent(..), pathadjust in dojox.layout.ContentPane
+
+		if(this.parseOnLoad){
+			this._createSubWidgets();
+		}
+
+		if(this.doLayout != "false" && this.doLayout !== false){
+			this._checkIfSingleChild();
+			if(this._singleChild && this._singleChild.resize){
+				this._singleChild.startup();
+				this._singleChild.resize(this._contentBox || dojo.contentBox(this.containerNode || this.domNode));
+			}
+		}
+
+		this._onLoadHandler();
+	},
+
+	cancel: function(){
+		// summary:
+		//		Cancels a inflight download of content
+		if(this._xhrDfd && (this._xhrDfd.fired == -1)){
+			this._xhrDfd.cancel();
+		}
+		delete this._xhrDfd; // garbage collect
+	},
+
+	destroy: function(){
+		// if we have multiple controllers destroying us, bail after the first
+		if(this._beingDestroyed){
+			return;
+		}
+		// make sure we call onUnload
+		this._onUnloadHandler();
+		this._beingDestroyed = true;
+		this.inherited("destroy",arguments);
+	},
+
+	resize: function(size){
+		dojo.marginBox(this.domNode, size);
+
+		// Compute content box size in case we [later] need to size child
+		// If either height or width wasn't specified by the user, then query node for it.
+		// But note that setting the margin box and then immediately querying dimensions may return
+		// inaccurate results, so try not to depend on it.
+		var node = this.containerNode || this.domNode,
+			mb = dojo.mixin(dojo.marginBox(node), size||{});
+
+		this._contentBox = dijit.layout.marginBox2contentBox(node, mb);
+
+		// If we have a single widget child then size it to fit snugly within my borders
+		if(this._singleChild && this._singleChild.resize){
+			this._singleChild.resize(this._contentBox);
+		}
+	},
+
+	_prepareLoad: function(forceLoad){
+		// sets up for a xhrLoad, load is deferred until widget onShow
+		// cancels a inflight download
+		this.cancel();
+		this.isLoaded = false;
+		this._loadCheck(forceLoad);
+	},
+
+	_isShown: function(){
+		// summary: returns true if the content is currently shown
+		if("open" in this){
+			return this.open;		// for TitlePane, etc.
+		}else{
+			var node = this.domNode;
+			return (node.style.display != 'none')  && (node.style.visibility != 'hidden');
+		}
+	},
+
+	_loadCheck: function(/*Boolean*/ forceLoad){
+		// call this when you change onShow (onSelected) status when selected in parent container
+		// it's used as a trigger for href download when this.domNode.display != 'none'
+
+		// sequence:
+		// if no href -> bail
+		// forceLoad -> always load
+		// this.preload -> load when download not in progress, domNode display doesn't matter
+		// this.refreshOnShow -> load when download in progress bails, domNode display !='none' AND
+		//						this.open !== false (undefined is ok), isLoaded doesn't matter
+		// else -> load when download not in progress, if this.open !== false (undefined is ok) AND
+		//						domNode display != 'none', isLoaded must be false
+
+		var displayState = this._isShown();
+
+		if(this.href &&	
+			(forceLoad ||
+				(this.preload && !this._xhrDfd) ||
+				(this.refreshOnShow && displayState && !this._xhrDfd) ||
+				(!this.isLoaded && displayState && !this._xhrDfd)
+			)
+		){
+			this._downloadExternalContent();
+		}
+	},
+
+	_downloadExternalContent: function(){
+		this._onUnloadHandler();
+
+		// display loading message
+		this._setContent(
+			this.onDownloadStart.call(this)
+		);
+
+		var self = this;
+		var getArgs = {
+			preventCache: (this.preventCache || this.refreshOnShow),
+			url: this.href,
+			handleAs: "text"
+		};
+		if(dojo.isObject(this.ioArgs)){
+			dojo.mixin(getArgs, this.ioArgs);
+		}
+
+		var hand = this._xhrDfd = (this.ioMethod || dojo.xhrGet)(getArgs);
+
+		hand.addCallback(function(html){
+			try{
+				self.onDownloadEnd.call(self);
+				self._isDownloaded = true;
+				self.setContent.call(self, html); // onload event is called from here
+			}catch(err){
+				self._onError.call(self, 'Content', err); // onContentError
+			}
+			delete self._xhrDfd;
+			return html;
+		});
+
+		hand.addErrback(function(err){
+			if(!hand.cancelled){
+				// show error message in the pane
+				self._onError.call(self, 'Download', err); // onDownloadError
+			}
+			delete self._xhrDfd;
+			return err;
+		});
+	},
+
+	_onLoadHandler: function(){
+		this.isLoaded = true;
+		try{
+			this.onLoad.call(this);
+		}catch(e){
+			console.error('Error '+this.widgetId+' running custom onLoad code');
+		}
+	},
+
+	_onUnloadHandler: function(){
+		this.isLoaded = false;
+		this.cancel();
+		try{
+			this.onUnload.call(this);
+		}catch(e){
+			console.error('Error '+this.widgetId+' running custom onUnload code');
+		}
+	},
+
+	_setContent: function(cont){
+		this.destroyDescendants();
+
+		try{
+			var node = this.containerNode || this.domNode;
+			while(node.firstChild){
+				dojo._destroyElement(node.firstChild);
+			}
+			if(typeof cont == "string"){
+				// dijit.ContentPane does only minimal fixes,
+				// No pathAdjustments, script retrieval, style clean etc
+				// some of these should be available in the dojox.layout.ContentPane
+				if(this.extractContent){
+					match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+					if(match){ cont = match[1]; }
+				}
+				node.innerHTML = cont;
+			}else{
+				// domNode or NodeList
+				if(cont.nodeType){ // domNode (htmlNode 1 or textNode 3)
+					node.appendChild(cont);
+				}else{// nodelist or array such as dojo.Nodelist
+					dojo.forEach(cont, function(n){
+						node.appendChild(n.cloneNode(true));
+					});
+				}
+			}
+		}catch(e){
+			// check if a domfault occurs when we are appending this.errorMessage
+			// like for instance if domNode is a UL and we try append a DIV
+			var errMess = this.onContentError(e);
+			try{
+				node.innerHTML = errMess;
+			}catch(e){
+				console.error('Fatal '+this.id+' could not change content due to '+e.message, e);
+			}
+		}
+	},
+
+	_onError: function(type, err, consoleText){
+		// shows user the string that is returned by on[type]Error
+		// overide on[type]Error and return your own string to customize
+		var errText = this['on' + type + 'Error'].call(this, err);
+		if(consoleText){
+			console.error(consoleText, err);
+		}else if(errText){// a empty string won't change current content
+			this._setContent.call(this, errText);
+		}
+	},
+
+	_createSubWidgets: function(){
+		// summary: scan my contents and create subwidgets
+		var rootNode = this.containerNode || this.domNode;
+		try{
+			dojo.parser.parse(rootNode, true);
+		}catch(e){
+			this._onError('Content', e, "Couldn't create widgets in "+this.id
+				+(this.href ? " from "+this.href : ""));
+		}
+	},
+
+	// EVENT's, should be overide-able
+	onLoad: function(e){
+		// summary:
+		//		Event hook, is called after everything is loaded and widgetified
+	},
+
+	onUnload: function(e){
+		// summary:
+		//		Event hook, is called before old content is cleared
+	},
+
+	onDownloadStart: function(){
+		// summary:
+		//		called before download starts
+		//		the string returned by this function will be the html
+		//		that tells the user we are loading something
+		//		override with your own function if you want to change text
+		return this.loadingMessage;
+	},
+
+	onContentError: function(/*Error*/ error){
+		// summary:
+		//		called on DOM faults, require fault etc in content
+		//		default is to display errormessage inside pane
+	},
+
+	onDownloadError: function(/*Error*/ error){
+		// summary:
+		//		Called when download error occurs, default is to display
+		//		errormessage inside pane. Overide function to change that.
+		//		The string returned by this function will be the html
+		//		that tells the user a error happend
+		return this.errorMessage;
+	},
+
+	onDownloadEnd: function(){
+		// summary:
+		//		called when download is finished
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.form.Form"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Form"] = true;
+dojo.provide("dijit.form.Form");
+
+
+
+
+dojo.declare("dijit.form._FormMixin", null,
+	{
+	//
+	//	summary:
+	//		Widget corresponding to HTML form tag, for validation and serialization
+	//
+	//	example:
+	//	|	<form dojoType="dijit.form.Form" id="myForm">
+	//	|		Name: <input type="text" name="name" />
+	//	|	</form>
+	//	|	myObj = {name: "John Doe"};
+	//	|	dijit.byId('myForm').setValues(myObj);
+	//	|
+	//	|	myObj=dijit.byId('myForm').getValues();
+
+	//	TODO:
+	//	* Repeater
+	//	* better handling for arrays.  Often form elements have names with [] like
+	//	* people[3].sex (for a list of people [{name: Bill, sex: M}, ...])
+	//
+	//	
+
+		reset: function(){
+			dojo.forEach(this.getDescendants(), function(widget){
+				if(widget.reset){
+					widget.reset();
+				}
+			});
+		},
+
+		validate: function(){
+			// summary: returns if the form is valid - same as isValid - but
+			//			provides a few additional (ui-specific) features.
+			//			1 - it will highlight any sub-widgets that are not
+			//				valid
+			//			2 - it will call focus() on the first invalid 
+			//				sub-widget
+			var didFocus = false;
+			return dojo.every(dojo.map(this.getDescendants(), function(widget){
+				// Need to set this so that "required" widgets get their 
+				// state set.
+				widget._hasBeenBlurred = true;
+				var valid = !widget.validate || widget.validate();
+				if (!valid && !didFocus) {
+					// Set focus of the first non-valid widget
+					dijit.scrollIntoView(widget.containerNode||widget.domNode);
+					widget.focus();
+					didFocus = true;
+				}
+	 			return valid;
+	 		}), "return item;");
+		},
+		
+		setValues: function(/*object*/obj){
+			// summary: fill in form values from a JSON structure
+
+			// generate map from name --> [list of widgets with that name]
+			var map = { };
+			dojo.forEach(this.getDescendants(), function(widget){
+				if(!widget.name){ return; }
+				var entry = map[widget.name] || (map[widget.name] = [] );
+				entry.push(widget);
+			});
+
+			// call setValue() or setAttribute('checked') for each widget, according to obj
+			for(var name in map){
+				var widgets = map[name],						// array of widgets w/this name
+					values = dojo.getObject(name, false, obj);	// list of values for those widgets
+				if(!dojo.isArray(values)){
+					values = [ values ];
+				}
+				if(typeof widgets[0].checked == 'boolean'){
+					// for checkbox/radio, values is a list of which widgets should be checked
+					dojo.forEach(widgets, function(w, i){
+						w.setValue(dojo.indexOf(values, w.value) != -1);
+					});
+				}else if(widgets[0]._multiValue){
+					// it takes an array (e.g. multi-select)
+					widgets[0].setValue(values);
+				}else{
+					// otherwise, values is a list of values to be assigned sequentially to each widget
+					dojo.forEach(widgets, function(w, i){
+						w.setValue(values[i]);
+					});					
+				}
+			}
+
+			/***
+			 * 	TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets)
+
+			dojo.forEach(this.containerNode.elements, function(element){
+				if (element.name == ''){return};	// like "continue"	
+				var namePath = element.name.split(".");
+				var myObj=obj;
+				var name=namePath[namePath.length-1];
+				for(var j=1,len2=namePath.length;j<len2;++j){
+					var p=namePath[j - 1];
+					// repeater support block
+					var nameA=p.split("[");
+					if (nameA.length > 1){
+						if(typeof(myObj[nameA[0]]) == "undefined"){
+							myObj[nameA[0]]=[ ];
+						} // if
+
+						nameIndex=parseInt(nameA[1]);
+						if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){
+							myObj[nameA[0]][nameIndex] = { };
+						}
+						myObj=myObj[nameA[0]][nameIndex];
+						continue;
+					} // repeater support ends
+
+					if(typeof(myObj[p]) == "undefined"){
+						myObj=undefined;
+						break;
+					};
+					myObj=myObj[p];
+				}
+
+				if (typeof(myObj) == "undefined"){
+					return;		// like "continue"
+				}
+				if (typeof(myObj[name]) == "undefined" && this.ignoreNullValues){
+					return;		// like "continue"
+				}
+
+				// TODO: widget values (just call setValue() on the widget)
+
+				switch(element.type){
+					case "checkbox":
+						element.checked = (name in myObj) &&
+							dojo.some(myObj[name], function(val){ return val==element.value; });
+						break;
+					case "radio":
+						element.checked = (name in myObj) && myObj[name]==element.value;
+						break;
+					case "select-multiple":
+						element.selectedIndex=-1;
+						dojo.forEach(element.options, function(option){
+							option.selected = dojo.some(myObj[name], function(val){ return option.value == val; });
+						});
+						break;
+					case "select-one":
+						element.selectedIndex="0";
+						dojo.forEach(element.options, function(option){
+							option.selected = option.value == myObj[name];
+						});
+						break;
+					case "hidden":
+					case "text":
+					case "textarea":
+					case "password":
+						element.value = myObj[name] || "";
+						break;
+				}
+	  		});
+	  		*/
+		},
+
+		getValues: function(){
+			// summary: generate JSON structure from form values
+
+			// get widget values
+			var obj = { };
+			dojo.forEach(this.getDescendants(), function(widget){
+				var name = widget.name;
+				if(!name){ return; }
+
+				// Single value widget (checkbox, radio, or plain <input> type widget
+				var value = (widget.getValue && !widget._getValueDeprecated) ? widget.getValue() : widget.value;
+
+				// Store widget's value(s) as a scalar, except for checkboxes which are automatically arrays
+				if(typeof widget.checked == 'boolean'){
+					if(/Radio/.test(widget.declaredClass)){
+						// radio button
+						if(value !== false){
+							dojo.setObject(name, value, obj);
+						}
+					}else{
+						// checkbox/toggle button
+						var ary=dojo.getObject(name, false, obj);
+						if(!ary){
+							ary=[];
+							dojo.setObject(name, ary, obj);
+						}
+						if(value !== false){
+							ary.push(value);
+						}
+					}
+				}else{
+					// plain input
+					dojo.setObject(name, value, obj);
+				}
+			});
+
+			/***
+			 * code for plain input boxes (see also dojo.formToObject, can we use that instead of this code?
+			 * but it doesn't understand [] notation, presumably)
+			var obj = { };
+			dojo.forEach(this.containerNode.elements, function(elm){
+				if (!elm.name)	{
+					return;		// like "continue"
+				}
+				var namePath = elm.name.split(".");
+				var myObj=obj;
+				var name=namePath[namePath.length-1];
+				for(var j=1,len2=namePath.length;j<len2;++j){
+					var nameIndex = null;
+					var p=namePath[j - 1];
+					var nameA=p.split("[");
+					if (nameA.length > 1){
+						if(typeof(myObj[nameA[0]]) == "undefined"){
+							myObj[nameA[0]]=[ ];
+						} // if
+						nameIndex=parseInt(nameA[1]);
+						if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){
+							myObj[nameA[0]][nameIndex] = { };
+						}
+					} else if(typeof(myObj[nameA[0]]) == "undefined"){
+						myObj[nameA[0]] = { }
+					} // if
+
+					if (nameA.length == 1){
+						myObj=myObj[nameA[0]];
+					} else{
+						myObj=myObj[nameA[0]][nameIndex];
+					} // if
+				} // for
+
+				if ((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type=="radio" && elm.checked)){
+					if(name == name.split("[")[0]){
+						myObj[name]=elm.value;
+					} else{
+						// can not set value when there is no name
+					}
+				} else if (elm.type == "checkbox" && elm.checked){
+					if(typeof(myObj[name]) == 'undefined'){
+						myObj[name]=[ ];
+					}
+					myObj[name].push(elm.value);
+				} else if (elm.type == "select-multiple"){
+					if(typeof(myObj[name]) == 'undefined'){
+						myObj[name]=[ ];
+					}
+					for (var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){
+						if (elm.options[jdx].selected){
+							myObj[name].push(elm.options[jdx].value);
+						}
+					}
+				} // if
+				name=undefined;
+			}); // forEach
+			***/
+			return obj;
+		},
+
+		// TODO: ComboBox might need time to process a recently input value.  This should be async?
+	 	isValid: function(){
+	 		// summary: make sure that every widget that has a validator function returns true
+	 		return dojo.every(this.getDescendants(), function(widget){
+	 			return !widget.isValid || widget.isValid();
+	 		});
+		}
+	});
+
+dojo.declare(
+	"dijit.form.Form",
+	[dijit._Widget, dijit._Templated, dijit.form._FormMixin],
+	{
+		// summary:
+		// Adds conveniences to regular HTML form
+
+		// HTML <FORM> attributes
+		name: "",
+		action: "",
+		method: "",
+		encType: "",
+		"accept-charset": "",
+		accept: "",
+		target: "",
+
+		templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' name='${name}'></form>",
+
+		attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+			{action: "", method: "", encType: "", "accept-charset": "", accept: "", target: ""}),
+
+		execute: function(/*Object*/ formContents){
+			//	summary:
+			//		Deprecated: use submit()
+		},
+
+		onExecute: function(){
+			// summary:
+			//		Deprecated: use onSubmit()
+		},
+
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			this.inherited(arguments);
+			switch(attr){
+				case "encType":
+					if(dojo.isIE){ this.domNode.encoding = value; }
+			}
+		},
+
+		postCreate: function(){
+			// IE tries to hide encType
+			if(dojo.isIE && this.srcNodeRef && this.srcNodeRef.attributes){
+				var item = this.srcNodeRef.attributes.getNamedItem('encType');
+				if(item && !item.specified && (typeof item.value == "string")){
+					this.setAttribute('encType', item.value);
+				}
+			}
+			this.inherited(arguments);
+		},
+
+		onReset: function(/*Event?*/e){ 
+			//	summary:
+			//		Callback when user resets the form. This method is intended
+			//		to be over-ridden. When the `reset` method is called
+			//		programmatically, the return value from `onReset` is used
+			//		to compute whether or not resetting should proceed
+			return true; // Boolean
+		},
+
+		_onReset: function(e){
+			// create fake event so we can know if preventDefault() is called
+			var faux = {
+				returnValue: true, // the IE way
+				preventDefault: function(){  // not IE
+							this.returnValue = false;
+						},
+				stopPropagation: function(){}, currentTarget: e.currentTarget, target: e.target
+			};
+			// if return value is not exactly false, and haven't called preventDefault(), then reset
+			if(!(this.onReset(faux) === false) && faux.returnValue){
+				this.reset();
+			}
+			dojo.stopEvent(e);
+			return false;
+		},
+
+		_onSubmit: function(e){
+			var fp = dijit.form.Form.prototype;
+			// TODO: remove ths if statement beginning with 2.0
+			if(this.execute != fp.execute || this.onExecute != fp.onExecute){
+				dojo.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.", "", "2.0");
+				this.onExecute();
+				this.execute(this.getValues());
+			}
+			if(this.onSubmit(e) === false){ // only exactly false stops submit
+				dojo.stopEvent(e);
+			}
+		},
+		
+		onSubmit: function(/*Event?*/e){ 
+			//	summary:
+			//		Callback when user submits the form. This method is
+			//		intended to be over-ridden, but by default it checks and
+			//		returns the validity of form elements. When the `submit`
+			//		method is called programmatically, the return value from
+			//		`onSubmit` is used to compute whether or not submission
+			//		should proceed
+
+			return this.isValid(); // Boolean
+		},
+
+		submit: function(){
+			// summary:
+			//		programmatically submit form if and only if the `onSubmit` returns true
+			if(!(this.onSubmit() === false)){
+				this.containerNode.submit();
+			}
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.Dialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Dialog"] = true;
+dojo.provide("dijit.Dialog");
+
+
+
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit.DialogUnderlay",
+	[dijit._Widget, dijit._Templated],
+	{
+		// summary: The component that grays out the screen behind the dialog
+	
+		// Template has two divs; outer div is used for fade-in/fade-out, and also to hold background iframe.
+		// Inner div has opacity specified in CSS file.
+		templateString: "<div class='dijitDialogUnderlayWrapper' id='${id}_wrapper'><div class='dijitDialogUnderlay ${class}' id='${id}' dojoAttachPoint='node'></div></div>",
+
+		attributeMap: {},
+
+		postCreate: function(){
+			// summary: Append the underlay to the body
+			dojo.body().appendChild(this.domNode);
+			this.bgIframe = new dijit.BackgroundIframe(this.domNode);
+		},
+
+		layout: function(){
+			// summary: Sets the background to the size of the viewport
+			//
+			// description:
+			//	Sets the background to the size of the viewport (rather than the size
+			//	of the document) since we need to cover the whole browser window, even
+			//	if the document is only a few lines long.
+
+			var viewport = dijit.getViewport();
+			var is = this.node.style,
+				os = this.domNode.style;
+
+			os.top = viewport.t + "px";
+			os.left = viewport.l + "px";
+			is.width = viewport.w + "px";
+			is.height = viewport.h + "px";
+
+			// process twice since the scroll bar may have been removed
+			// by the previous resizing
+			var viewport2 = dijit.getViewport();
+			if(viewport.w != viewport2.w){ is.width = viewport2.w + "px"; }
+			if(viewport.h != viewport2.h){ is.height = viewport2.h + "px"; }
+		},
+
+		show: function(){
+			// summary: Show the dialog underlay
+			this.domNode.style.display = "block";
+			this.layout();
+			if(this.bgIframe.iframe){
+				this.bgIframe.iframe.style.display = "block";
+			}
+			this._resizeHandler = this.connect(window, "onresize", "layout");
+		},
+
+		hide: function(){
+			// summary: hides the dialog underlay
+			this.domNode.style.display = "none";
+			if(this.bgIframe.iframe){
+				this.bgIframe.iframe.style.display = "none";
+			}
+			this.disconnect(this._resizeHandler);
+		},
+
+		uninitialize: function(){
+			if(this.bgIframe){
+				this.bgIframe.destroy();
+			}
+		}
+	}
+);
+
+
+dojo.declare("dijit._DialogMixin", null,
+	{
+		attributeMap: dijit._Widget.prototype.attributeMap,
+
+		// execute: Function
+		//	User defined function to do stuff when the user hits the submit button
+		execute: function(/*Object*/ formContents){},
+
+		// onCancel: Function
+		//      Callback when user has canceled dialog, to notify container
+		//      (user shouldn't override)
+		onCancel: function(){},
+
+		// onExecute: Function
+		//	Callback when user is about to execute dialog, to notify container
+		//	(user shouldn't override)
+		onExecute: function(){},
+
+		_onSubmit: function(){
+			// summary: callback when user hits submit button
+			this.onExecute();	// notify container that we are about to execute
+			this.execute(this.getValues());
+		},
+
+		_getFocusItems: function(/*Node*/ dialogNode){
+			// find focusable Items each time a dialog is opened
+			var focusItem = dijit.getFirstInTabbingOrder(dialogNode);
+			this._firstFocusItem = focusItem ? focusItem : dialogNode;
+			focusItem = dijit.getLastInTabbingOrder(dialogNode);
+			this._lastFocusItem = focusItem ? focusItem : this._firstFocusItem;
+			if(dojo.isMoz && this._firstFocusItem.tagName.toLowerCase() == "input" && dojo.attr(this._firstFocusItem, "type").toLowerCase() == "file"){
+					//FF doesn't behave well when first element is input type=file, set first focusable to dialog container
+					dojo.attr(dialogNode, "tabindex", "0");
+					this._firstFocusItem = dialogNode;
+			}
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.Dialog",
+	[dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin],
+	{
+		// summary: A modal dialog Widget
+		//
+		// description:
+		//	Pops up a modal dialog window, blocking access to the screen
+		//	and also graying out the screen Dialog is extended from
+		//	ContentPane so it supports all the same parameters (href, etc.)
+		//
+		// example:
+		// |	<div dojoType="dijit.Dialog" href="test.html"></div>
+		//
+		// example:
+		// |	<div id="test">test content</div>
+		// |	...
+		// |	var foo = new dijit.Dialog({ title: "test dialog" },dojo.byId("test"));
+		// |	foo.startup();
+		
+		templateString: null,
+		templateString:"<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\">${title}</span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n",
+
+		// open: Boolean
+		//		is True or False depending on state of dialog
+		open: false,
+
+		// duration: Integer
+		//		The time in milliseconds it takes the dialog to fade in and out
+		duration: 400,
+
+		// refocus: Boolean
+		// 		A Toggle to modify the default focus behavior of a Dialog, which
+		// 		is to re-focus the element which had focus before being opened.
+		//		False will disable refocusing. Default: true
+		refocus: true,
+
+		// _firstFocusItem: DomNode
+		//		The pointer to the first focusable node in the dialog
+		_firstFocusItem:null,
+		
+		// _lastFocusItem: DomNode
+		//		The pointer to which node has focus prior to our dialog
+		_lastFocusItem:null,
+
+		// doLayout: Boolean
+		//		Don't change this parameter from the default value.
+		//		This ContentPane parameter doesn't make sense for Dialog, since Dialog
+		//		is never a child of a layout container, nor can you specify the size of
+		//		Dialog in order to control the size of an inner widget. 
+		doLayout: false,
+
+		attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+			{title: "titleBar"}),
+
+		postCreate: function(){
+			dojo.body().appendChild(this.domNode);
+			this.inherited(arguments);
+			var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+			if(this.closeButtonNode){
+				this.closeButtonNode.setAttribute("title", _nlsResources.buttonCancel);
+			}
+			if(this.closeText){
+				this.closeText.setAttribute("title", _nlsResources.buttonCancel);
+			}
+			var s = this.domNode.style;
+			s.visibility = "hidden";
+			s.position = "absolute";
+			s.display = "";
+			s.top = "-9999px";
+
+			this.connect(this, "onExecute", "hide");
+			this.connect(this, "onCancel", "hide");
+			this._modalconnects = [];
+		},
+
+		onLoad: function(){
+			// summary: when href is specified we need to reposition the dialog after the data is loaded
+			this._position();
+			this.inherited(arguments);
+		},
+
+		_setup: function(){
+			// summary: 
+			//		stuff we need to do before showing the Dialog for the first
+			//		time (but we defer it until right beforehand, for
+			//		performance reasons)
+
+			if(this.titleBar){
+				this._moveable = new dojo.dnd.TimedMoveable(this.domNode, { handle: this.titleBar, timeout: 0 });
+			}
+
+			this._underlay = new dijit.DialogUnderlay({
+				id: this.id+"_underlay",
+				"class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
+			});
+
+			var node = this.domNode;
+			this._fadeIn = dojo.fx.combine(
+				[dojo.fadeIn({
+					node: node,
+					duration: this.duration
+				 }),
+				 dojo.fadeIn({
+					node: this._underlay.domNode,
+					duration: this.duration,
+					onBegin: dojo.hitch(this._underlay, "show")
+				 })
+				]
+			);
+
+			this._fadeOut = dojo.fx.combine(
+				[dojo.fadeOut({
+					node: node,
+					duration: this.duration,
+					onEnd: function(){
+						node.style.visibility="hidden";
+						node.style.top = "-9999px";
+					}
+				 }),
+				 dojo.fadeOut({
+					node: this._underlay.domNode,
+					duration: this.duration,
+					onEnd: dojo.hitch(this._underlay, "hide")
+				 })
+				]
+			);
+		},
+
+		uninitialize: function(){
+			if(this._fadeIn && this._fadeIn.status() == "playing"){
+				this._fadeIn.stop();
+			}
+			if(this._fadeOut && this._fadeOut.status() == "playing"){
+				this._fadeOut.stop();
+			}
+			if(this._underlay){
+				this._underlay.destroy();
+			}
+		},
+
+		_position: function(){
+			// summary: position modal dialog in center of screen
+			
+			if(dojo.hasClass(dojo.body(),"dojoMove")){ return; }
+			var viewport = dijit.getViewport();
+			var mb = dojo.marginBox(this.domNode);
+
+			var style = this.domNode.style;
+			style.left = Math.floor((viewport.l + (viewport.w - mb.w)/2)) + "px";
+			style.top = Math.floor((viewport.t + (viewport.h - mb.h)/2)) + "px";
+		},
+
+		_onKey: function(/*Event*/ evt){
+			// summary: handles the keyboard events for accessibility reasons
+			if(evt.keyCode){
+				var node = evt.target;
+				if (evt.keyCode == dojo.keys.TAB){
+					this._getFocusItems(this.domNode);
+				}
+				var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+				// see if we are shift-tabbing from first focusable item on dialog
+				if(node == this._firstFocusItem && evt.shiftKey && evt.keyCode == dojo.keys.TAB){
+					if(!singleFocusItem){
+						dijit.focus(this._lastFocusItem); // send focus to last item in dialog
+					}
+					dojo.stopEvent(evt);
+				}else if(node == this._lastFocusItem && evt.keyCode == dojo.keys.TAB && !evt.shiftKey){
+					if (!singleFocusItem){
+						dijit.focus(this._firstFocusItem); // send focus to first item in dialog
+					}
+					dojo.stopEvent(evt);
+				}else{
+					// see if the key is for the dialog
+					while(node){
+						if(node == this.domNode){
+							if(evt.keyCode == dojo.keys.ESCAPE){
+								this.hide(); 
+							}else{
+								return; // just let it go
+							}
+						}
+						node = node.parentNode;
+					}
+					// this key is for the disabled document window
+					if(evt.keyCode != dojo.keys.TAB){ // allow tabbing into the dialog for a11y
+						dojo.stopEvent(evt);
+					// opera won't tab to a div
+					}else if(!dojo.isOpera){
+						try{
+							this._firstFocusItem.focus();
+						}catch(e){ /*squelch*/ }
+					}
+				}
+			}
+		},
+
+		show: function(){
+			// summary: display the dialog
+
+			if(this.open){ return; }
+			
+			// first time we show the dialog, there's some initialization stuff to do			
+			if(!this._alreadyInitialized){
+				this._setup();
+				this._alreadyInitialized=true;
+			}
+
+			if(this._fadeOut.status() == "playing"){
+				this._fadeOut.stop();
+			}
+
+			this._modalconnects.push(dojo.connect(window, "onscroll", this, "layout"));
+			this._modalconnects.push(dojo.connect(dojo.doc.documentElement, "onkeypress", this, "_onKey"));
+
+			dojo.style(this.domNode, "opacity", 0);
+			this.domNode.style.visibility="";
+			this.open = true;
+			this._loadCheck(); // lazy load trigger
+
+			this._position();
+
+			this._fadeIn.play();
+
+			this._savedFocus = dijit.getFocus(this);
+
+			// find focusable Items each time dialog is shown since if dialog contains a widget the 
+			// first focusable items can change
+			this._getFocusItems(this.domNode);
+
+			// set timeout to allow the browser to render dialog
+			setTimeout(dojo.hitch(this, function(){
+				dijit.focus(this._firstFocusItem);
+			}), 50);
+		},
+
+		hide: function(){
+			// summary: Hide the dialog
+
+			// if we haven't been initialized yet then we aren't showing and we can just return		
+			if(!this._alreadyInitialized){
+				return;
+			}
+
+			if(this._fadeIn.status() == "playing"){
+				this._fadeIn.stop();
+			}
+			this._fadeOut.play();
+
+			if (this._scrollConnected){
+				this._scrollConnected = false;
+			}
+			dojo.forEach(this._modalconnects, dojo.disconnect);
+			this._modalconnects = [];
+			if(this.refocus){
+				this.connect(this._fadeOut,"onEnd",dojo.hitch(dijit,"focus",this._savedFocus));
+			}
+			this.open = false;
+		},
+
+		layout: function() {
+			// summary: position the Dialog and the underlay
+			if(this.domNode.style.visibility != "hidden"){
+				this._underlay.layout();
+				this._position();
+			}
+		},
+		
+		destroy: function(){
+			dojo.forEach(this._modalconnects, dojo.disconnect);
+			if(this.refocus && this.open){
+				var fo = this._savedFocus;
+				setTimeout(dojo.hitch(dijit,"focus",fo),25);
+			}
+			this.inherited(arguments);			
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.TooltipDialog",
+	[dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin],
+	{
+		// summary:
+		//		Pops up a dialog that appears like a Tooltip
+		//
+		// title: String
+		// 		Description of tooltip dialog (required for a11Y)
+		title: "",
+
+		// doLayout: Boolean
+		//		Don't change this parameter from the default value.
+		//		This ContentPane parameter doesn't make sense for TooltipDialog, since TooltipDialog
+		//		is never a child of a layout container, nor can you specify the size of
+		//		TooltipDialog in order to control the size of an inner widget. 
+		doLayout: false,
+
+		// _firstFocusItem: DomNode
+		//		The pointer to the first focusable node in the dialog
+		_firstFocusItem:null,
+		
+		// _lastFocusItem: DomNode
+		//		The domNode that had focus before we took it.
+		_lastFocusItem: null,
+
+		templateString: null,
+		templateString:"<div class=\"dijitTooltipDialog\" waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presenation\"></div>\n</div>\n",
+
+		postCreate: function(){
+			this.inherited(arguments);
+			this.connect(this.containerNode, "onkeypress", "_onKey");
+			this.containerNode.title = this.title;
+		},
+
+		orient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ corner){
+			// summary: configure widget to be displayed in given position relative to the button
+			this.domNode.className="dijitTooltipDialog " +" dijitTooltipAB"+(corner.charAt(1)=='L'?"Left":"Right")+" dijitTooltip"+(corner.charAt(0)=='T' ? "Below" : "Above");
+		},
+
+		onOpen: function(/*Object*/ pos){
+			// summary: called when dialog is displayed
+		
+			this._getFocusItems(this.containerNode);
+			this.orient(this.domNode,pos.aroundCorner, pos.corner);
+			this._loadCheck(); // lazy load trigger
+			dijit.focus(this._firstFocusItem);
+		},
+		
+		_onKey: function(/*Event*/ evt){
+			// summary: keep keyboard focus in dialog; close dialog on escape key
+			var node = evt.target;
+			if (evt.keyCode == dojo.keys.TAB){
+					this._getFocusItems(this.containerNode);
+			}
+			var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+			if(evt.keyCode == dojo.keys.ESCAPE){
+				this.onCancel();
+			}else if(node == this._firstFocusItem && evt.shiftKey && evt.keyCode == dojo.keys.TAB){
+				if(!singleFocusItem){
+					dijit.focus(this._lastFocusItem); // send focus to last item in dialog
+				}
+				dojo.stopEvent(evt);
+			}else if(node == this._lastFocusItem && evt.keyCode == dojo.keys.TAB && !evt.shiftKey){
+				if(!singleFocusItem){
+					dijit.focus(this._firstFocusItem); // send focus to first item in dialog
+				}
+				dojo.stopEvent(evt);
+			}else if(evt.keyCode == dojo.keys.TAB){
+				// we want the browser's default tab handling to move focus
+				// but we don't want the tab to propagate upwards
+				evt.stopPropagation();
+			}
+		}
+	}	
+);
+
+
+}
+
+if(!dojo._hasResource["dijit._editor.selection"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.selection"] = true;
+dojo.provide("dijit._editor.selection");
+
+// FIXME:
+//		all of these methods branch internally for IE. This is probably
+//		sub-optimal in terms of runtime performance. We should investigate the
+//		size difference for differentiating at definition time.
+
+dojo.mixin(dijit._editor.selection, {
+	getType: function(){
+		// summary: Get the selection type (like dojo.doc.select.type in IE).
+		if(dojo.doc.selection){ //IE
+			return dojo.doc.selection.type.toLowerCase();
+		}else{
+			var stype = "text";
+
+			// Check if the actual selection is a CONTROL (IMG, TABLE, HR, etc...).
+			var oSel;
+			try{
+				oSel = dojo.global.getSelection();
+			}catch(e){ /*squelch*/ }
+
+			if(oSel && oSel.rangeCount==1){
+				var oRange = oSel.getRangeAt(0);
+				if(	(oRange.startContainer == oRange.endContainer) &&
+					((oRange.endOffset - oRange.startOffset) == 1) &&
+					(oRange.startContainer.nodeType != 3 /* text node*/)
+				){
+					stype = "control";
+				}
+			}
+			return stype;
+		}
+	},
+
+	getSelectedText: function(){
+		// summary:
+		//		Return the text (no html tags) included in the current selection or null if no text is selected
+		if(dojo.doc.selection){ //IE
+			if(dijit._editor.selection.getType() == 'control'){
+				return null;
+			}
+			return dojo.doc.selection.createRange().text;
+		}else{
+			var selection = dojo.global.getSelection();
+			if(selection){
+				return selection.toString();
+			}
+		}
+		return ''
+	},
+
+	getSelectedHtml: function(){
+		// summary:
+		//		Return the html of the current selection or null if unavailable
+		if(dojo.doc.selection){ //IE
+			if(dijit._editor.selection.getType() == 'control'){
+				return null;
+			}
+			return dojo.doc.selection.createRange().htmlText;
+		}else{
+			var selection = dojo.global.getSelection();
+			if(selection && selection.rangeCount){
+				var frag = selection.getRangeAt(0).cloneContents();
+				var div = dojo.doc.createElement("div");
+				div.appendChild(frag);
+				return div.innerHTML;
+			}
+			return null;
+		}
+	},
+
+	getSelectedElement: function(){
+		// summary:
+		//		Retrieves the selected element (if any), just in the case that
+		//		a single element (object like and image or a table) is
+		//		selected.
+		if(this.getType() == "control"){
+			if(dojo.doc.selection){ //IE
+				var range = dojo.doc.selection.createRange();
+				if(range && range.item){
+					return dojo.doc.selection.createRange().item(0);
+				}
+			}else{
+				var selection = dojo.global.getSelection();
+				return selection.anchorNode.childNodes[ selection.anchorOffset ];
+			}
+		}
+		return null;
+	},
+
+	getParentElement: function(){
+		// summary:
+		//		Get the parent element of the current selection
+		if(this.getType() == "control"){
+			var p = this.getSelectedElement();
+			if(p){ return p.parentNode; }
+		}else{
+			if(dojo.doc.selection){ //IE
+				return dojo.doc.selection.createRange().parentElement();
+			}else{
+				var selection = dojo.global.getSelection();
+				if(selection){
+					var node = selection.anchorNode;
+
+					while(node && (node.nodeType != 1)){ // not an element
+						node = node.parentNode;
+					}
+
+					return node;
+				}
+			}
+		}
+		return null;
+	},
+
+	hasAncestorElement: function(/*String*/tagName /* ... */){
+		// summary:
+		// 		Check whether current selection has a  parent element which is
+		// 		of type tagName (or one of the other specified tagName)
+		return this.getAncestorElement.apply(this, arguments) != null;
+	},
+
+	getAncestorElement: function(/*String*/tagName /* ... */){
+		// summary:
+		//		Return the parent element of the current selection which is of
+		//		type tagName (or one of the other specified tagName)
+
+		var node = this.getSelectedElement() || this.getParentElement();
+		return this.getParentOfType(node, arguments);
+	},
+
+	isTag: function(/*DomNode*/node, /*Array*/tags){
+		if(node && node.tagName){
+			var _nlc = node.tagName.toLowerCase();
+			for(var i=0; i<tags.length; i++){
+				var _tlc = String(tags[i]).toLowerCase();
+				if(_nlc == _tlc){
+					return _tlc;
+				}
+			}
+		}
+		return "";
+	},
+
+	getParentOfType: function(/*DomNode*/node, /*Array*/tags){
+		while(node){
+			if(this.isTag(node, tags).length){
+				return node;
+			}
+			node = node.parentNode;
+		}
+		return null;
+	},
+
+	collapse: function(/*Boolean*/beginning) {
+		// summary: clear current selection
+	  if(window['getSelection']){
+	          var selection = dojo.global.getSelection();
+	          if(selection.removeAllRanges){ // Mozilla
+	                  if(beginning){
+	                          selection.collapseToStart();
+	                  }else{
+	                          selection.collapseToEnd();
+	                  }
+	          }else{ // Safari
+	                  // pulled from WebCore/ecma/kjs_window.cpp, line 2536
+	                   selection.collapse(beginning);
+	          }
+	  }else if(dojo.doc.selection){ // IE
+	          var range = dojo.doc.selection.createRange();
+	          range.collapse(beginning);
+	          range.select();
+	  }
+	},
+
+	remove: function(){
+		// summary: delete current selection
+		var _s = dojo.doc.selection;
+		if(_s){ //IE
+			if(_s.type.toLowerCase() != "none"){
+				_s.clear();
+			}
+			return _s;
+		}else{
+			_s = dojo.global.getSelection();
+			_s.deleteFromDocument();
+			return _s;
+		}
+	},
+
+	selectElementChildren: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
+		// summary:
+		//		clear previous selection and select the content of the node
+		//		(excluding the node itself)
+		var _window = dojo.global;
+		var _document = dojo.doc;
+		element = dojo.byId(element);
+		if(_document.selection && dojo.body().createTextRange){ // IE
+			var range = element.ownerDocument.body.createTextRange();
+			range.moveToElementText(element);
+			if(!nochangefocus){
+				try{
+					range.select(); // IE throws an exception here if the widget is hidden.  See #5439
+				}catch(e){ /* squelch */}
+			}
+		}else if(_window.getSelection){
+			var selection = _window.getSelection();
+			if(selection.setBaseAndExtent){ // Safari
+				selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
+			}else if(selection.selectAllChildren){ // Mozilla
+				selection.selectAllChildren(element);
+			}
+		}
+	},
+
+	selectElement: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
+		// summary:
+		//		clear previous selection and select element (including all its children)
+		var range, _document = dojo.doc;
+		element = dojo.byId(element);
+		if(_document.selection && dojo.body().createTextRange){ // IE
+			try{
+				range = dojo.body().createControlRange();
+				range.addElement(element);
+				if(!nochangefocus){
+					range.select();
+				}
+			}catch(e){
+				this.selectElementChildren(element,nochangefocus);
+			}
+		}else if(dojo.global.getSelection){
+			var selection = dojo.global.getSelection();
+			// FIXME: does this work on Safari?
+			if(selection.removeAllRanges){ // Mozilla
+				range = _document.createRange();
+				range.selectNode(element);
+				selection.removeAllRanges();
+				selection.addRange(range);
+			}
+		}
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit._editor.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.html"] = true;
+dojo.provide("dijit._editor.html");
+
+dijit._editor.escapeXml=function(/*String*/str, /*Boolean*/noSingleQuotes){
+	//summary:
+	//		Adds escape sequences for special characters in XML: &<>"'
+	//		Optionally skips escapes for single quotes
+	str = str.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;");
+	if(!noSingleQuotes){
+		str = str.replace(/'/gm, "&#39;");
+	}
+	return str; // string
+};
+
+dijit._editor.getNodeHtml=function(/* DomNode */node){
+	var output;
+	switch(node.nodeType){
+		case 1: //element node
+			output = '<'+node.nodeName.toLowerCase();
+
+			//store the list of attributes and sort it to have the
+			//attributes appear in the dictionary order
+			var attrarray = [];
+			if(dojo.isIE && node.outerHTML){
+				var s = node.outerHTML;
+				s = s.substr(0,s.indexOf('>'));
+				s = s.replace(/(['"])[^"']*\1/g, '');//to make the following regexp safe
+				var reg = /([^\s=]+)=/g;
+				var m, key;
+				while((m = reg.exec(s))){
+					key=m[1];
+					if(key.substr(0,3) != '_dj'){
+						if(key == 'src' || key == 'href'){
+							if(node.getAttribute('_djrealurl')){
+								attrarray.push([key,node.getAttribute('_djrealurl')]);
+								continue;
+							}
+						}
+						if(key=='style'){
+							attrarray.push([key, node.style.cssText.toLowerCase()]);
+						}else{
+							attrarray.push([key, key=='class'?node.className:node.getAttribute(key)]);
+						}
+					}
+				}
+			}else{
+				var attr, i=0, attrs = node.attributes;
+				while((attr=attrs[i++])){
+					//ignore all attributes starting with _dj which are
+					//internal temporary attributes used by the editor
+					var n=attr.name;
+					if(n.substr(0,3) != '_dj' /*&&
+						(attr.specified == undefined || attr.specified)*/){
+						var v = attr.value;
+						if(n == 'src' || n == 'href'){
+							if(node.getAttribute('_djrealurl')){
+								v = node.getAttribute('_djrealurl');
+							}
+						}
+						attrarray.push([n,v]);
+					}
+				}
+			}
+			attrarray.sort(function(a,b){
+				return a[0]<b[0]?-1:(a[0]==b[0]?0:1);
+			});
+			i=0;
+			while((attr=attrarray[i++])){
+				output += ' '+attr[0]+'="'+
+					(dojo.isString(attr[1]) ? dijit._editor.escapeXml(attr[1],true) : attr[1])+'"';
+			}
+			if(node.childNodes.length){
+				output += '>' + dijit._editor.getChildrenHtml(node)+'</'+node.nodeName.toLowerCase()+'>';
+			}else{
+				output += ' />';
+			}
+			break;
+		case 3: //text
+			// FIXME:
+			output = dijit._editor.escapeXml(node.nodeValue,true);
+			break;
+		case 8: //comment
+			// FIXME:
+			output = '<!--'+dijit._editor.escapeXml(node.nodeValue,true)+'-->';
+			break;
+		default:
+			output = "Element not recognized - Type: " + node.nodeType + " Name: " + node.nodeName;
+	}
+	return output;
+};
+
+dijit._editor.getChildrenHtml = function(/* DomNode */dom){
+	// summary: Returns the html content of a DomNode and children
+	var out = "";
+	if(!dom){ return out; }
+	var nodes = dom["childNodes"]||dom;
+	var i=0;
+	var node;
+	while((node=nodes[i++])){
+		out += dijit._editor.getNodeHtml(node);
+	}
+	return out; // String
+}
+
+}
+
+if(!dojo._hasResource["dijit._editor.RichText"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.RichText"] = true;
+dojo.provide("dijit._editor.RichText");
+
+
+
+
+
+
+
+// used to restore content when user leaves this page then comes back
+// but do not try doing dojo.doc.write if we are using xd loading.
+// dojo.doc.write will only work if RichText.js is included in the dojo.js
+// file. If it is included in dojo.js and you want to allow rich text saving
+// for back/forward actions, then set dojo.config.allowXdRichTextSave = true.
+if(!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"]){
+	if(dojo._postLoad){
+		(function(){
+			var savetextarea = dojo.doc.createElement('textarea');
+			savetextarea.id = dijit._scopeName + "._editor.RichText.savedContent";
+			var s = savetextarea.style;
+			s.display='none';
+			s.position='absolute';
+			s.top="-100px";
+			s.left="-100px";
+			s.height="3px";
+			s.width="3px";
+			dojo.body().appendChild(savetextarea);
+		})();
+	}else{
+		//dojo.body() is not available before onLoad is fired
+		try{
+			dojo.doc.write('<textarea id="' + dijit._scopeName + '._editor.RichText.savedContent" ' +
+				'style="display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;"></textarea>');
+		}catch(e){ }
+	}
+}
+dojo.declare("dijit._editor.RichText", dijit._Widget, {
+	constructor: function(){
+		// summary:
+		//		dijit._editor.RichText is the core of the WYSIWYG editor in dojo, which
+		//		provides the basic editing features. It also encapsulates the differences
+		//		of different js engines for various browsers
+		//
+		// contentPreFilters: Array
+		//		pre content filter function register array.
+		//		these filters will be executed before the actual
+		//		editing area get the html content
+		this.contentPreFilters = [];
+
+		// contentPostFilters: Array
+		//		post content filter function register array.
+		//		these will be used on the resulting html
+		//		from contentDomPostFilters. The resuling
+		//		content is the final html (returned by getValue())
+		this.contentPostFilters = [];
+
+		// contentDomPreFilters: Array
+		//		pre content dom filter function register array.
+		//		these filters are applied after the result from
+		//		contentPreFilters are set to the editing area
+		this.contentDomPreFilters = [];
+
+		// contentDomPostFilters: Array
+		//		post content dom filter function register array.
+		//		these filters are executed on the editing area dom
+		//		the result from these will be passed to contentPostFilters
+		this.contentDomPostFilters = [];
+
+		// editingAreaStyleSheets: Array
+		//		array to store all the stylesheets applied to the editing area
+		this.editingAreaStyleSheets=[];
+
+		this._keyHandlers = {};
+		this.contentPreFilters.push(dojo.hitch(this, "_preFixUrlAttributes"));
+		if(dojo.isMoz){
+			this.contentPreFilters.push(this._fixContentForMoz);
+			this.contentPostFilters.push(this._removeMozBogus);
+		}else if(dojo.isSafari){
+			this.contentPostFilters.push(this._removeSafariBogus);
+		}
+		//this.contentDomPostFilters.push(this._postDomFixUrlAttributes);
+
+		this.onLoadDeferred = new dojo.Deferred();
+	},
+
+	// inheritWidth: Boolean
+	//		whether to inherit the parent's width or simply use 100%
+	inheritWidth: false,
+
+	// focusOnLoad: Boolean
+	//		whether focusing into this instance of richtext when page onload
+	focusOnLoad: false,
+
+	// name: String
+	//		If a save name is specified the content is saved and restored when the user
+	//		leave this page can come back, or if the editor is not properly closed after
+	//		editing has started.
+	name: "",
+
+	// styleSheets: String
+	//		semicolon (";") separated list of css files for the editing area
+	styleSheets: "",
+
+	// _content: String
+	//		temporary content storage
+	_content: "",
+
+	// height: String
+	//		set height to fix the editor at a specific height, with scrolling.
+	//		By default, this is 300px. If you want to have the editor always
+	//		resizes to accommodate the content, use AlwaysShowToolbar plugin
+	//		and set height=""
+	height: "300px",
+
+	// minHeight: String
+	//		The minimum height that the editor should have
+	minHeight: "1em",
+	
+	// isClosed: Boolean
+	isClosed: true,
+
+	// isLoaded: Boolean
+	isLoaded: false,
+
+	// _SEPARATOR: String
+	//		used to concat contents from multiple textareas into a single string
+	_SEPARATOR: "@@**%%__RICHTEXTBOUNDRY__%%**@@",
+
+	// onLoadDeferred: dojo.Deferred
+	//		deferred which is fired when the editor finishes loading
+	onLoadDeferred: null,
+
+	postCreate: function(){
+		// summary: init
+		dojo.publish(dijit._scopeName + "._editor.RichText::init", [this]);
+		this.open();
+		this.setupDefaultShortcuts();
+	},
+
+	setupDefaultShortcuts: function(){
+		// summary: add some default key handlers
+		// description:
+		// 		Overwrite this to setup your own handlers. The default
+		// 		implementation does not use Editor commands, but directly
+		//		executes the builtin commands within the underlying browser
+		//		support.
+		var exec = function(cmd, arg){
+			return arguments.length == 1 ? function(){ this.execCommand(cmd); } :
+				function(){ this.execCommand(cmd, arg); };
+		};
+
+		var ctrlKeyHandlers = { b: exec("bold"),
+			i: exec("italic"),
+			u: exec("underline"),
+			a: exec("selectall"),
+			s: function(){ this.save(true); },
+
+			"1": exec("formatblock", "h1"),
+			"2": exec("formatblock", "h2"),
+			"3": exec("formatblock", "h3"),
+			"4": exec("formatblock", "h4"),
+
+			"\\": exec("insertunorderedlist") };
+
+		if(!dojo.isIE){
+			ctrlKeyHandlers.Z = exec("redo"); //FIXME: undo?
+		}
+
+		for(var key in ctrlKeyHandlers){
+			this.addKeyHandler(key, this.KEY_CTRL, ctrlKeyHandlers[key]);
+		}
+	},
+
+	// events: Array
+	//		 events which should be connected to the underlying editing area
+	events: ["onKeyPress", "onKeyDown", "onKeyUp", "onClick"],
+
+	// events: Array
+	//		 events which should be connected to the underlying editing
+	//		 area, events in this array will be addListener with
+	//		 capture=true
+	captureEvents: [],
+
+	_editorCommandsLocalized: false,
+	_localizeEditorCommands: function(){
+		if(this._editorCommandsLocalized){
+			return;
+		}
+		this._editorCommandsLocalized = true;
+
+		//in IE, names for blockformat is locale dependent, so we cache the values here
+
+		//if the normal way fails, we try the hard way to get the list
+
+		//do not use _cacheLocalBlockFormatNames here, as it will
+		//trigger security warning in IE7
+
+		//in the array below, ul can not come directly after ol,
+		//otherwise the queryCommandValue returns Normal for it
+		var formats = ['p', 'pre', 'address', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'div', 'ul'];
+		var localhtml = "", format, i=0;
+		while((format=formats[i++])){
+			if(format.charAt(1) != 'l'){
+				localhtml += "<"+format+"><span>content</span></"+format+">";
+			}else{
+				localhtml += "<"+format+"><li>content</li></"+format+">";
+			}
+		}
+		//queryCommandValue returns empty if we hide editNode, so move it out of screen temporary
+		var div=dojo.doc.createElement('div');
+		div.style.position = "absolute";
+		div.style.left = "-2000px";
+		div.style.top = "-2000px";
+		dojo.doc.body.appendChild(div);
+		div.innerHTML = localhtml;
+		var node = div.firstChild;
+		while(node){
+			dijit._editor.selection.selectElement(node.firstChild);
+			dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [node.firstChild]);
+			var nativename = node.tagName.toLowerCase();
+			this._local2NativeFormatNames[nativename] = dojo.doc.queryCommandValue("formatblock");//this.queryCommandValue("formatblock");
+			this._native2LocalFormatNames[this._local2NativeFormatNames[nativename]] = nativename;
+			node = node.nextSibling;
+		}
+		dojo.doc.body.removeChild(div);
+	},
+
+	open: function(/*DomNode?*/element){
+		// summary:
+		//		Transforms the node referenced in this.domNode into a rich text editing
+		//		node. This will result in the creation and replacement with an <iframe>
+		//		if designMode(FF)/contentEditable(IE) is used.
+
+		if((!this.onLoadDeferred)||(this.onLoadDeferred.fired >= 0)){
+			this.onLoadDeferred = new dojo.Deferred();
+		}
+
+		if(!this.isClosed){ this.close(); }
+		dojo.publish(dijit._scopeName + "._editor.RichText::open", [ this ]);
+
+		this._content = "";
+		if((arguments.length == 1)&&(element["nodeName"])){ this.domNode = element; } // else unchanged
+
+		var html;
+		if(	(this.domNode["nodeName"])&&
+			(this.domNode.nodeName.toLowerCase() == "textarea")){
+			// if we were created from a textarea, then we need to create a
+			// new editing harness node.
+			this.textarea = this.domNode;
+			this.name=this.textarea.name;
+			html = this._preFilterContent(this.textarea.value);
+			this.domNode = dojo.doc.createElement("div");
+			this.domNode.setAttribute('widgetId',this.id);
+			this.textarea.removeAttribute('widgetId');
+			this.domNode.cssText = this.textarea.cssText;
+			this.domNode.className += " "+this.textarea.className;
+			dojo.place(this.domNode, this.textarea, "before");
+			var tmpFunc = dojo.hitch(this, function(){
+				//some browsers refuse to submit display=none textarea, so
+				//move the textarea out of screen instead
+				dojo.attr(this.textarea, 'tabIndex', '-1');
+				with(this.textarea.style){
+					display = "block";
+					position = "absolute";
+					left = top = "-1000px";
+
+					if(dojo.isIE){ //nasty IE bug: abnormal formatting if overflow is not hidden
+						this.__overflow = overflow;
+						overflow = "hidden";
+					}
+				}
+			});
+			if(dojo.isIE){
+				setTimeout(tmpFunc, 10);
+			}else{
+				tmpFunc();
+			}
+
+			// this.domNode.innerHTML = html;
+
+//				if(this.textarea.form){
+//					// FIXME: port: this used to be before advice!!!
+//					dojo.connect(this.textarea.form, "onsubmit", this, function(){
+//						// FIXME: should we be calling close() here instead?
+//						this.textarea.value = this.getValue();
+//					});
+//				}
+		}else{
+			html = this._preFilterContent(dijit._editor.getChildrenHtml(this.domNode));
+			this.domNode.innerHTML = '';
+		}
+		if(html == ""){ html = "&nbsp;"; }
+
+		var content = dojo.contentBox(this.domNode);
+		// var content = dojo.contentBox(this.srcNodeRef);
+		this._oldHeight = content.h;
+		this._oldWidth = content.w;
+
+		// If we're a list item we have to put in a blank line to force the
+		// bullet to nicely align at the top of text
+		if(	(this.domNode["nodeName"]) &&
+			(this.domNode.nodeName == "LI") ){
+			this.domNode.innerHTML = " <br>";
+		}
+
+		this.editingArea = dojo.doc.createElement("div");
+		this.domNode.appendChild(this.editingArea);
+
+		if(this.name != "" && (!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"])){
+			var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.savedContent");
+			if(saveTextarea.value != ""){
+				var datas = saveTextarea.value.split(this._SEPARATOR), i=0, dat;
+				while((dat=datas[i++])){
+					var data = dat.split(":");
+					if(data[0] == this.name){
+						html = data[1];
+						datas.splice(i, 1);
+						break;
+					}
+				}
+			}
+
+			// FIXME: need to do something different for Opera/Safari
+			this.connect(window, "onbeforeunload", "_saveContent");
+			// dojo.connect(window, "onunload", this, "_saveContent");
+		}
+
+		this.isClosed = false;
+		// Safari's selections go all out of whack if we do it inline,
+		// so for now IE is our only hero
+		//if(typeof dojo.doc.body.contentEditable != "undefined"){
+		if(dojo.isIE || dojo.isSafari || dojo.isOpera){ // contentEditable, easy		
+
+			if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){
+				console.debug("dijit._editor.RichText: When using cross-domain Dojo builds,"
+				+ " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"
+				+ " to the path on your domain to blank.html");
+			}
+
+			var burl = dojo.config["dojoBlankHtmlUrl"] || (dojo.moduleUrl("dojo", "resources/blank.html")+"");
+			var ifr = this.editorObject = this.iframe = dojo.doc.createElement('iframe');
+			ifr.id = this.id+"_iframe";
+			ifr.src = burl;
+			ifr.style.border = "none";
+			ifr.style.width = "100%";
+			ifr.frameBorder = 0;
+			// ifr.style.scrolling = this.height ? "auto" : "vertical";
+			this.editingArea.appendChild(ifr);
+			var h = null; // set later in non-ie6 branch
+			var loadFunc = dojo.hitch( this, function(){
+				if(h){ dojo.disconnect(h); h = null; }
+				this.window = ifr.contentWindow;
+				var d = this.document = this.window.document;
+				d.open();
+				d.write(this._getIframeDocTxt(html));
+				d.close();
+
+				if(dojo.isIE >= 7){
+					if(this.height){
+						ifr.style.height = this.height;
+					}
+					if(this.minHeight){
+						ifr.style.minHeight = this.minHeight;
+					}
+				}else{
+					ifr.style.height = this.height ? this.height : this.minHeight;
+				}
+
+				if(dojo.isIE){
+					this._localizeEditorCommands();
+				}
+
+				this.onLoad();
+				this.savedContent = this.getValue(true);
+			});
+			if(dojo.isIE && dojo.isIE < 7){ // IE 6 is a steaming pile...
+				var t = setInterval(function(){
+					if(ifr.contentWindow.isLoaded){
+						clearInterval(t);
+						loadFunc();
+					}
+				}, 100);
+			}else{ // blissful sanity!
+				h = dojo.connect(
+					((dojo.isIE) ? ifr.contentWindow : ifr), "onload", loadFunc
+				);
+			}
+		}else{ // designMode in iframe
+			this._drawIframe(html);
+			this.savedContent = this.getValue(true);
+		}
+
+		// TODO: this is a guess at the default line-height, kinda works
+		if(this.domNode.nodeName == "LI"){ this.domNode.lastChild.style.marginTop = "-1.2em"; }
+		this.domNode.className += " RichTextEditable";
+	},
+
+	//static cache variables shared among all instance of this class
+	_local2NativeFormatNames: {},
+	_native2LocalFormatNames: {},
+	_localizedIframeTitles: null,
+
+	_getIframeDocTxt: function(/* String */ html){
+		var _cs = dojo.getComputedStyle(this.domNode);
+		if(dojo.isIE || (!this.height && !dojo.isMoz)){
+			html="<div>"+html+"</div>";
+		}
+		var font = [ _cs.fontWeight, _cs.fontSize, _cs.fontFamily ].join(" ");
+
+		// line height is tricky - applying a units value will mess things up.
+		// if we can't get a non-units value, bail out.
+		var lineHeight = _cs.lineHeight;
+		if(lineHeight.indexOf("px") >= 0){
+			lineHeight = parseFloat(lineHeight)/parseFloat(_cs.fontSize);
+			// console.debug(lineHeight);
+		}else if(lineHeight.indexOf("em")>=0){
+			lineHeight = parseFloat(lineHeight);
+		}else{
+			lineHeight = "1.0";
+		}
+		return [
+			this.isLeftToRight() ? "<html><head>" : "<html dir='rtl'><head>",
+			(dojo.isMoz ? "<title>" + this._localizedIframeTitles.iframeEditTitle + "</title>" : ""),
+			"<style>",
+			"body,html {",
+			"	background:transparent;",
+			"	font:", font, ";",
+			"	padding: 1em 0 0 0;",
+			"	margin: -1em 0 0 0;", // remove extraneous vertical scrollbar on safari and firefox
+			"	height: 100%;",
+			"}",
+			// TODO: left positioning will cause contents to disappear out of view
+			//	   if it gets too wide for the visible area
+			"body{",
+			"	top:0px; left:0px; right:0px;",
+				((this.height||dojo.isOpera) ? "" : "position: fixed;"),
+			// FIXME: IE 6 won't understand min-height?
+			"	min-height:", this.minHeight, ";",
+			"	line-height:", lineHeight,
+			"}",
+			"p{ margin: 1em 0 !important; }",
+			(this.height ? // height:auto undoes the height:100%
+				"" : "body,html{height:auto;overflow-y:hidden;/*for IE*/} body > div {overflow-x:auto;/*for FF to show vertical scrollbar*/}"
+			),
+			"li > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; } ",
+			"li{ min-height:1.2em; }",
+			"</style>",
+			this._applyEditingAreaStyleSheets(),
+			"</head><body>"+html+"</body></html>"
+		].join(""); // String
+	},
+
+	_drawIframe: function(/*String*/html){
+		// summary:
+		//		Draws an iFrame using the existing one if one exists.
+		//		Used by Mozilla, Safari, and Opera
+
+		if(!this.iframe){
+			var ifr = this.iframe = dojo.doc.createElement("iframe");
+			ifr.id=this.id;
+			// this.iframe.src = "about:blank";
+			// dojo.doc.body.appendChild(this.iframe);
+			// console.debug(this.iframe.contentDocument.open());
+			// dojo.body().appendChild(this.iframe);
+			var ifrs = ifr.style;
+			// ifrs.border = "1px solid black";
+			ifrs.border = "none";
+			ifrs.lineHeight = "0"; // squash line height
+			ifrs.verticalAlign = "bottom";
+//			ifrs.scrolling = this.height ? "auto" : "vertical";
+			this.editorObject = this.iframe;
+			// get screen reader text for mozilla here, too
+			this._localizedIframeTitles = dojo.i18n.getLocalization("dijit.form", "Textarea");
+			// need to find any associated label element and update iframe document title
+			var label=dojo.query('label[for="'+this.id+'"]');
+			if(label.length){
+				this._localizedIframeTitles.iframeEditTitle = label[0].innerHTML + " " + this._localizedIframeTitles.iframeEditTitle;
+			}
+		}
+		// opera likes this to be outside the with block
+		//	this.iframe.src = "javascript:void(0)";//dojo.uri.dojoUri("src/widget/templates/richtextframe.html") + ((dojo.doc.domain != currentDomain) ? ("#"+dojo.doc.domain) : "");
+		this.iframe.style.width = this.inheritWidth ? this._oldWidth : "100%";
+
+		if(this.height){
+			this.iframe.style.height = this.height;
+		}else{
+			this.iframe.height = this._oldHeight;
+		}
+
+		var tmpContent;
+		if(this.textarea){
+			tmpContent = this.srcNodeRef;
+		}else{
+			tmpContent = dojo.doc.createElement('div');
+			tmpContent.style.display="none";
+			tmpContent.innerHTML = html;
+			//append tmpContent to under the current domNode so that the margin
+			//calculation below is correct
+			this.editingArea.appendChild(tmpContent);
+		}
+
+		this.editingArea.appendChild(this.iframe);
+
+		//do we want to show the content before the editing area finish loading here?
+		//if external style sheets are used for the editing area, the appearance now
+		//and after loading of the editing area won't be the same (and padding/margin
+		//calculation above may not be accurate)
+		//	tmpContent.style.display = "none";
+		//	this.editingArea.appendChild(this.iframe);
+
+		var _iframeInitialized = false;
+		// console.debug(this.iframe);
+		// var contentDoc = this.iframe.contentWindow.document;
+
+
+		// note that on Safari lower than 420+, we have to get the iframe
+		// by ID in order to get something w/ a contentDocument property
+
+		var contentDoc = this.iframe.contentDocument;
+		contentDoc.open();
+		if(dojo.isAIR){
+			contentDoc.body.innerHTML = html;
+		}else{
+			contentDoc.write(this._getIframeDocTxt(html));
+		}
+		contentDoc.close();
+
+		// now we wait for onload. Janky hack!
+		var ifrFunc = dojo.hitch(this, function(){
+			if(!_iframeInitialized){
+				_iframeInitialized = true;
+			}else{ return; }
+			if(!this.editNode){
+				try{
+					if(this.iframe.contentWindow){
+						this.window = this.iframe.contentWindow;
+						this.document = this.iframe.contentWindow.document
+					}else if(this.iframe.contentDocument){
+						// for opera
+						this.window = this.iframe.contentDocument.window;
+						this.document = this.iframe.contentDocument;
+					}
+					if(!this.document.body){
+						throw 'Error';
+					}
+				}catch(e){
+					setTimeout(ifrFunc,500);
+					_iframeInitialized = false;
+					return;
+				}
+
+				dojo._destroyElement(tmpContent);
+				this.onLoad();
+			}else{
+				dojo._destroyElement(tmpContent);
+				this.editNode.innerHTML = html;
+				this.onDisplayChanged();
+			}
+			this._preDomFilterContent(this.editNode);
+		});
+
+		ifrFunc();
+	},
+
+	_applyEditingAreaStyleSheets: function(){
+		// summary:
+		//		apply the specified css files in styleSheets
+		var files = [];
+		if(this.styleSheets){
+			files = this.styleSheets.split(';');
+			this.styleSheets = '';
+		}
+
+		//empty this.editingAreaStyleSheets here, as it will be filled in addStyleSheet
+		files = files.concat(this.editingAreaStyleSheets);
+		this.editingAreaStyleSheets = [];
+
+		var text='', i=0, url;
+		while((url=files[i++])){
+			var abstring = (new dojo._Url(dojo.global.location, url)).toString();
+			this.editingAreaStyleSheets.push(abstring);
+			text += '<link rel="stylesheet" type="text/css" href="'+abstring+'"/>'
+		}
+		return text;
+	},
+
+	addStyleSheet: function(/*dojo._Url*/uri){
+		// summary:
+		//		add an external stylesheet for the editing area
+		// uri:	a dojo.uri.Uri pointing to the url of the external css file
+		var url=uri.toString();
+
+		//if uri is relative, then convert it to absolute so that it can be resolved correctly in iframe
+		if(url.charAt(0) == '.' || (url.charAt(0) != '/' && !uri.host)){
+			url = (new dojo._Url(dojo.global.location, url)).toString();
+		}
+
+		if(dojo.indexOf(this.editingAreaStyleSheets, url) > -1){
+//			console.debug("dijit._editor.RichText.addStyleSheet: Style sheet "+url+" is already applied");
+			return;
+		}
+
+		this.editingAreaStyleSheets.push(url);
+		if(this.document.createStyleSheet){ //IE
+			this.document.createStyleSheet(url);
+		}else{ //other browser
+			var head = this.document.getElementsByTagName("head")[0];
+			var stylesheet = this.document.createElement("link");
+			with(stylesheet){
+				rel="stylesheet";
+				type="text/css";
+				href=url;
+			}
+			head.appendChild(stylesheet);
+		}
+	},
+
+	removeStyleSheet: function(/*dojo._Url*/uri){
+		// summary:
+		//		remove an external stylesheet for the editing area
+		var url=uri.toString();
+		//if uri is relative, then convert it to absolute so that it can be resolved correctly in iframe
+		if(url.charAt(0) == '.' || (url.charAt(0) != '/' && !uri.host)){
+			url = (new dojo._Url(dojo.global.location, url)).toString();
+		}
+		var index = dojo.indexOf(this.editingAreaStyleSheets, url);
+		if(index == -1){
+//			console.debug("dijit._editor.RichText.removeStyleSheet: Style sheet "+url+" has not been applied");
+			return;
+		}
+		delete this.editingAreaStyleSheets[index];
+		dojo.withGlobal(this.window,'query', dojo, ['link:[href="'+url+'"]']).orphan()
+	},
+
+	disabled: true,
+	_mozSettingProps: ['styleWithCSS','insertBrOnReturn'],
+	setDisabled: function(/*Boolean*/ disabled){
+		if(dojo.isIE || dojo.isSafari || dojo.isOpera){
+			if(dojo.isIE){ this.editNode.unselectable = "on"; } // prevent IE from setting focus
+			this.editNode.contentEditable = !disabled;
+			if(dojo.isIE){
+				var _this = this;
+				setTimeout(function(){ _this.editNode.unselectable = "off"; }, 0);
+			}
+		}else{ //moz
+			if(disabled){
+				//AP: why isn't this set in the constructor, or put in mozSettingProps as a hash?
+				this._mozSettings=[false,this.blockNodeForEnter==='BR'];
+			}
+			this.document.designMode=(disabled?'off':'on');
+			if(!disabled && this._mozSettings){
+				dojo.forEach(this._mozSettingProps, function(s,i){
+					this.document.execCommand(s,false,this._mozSettings[i]);
+				},this);
+			}
+//			this.document.execCommand('contentReadOnly', false, disabled);
+//				if(disabled){
+//					this.blur(); //to remove the blinking caret
+//				}
+		}
+		this.disabled = disabled;
+	},
+
+/* Event handlers
+ *****************/
+
+	_isResized: function(){ return false; },
+
+	onLoad: function(/* Event */ e){
+		// summary: handler after the content of the document finishes loading
+		this.isLoaded = true;
+		if(!this.window.__registeredWindow){
+			this.window.__registeredWindow=true;
+			dijit.registerWin(this.window);
+		}
+		if(!dojo.isIE && (this.height || dojo.isMoz)){
+			this.editNode=this.document.body;
+		}else{
+			this.editNode=this.document.body.firstChild;
+			var _this = this;
+			if(dojo.isIE){ // #4996 IE wants to focus the BODY tag
+				var tabStop = this.tabStop = dojo.doc.createElement('<div tabIndex=-1>');
+				this.editingArea.appendChild(tabStop);
+				this.iframe.onfocus = function(){ _this.editNode.setActive(); }
+			}
+		}
+
+		try{
+			this.setDisabled(false);
+		}catch(e){
+			// Firefox throws an exception if the editor is initially hidden
+			// so, if this fails, try again onClick by adding "once" advice
+			var handle = dojo.connect(this, "onClick", this, function(){
+				this.setDisabled(false);
+				dojo.disconnect(handle);
+			});
+		}
+
+		this._preDomFilterContent(this.editNode);
+
+		var events=this.events.concat(this.captureEvents),i=0,et;
+		while((et=events[i++])){
+			this.connect(this.document, et.toLowerCase(), et);
+		}
+		if(!dojo.isIE){
+			try{ // sanity check for Mozilla
+			//AP: what's the point of this?
+//					this.document.execCommand("useCSS", false, true); // old moz call
+				this.document.execCommand("styleWithCSS", false, false); // new moz call
+				//this.document.execCommand("insertBrOnReturn", false, false); // new moz call
+			}catch(e2){ }
+			// FIXME: when scrollbars appear/disappear this needs to be fired
+		}else{ // IE contentEditable
+			// give the node Layout on IE
+			this.connect(this.document, "onmousedown", "_onMouseDown"); // #4996 fix focus
+			this.editNode.style.zoom = 1.0;
+		}
+
+		if(this.focusOnLoad){
+			setTimeout(dojo.hitch(this, "focus"), 0); // have to wait for IE to set unselectable=off
+		}
+
+		this.onDisplayChanged(e);
+		if(this.onLoadDeferred){
+			this.onLoadDeferred.callback(true);
+		}
+	},
+
+	onKeyDown: function(/* Event */ e){
+		// summary: Fired on keydown
+
+		// we need this event at the moment to get the events from control keys
+		// such as the backspace. It might be possible to add this to Dojo, so that
+		// keyPress events can be emulated by the keyDown and keyUp detection.
+		if(dojo.isIE){
+			if(e.keyCode == dojo.keys.TAB && e.shiftKey && !e.ctrlKey && !e.altKey){
+				// focus the BODY so the browser will tab away from it instead
+				this.iframe.focus();
+			}else if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey){
+				// focus the BODY so the browser will tab away from it instead
+				this.tabStop.focus();
+			}else if(e.keyCode === dojo.keys.BACKSPACE && this.document.selection.type === "Control"){
+				// IE has a bug where if a non-text object is selected in the editor,
+		  // hitting backspace would act as if the browser's back button was
+		  // clicked instead of deleting the object. see #1069
+				dojo.stopEvent(e);
+				this.execCommand("delete");
+			}else if((65 <= e.keyCode&&e.keyCode <= 90) ||
+				(e.keyCode>=37&&e.keyCode<=40) // FIXME: get this from connect() instead!
+			){ //arrow keys
+				e.charCode = e.keyCode;
+				this.onKeyPress(e);
+			}
+		}else if(dojo.isMoz){
+			if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
+				// update iframe document title for screen reader
+				this.iframe.contentDocument.title = this._localizedIframeTitles.iframeFocusTitle;
+				
+				// Place focus on the iframe. A subsequent tab or shift tab will put focus
+				// on the correct control.
+				this.iframe.focus();  // this.focus(); won't work
+				dojo.stopEvent(e);
+			}else if(e.keyCode == dojo.keys.TAB && e.shiftKey){
+				// if there is a toolbar, set focus to it, otherwise ignore
+				if(this.toolbar){
+					this.toolbar.focus();
+				}
+				dojo.stopEvent(e);
+			}
+		}
+	},
+
+	onKeyUp: function(e){
+		// summary: Fired on keyup
+		return;
+	},
+
+	KEY_CTRL: 1,
+	KEY_SHIFT: 2,
+
+	onKeyPress: function(e){
+		// summary: Fired on keypress
+
+		// handle the various key events
+		var modifiers = (e.ctrlKey && !e.altKey) ? this.KEY_CTRL : 0 | e.shiftKey ? this.KEY_SHIFT : 0;
+
+		var key = e.keyChar || e.keyCode;
+		if(this._keyHandlers[key]){
+			// console.debug("char:", e.key);
+			var handlers = this._keyHandlers[key], i = 0, h;
+			while((h = handlers[i++])){
+				if(modifiers == h.modifiers){
+					if(!h.handler.apply(this,arguments)){
+						e.preventDefault();
+					}
+					break;
+				}
+			}
+		}
+
+		// function call after the character has been inserted
+		setTimeout(dojo.hitch(this, function(){
+			this.onKeyPressed(e);
+		}), 1);
+	},
+
+	addKeyHandler: function(/*String*/key, /*Int*/modifiers, /*Function*/handler){
+		// summary: add a handler for a keyboard shortcut
+		if(!dojo.isArray(this._keyHandlers[key])){ this._keyHandlers[key] = []; }
+		this._keyHandlers[key].push({
+			modifiers: modifiers || 0,
+			handler: handler
+		});
+	},
+
+	onKeyPressed: function(/*Event*/e){
+		this.onDisplayChanged(/*e*/); // can't pass in e
+	},
+
+	onClick: function(/*Event*/e){
+//		console.info('onClick',this._tryDesignModeOn);
+		this.onDisplayChanged(e);
+	},
+
+	_onMouseDown: function(/*Event*/e){ // IE only to prevent 2 clicks to focus
+		if(!this._focused && !this.disabled){
+			this.focus();
+		}
+	},
+
+	_onBlur: function(e){
+		this.inherited(arguments);
+		var _c=this.getValue(true);
+		if(_c!=this.savedContent){
+			this.onChange(_c);
+			this.savedContent=_c;
+		}
+		if(dojo.isMoz && this.iframe){
+			this.iframe.contentDocument.title = this._localizedIframeTitles.iframeEditTitle;
+		} 
+	},
+	_initialFocus: true,
+	_onFocus: function(/*Event*/e){
+		// summary: Fired on focus
+		this.inherited(arguments);
+		if(dojo.isMoz && this._initialFocus){
+			this._initialFocus = false;
+			if(this.editNode.innerHTML.replace(/^\s+|\s+$/g, "") == "&nbsp;"){
+				this.placeCursorAtStart();
+//					this.execCommand("selectall");
+//					this.window.getSelection().collapseToStart();
+			}
+		}
+	},
+
+	// TODO: why is this needed - should we deprecate this ?
+	blur: function(){
+		// summary: remove focus from this instance
+		if(!dojo.isIE && this.window.document.documentElement && this.window.document.documentElement.focus){
+			this.window.document.documentElement.focus();
+		}else if(dojo.doc.body.focus){
+			dojo.doc.body.focus();
+		}
+	},
+
+	focus: function(){
+		// summary: move focus to this instance
+		if(!dojo.isIE){
+			dijit.focus(this.iframe);
+		}else if(this.editNode && this.editNode.focus){
+			// editNode may be hidden in display:none div, lets just punt in this case
+			//this.editNode.focus(); -> causes IE to scroll always (strict and quirks mode) to the top the Iframe 
+			// if we fire the event manually and let the browser handle the focusing, the latest  
+			// cursor position is focused like in FF                         
+			this.iframe.fireEvent('onfocus', document.createEventObject()); // createEventObject only in IE 
+//		}else{
+// TODO: should we throw here?
+//			console.debug("Have no idea how to focus into the editor!");
+		}
+	},
+
+//		_lastUpdate: 0,
+	updateInterval: 200,
+	_updateTimer: null,
+	onDisplayChanged: function(/*Event*/e){
+		// summary:
+		//		This event will be fired everytime the display context
+		//		changes and the result needs to be reflected in the UI.
+		// description:
+		//		If you don't want to have update too often,
+		//		onNormalizedDisplayChanged should be used instead
+
+//			var _t=new Date();
+		if(!this._updateTimer){
+//				this._lastUpdate=_t;
+			if(this._updateTimer){
+				clearTimeout(this._updateTimer);
+			}
+			this._updateTimer=setTimeout(dojo.hitch(this,this.onNormalizedDisplayChanged),this.updateInterval);
+		}
+	},
+	onNormalizedDisplayChanged: function(){
+		// summary:
+		//		This event is fired every updateInterval ms or more
+		// description:
+		//		If something needs to happen immidiately after a
+		//		user change, please use onDisplayChanged instead
+		this._updateTimer=null;
+	},
+	onChange: function(newContent){
+		// summary:
+		//		this is fired if and only if the editor loses focus and
+		//		the content is changed
+
+//			console.log('onChange',newContent);
+	},
+	_normalizeCommand: function(/*String*/cmd){
+		// summary:
+		//		Used as the advice function by dojo.connect to map our
+		//		normalized set of commands to those supported by the target
+		//		browser
+
+		var command = cmd.toLowerCase();
+		if(command == "hilitecolor" && !dojo.isMoz){
+			command = "backcolor";
+		}
+
+		return command;
+	},
+
+	queryCommandAvailable: function(/*String*/command){
+		// summary:
+		//		Tests whether a command is supported by the host. Clients SHOULD check
+		//		whether a command is supported before attempting to use it, behaviour
+		//		for unsupported commands is undefined.
+		// command: The command to test for
+		var ie = 1;
+		var mozilla = 1 << 1;
+		var safari = 1 << 2;
+		var opera = 1 << 3;
+		var safari420 = 1 << 4;
+
+		var gt420 = dojo.isSafari;
+
+		function isSupportedBy(browsers){
+			return {
+				ie: Boolean(browsers & ie),
+				mozilla: Boolean(browsers & mozilla),
+				safari: Boolean(browsers & safari),
+				safari420: Boolean(browsers & safari420),
+				opera: Boolean(browsers & opera)
+			}
+		}
+
+		var supportedBy = null;
+
+		switch(command.toLowerCase()){
+			case "bold": case "italic": case "underline":
+			case "subscript": case "superscript":
+			case "fontname": case "fontsize":
+			case "forecolor": case "hilitecolor":
+			case "justifycenter": case "justifyfull": case "justifyleft":
+			case "justifyright": case "delete": case "selectall": case "toggledir":
+				supportedBy = isSupportedBy(mozilla | ie | safari | opera);
+				break;
+
+			case "createlink": case "unlink": case "removeformat":
+			case "inserthorizontalrule": case "insertimage":
+			case "insertorderedlist": case "insertunorderedlist":
+			case "indent": case "outdent": case "formatblock":
+			case "inserthtml": case "undo": case "redo": case "strikethrough":
+				supportedBy = isSupportedBy(mozilla | ie | opera | safari420);
+				break;
+
+			case "blockdirltr": case "blockdirrtl":
+			case "dirltr": case "dirrtl":
+			case "inlinedirltr": case "inlinedirrtl":
+				supportedBy = isSupportedBy(ie);
+				break;
+			case "cut": case "copy": case "paste":
+				supportedBy = isSupportedBy( ie | mozilla | safari420);
+				break;
+
+			case "inserttable":
+				supportedBy = isSupportedBy(mozilla | ie);
+				break;
+
+			case "insertcell": case "insertcol": case "insertrow":
+			case "deletecells": case "deletecols": case "deleterows":
+			case "mergecells": case "splitcell":
+				supportedBy = isSupportedBy(ie | mozilla);
+				break;
+
+			default: return false;
+		}
+
+		return (dojo.isIE && supportedBy.ie) ||
+			(dojo.isMoz && supportedBy.mozilla) ||
+			(dojo.isSafari && supportedBy.safari) ||
+			(gt420 && supportedBy.safari420) ||
+			(dojo.isOpera && supportedBy.opera);  // Boolean return true if the command is supported, false otherwise
+	},
+
+	execCommand: function(/*String*/command, argument){
+		// summary: Executes a command in the Rich Text area
+		// command: The command to execute
+		// argument: An optional argument to the command
+		var returnValue;
+
+		//focus() is required for IE to work
+		//In addition, focus() makes sure after the execution of
+		//the command, the editor receives the focus as expected
+		this.focus();
+
+		command = this._normalizeCommand(command);
+		if(argument != undefined){
+			if(command == "heading"){
+				throw new Error("unimplemented");
+			}else if((command == "formatblock") && dojo.isIE){
+				argument = '<'+argument+'>';
+			}
+		}
+		if(command == "inserthtml"){
+			argument=this._preFilterContent(argument);
+			if(dojo.isIE){
+				var insertRange = this.document.selection.createRange();
+				if(this.document.selection.type.toUpperCase()=='CONTROL'){
+					var n=insertRange.item(0);
+					while(insertRange.length){
+						insertRange.remove(insertRange.item(0));
+					}
+					n.outerHTML=argument;
+				}else{
+					insertRange.pasteHTML(argument);
+				}
+				insertRange.select();
+				//insertRange.collapse(true);
+				returnValue=true;
+			}else if(dojo.isMoz && !argument.length){
+				//mozilla can not inserthtml an empty html to delete current selection
+				//so we delete the selection instead in this case
+				dojo.withGlobal(this.window,'remove',dijit._editor.selection);
+				returnValue=true;
+			}else{
+				returnValue=this.document.execCommand(command, false, argument);
+			}
+		}else if(
+			(command == "unlink")&&
+			(this.queryCommandEnabled("unlink"))&&
+			(dojo.isMoz || dojo.isSafari)
+		){
+			// fix up unlink in Mozilla to unlink the link and not just the selection
+
+			// grab selection
+			// Mozilla gets upset if we just store the range so we have to
+			// get the basic properties and recreate to save the selection
+			var selection = this.window.getSelection();
+			//	var selectionRange = selection.getRangeAt(0);
+			//	var selectionStartContainer = selectionRange.startContainer;
+			//	var selectionStartOffset = selectionRange.startOffset;
+			//	var selectionEndContainer = selectionRange.endContainer;
+			//	var selectionEndOffset = selectionRange.endOffset;
+
+			// select our link and unlink
+			var a = dojo.withGlobal(this.window, "getAncestorElement",dijit._editor.selection, ['a']);
+			dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [a]);
+
+			returnValue=this.document.execCommand("unlink", false, null);
+		}else if((command == "hilitecolor")&&(dojo.isMoz)){
+//				// mozilla doesn't support hilitecolor properly when useCSS is
+//				// set to false (bugzilla #279330)
+
+			this.document.execCommand("styleWithCSS", false, true);
+			returnValue = this.document.execCommand(command, false, argument);
+			this.document.execCommand("styleWithCSS", false, false);
+
+		}else if((dojo.isIE)&&( (command == "backcolor")||(command == "forecolor") )){
+			// Tested under IE 6 XP2, no problem here, comment out
+			// IE weirdly collapses ranges when we exec these commands, so prevent it
+//				var tr = this.document.selection.createRange();
+			argument = arguments.length > 1 ? argument : null;
+			returnValue = this.document.execCommand(command, false, argument);
+
+			// timeout is workaround for weird IE behavior were the text
+			// selection gets correctly re-created, but subsequent input
+			// apparently isn't bound to it
+//				setTimeout(function(){tr.select();}, 1);
+		}else{
+			argument = arguments.length > 1 ? argument : null;
+//				if(dojo.isMoz){
+//					this.document = this.iframe.contentWindow.document
+//				}
+
+			if(argument || command!="createlink"){
+				returnValue = this.document.execCommand(command, false, argument);
+			}
+		}
+
+		this.onDisplayChanged();
+		return returnValue;
+	},
+
+	queryCommandEnabled: function(/*String*/command){
+		// summary: check whether a command is enabled or not
+
+		if(this.disabled){ return false; }
+		command = this._normalizeCommand(command);
+		if(dojo.isMoz || dojo.isSafari){
+			if(command == "unlink"){ // mozilla returns true always
+				// console.debug(dojo.withGlobal(this.window, "hasAncestorElement",dijit._editor.selection, ['a']));
+				return dojo.withGlobal(this.window, "hasAncestorElement",dijit._editor.selection, ['a']);
+			}else if(command == "inserttable"){
+				return true;
+			}
+		}
+		//see #4109
+		if(dojo.isSafari){
+			if(command == "copy"){
+				command = "cut";
+			}else if(command == "paste"){
+				return true;
+			}
+		}
+
+		// return this.document.queryCommandEnabled(command);
+		var elem = dojo.isIE ? this.document.selection.createRange() : this.document;
+		return elem.queryCommandEnabled(command);
+	},
+
+	queryCommandState: function(command){
+		// summary: check the state of a given command
+
+		if(this.disabled){ return false; }
+		command = this._normalizeCommand(command);
+		return this.document.queryCommandState(command);
+	},
+
+	queryCommandValue: function(command){
+		// summary: check the value of a given command
+
+		if(this.disabled){ return false; }
+		command = this._normalizeCommand(command);
+		if(dojo.isIE && command == "formatblock"){
+			return this._local2NativeFormatNames[this.document.queryCommandValue(command)];
+		}
+		return this.document.queryCommandValue(command);
+	},
+
+	// Misc.
+
+	placeCursorAtStart: function(){
+		// summary:
+		//		place the cursor at the start of the editing area
+		this.focus();
+
+		//see comments in placeCursorAtEnd
+		var isvalid=false;
+		if(dojo.isMoz){
+			var first=this.editNode.firstChild;
+			while(first){
+				if(first.nodeType == 3){
+					if(first.nodeValue.replace(/^\s+|\s+$/g, "").length>0){
+						isvalid=true;
+						dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [first]);
+						break;
+					}
+				}else if(first.nodeType == 1){
+					isvalid=true;
+					dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [first]);
+					break;
+				}
+				first = first.nextSibling;
+			}
+		}else{
+			isvalid=true;
+			dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [this.editNode]);
+		}
+		if(isvalid){
+			dojo.withGlobal(this.window, "collapse", dijit._editor.selection, [true]);
+		}
+	},
+
+	placeCursorAtEnd: function(){
+		// summary:
+		//		place the cursor at the end of the editing area
+		this.focus();
+
+		//In mozilla, if last child is not a text node, we have to use selectElementChildren on this.editNode.lastChild
+		//otherwise the cursor would be placed at the end of the closing tag of this.editNode.lastChild
+		var isvalid=false;
+		if(dojo.isMoz){
+			var last=this.editNode.lastChild;
+			while(last){
+				if(last.nodeType == 3){
+					if(last.nodeValue.replace(/^\s+|\s+$/g, "").length>0){
+						isvalid=true;
+						dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last]);
+						break;
+					}
+				}else if(last.nodeType == 1){
+					isvalid=true;
+					if(last.lastChild){
+						dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last.lastChild]);
+					}else{
+						dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last]);
+					}
+					break;
+				}
+				last = last.previousSibling;
+			}
+		}else{
+			isvalid=true;
+			dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [this.editNode]);
+		}
+		if(isvalid){
+			dojo.withGlobal(this.window, "collapse", dijit._editor.selection, [false]);
+		}
+	},
+
+	getValue: function(/*Boolean?*/nonDestructive){
+		// summary:
+		//		return the current content of the editing area (post filters are applied)
+		if(this.textarea){
+			if(this.isClosed || !this.isLoaded){
+				return this.textarea.value;
+			}
+		}
+
+		return this._postFilterContent(null, nonDestructive);
+	},
+
+	setValue: function(/*String*/html){
+		// summary:
+		//		this function set the content. No undo history is preserved
+
+		if(!this.isLoaded){
+			// try again after the editor is finished loading
+			this.onLoadDeferred.addCallback(dojo.hitch(this, function(){
+				this.setValue(html);
+			}));
+			return;
+		}
+
+		if(this.textarea && (this.isClosed || !this.isLoaded)){
+			this.textarea.value=html;
+		}else{
+			html = this._preFilterContent(html);
+			var node = this.isClosed ? this.domNode : this.editNode;
+			node.innerHTML = html;
+			this._preDomFilterContent(node);
+		}
+
+		this.onDisplayChanged();
+	},
+
+	replaceValue: function(/*String*/html){
+		// summary:
+		//		this function set the content while trying to maintain the undo stack
+		//		(now only works fine with Moz, this is identical to setValue in all
+		//		other browsers)
+		if(this.isClosed){
+			this.setValue(html);
+		}else if(this.window && this.window.getSelection && !dojo.isMoz){ // Safari
+			// look ma! it's a totally f'd browser!
+			this.setValue(html);
+		}else if(this.window && this.window.getSelection){ // Moz
+			html = this._preFilterContent(html);
+			this.execCommand("selectall");
+			if(dojo.isMoz && !html){ html = "&nbsp;" }
+			this.execCommand("inserthtml", html);
+			this._preDomFilterContent(this.editNode);
+		}else if(this.document && this.document.selection){//IE
+			//In IE, when the first element is not a text node, say
+			//an <a> tag, when replacing the content of the editing
+			//area, the <a> tag will be around all the content
+			//so for now, use setValue for IE too
+			this.setValue(html);
+		}
+	},
+
+	_preFilterContent: function(/*String*/html){
+		// summary:
+		//		filter the input before setting the content of the editing area
+		var ec = html;
+		dojo.forEach(this.contentPreFilters, function(ef){ if(ef){ ec = ef(ec); } });
+		return ec;
+	},
+	_preDomFilterContent: function(/*DomNode*/dom){
+		// summary:
+		//		filter the input
+		dom = dom || this.editNode;
+		dojo.forEach(this.contentDomPreFilters, function(ef){
+			if(ef && dojo.isFunction(ef)){
+				ef(dom);
+			}
+		}, this);
+	},
+
+	_postFilterContent: function(/*DomNode|DomNode[]|String?*/dom,/*Boolean?*/nonDestructive){
+		// summary:
+		//		filter the output after getting the content of the editing area
+		var ec;
+		if(!dojo.isString(dom)){
+			dom = dom || this.editNode;
+			if(this.contentDomPostFilters.length){
+				if(nonDestructive && dom['cloneNode']){
+					dom = dom.cloneNode(true);
+				}
+				dojo.forEach(this.contentDomPostFilters, function(ef){
+					dom = ef(dom);
+				});
+			}
+			ec = dijit._editor.getChildrenHtml(dom);
+		}else{
+			ec = dom;
+		}
+		
+		if(!ec.replace(/^(?:\s|\xA0)+/g, "").replace(/(?:\s|\xA0)+$/g,"").length){ ec = ""; }
+
+		//	if(dojo.isIE){
+		//		//removing appended <P>&nbsp;</P> for IE
+		//		ec = ec.replace(/(?:<p>&nbsp;</p>[\n\r]*)+$/i,"");
+		//	}
+		dojo.forEach(this.contentPostFilters, function(ef){
+			ec = ef(ec);
+		});
+
+		return ec;
+	},
+
+	_saveContent: function(/*Event*/e){
+		// summary:
+		//		Saves the content in an onunload event if the editor has not been closed
+		var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.savedContent");
+		saveTextarea.value += this._SEPARATOR + this.name + ":" + this.getValue();
+	},
+
+	escapeXml: function(/*String*/str, /*Boolean*/noSingleQuotes){
+		dojo.deprecated('dijit.Editor::escapeXml is deprecated','use dijit._editor.escapeXml instead', 2);
+		return dijit._editor.escapeXml(str,noSingleQuotes);
+	},
+
+	getNodeHtml: function(/* DomNode */node){
+		dojo.deprecated('dijit.Editor::getNodeHtml is deprecated','use dijit._editor.getNodeHtml instead', 2);
+		return dijit._editor.getNodeHtml(node);
+	},
+
+	getNodeChildrenHtml: function(/* DomNode */dom){
+		dojo.deprecated('dijit.Editor::getNodeChildrenHtml is deprecated','use dijit._editor.getChildrenHtml instead', 2);
+		return dijit._editor.getChildrenHtml(dom);
+	},
+
+	close: function(/*Boolean*/save, /*Boolean*/force){
+		// summary:
+		//		Kills the editor and optionally writes back the modified contents to the
+		//		element from which it originated.
+		// save:
+		//		Whether or not to save the changes. If false, the changes are discarded.
+		// force:
+		if(this.isClosed){return false; }
+
+		if(!arguments.length){ save = true; }
+		this._content = this.getValue();
+		var changed = (this.savedContent != this._content);
+
+		// line height is squashed for iframes
+		// FIXME: why was this here? if(this.iframe){ this.domNode.style.lineHeight = null; }
+
+		if(this.interval){ clearInterval(this.interval); }
+
+		if(this.textarea){
+			with(this.textarea.style){
+				position = "";
+				left = top = "";
+				if(dojo.isIE){
+					overflow = this.__overflow;
+					this.__overflow = null;
+				}
+			}
+			this.textarea.value = save ? this._content : this.savedContent;
+			dojo._destroyElement(this.domNode);
+			this.domNode = this.textarea;
+		}else{
+//			if(save){
+				//why we treat moz differently? comment out to fix #1061
+//					if(dojo.isMoz){
+//						var nc = dojo.doc.createElement("span");
+//						this.domNode.appendChild(nc);
+//						nc.innerHTML = this.editNode.innerHTML;
+//					}else{
+//						this.domNode.innerHTML = this._content;
+//					}
+//			}
+			this.domNode.innerHTML = save ? this._content : this.savedContent;
+		}
+
+		dojo.removeClass(this.domNode, "RichTextEditable");
+		this.isClosed = true;
+		this.isLoaded = false;
+		// FIXME: is this always the right thing to do?
+		delete this.editNode;
+
+		if(this.window && this.window._frameElement){
+			this.window._frameElement = null;
+		}
+
+		this.window = null;
+		this.document = null;
+		this.editingArea = null;
+		this.editorObject = null;
+
+		return changed; // Boolean: whether the content has been modified
+	},
+
+	destroyRendering: function(){
+		// summary: stub	
+	}, 
+
+	destroy: function(){
+		this.destroyRendering();
+		if(!this.isClosed){ this.close(false); }
+		this.inherited("destroy",arguments);
+		//dijit._editor.RichText.superclass.destroy.call(this);
+	},
+
+	_removeMozBogus: function(/* String */ html){
+		return html.replace(/\stype="_moz"/gi, '').replace(/\s_moz_dirty=""/gi, ''); // String
+	},
+	_removeSafariBogus: function(/* String */ html){
+		return html.replace(/\sclass="webkit-block-placeholder"/gi, ''); // String
+	},
+	_fixContentForMoz: function(/* String */ html){
+		// summary:
+		//		Moz can not handle strong/em tags correctly, convert them to b/i
+		return html.replace(/<(\/)?strong([ \>])/gi, '<$1b$2')
+			.replace(/<(\/)?em([ \>])/gi, '<$1i$2' ); // String
+	},
+
+	_srcInImgRegex	: /(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi ,
+	_hrefInARegex	: /(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi ,
+
+	_preFixUrlAttributes: function(/* String */ html){
+		return html.replace(this._hrefInARegex, '$1$4$2$3$5$2 _djrealurl=$2$3$5$2')
+			.replace(this._srcInImgRegex, '$1$4$2$3$5$2 _djrealurl=$2$3$5$2'); // String
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.Toolbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Toolbar"] = true;
+dojo.provide("dijit.Toolbar");
+
+
+
+
+
+dojo.declare("dijit.Toolbar",
+	[dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
+	{
+	// summary: A Toolbar widget, used to hold things like dijit.Editor buttons
+
+	templateString:
+		'<div class="dijit dijitToolbar" waiRole="toolbar" tabIndex="${tabIndex}" dojoAttachPoint="containerNode">' +
+		//	'<table style="table-layout: fixed" class="dijitReset dijitToolbarTable">' + // factor out style
+		//		'<tr class="dijitReset" dojoAttachPoint="containerNode"></tr>'+
+		//	'</table>' +
+		'</div>',
+
+	tabIndex: "0",
+
+	postCreate: function(){
+		this.connectKeyNavHandlers(
+			this.isLeftToRight() ? [dojo.keys.LEFT_ARROW] : [dojo.keys.RIGHT_ARROW],
+			this.isLeftToRight() ? [dojo.keys.RIGHT_ARROW] : [dojo.keys.LEFT_ARROW]
+		);
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		this.startupKeyNavChildren();
+
+		this.inherited(arguments);
+	}
+}
+);
+
+// Combine with dijit.MenuSeparator??
+dojo.declare("dijit.ToolbarSeparator",
+	[ dijit._Widget, dijit._Templated ],
+	{
+	// summary: A spacer between two Toolbar items
+	templateString: '<div class="dijitToolbarSeparator dijitInline"></div>',
+	postCreate: function(){ dojo.setSelectable(this.domNode, false); },
+	isFocusable: function(){ 
+		// summary: This widget isn't focusable, so pass along that fact.
+		return false; 
+	}
+
+});
+
+}
+
+if(!dojo._hasResource["dijit.form.Button"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Button"] = true;
+dojo.provide("dijit.form.Button");
+
+
+
+
+dojo.declare("dijit.form.Button",
+	dijit.form._FormWidget,
+	{
+	// summary:
+	//	Basically the same thing as a normal HTML button, but with special styling.
+	//
+	// example:
+	// |	<button dojoType="dijit.form.Button" onClick="...">Hello world</button>
+	// 
+	// example:
+	// |	var button1 = new dijit.form.Button({label: "hello world", onClick: foo});
+	// |	dojo.body().appendChild(button1.domNode);
+	//
+	// label: String
+	//	text to display in button
+	label: "",
+
+	// showLabel: Boolean
+	//	whether or not to display the text label in button
+	showLabel: true,
+
+	// iconClass: String
+	//	class to apply to div in button to make it display an icon
+	iconClass: "",
+
+	type: "button",
+	baseClass: "dijitButton",
+	templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\twaiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" dojoAttachPoint=\"focusNode,titleNode\"\n\t\ttype=\"${type}\" waiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t><span class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" \n \t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#10003;</span \n\t\t></span\n\t\t><div class=\"dijitReset dijitInline\"><center class=\"dijitReset dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\">${label}</center></div\n\t></button\n></div>\n",
+
+	_onChangeMonitor: '',
+	// TODO: set button's title to this.containerNode.innerText
+
+	_onClick: function(/*Event*/ e){
+		// summary: internal function to handle click actions
+		if(this.disabled || this.readOnly){
+			dojo.stopEvent(e); // needed for checkbox
+			return false;
+		}
+		this._clicked(); // widget click actions
+		return this.onClick(e); // user click actions
+	},
+
+	_onButtonClick: function(/*Event*/ e){
+		// summary: callback when the user mouse clicks the button portion
+		if(this._onClick(e) === false){ // returning nothing is same as true
+			dojo.stopEvent(e);
+		}else if(this.type=="submit" && !this.focusNode.form){ // see if a nonform widget needs to be signalled
+			for(var node=this.domNode; node.parentNode/*#5935*/; node=node.parentNode){
+				var widget=dijit.byNode(node);
+				if(widget && typeof widget._onSubmit == "function"){
+					widget._onSubmit(e);
+					break;
+				}
+			}
+		}
+	},
+
+	postCreate: function(){
+		// summary:
+		//	get label and set as title on button icon if necessary
+		if (this.showLabel == false){
+			var labelText = "";
+			this.label = this.containerNode.innerHTML;
+			labelText = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+			// set title attrib on iconNode
+			this.titleNode.title=labelText;
+			dojo.addClass(this.containerNode,"dijitDisplayNone");
+		}
+		dojo.setSelectable(this.focusNode, false);
+		this.inherited(arguments);
+	},
+
+	onClick: function(/*Event*/ e){
+		// summary: user callback for when button is clicked
+		//      if type="submit", return true to perform submit
+		return true;
+	},
+
+	_clicked: function(/*Event*/ e){
+		// summary: internal replaceable function for when the button is clicked
+	},
+
+	setLabel: function(/*String*/ content){
+		// summary: reset the label (text) of the button; takes an HTML string
+		this.containerNode.innerHTML = this.label = content;
+		this._layoutHack();
+		if (this.showLabel == false){
+			this.titleNode.title=dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+		}
+	}		
+});
+
+
+dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container], {
+	// summary: A button with a popup
+	//
+	// example:
+	// |	<button dojoType="dijit.form.DropDownButton" label="Hello world">
+	// |		<div dojotype="dijit.Menu">...</div>
+	// |	</button>
+	//
+	// example:
+	// |	var button1 = new dijit.form.DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) });
+	// |	dojo.body().appendChild(button1);
+	// 	
+	
+	baseClass : "dijitDropDownButton",
+
+	templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey\"\n\twaiRole=\"presentation\"\n\t><div class='dijitReset dijitRight' waiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" type=\"${type}\"\n\t\tdojoAttachPoint=\"focusNode,titleNode\" waiRole=\"button\" waiState=\"haspopup-true,labelledby-${id}_label\"\n\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t><div class=\"dijitReset dijitInline dijitButtonText\"  dojoAttachPoint=\"containerNode,popupStateNode\" waiRole=\"presentation\"\n\t\t\tid=\"${id}_label\">${label}</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t></button\n></div></div>\n",
+
+	_fillContent: function(){
+		// my inner HTML contains both the button contents and a drop down widget, like
+		// <DropDownButton>  <span>push me</span>  <Menu> ... </Menu> </DropDownButton>
+		// The first node is assumed to be the button content. The widget is the popup.
+		if(this.srcNodeRef){ // programatically created buttons might not define srcNodeRef
+			//FIXME: figure out how to filter out the widget and use all remaining nodes as button
+			//	content, not just nodes[0]
+			var nodes = dojo.query("*", this.srcNodeRef);
+			dijit.form.DropDownButton.superclass._fillContent.call(this, nodes[0]);
+
+			// save pointer to srcNode so we can grab the drop down widget after it's instantiated
+			this.dropDownContainer = this.srcNodeRef;
+		}
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		// the child widget from srcNodeRef is the dropdown widget.  Insert it in the page DOM,
+		// make it invisible, and store a reference to pass to the popup code.
+		if(!this.dropDown){
+			var dropDownNode = dojo.query("[widgetId]", this.dropDownContainer)[0];
+			this.dropDown = dijit.byNode(dropDownNode);
+			delete this.dropDownContainer;
+		}
+		dijit.popup.prepare(this.dropDown.domNode);
+
+		this.inherited(arguments);
+	},
+
+	destroyDescendants: function(){
+		if(this.dropDown){
+			this.dropDown.destroyRecursive();
+			delete this.dropDown;
+		}
+		this.inherited(arguments);
+	},
+
+	_onArrowClick: function(/*Event*/ e){
+		// summary: callback when the user mouse clicks on menu popup node
+		if(this.disabled || this.readOnly){ return; }
+		this._toggleDropDown();
+	},
+
+	_onDropDownClick: function(/*Event*/ e){
+		// on Firefox 2 on the Mac it is possible to fire onclick
+		// by pressing enter down on a second element and transferring
+		// focus to the DropDownButton;
+		// we want to prevent opening our menu in this situation
+		// and only do so if we have seen a keydown on this button;
+		// e.detail != 0 means that we were fired by mouse
+		var isMacFFlessThan3 = dojo.isFF && dojo.isFF < 3
+			&& navigator.appVersion.indexOf("Macintosh") != -1;
+		if(!isMacFFlessThan3 || e.detail != 0 || this._seenKeydown){
+			this._onArrowClick(e);
+		}
+		this._seenKeydown = false;
+	},
+
+	_onDropDownKeydown: function(/*Event*/ e){
+		this._seenKeydown = true;
+	},
+
+	_onDropDownBlur: function(/*Event*/ e){
+		this._seenKeydown = false;
+	},
+
+	_onKey: function(/*Event*/ e){
+		// summary: callback when the user presses a key on menu popup node
+		if(this.disabled || this.readOnly){ return; }
+		if(e.keyCode == dojo.keys.DOWN_ARROW){
+			if(!this.dropDown || this.dropDown.domNode.style.visibility=="hidden"){
+				dojo.stopEvent(e);
+				this._toggleDropDown();
+			}
+		}
+	},
+
+	_onBlur: function(){
+		// summary: called magically when focus has shifted away from this widget and it's dropdown
+		this._closeDropDown();
+		// don't focus on button.  the user has explicitly focused on something else.
+		this.inherited(arguments);
+	},
+
+	_toggleDropDown: function(){
+		// summary: toggle the drop-down widget; if it is up, close it, if not, open it
+		if(this.disabled || this.readOnly){ return; }
+		dijit.focus(this.popupStateNode);
+		var dropDown = this.dropDown;
+		if(!dropDown){ return; }
+		if(!this._opened){
+			// If there's an href, then load that first, so we don't get a flicker
+			if(dropDown.href && !dropDown.isLoaded){
+				var self = this;
+				var handler = dojo.connect(dropDown, "onLoad", function(){
+					dojo.disconnect(handler);
+					self._openDropDown();
+				});
+				dropDown._loadCheck(true);
+				return;
+			}else{
+				this._openDropDown();
+			}
+		}else{
+			this._closeDropDown();
+		}
+	},
+
+	_openDropDown: function(){
+		var dropDown = this.dropDown;
+		var oldWidth=dropDown.domNode.style.width;
+		var self = this;
+
+		dijit.popup.open({
+			parent: this,
+			popup: dropDown,
+			around: this.domNode,
+			orient:
+				// TODO: add user-defined positioning option, like in Tooltip.js
+				this.isLeftToRight() ? {'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'}
+				: {'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'},
+			onExecute: function(){
+				self._closeDropDown(true);
+			},
+			onCancel: function(){
+				self._closeDropDown(true);
+			},
+			onClose: function(){
+				dropDown.domNode.style.width = oldWidth;
+				self.popupStateNode.removeAttribute("popupActive");
+				this._opened = false;
+			}
+		});
+		if(this.domNode.offsetWidth > dropDown.domNode.offsetWidth){
+			var adjustNode = null;
+			if(!this.isLeftToRight()){
+				adjustNode = dropDown.domNode.parentNode;
+				var oldRight = adjustNode.offsetLeft + adjustNode.offsetWidth;
+			}
+			// make menu at least as wide as the button
+			dojo.marginBox(dropDown.domNode, {w: this.domNode.offsetWidth});
+			if(adjustNode){
+				adjustNode.style.left = oldRight - this.domNode.offsetWidth + "px";
+			}
+		}
+		this.popupStateNode.setAttribute("popupActive", "true");
+		this._opened=true;
+		if(dropDown.focus){
+			dropDown.focus();
+		}
+		// TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown
+	},
+	
+	_closeDropDown: function(/*Boolean*/ focus){
+		if(this._opened){
+			dijit.popup.close(this.dropDown);
+			if(focus){ this.focus(); }
+			this._opened = false;			
+		}
+	}
+});
+
+dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
+	// summary: A Normal Button with a DropDown
+	//
+	// example:
+	// |	<button dojoType="dijit.form.ComboButton" onClick="...">
+	// |		<span>Hello world</span>
+	// |		<div dojoType="dijit.Menu">...</div>
+	// |	</button>
+	//
+	// example:
+	// |	var button1 = new dijit.form.ComboButton({label: "hello world", onClick: foo, dropDown: "myMenu"});
+	// |	dojo.body().appendChild(button1.domNode);
+	// 
+
+	templateString:"<table class='dijit dijitReset dijitInline dijitLeft'\n\tcellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td\tclass=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\"\n\t\t\ttabIndex=\"${tabIndex}\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"  dojoAttachPoint=\"titleNode\"\n\t\t\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"presentation\">${label}</div\n\t\t></td\n\t\t><td class='dijitReset dijitStretch dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"popupStateNode,focusNode\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onArrowClick, onkeypress:_onKey,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\tstateModifier=\"DownArrow\"\n\t\t\ttitle=\"${optionsTitle}\" name=\"${name}\"\n\t\t\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t\t></td\n\t></tr></tbody\n></table>\n",
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+		{id:"", name:""}),
+
+	// optionsTitle: String
+	//  text that describes the options menu (accessibility)
+	optionsTitle: "",
+
+	baseClass: "dijitComboButton",
+
+	_focusedNode: null,
+
+	postCreate: function(){
+		this.inherited(arguments);
+		this._focalNodes = [this.titleNode, this.popupStateNode];
+		dojo.forEach(this._focalNodes, dojo.hitch(this, function(node){
+			if(dojo.isIE){
+				this.connect(node, "onactivate", this._onNodeFocus);
+				this.connect(node, "ondeactivate", this._onNodeBlur);
+			}else{
+				this.connect(node, "onfocus", this._onNodeFocus);
+				this.connect(node, "onblur", this._onNodeBlur);
+			}
+		}));
+	},
+
+	focusFocalNode: function(node){
+		// summary: Focus the focal node node.
+		this._focusedNode = node;
+		dijit.focus(node);
+	},
+
+	hasNextFocalNode: function(){
+		// summary: Returns true if this widget has no node currently
+		//		focused or if there is a node following the focused one.
+		//		False is returned if the last node has focus.
+		return this._focusedNode !== this.getFocalNodes()[1];
+	},
+
+	focusNext: function(){
+		// summary: Focus the focal node following the current node with focus
+		//		or the first one if no node currently has focus.
+		this._focusedNode = this.getFocalNodes()[this._focusedNode ? 1 : 0];
+		dijit.focus(this._focusedNode);
+	},
+
+	hasPrevFocalNode: function(){
+		// summary: Returns true if this widget has no node currently
+		//		focused or if there is a node before the focused one.
+		//		False is returned if the first node has focus.
+		return this._focusedNode !== this.getFocalNodes()[0];
+	},
+
+	focusPrev: function(){
+		// summary: Focus the focal node before the current node with focus
+		//		or the last one if no node currently has focus.
+		this._focusedNode = this.getFocalNodes()[this._focusedNode ? 0 : 1];
+		dijit.focus(this._focusedNode);
+	},
+
+	getFocalNodes: function(){
+		// summary: Returns an array of focal nodes for this widget.
+		return this._focalNodes;
+	},
+
+	_onNodeFocus: function(evt){
+		this._focusedNode = evt.currentTarget;
+		var fnc = this._focusedNode == this.focusNode ? "dijitDownArrowButtonFocused" : "dijitButtonContentsFocused";
+		dojo.addClass(this._focusedNode, fnc);
+	},
+
+	_onNodeBlur: function(evt){
+		var fnc = evt.currentTarget == this.focusNode ? "dijitDownArrowButtonFocused" : "dijitButtonContentsFocused";
+		dojo.removeClass(evt.currentTarget, fnc);
+	},
+
+	_onBlur: function(){
+		this.inherited(arguments);
+		this._focusedNode = null;
+	}
+});
+
+dojo.declare("dijit.form.ToggleButton", dijit.form.Button, {
+	// summary:
+	//	A button that can be in two states (checked or not).
+	//	Can be base class for things like tabs or checkbox or radio buttons
+
+	baseClass: "dijitToggleButton",
+
+	// checked: Boolean
+	//		Corresponds to the native HTML <input> element's attribute.
+	//		In markup, specified as "checked='checked'" or just "checked".
+	//		True if the button is depressed, or the checkbox is checked,
+	//		or the radio button is selected, etc.
+	checked: false,
+
+	_onChangeMonitor: 'checked',
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),
+		{checked:"focusNode"}),
+
+	_clicked: function(/*Event*/ evt){
+		this.setAttribute('checked', !this.checked);
+	},
+
+	setAttribute: function(/*String*/ attr, /*anything*/ value){
+		this.inherited(arguments);
+		switch(attr){
+			case "checked":
+				dijit.setWaiState(this.focusNode || this.domNode, "pressed", this.checked);
+				this._setStateClass();		
+				this._handleOnChange(this.checked, true);
+		}
+	},
+
+
+	setChecked: function(/*Boolean*/ checked){
+		// summary:
+		//	Programatically deselect the button
+		dojo.deprecated("setChecked("+checked+") is deprecated. Use setAttribute('checked',"+checked+") instead.", "", "2.0");
+		this.setAttribute('checked', checked);
+	},
+	
+	postCreate: function(){
+		this.inherited(arguments);
+		this.setAttribute('checked', this.checked); //to initially set wai pressed state 
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit._editor._Plugin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor._Plugin"] = true;
+dojo.provide("dijit._editor._Plugin");
+
+
+
+
+dojo.declare("dijit._editor._Plugin", null, {
+	// summary
+	//		This represents a "plugin" to the editor, which is basically
+	//		a single button on the Toolbar and some associated code
+	constructor: function(/*Object?*/args, /*DomNode?*/node){
+		if(args){
+			dojo.mixin(this, args);
+		}
+		this._connects=[];
+	},
+
+	editor: null,
+	iconClassPrefix: "dijitEditorIcon",
+	button: null,
+	queryCommand: null,
+	command: "",
+	commandArg: null,
+	useDefaultCommand: true,
+	buttonClass: dijit.form.Button,
+	getLabel: function(key){
+		return this.editor.commands[key];
+	},
+	_initButton: function(props){
+		if(this.command.length){
+			var label = this.getLabel(this.command);
+			var className = this.iconClassPrefix+" "+this.iconClassPrefix + this.command.charAt(0).toUpperCase() + this.command.substr(1);
+			if(!this.button){
+				props = dojo.mixin({
+					label: label,
+					showLabel: false,
+					iconClass: className,
+					dropDown: this.dropDown,
+					tabIndex: "-1"
+				}, props || {});
+				this.button = new this.buttonClass(props);
+			}
+		}
+	},
+	destroy: function(f){
+		dojo.forEach(this._connects, dojo.disconnect);
+	},
+	connect: function(o, f, tf){
+		this._connects.push(dojo.connect(o, f, this, tf));
+	},
+	updateState: function(){
+		var _e = this.editor;
+		var _c = this.command;
+		if(!_e){ return; }
+		if(!_e.isLoaded){ return; }
+		if(!_c.length){ return; }
+		if(this.button){
+			try{
+				var enabled = _e.queryCommandEnabled(_c);
+				this.button.setAttribute('disabled', !enabled);
+				if(typeof this.button.checked == 'boolean'){
+					this.button.setAttribute('checked', _e.queryCommandState(_c));
+				}
+			}catch(e){
+				console.debug(e);
+			}
+		}
+	},
+	setEditor: function(/*Widget*/editor){
+		// FIXME: detatch from previous editor!!
+		this.editor = editor;
+
+		// FIXME: prevent creating this if we don't need to (i.e., editor can't handle our command)
+		this._initButton();
+
+		// FIXME: wire up editor to button here!
+		if(this.command.length &&
+			!this.editor.queryCommandAvailable(this.command)
+		){
+			// console.debug("hiding:", this.command);
+			if(this.button){
+				this.button.domNode.style.display = "none";
+			}
+		}
+		if(this.button && this.useDefaultCommand){
+			this.connect(this.button, "onClick",
+				dojo.hitch(this.editor, "execCommand", this.command, this.commandArg)
+			);
+		}
+		this.connect(this.editor, "onNormalizedDisplayChanged", "updateState");
+	},
+	setToolbar: function(/*Widget*/toolbar){
+		if(this.button){
+			toolbar.addChild(this.button);
+		}
+		// console.debug("adding", this.button, "to:", toolbar);
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.Editor"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Editor"] = true;
+dojo.provide("dijit.Editor");
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit.Editor",
+	dijit._editor.RichText,
+	{
+	// summary: A rich-text Editing widget
+
+		// plugins: Array
+		//		a list of plugin names (as strings) or instances (as objects)
+		//		for this widget.
+		plugins: null,
+
+		// extraPlugins: Array
+		//		a list of extra plugin names which will be appended to plugins array
+		extraPlugins: null,
+
+		constructor: function(){
+			if(!dojo.isArray(this.plugins)){
+				this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|",
+				"insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull"/*"createLink"*/];
+			}
+
+			this._plugins=[];
+			this._editInterval = this.editActionInterval * 1000;
+		},
+
+		postCreate: function(){
+			//for custom undo/redo
+			if(this.customUndo){
+				dojo['require']("dijit._editor.range");
+				this._steps=this._steps.slice(0);
+				this._undoedSteps=this._undoedSteps.slice(0);
+//				this.addKeyHandler('z',this.KEY_CTRL,this.undo);
+//				this.addKeyHandler('y',this.KEY_CTRL,this.redo);
+			}
+			if(dojo.isArray(this.extraPlugins)){
+				this.plugins=this.plugins.concat(this.extraPlugins);
+			}
+
+//			try{
+			this.inherited(arguments);
+//			dijit.Editor.superclass.postCreate.apply(this, arguments);
+
+			this.commands = dojo.i18n.getLocalization("dijit._editor", "commands", this.lang);
+
+			if(!this.toolbar){
+				// if we haven't been assigned a toolbar, create one
+				this.toolbar = new dijit.Toolbar({});
+				dojo.place(this.toolbar.domNode, this.editingArea, "before");
+			}
+
+			dojo.forEach(this.plugins, this.addPlugin, this);
+			this.onNormalizedDisplayChanged(); //update toolbar button status
+//			}catch(e){ console.debug(e); }
+		},
+		destroy: function(){
+			dojo.forEach(this._plugins, function(p){
+				if(p && p.destroy){
+					p.destroy();
+				}
+			});
+			this._plugins=[];
+			this.toolbar.destroy(); delete this.toolbar;
+			this.inherited(arguments);
+		},
+		addPlugin: function(/*String||Object*/plugin, /*Integer?*/index){
+			//	summary:
+			//		takes a plugin name as a string or a plugin instance and
+			//		adds it to the toolbar and associates it with this editor
+			//		instance. The resulting plugin is added to the Editor's
+			//		plugins array. If index is passed, it's placed in the plugins
+			//		array at that index. No big magic, but a nice helper for
+			//		passing in plugin names via markup.
+			//	plugin: String, args object or plugin instance. Required.
+			//	args: This object will be passed to the plugin constructor.
+			//	index:	
+			//		Integer, optional. Used when creating an instance from
+			//		something already in this.plugins. Ensures that the new
+			//		instance is assigned to this.plugins at that index.
+			var args=dojo.isString(plugin)?{name:plugin}:plugin;
+			if(!args.setEditor){
+				var o={"args":args,"plugin":null,"editor":this};
+				dojo.publish(dijit._scopeName + ".Editor.getPlugin",[o]);
+				if(!o.plugin){
+					var pc = dojo.getObject(args.name);
+					if(pc){
+						o.plugin=new pc(args);
+					}
+				}
+				if(!o.plugin){
+					console.warn('Cannot find plugin',plugin);
+					return;
+				}
+				plugin=o.plugin;
+			}
+			if(arguments.length > 1){
+				this._plugins[index] = plugin;
+			}else{
+				this._plugins.push(plugin);
+			}
+			plugin.setEditor(this);
+			if(dojo.isFunction(plugin.setToolbar)){
+				plugin.setToolbar(this.toolbar);
+			}
+		},
+		/* beginning of custom undo/redo support */
+
+		// customUndo: Boolean
+		//		Whether we shall use custom undo/redo support instead of the native
+		//		browser support. By default, we only enable customUndo for IE, as it
+		//		has broken native undo/redo support. Note: the implementation does
+		//		support other browsers which have W3C DOM2 Range API.
+		customUndo: dojo.isIE,
+
+		//	editActionInterval: Integer
+		//		When using customUndo, not every keystroke will be saved as a step.
+		//		Instead typing (including delete) will be grouped together: after
+		//		a user stop typing for editActionInterval seconds, a step will be
+		//		saved; if a user resume typing within editActionInterval seconds,
+		//		the timeout will be restarted. By default, editActionInterval is 3
+		//		seconds.
+		editActionInterval: 3,
+		beginEditing: function(cmd){
+			if(!this._inEditing){
+				this._inEditing=true;
+				this._beginEditing(cmd);
+			}
+			if(this.editActionInterval>0){
+				if(this._editTimer){
+					clearTimeout(this._editTimer);
+				}
+				this._editTimer = setTimeout(dojo.hitch(this, this.endEditing), this._editInterval);
+			}
+		},
+		_steps:[],
+		_undoedSteps:[],
+		execCommand: function(cmd){
+			if(this.customUndo && (cmd=='undo' || cmd=='redo')){
+				return this[cmd]();
+			}else{
+				try{
+					if(this.customUndo){
+						this.endEditing();
+						this._beginEditing();
+					}
+					var r = this.inherited('execCommand',arguments);
+					if(this.customUndo){
+						this._endEditing();
+					}
+					return r;
+				}catch(e){
+					if(dojo.isMoz && /copy|cut|paste/.test(cmd)){
+						// Warn user of platform limitation.  Cannot programmatically access keyboard. See ticket #4136
+						var sub = dojo.string.substitute,
+							accel = {cut:'X', copy:'C', paste:'V'},
+							isMac = navigator.userAgent.indexOf("Macintosh") != -1;
+						alert(sub(this.commands.systemShortcutFF,
+							[this.commands[cmd], sub(this.commands[isMac ? 'appleKey' : 'ctrlKey'], [accel[cmd]])]));
+					}
+					return false;
+				}
+			}
+		},
+		queryCommandEnabled: function(cmd){
+			if(this.customUndo && (cmd=='undo' || cmd=='redo')){
+				return cmd=='undo'?(this._steps.length>1):(this._undoedSteps.length>0);
+			}else{
+				return this.inherited('queryCommandEnabled',arguments);
+			}
+		},
+		_moveToBookmark: function(b){
+			var bookmark=b;
+			if(dojo.isIE){
+				if(dojo.isArray(b)){//IE CONTROL
+					bookmark=[];
+					dojo.forEach(b,function(n){
+						bookmark.push(dijit.range.getNode(n,this.editNode));
+					},this);
+				}
+			}else{//w3c range
+				var r=dijit.range.create();
+				r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset);
+				r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset);
+				bookmark=r;
+			}
+			dojo.withGlobal(this.window,'moveToBookmark',dijit,[bookmark]);
+		},
+		_changeToStep: function(from,to){
+			this.setValue(to.text);
+			var b=to.bookmark;
+			if(!b){ return; }
+			this._moveToBookmark(b);
+		},
+		undo: function(){
+//			console.log('undo');
+			this.endEditing(true);
+			var s=this._steps.pop();
+			if(this._steps.length>0){
+				this.focus();
+				this._changeToStep(s,this._steps[this._steps.length-1]);
+				this._undoedSteps.push(s);
+				this.onDisplayChanged();
+				return true;
+			}
+			return false;
+		},
+		redo: function(){
+//			console.log('redo');
+			this.endEditing(true);
+			var s=this._undoedSteps.pop();
+			if(s && this._steps.length>0){
+				this.focus();
+				this._changeToStep(this._steps[this._steps.length-1],s);
+				this._steps.push(s);
+				this.onDisplayChanged();
+				return true;
+			}
+			return false;
+		},
+		endEditing: function(ignore_caret){
+			if(this._editTimer){
+				clearTimeout(this._editTimer);
+			}
+			if(this._inEditing){
+				this._endEditing(ignore_caret);
+				this._inEditing=false;
+			}
+		},
+		_getBookmark: function(){
+			var b=dojo.withGlobal(this.window,dijit.getBookmark);
+			var tmp=[];
+			if(dojo.isIE){
+				if(dojo.isArray(b)){//CONTROL
+					dojo.forEach(b,function(n){
+						tmp.push(dijit.range.getIndex(n,this.editNode).o);
+					},this);
+					b=tmp;
+				}
+			}else{//w3c range
+				tmp=dijit.range.getIndex(b.startContainer,this.editNode).o;
+				b={startContainer:tmp,
+					startOffset:b.startOffset,
+					endContainer:b.endContainer===b.startContainer?tmp:dijit.range.getIndex(b.endContainer,this.editNode).o,
+					endOffset:b.endOffset};
+			}
+			return b;
+		},
+		_beginEditing: function(cmd){
+			if(this._steps.length===0){
+				this._steps.push({'text':this.savedContent,'bookmark':this._getBookmark()});
+			}
+		},
+		_endEditing: function(ignore_caret){
+			var v=this.getValue(true);
+
+			this._undoedSteps=[];//clear undoed steps
+			this._steps.push({text: v, bookmark: this._getBookmark()});
+		},
+		onKeyDown: function(e){
+			if(!this.customUndo){
+				this.inherited('onKeyDown',arguments);
+				return;
+			}
+			var k = e.keyCode, ks = dojo.keys;
+			if(e.ctrlKey && !e.altKey){//undo and redo only if the special right Alt + z/y are not pressed #5892
+				if(k == 90 || k == 122){ //z
+					dojo.stopEvent(e);
+					this.undo();
+					return;
+				}else if(k == 89 || k == 121){ //y
+					dojo.stopEvent(e);
+					this.redo();
+					return;
+				}
+			}
+			this.inherited('onKeyDown',arguments);
+
+			switch(k){
+					case ks.ENTER:
+					case ks.BACKSPACE:
+					case ks.DELETE:
+						this.beginEditing();
+						break;
+					case 88: //x
+					case 86: //v
+						if(e.ctrlKey && !e.altKey && !e.metaKey){
+							this.endEditing();//end current typing step if any
+							if(e.keyCode == 88){
+								this.beginEditing('cut');
+								//use timeout to trigger after the cut is complete
+								setTimeout(dojo.hitch(this, this.endEditing), 1);
+							}else{
+								this.beginEditing('paste');
+								//use timeout to trigger after the paste is complete
+								setTimeout(dojo.hitch(this, this.endEditing), 1);
+							}
+							break;
+						}
+						//pass through
+					default:
+						if(!e.ctrlKey && !e.altKey && !e.metaKey && (e.keyCode<dojo.keys.F1 || e.keyCode>dojo.keys.F15)){
+							this.beginEditing();
+							break;
+						}
+						//pass through
+					case ks.ALT:
+						this.endEditing();
+						break;
+					case ks.UP_ARROW:
+					case ks.DOWN_ARROW:
+					case ks.LEFT_ARROW:
+					case ks.RIGHT_ARROW:
+					case ks.HOME:
+					case ks.END:
+					case ks.PAGE_UP:
+					case ks.PAGE_DOWN:
+						this.endEditing(true);
+						break;
+					//maybe ctrl+backspace/delete, so don't endEditing when ctrl is pressed
+					case ks.CTRL:
+					case ks.SHIFT:
+					case ks.TAB:
+						break;
+				}	
+		},
+		_onBlur: function(){
+			this.inherited('_onBlur',arguments);
+			this.endEditing(true);
+		},
+		onClick: function(){
+			this.endEditing(true);
+			this.inherited('onClick',arguments);
+		}
+		/* end of custom undo/redo support */
+	}
+);
+
+/* the following code is to registered a handler to get default plugins */
+dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+	if(o.plugin){ return; }
+	var args = o.args, p;
+	var _p = dijit._editor._Plugin;
+	var name = args.name;
+	switch(name){
+		case "undo": case "redo": case "cut": case "copy": case "paste": case "insertOrderedList":
+		case "insertUnorderedList": case "indent": case "outdent": case "justifyCenter":
+		case "justifyFull": case "justifyLeft": case "justifyRight": case "delete":
+		case "selectAll": case "removeFormat":
+		case "insertHorizontalRule":
+			p = new _p({ command: name });
+			break;
+
+		case "bold": case "italic": case "underline": case "strikethrough":
+		case "subscript": case "superscript":
+			p = new _p({ buttonClass: dijit.form.ToggleButton, command: name });
+			break;
+		case "|":
+			p = new _p({ button: new dijit.ToolbarSeparator() });
+	}
+//	console.log('name',name,p);
+	o.plugin=p;
+});
+
+}
+
+if(!dojo._hasResource["dijit.Menu"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Menu"] = true;
+dojo.provide("dijit.Menu");
+
+
+
+
+
+dojo.declare("dijit.Menu",
+	[dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
+	{
+	// summary
+	//	A context menu you can assign to multiple elements
+
+	constructor: function(){
+		this._bindings = [];
+	},
+
+	templateString:
+			'<table class="dijit dijitMenu dijitReset dijitMenuTable" waiRole="menu" dojoAttachEvent="onkeypress:_onKeyPress">' +
+				'<tbody class="dijitReset" dojoAttachPoint="containerNode"></tbody>'+
+			'</table>',
+
+	// targetNodeIds: String[]
+	//	Array of dom node ids of nodes to attach to.
+	//	Fill this with nodeIds upon widget creation and it becomes context menu for those nodes.
+	targetNodeIds: [],
+
+	// contextMenuForWindow: Boolean
+	//	if true, right clicking anywhere on the window will cause this context menu to open;
+	//	if false, must specify targetNodeIds
+	contextMenuForWindow: false,
+
+	// leftClickToOpen: Boolean
+	//	If true, menu will open on left click instead of right click, similiar to a file menu.
+	leftClickToOpen: false,
+	
+	// parentMenu: Widget
+	// pointer to menu that displayed me
+	parentMenu: null,
+
+	// popupDelay: Integer
+	//	number of milliseconds before hovering (without clicking) causes the popup to automatically open
+	popupDelay: 500,
+
+	// _contextMenuWithMouse: Boolean
+	//	used to record mouse and keyboard events to determine if a context
+	//	menu is being opened with the keyboard or the mouse
+	_contextMenuWithMouse: false,
+
+	postCreate: function(){
+		if(this.contextMenuForWindow){
+			this.bindDomNode(dojo.body());
+		}else{
+			dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
+		}
+		this.connectKeyNavHandlers([dojo.keys.UP_ARROW], [dojo.keys.DOWN_ARROW]);
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+		this.startupKeyNavChildren();
+
+		this.inherited(arguments);
+	},
+
+	onExecute: function(){
+		// summary: attach point for notification about when a menu item has been executed
+	},
+
+	onCancel: function(/*Boolean*/ closeAll){
+		// summary: attach point for notification about when the user cancels the current menu
+	},
+
+	_moveToPopup: function(/*Event*/ evt){
+		if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){
+			this.focusedChild._onClick(evt);
+		}
+	},
+
+	_onKeyPress: function(/*Event*/ evt){
+		// summary: Handle keyboard based menu navigation.
+		if(evt.ctrlKey || evt.altKey){ return; }
+
+		switch(evt.keyCode){
+			case dojo.keys.RIGHT_ARROW:
+				this._moveToPopup(evt);
+				dojo.stopEvent(evt);
+				break;
+			case dojo.keys.LEFT_ARROW:
+				if(this.parentMenu){
+					this.onCancel(false);
+				}else{
+					dojo.stopEvent(evt);
+				}
+				break;
+		}
+	},
+
+	onItemHover: function(/*MenuItem*/ item){
+		// summary: Called when cursor is over a MenuItem
+		this.focusChild(item);
+
+		if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
+			this.hover_timer = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay);
+		}
+	},
+
+	_onChildBlur: function(item){
+		// summary: Close all popups that are open and descendants of this menu
+		dijit.popup.close(item.popup);
+		item._blur();
+		this._stopPopupTimer();
+	},
+
+	onItemUnhover: function(/*MenuItem*/ item){
+		// summary: Callback fires when mouse exits a MenuItem
+	},
+
+	_stopPopupTimer: function(){
+		if(this.hover_timer){
+			clearTimeout(this.hover_timer);
+			this.hover_timer = null;
+		}
+	},
+
+	_getTopMenu: function(){
+		for(var top=this; top.parentMenu; top=top.parentMenu);
+		return top;
+	},
+
+	onItemClick: function(/*Widget*/ item, /*Event*/ evt){
+		// summary: user defined function to handle clicks on an item
+		if(item.disabled){ return false; }
+
+		if(item.popup){
+			if(!this.is_open){
+				this._openPopup();
+			}
+		}else{
+			// before calling user defined handler, close hierarchy of menus
+			// and restore focus to place it was when menu was opened
+			this.onExecute();
+
+			// user defined handler for click
+			item.onClick(evt);
+		}
+	},
+
+	// thanks burstlib!
+	_iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
+		// summary:
+		//	Returns the window reference of the passed iframe
+		var win = dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(iframe_el)) ||
+			// Moz. TODO: is this available when defaultView isn't?
+			dijit.Menu._iframeContentDocument(iframe_el)['__parent__'] ||
+			(iframe_el.name && dojo.doc.frames[iframe_el.name]) || null;
+		return win;	//	Window
+	},
+
+	_iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){
+		// summary:
+		//	Returns a reference to the document object inside iframe_el
+		var doc = iframe_el.contentDocument // W3
+			|| (iframe_el.contentWindow && iframe_el.contentWindow.document) // IE
+			|| (iframe_el.name && dojo.doc.frames[iframe_el.name] && dojo.doc.frames[iframe_el.name].document)
+			|| null;
+		return doc;	//	HTMLDocument
+	},
+
+	bindDomNode: function(/*String|DomNode*/ node){
+		// summary: attach menu to given node
+		node = dojo.byId(node);
+
+		//TODO: this is to support context popups in Editor.  Maybe this shouldn't be in dijit.Menu
+		var win = dijit.getDocumentWindow(node.ownerDocument);
+		if(node.tagName.toLowerCase()=="iframe"){
+			win = this._iframeContentWindow(node);
+			node = dojo.withGlobal(win, dojo.body);
+		}
+
+		// to capture these events at the top level,
+		// attach to document, not body
+		var cn = (node == dojo.body() ? dojo.doc : node);
+
+		node[this.id] = this._bindings.push([
+			dojo.connect(cn, (this.leftClickToOpen)?"onclick":"oncontextmenu", this, "_openMyself"),
+			dojo.connect(cn, "onkeydown", this, "_contextKey"),
+			dojo.connect(cn, "onmousedown", this, "_contextMouse")
+		]);
+	},
+
+	unBindDomNode: function(/*String|DomNode*/ nodeName){
+		// summary: detach menu from given node
+		var node = dojo.byId(nodeName);
+		if(node){
+			var bid = node[this.id]-1, b = this._bindings[bid];
+			dojo.forEach(b, dojo.disconnect);
+			delete this._bindings[bid];
+		}
+	},
+
+	_contextKey: function(e){
+		this._contextMenuWithMouse = false;
+		if(e.keyCode == dojo.keys.F10){
+			dojo.stopEvent(e);
+			if(e.shiftKey && e.type=="keydown"){
+				// FF: copying the wrong property from e will cause the system
+				// context menu to appear in spite of stopEvent. Don't know
+				// exactly which properties cause this effect.
+				var _e = { target: e.target, pageX: e.pageX, pageY: e.pageY };
+				_e.preventDefault = _e.stopPropagation = function(){};
+				// IE: without the delay, focus work in "open" causes the system
+				// context menu to appear in spite of stopEvent.
+				window.setTimeout(dojo.hitch(this, function(){ this._openMyself(_e); }), 1);
+			}
+		}
+	},
+
+	_contextMouse: function(e){
+		this._contextMenuWithMouse = true;
+	},
+
+	_openMyself: function(/*Event*/ e){
+		// summary:
+		//		Internal function for opening myself when the user
+		//		does a right-click or something similar
+
+		if(this.leftClickToOpen&&e.button>0){
+			return;
+		}
+		dojo.stopEvent(e);
+
+		// Get coordinates.
+		// if we are opening the menu with the mouse or on safari open
+		// the menu at the mouse cursor
+		// (Safari does not have a keyboard command to open the context menu
+		// and we don't currently have a reliable way to determine
+		// _contextMenuWithMouse on Safari)
+		var x,y;
+		if(dojo.isSafari || this._contextMenuWithMouse){
+			x=e.pageX;
+			y=e.pageY;
+		}else{
+			// otherwise open near e.target
+			var coords = dojo.coords(e.target, true);
+			x = coords.x + 10;
+			y = coords.y + 10;
+		}
+
+		var self=this;
+		var savedFocus = dijit.getFocus(this);
+		function closeAndRestoreFocus(){
+			// user has clicked on a menu or popup
+			dijit.focus(savedFocus);
+			dijit.popup.close(self);
+		}
+		dijit.popup.open({
+			popup: this,
+			x: x,
+			y: y,
+			onExecute: closeAndRestoreFocus,
+			onCancel: closeAndRestoreFocus,
+			orient: this.isLeftToRight() ? 'L' : 'R'
+		});
+		this.focus();
+
+		this._onBlur = function(){
+			this.inherited('_onBlur', arguments);
+			// Usually the parent closes the child widget but if this is a context
+			// menu then there is no parent
+			dijit.popup.close(this);
+			// don't try to restore focus; user has clicked another part of the screen
+			// and set focus there
+		}
+	},
+
+	onOpen: function(/*Event*/ e){
+		// summary: Open menu relative to the mouse
+		this.isShowingNow = true;
+	},
+
+	onClose: function(){
+		// summary: callback when this menu is closed
+		this._stopPopupTimer();
+		this.parentMenu = null;
+		this.isShowingNow = false;
+		this.currentPopup = null;
+		if(this.focusedChild){
+			this._onChildBlur(this.focusedChild);
+			this.focusedChild = null;
+		}
+	},
+
+	_openPopup: function(){
+		// summary: open the popup to the side of the current menu item
+		this._stopPopupTimer();
+		var from_item = this.focusedChild;
+		var popup = from_item.popup;
+
+		if(popup.isShowingNow){ return; }
+		popup.parentMenu = this;
+		var self = this;
+		dijit.popup.open({
+			parent: this,
+			popup: popup,
+			around: from_item.arrowCell,
+			orient: this.isLeftToRight() ? {'TR': 'TL', 'TL': 'TR'} : {'TL': 'TR', 'TR': 'TL'},
+			onCancel: function(){
+				// called when the child menu is canceled
+				dijit.popup.close(popup);
+				from_item.focus();	// put focus back on my node
+				self.currentPopup = null;
+			}
+		});
+
+		this.currentPopup = popup;
+
+		if(popup.focus){
+			popup.focus();
+		}
+	},
+	
+	uninitialize: function(){
+ 		dojo.forEach(this.targetNodeIds, this.unBindDomNode, this);
+ 		this.inherited(arguments);
+	}
+}
+);
+
+dojo.declare("dijit.MenuItem",
+	[dijit._Widget, dijit._Templated, dijit._Contained],
+	{
+	// summary: A line item in a Menu Widget
+
+	// Make 3 columns
+	//   icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
+	templateString:
+		 '<tr class="dijitReset dijitMenuItem" '
+		+'dojoAttachEvent="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">'
+		+'<td class="dijitReset"><div class="dijitMenuItemIcon ${iconClass}" dojoAttachPoint="iconNode"></div></td>'
+		+'<td tabIndex="-1" class="dijitReset dijitMenuItemLabel" dojoAttachPoint="containerNode,focusNode" waiRole="menuitem"></td>'
+		+'<td class="dijitReset" dojoAttachPoint="arrowCell">'
+			+'<div class="dijitMenuExpand" dojoAttachPoint="expand" style="display:none">'
+			+'<span class="dijitInline dijitArrowNode dijitMenuExpandInner">+</span>'
+			+'</div>'
+		+'</td>'
+		+'</tr>',
+
+	// label: String
+	//	menu text
+	label: '',
+
+	// iconClass: String
+	//	class to apply to div in button to make it display an icon
+	iconClass: "",
+
+	// disabled: Boolean
+	//  if true, the menu item is disabled
+	//  if false, the menu item is enabled
+	disabled: false,
+
+	postCreate: function(){
+		dojo.setSelectable(this.domNode, false);
+		this.setDisabled(this.disabled);
+		if(this.label){
+			this.setLabel(this.label);
+		}
+	},
+
+	_onHover: function(){
+		// summary: callback when mouse is moved onto menu item
+		this.getParent().onItemHover(this);
+	},
+
+	_onUnhover: function(){
+		// summary: callback when mouse is moved off of menu item
+
+		// if we are unhovering the currently selected item
+		// then unselect it
+		this.getParent().onItemUnhover(this);
+	},
+
+	_onClick: function(evt){
+		this.getParent().onItemClick(this, evt);
+		dojo.stopEvent(evt);
+	},
+
+	onClick: function(/*Event*/ evt){
+		// summary: User defined function to handle clicks
+	},
+
+	focus: function(){
+		dojo.addClass(this.domNode, 'dijitMenuItemHover');
+		try{
+			dijit.focus(this.containerNode);
+		}catch(e){
+			// this throws on IE (at least) in some scenarios
+		}
+	},
+
+	_blur: function(){
+		dojo.removeClass(this.domNode, 'dijitMenuItemHover');
+	},
+	
+	setLabel: function(/*String*/ value){
+		this.containerNode.innerHTML=this.label=value;
+	},
+
+	setDisabled: function(/*Boolean*/ value){
+		// summary: enable or disable this menu item
+		this.disabled = value;
+		dojo[value ? "addClass" : "removeClass"](this.domNode, 'dijitMenuItemDisabled');
+		dijit.setWaiState(this.containerNode, 'disabled', value ? 'true' : 'false');
+	}
+});
+
+dojo.declare("dijit.PopupMenuItem",
+	dijit.MenuItem,
+	{
+	_fillContent: function(){
+		// summary: The innerHTML contains both the menu item text and a popup widget
+		// description: the first part holds the menu item text and the second part is the popup
+		// example: 
+		// |	<div dojoType="dijit.PopupMenuItem">
+		// |		<span>pick me</span>
+		// |		<popup> ... </popup>
+		// |	</div>
+		if(this.srcNodeRef){
+			var nodes = dojo.query("*", this.srcNodeRef);
+			dijit.PopupMenuItem.superclass._fillContent.call(this, nodes[0]);
+
+			// save pointer to srcNode so we can grab the drop down widget after it's instantiated
+			this.dropDownContainer = this.srcNodeRef;
+		}
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+		this.inherited(arguments);
+
+		// we didn't copy the dropdown widget from the this.srcNodeRef, so it's in no-man's
+		// land now.  move it to dojo.doc.body.
+		if(!this.popup){
+			var node = dojo.query("[widgetId]", this.dropDownContainer)[0];
+			this.popup = dijit.byNode(node);
+		}
+		dojo.body().appendChild(this.popup.domNode);
+
+		this.popup.domNode.style.display="none";
+		dojo.addClass(this.expand, "dijitMenuExpandEnabled");
+		dojo.style(this.expand, "display", "");
+		dijit.setWaiState(this.containerNode, "haspopup", "true");
+	},
+	
+	destroyDescendants: function(){
+		if(this.popup){
+			this.popup.destroyRecursive();
+			delete this.popup;
+		}
+		this.inherited(arguments);
+	}
+});
+
+dojo.declare("dijit.MenuSeparator",
+	[dijit._Widget, dijit._Templated, dijit._Contained],
+	{
+	// summary: A line between two menu items
+
+	templateString: '<tr class="dijitMenuSeparator"><td colspan=3>'
+			+'<div class="dijitMenuSeparatorTop"></div>'
+			+'<div class="dijitMenuSeparatorBottom"></div>'
+			+'</td></tr>',
+
+	postCreate: function(){
+		dojo.setSelectable(this.domNode, false);
+	},
+	
+	isFocusable: function(){
+		// summary: over ride to always return false
+		return false; // Boolean
+	}
+});
+
+}
+
+if(!dojo._hasResource["dojo.regexp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.regexp"] = true;
+dojo.provide("dojo.regexp");
+
+/*=====
+dojo.regexp = {
+	// summary: Regular expressions and Builder resources
+};
+=====*/
+
+dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){
+	//	summary:
+	//		Adds escape sequences for special characters in regular expressions
+	// except:
+	//		a String with special characters to be left unescaped
+
+//	return str.replace(/([\f\b\n\t\r[\^$|?*+(){}])/gm, "\\$1"); // string
+	return str.replace(/([\.$?*!=:|{}\(\)\[\]\\\/^])/g, function(ch){
+		if(except && except.indexOf(ch) != -1){
+			return ch;
+		}
+		return "\\" + ch;
+	}); // String
+}
+
+dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){
+	//	summary:
+	//		Builds a regular expression that groups subexpressions
+	//	description:
+	//		A utility function used by some of the RE generators. The
+	//		subexpressions are constructed by the function, re, in the second
+	//		parameter.  re builds one subexpression for each elem in the array
+	//		a, in the first parameter. Returns a string for a regular
+	//		expression that groups all the subexpressions.
+	// arr:
+	//		A single value or an array of values.
+	// re:
+	//		A function. Takes one parameter and converts it to a regular
+	//		expression. 
+	// nonCapture:
+	//		If true, uses non-capturing match, otherwise matches are retained
+	//		by regular expression. Defaults to false
+
+	// case 1: a is a single value.
+	if(!(arr instanceof Array)){
+		return re(arr); // String
+	}
+
+	// case 2: a is an array
+	var b = [];
+	for(var i = 0; i < arr.length; i++){
+		// convert each elem to a RE
+		b.push(re(arr[i]));
+	}
+
+	 // join the REs as alternatives in a RE group.
+	return dojo.regexp.group(b.join("|"), nonCapture); // String
+}
+
+dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){
+	// summary:
+	//		adds group match to expression
+	// nonCapture:
+	//		If true, uses non-capturing match, otherwise matches are retained
+	//		by regular expression. 
+	return "(" + (nonCapture ? "?:":"") + expression + ")"; // String
+}
+
+}
+
+if(!dojo._hasResource["dojo.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.number"] = true;
+dojo.provide("dojo.number");
+
+
+
+
+
+
+
+/*=====
+dojo.number = {
+	// summary: localized formatting and parsing routines for Number
+}
+
+dojo.number.__FormatOptions = function(){
+	//	pattern: String?
+	//		override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+	//		with this string
+	//	type: String?
+	//		choose a format type based on the locale from the following:
+	//		decimal, scientific, percent, currency. decimal by default.
+	//	places: Number?
+	//		fixed number of decimal places to show.  This overrides any
+	//		information in the provided pattern.
+	//	round: Number?
+	//		5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
+	//		means don't round.
+	//	currency: String?
+	//		an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+	//	symbol: String?
+	//		localized currency symbol
+	//	locale: String?
+	//		override the locale used to determine formatting rules
+	this.pattern = pattern;
+	this.type = type;
+	this.places = places;
+	this.round = round;
+	this.currency = currency;
+	this.symbol = symbol;
+	this.locale = locale;
+}
+=====*/
+
+dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
+	// summary:
+	//		Format a Number as a String, using locale-specific settings
+	// description:
+	//		Create a string from a Number using a known localized pattern.
+	//		Formatting patterns appropriate to the locale are chosen from the
+	//		[CLDR](http://unicode.org/cldr) as well as the appropriate symbols and
+	//		delimiters.  See <http://www.unicode.org/reports/tr35/#Number_Elements>
+	// value:
+	//		the number to be formatted.  If not a valid JavaScript number,
+	//		return null.
+
+	options = dojo.mixin({}, options || {});
+	var locale = dojo.i18n.normalizeLocale(options.locale);
+	var bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
+	options.customs = bundle;
+	var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
+	if(isNaN(value)){ return null; } // null
+	return dojo.number._applyPattern(value, pattern, options); // String
+};
+
+//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough
+dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough
+
+dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){
+	// summary:
+	//		Apply pattern to format value as a string using options. Gives no
+	//		consideration to local customs.
+	// value:
+	//		the number to be formatted.
+	// pattern:
+	//		a pattern string as described by
+	//		[unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+	// options: dojo.number.__FormatOptions?
+	//		_applyPattern is usually called via `dojo.number.format()` which
+	//		populates an extra property in the options parameter, "customs".
+	//		The customs object specifies group and decimal parameters if set.
+
+	//TODO: support escapes
+	options = options || {};
+	var group = options.customs.group;
+	var decimal = options.customs.decimal;
+
+	var patternList = pattern.split(';');
+	var positivePattern = patternList[0];
+	pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern);
+
+	//TODO: only test against unescaped
+	if(pattern.indexOf('%') != -1){
+		value *= 100;
+	}else if(pattern.indexOf('\u2030') != -1){
+		value *= 1000; // per mille
+	}else if(pattern.indexOf('\u00a4') != -1){
+		group = options.customs.currencyGroup || group;//mixins instead?
+		decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead?
+		pattern = pattern.replace(/\u00a4{1,3}/, function(match){
+			var prop = ["symbol", "currency", "displayName"][match.length-1];
+			return options[prop] || options.currency || "";
+		});
+	}else if(pattern.indexOf('E') != -1){
+		throw new Error("exponential notation not supported");
+	}
+	
+	//TODO: support @ sig figs?
+	var numberPatternRE = dojo.number._numberPatternRE;
+	var numberPattern = positivePattern.match(numberPatternRE);
+	if(!numberPattern){
+		throw new Error("unable to find a number expression in pattern: "+pattern);
+	}
+	return pattern.replace(numberPatternRE,
+		dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places}));
+}
+
+dojo.number.round = function(/*Number*/value, /*Number*/places, /*Number?*/multiple){
+	//	summary:
+	//		Rounds the number at the given number of places
+	//	value:
+	//		the number to round
+	//	places:
+	//		the number of decimal places where rounding takes place
+	//	multiple:
+	//		rounds next place to nearest multiple
+
+	var pieces = String(value).split(".");
+	var length = (pieces[1] && pieces[1].length) || 0;
+	if(length > places){
+		var factor = Math.pow(10, places);
+		if(multiple > 0){factor *= 10/multiple;places++;} //FIXME
+		value = Math.round(value * factor)/factor;
+
+		// truncate to remove any residual floating point values
+		pieces = String(value).split(".");
+		length = (pieces[1] && pieces[1].length) || 0;
+		if(length > places){
+			pieces[1] = pieces[1].substr(0, places);
+			value = Number(pieces.join("."));
+		}
+	}
+	return value; //Number
+}
+
+/*=====
+dojo.number.__FormatAbsoluteOptions = function(){
+	//	decimal: String?
+	//		the decimal separator
+	//	group: String?
+	//		the group separator
+	//	places: Integer?
+	//		number of decimal places
+	//	round: Number?
+	//		5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
+	//		means don't round.
+	this.decimal = decimal;
+	this.group = group;
+	this.places = places;
+	this.round = round;
+}
+=====*/
+
+dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
+	// summary: 
+	//		Apply numeric pattern to absolute value using options. Gives no
+	//		consideration to local customs.
+	// value:
+	//		the number to be formatted, ignores sign
+	// pattern:
+	//		the number portion of a pattern (e.g. `#,##0.00`)
+	options = options || {};
+	if(options.places === true){options.places=0;}
+	if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit
+
+	var patternParts = pattern.split(".");
+	var maxPlaces = (options.places >= 0) ? options.places : (patternParts[1] && patternParts[1].length) || 0;
+	if(!(options.round < 0)){
+		value = dojo.number.round(value, maxPlaces, options.round);
+	}
+
+	var valueParts = String(Math.abs(value)).split(".");
+	var fractional = valueParts[1] || "";
+	if(options.places){
+		valueParts[1] = dojo.string.pad(fractional.substr(0, options.places), options.places, '0', true);
+	}else if(patternParts[1] && options.places !== 0){
+		// Pad fractional with trailing zeros
+		var pad = patternParts[1].lastIndexOf("0") + 1;
+		if(pad > fractional.length){
+			valueParts[1] = dojo.string.pad(fractional, pad, '0', true);
+		}
+
+		// Truncate fractional
+		var places = patternParts[1].length;
+		if(places < fractional.length){
+			valueParts[1] = fractional.substr(0, places);
+		}
+	}else{
+		if(valueParts[1]){ valueParts.pop(); }
+	}
+
+	// Pad whole with leading zeros
+	var patternDigits = patternParts[0].replace(',', '');
+	pad = patternDigits.indexOf("0");
+	if(pad != -1){
+		pad = patternDigits.length - pad;
+		if(pad > valueParts[0].length){
+			valueParts[0] = dojo.string.pad(valueParts[0], pad);
+		}
+
+		// Truncate whole
+		if(patternDigits.indexOf("#") == -1){
+			valueParts[0] = valueParts[0].substr(valueParts[0].length - pad);
+		}
+	}
+
+	// Add group separators
+	var index = patternParts[0].lastIndexOf(',');
+	var groupSize, groupSize2;
+	if(index != -1){
+		groupSize = patternParts[0].length - index - 1;
+		var remainder = patternParts[0].substr(0, index);
+		index = remainder.lastIndexOf(',');
+		if(index != -1){
+			groupSize2 = remainder.length - index - 1;
+		}
+	}
+	var pieces = [];
+	for(var whole = valueParts[0]; whole;){
+		var off = whole.length - groupSize;
+		pieces.push((off > 0) ? whole.substr(off) : whole);
+		whole = (off > 0) ? whole.slice(0, off) : "";
+		if(groupSize2){
+			groupSize = groupSize2;
+			delete groupSize2;
+		}
+	}
+	valueParts[0] = pieces.reverse().join(options.group || ",");
+
+	return valueParts.join(options.decimal || ".");
+};
+
+/*=====
+dojo.number.__RegexpOptions = function(){
+	//	pattern: String?
+	//		override pattern with this string.  Default is provided based on
+	//		locale.
+	//	type: String?
+	//		choose a format type based on the locale from the following:
+	//		decimal, scientific, percent, currency. decimal by default.
+	//	locale: String?
+	//		override the locale used to determine formatting rules
+	//	strict: Boolean?
+	//		strict parsing, false by default
+	//	places: Number|String?
+	//		number of decimal places to accept: Infinity, a positive number, or
+	//		a range "n,m".  By default, defined by pattern.
+	this.pattern = pattern;
+	this.type = type;
+	this.locale = locale;
+	this.strict = strict;
+	this.places = places;
+}
+=====*/
+dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
+	//	summary:
+	//		Builds the regular needed to parse a number
+	//	description:
+	//		Returns regular expression with positive and negative match, group
+	//		and decimal separators
+	return dojo.number._parseInfo(options).regexp; // String
+}
+
+dojo.number._parseInfo = function(/*Object?*/options){
+	options = options || {};
+	var locale = dojo.i18n.normalizeLocale(options.locale);
+	var bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
+	var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
+//TODO: memoize?
+	var group = bundle.group;
+	var decimal = bundle.decimal;
+	var factor = 1;
+
+	if(pattern.indexOf('%') != -1){
+		factor /= 100;
+	}else if(pattern.indexOf('\u2030') != -1){
+		factor /= 1000; // per mille
+	}else{
+		var isCurrency = pattern.indexOf('\u00a4') != -1;
+		if(isCurrency){
+			group = bundle.currencyGroup || group;
+			decimal = bundle.currencyDecimal || decimal;
+		}
+	}
+
+	//TODO: handle quoted escapes
+	var patternList = pattern.split(';');
+	if(patternList.length == 1){
+		patternList.push("-" + patternList[0]);
+	}
+
+	var re = dojo.regexp.buildGroupRE(patternList, function(pattern){
+		pattern = "(?:"+dojo.regexp.escapeString(pattern, '.')+")";
+		return pattern.replace(dojo.number._numberPatternRE, function(format){
+			var flags = {
+				signed: false,
+				separator: options.strict ? group : [group,""],
+				fractional: options.fractional,
+				decimal: decimal,
+				exponent: false};
+			var parts = format.split('.');
+			var places = options.places;
+			if(parts.length == 1 || places === 0){flags.fractional = false;}
+			else{
+				if(places === undefined){ places = parts[1].lastIndexOf('0')+1; }
+				if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified
+				if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; }
+				flags.places = places;
+			}
+			var groups = parts[0].split(',');
+			if(groups.length>1){
+				flags.groupSize = groups.pop().length;
+				if(groups.length>1){
+					flags.groupSize2 = groups.pop().length;
+				}
+			}
+			return "("+dojo.number._realNumberRegexp(flags)+")";
+		});
+	}, true);
+
+	if(isCurrency){
+		// substitute the currency symbol for the placeholder in the pattern
+		re = re.replace(/(\s*)(\u00a4{1,3})(\s*)/g, function(match, before, target, after){
+			var prop = ["symbol", "currency", "displayName"][target.length-1];
+			var symbol = dojo.regexp.escapeString(options[prop] || options.currency || "");
+			before = before ? "\\s" : "";
+			after = after ? "\\s" : "";
+			if(!options.strict){
+				if(before){before += "*";}
+				if(after){after += "*";}
+				return "(?:"+before+symbol+after+")?";
+			}
+			return before+symbol+after;
+		});
+	}
+
+//TODO: substitute localized sign/percent/permille/etc.?
+
+	// normalize whitespace and return
+	return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
+}
+
+/*=====
+dojo.number.__ParseOptions = function(){
+	//	pattern: String
+	//		override pattern with this string.  Default is provided based on
+	//		locale.
+	//	type: String?
+	//		choose a format type based on the locale from the following:
+	//		decimal, scientific, percent, currency. decimal by default.
+	//	locale: String
+	//		override the locale used to determine formatting rules
+	//	strict: Boolean?
+	//		strict parsing, false by default
+	//	currency: Object
+	//		object with currency information
+	this.pattern = pattern;
+	this.type = type;
+	this.locale = locale;
+	this.strict = strict;
+	this.currency = currency;
+}
+=====*/
+dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){
+	// summary:
+	//		Convert a properly formatted string to a primitive Number, using
+	//		locale-specific settings.
+	// description:
+	//		Create a Number from a string using a known localized pattern.
+	//		Formatting patterns are chosen appropriate to the locale
+	//		and follow the syntax described by
+	//		[unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+	// expression:
+	//		A string representation of a Number
+	var info = dojo.number._parseInfo(options);
+	var results = (new RegExp("^"+info.regexp+"$")).exec(expression);
+	if(!results){
+		return NaN; //NaN
+	}
+	var absoluteMatch = results[1]; // match for the positive expression
+	if(!results[1]){
+		if(!results[2]){
+			return NaN; //NaN
+		}
+		// matched the negative pattern
+		absoluteMatch =results[2];
+		info.factor *= -1;
+	}
+
+	// Transform it to something Javascript can parse as a number.  Normalize
+	// decimal point and strip out group separators or alternate forms of whitespace
+	absoluteMatch = absoluteMatch.
+		replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), "").
+		replace(info.decimal, ".");
+	// Adjust for negative sign, percent, etc. as necessary
+	return Number(absoluteMatch) * info.factor; //Number
+};
+
+/*=====
+dojo.number.__RealNumberRegexpFlags = function(){
+	//	places: Number?
+	//		The integer number of decimal places or a range given as "n,m".  If
+	//		not given, the decimal part is optional and the number of places is
+	//		unlimited.
+	//	decimal: String?
+	//		A string for the character used as the decimal point.  Default
+	//		is ".".
+	//	fractional: Boolean|Array?
+	//		Whether decimal places are allowed.  Can be true, false, or [true,
+	//		false].  Default is [true, false]
+	//	exponent: Boolean|Array?
+	//		Express in exponential notation.  Can be true, false, or [true,
+	//		false]. Default is [true, false], (i.e. will match if the
+	//		exponential part is present are not).
+	//	eSigned: Boolean|Array?
+	//		The leading plus-or-minus sign on the exponent.  Can be true,
+	//		false, or [true, false].  Default is [true, false], (i.e. will
+	//		match if it is signed or unsigned).  flags in regexp.integer can be
+	//		applied.
+	this.places = places;
+	this.decimal = decimal;
+	this.fractional = fractional;
+	this.exponent = exponent;
+	this.eSigned = eSigned;
+}
+=====*/
+
+dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){
+	// summary:
+	//		Builds a regular expression to match a real number in exponential
+	//		notation
+
+	// assign default values to missing paramters
+	flags = flags || {};
+	//TODO: use mixin instead?
+	if(!("places" in flags)){ flags.places = Infinity; }
+	if(typeof flags.decimal != "string"){ flags.decimal = "."; }
+	if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; }
+	if(!("exponent" in flags)){ flags.exponent = [true, false]; }
+	if(!("eSigned" in flags)){ flags.eSigned = [true, false]; }
+
+	// integer RE
+	var integerRE = dojo.number._integerRegexp(flags);
+
+	// decimal RE
+	var decimalRE = dojo.regexp.buildGroupRE(flags.fractional,
+		function(q){
+			var re = "";
+			if(q && (flags.places!==0)){
+				re = "\\" + flags.decimal;
+				if(flags.places == Infinity){ 
+					re = "(?:" + re + "\\d+)?"; 
+				}else{
+					re += "\\d{" + flags.places + "}"; 
+				}
+			}
+			return re;
+		},
+		true
+	);
+
+	// exponent RE
+	var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
+		function(q){ 
+			if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
+			return ""; 
+		}
+	);
+
+	// real number RE
+	var realRE = integerRE + decimalRE;
+	// allow for decimals without integers, e.g. .25
+	if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";}
+	return realRE + exponentRE; // String
+};
+
+/*=====
+dojo.number.__IntegerRegexpFlags = function(){
+	//	signed: Boolean?
+	//		The leading plus-or-minus sign. Can be true, false, or `[true,false]`.
+	//		Default is `[true, false]`, (i.e. will match if it is signed
+	//		or unsigned).
+	//	separator: String?
+	//		The character used as the thousands separator. Default is no
+	//		separator. For more than one symbol use an array, e.g. `[",", ""]`,
+	//		makes ',' optional.
+	//	groupSize: Number?
+	//		group size between separators
+	//	groupSize2: Number?
+	//		second grouping, where separators 2..n have a different interval than the first separator (for India)
+	this.signed = signed;
+	this.separator = separator;
+	this.groupSize = groupSize;
+	this.groupSize2 = groupSize2;
+}
+=====*/
+
+dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
+	// summary: 
+	//		Builds a regular expression that matches an integer
+
+	// assign default values to missing paramters
+	flags = flags || {};
+	if(!("signed" in flags)){ flags.signed = [true, false]; }
+	if(!("separator" in flags)){
+		flags.separator = "";
+	}else if(!("groupSize" in flags)){
+		flags.groupSize = 3;
+	}
+	// build sign RE
+	var signRE = dojo.regexp.buildGroupRE(flags.signed,
+		function(q) { return q ? "[-+]" : ""; },
+		true
+	);
+
+	// number RE
+	var numberRE = dojo.regexp.buildGroupRE(flags.separator,
+		function(sep){
+			if(!sep){
+				return "(?:0|[1-9]\\d*)";
+			}
+
+			sep = dojo.regexp.escapeString(sep);
+			if(sep == " "){ sep = "\\s"; }
+			else if(sep == "\xa0"){ sep = "\\s\\xa0"; }
+
+			var grp = flags.groupSize, grp2 = flags.groupSize2;
+			if(grp2){
+				var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})";
+				return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE;
+			}
+			return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)";
+		},
+		true
+	);
+
+	// integer RE
+	return signRE + numberRE; // String
+}
+
+}
+
+if(!dojo._hasResource["dijit.ProgressBar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.ProgressBar"] = true;
+dojo.provide("dijit.ProgressBar");
+
+
+
+
+
+
+
+dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
+	// summary: A progress indication widget
+	//
+	// example:
+	// |	<div dojoType="ProgressBar"
+	// |		 places="0"
+	// |		 progress="..." maximum="...">
+	// |	</div>
+	//
+	// progress: String (Percentage or Number)
+	// 	initial progress value.
+	// 	with "%": percentage value, 0% <= progress <= 100%
+	// 	or without "%": absolute value, 0 <= progress <= maximum
+	progress: "0",
+
+	// maximum: Float
+	// 	max sample number
+	maximum: 100,
+
+	// places: Number
+	// 	number of places to show in values; 0 by default
+	places: 0,
+
+	// indeterminate: Boolean
+	// 	If false: show progress.
+	// 	If true: show that a process is underway but that the progress is unknown
+	indeterminate: false,
+
+	templateString:"<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" tabindex=\"0\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\">&nbsp;</div\n\t><img dojoAttachPoint=\"inteterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\"\n\t></img\n></div>\n",
+
+	_indeterminateHighContrastImagePath:
+		dojo.moduleUrl("dijit", "themes/a11y/indeterminate_progress.gif"),
+
+	// public functions
+	postCreate: function(){
+		this.inherited("postCreate",arguments);
+		this.inteterminateHighContrastImage.setAttribute("src",
+			this._indeterminateHighContrastImagePath);
+		this.update();
+	},
+
+	update: function(/*Object?*/attributes){
+		// summary: update progress information
+		//
+		// attributes: may provide progress and/or maximum properties on this parameter,
+		//	see attribute specs for details.
+		dojo.mixin(this, attributes||{});
+		var percent = 1, classFunc;
+		if(this.indeterminate){
+			classFunc = "addClass";
+			dijit.removeWaiState(this.internalProgress, "valuenow");
+			dijit.removeWaiState(this.internalProgress, "valuemin");
+			dijit.removeWaiState(this.internalProgress, "valuemax");
+		}else{
+			classFunc = "removeClass";
+			if(String(this.progress).indexOf("%") != -1){
+				percent = Math.min(parseFloat(this.progress)/100, 1);
+				this.progress = percent * this.maximum;
+			}else{
+				this.progress = Math.min(this.progress, this.maximum);
+				percent = this.progress / this.maximum;
+			}
+			var text = this.report(percent);
+			this.label.firstChild.nodeValue = text;
+			dijit.setWaiState(this.internalProgress, "describedby", this.label.id);
+			dijit.setWaiState(this.internalProgress, "valuenow", this.progress);
+			dijit.setWaiState(this.internalProgress, "valuemin", 0);
+			dijit.setWaiState(this.internalProgress, "valuemax", this.maximum);
+		}
+		dojo[classFunc](this.domNode, "dijitProgressBarIndeterminate");
+		this.internalProgress.style.width = (percent * 100) + "%";
+		this.onChange();
+	},
+
+	report: function(/*float*/percent){
+		// Generates message to show; may be overridden by user
+		return dojo.number.format(percent, {type: "percent", places: this.places, locale: this.lang});
+	},
+
+	onChange: function(){
+		// summary: User definable function fired when progress updates.
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.TitlePane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.TitlePane"] = true;
+dojo.provide("dijit.TitlePane");
+
+
+
+
+
+
+dojo.declare(
+	"dijit.TitlePane",
+	[dijit.layout.ContentPane, dijit._Templated],
+{
+	// summary: A pane with a title on top, that can be opened or collapsed.
+	//
+	// description: An accessible container with a Title Heading, and a content
+	//	section that slides open and closed. TitlePane is an extension to 
+	//	ContentPane, providing all the usesful content-control aspects from.
+	//
+	// example:
+	// | 	// load a TitlePane from remote file:
+	// |	var foo = new dijit.TitlePane({ href: "foobar.html", title:"Title" });
+	// |	foo.startup();
+	//
+	// example:
+	// |	<!-- markup href example: -->
+	// |	<div dojoType="dijit.TitlePane" href="foobar.html" title="Title"></div>
+	// 
+	// example:
+	// |	<!-- markup with inline data -->
+	// | 	<div dojoType="dijit.TitlePane" title="Title">
+	// |		<p>I am content</p>
+	// |	</div>
+	//
+	// title: String
+	//		Title of the pane
+	title: "",
+
+	// open: Boolean
+	//		Whether pane is opened or closed.
+	open: true,
+
+	// duration: Integer
+	//		Time in milliseconds to fade in/fade out
+	duration: 250,
+
+	// baseClass: String
+	//	The root className to use for the various states of this widget
+	baseClass: "dijitTitlePane",
+
+	templateString:"<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus\" tabindex=\"0\"\n\t\t\twaiRole=\"button\" class=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<div dojoAttachPoint=\"arrowNode\" class=\"dijitInline dijitArrowNode\"><span dojoAttachPoint=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span></div>\n\t\t<div dojoAttachPoint=\"titleNode\" class=\"dijitTitlePaneTextNode\"></div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" dojoAttachPoint=\"hideNode\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\">\n\t\t\t\t<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc.  Put padding on inner div. -->\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n",
+
+	postCreate: function(){
+		this.setTitle(this.title);
+		if(!this.open){
+			this.hideNode.style.display = this.wipeNode.style.display = "none";
+		}
+		this._setCss();
+		dojo.setSelectable(this.titleNode, false);
+		this.inherited(arguments);
+		dijit.setWaiState(this.containerNode, "labelledby", this.titleNode.id);
+		dijit.setWaiState(this.focusNode, "haspopup", "true");
+
+		// setup open/close animations
+		var hideNode = this.hideNode, wipeNode = this.wipeNode;
+		this._wipeIn = dojo.fx.wipeIn({
+			node: this.wipeNode,
+			duration: this.duration,
+			beforeBegin: function(){
+				hideNode.style.display="";
+			}
+		});
+		this._wipeOut = dojo.fx.wipeOut({
+			node: this.wipeNode,
+			duration: this.duration,
+			onEnd: function(){
+				hideNode.style.display="none";
+			}
+		});
+	},
+
+	setContent: function(content){
+		// summary:
+		// 		Typically called when an href is loaded.  Our job is to make the animation smooth
+		if(!this.open || this._wipeOut.status() == "playing"){
+			// we are currently *closing* the pane (or the pane is closed), so just let that continue
+			this.inherited(arguments);
+		}else{
+			if(this._wipeIn.status() == "playing"){
+				this._wipeIn.stop();
+			}
+
+			// freeze container at current height so that adding new content doesn't make it jump
+			dojo.marginBox(this.wipeNode, { h: dojo.marginBox(this.wipeNode).h });
+
+			// add the new content (erasing the old content, if any)
+			this.inherited(arguments);
+
+			// call _wipeIn.play() to animate from current height to new height
+			this._wipeIn.play();
+		}
+	},
+
+	toggle: function(){
+		// summary: switches between opened and closed state
+		dojo.forEach([this._wipeIn, this._wipeOut], function(animation){
+			if(animation.status() == "playing"){
+				animation.stop();
+			}
+		});
+
+		this[this.open ? "_wipeOut" : "_wipeIn"].play();
+		this.open =! this.open;
+
+		// load content (if this is the first time we are opening the TitlePane
+		// and content is specified as an href, or we have setHref when hidden)
+		this._loadCheck();
+
+		this._setCss();
+	},
+
+	_setCss: function(){
+		// summary: set the open/close css state for the TitlePane
+		var classes = ["dijitClosed", "dijitOpen"];
+		var boolIndex = this.open;
+		var node = this.titleBarNode || this.focusNode
+		dojo.removeClass(node, classes[!boolIndex+0]);
+		node.className += " " + classes[boolIndex+0];
+
+		// provide a character based indicator for images-off mode
+		this.arrowNodeInner.innerHTML = this.open ? "-" : "+";
+	},
+
+	_onTitleKey: function(/*Event*/ e){
+		// summary: callback when user hits a key
+		if(e.keyCode == dojo.keys.ENTER || e.charCode == dojo.keys.SPACE){
+			this.toggle();
+		}else if(e.keyCode == dojo.keys.DOWN_ARROW && this.open){
+			this.containerNode.focus();
+			e.preventDefault();
+	 	}
+	},
+	
+	_handleFocus: function(/*Event*/ e){
+		// summary: handle blur and focus for this widget
+		
+		// add/removeClass is safe to call without hasClass in this case
+		dojo[(e.type == "focus" ? "addClass" : "removeClass")](this.focusNode, this.baseClass + "Focused");
+	},
+
+	setTitle: function(/*String*/ title){
+		// summary: sets the text of the title
+		this.titleNode.innerHTML = title;
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.Tooltip"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Tooltip"] = true;
+dojo.provide("dijit.Tooltip");
+
+
+
+
+dojo.declare(
+	"dijit._MasterTooltip",
+	[dijit._Widget, dijit._Templated],
+	{
+		// summary
+		//		Internal widget that holds the actual tooltip markup,
+		//		which occurs once per page.
+		//		Called by Tooltip widgets which are just containers to hold
+		//		the markup
+
+		// duration: Integer
+		//		Milliseconds to fade in/fade out
+		duration: 200,
+
+		templateString:"<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\">\n\t<div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></div>\n</div>\n",
+
+		postCreate: function(){
+			dojo.body().appendChild(this.domNode);
+
+			this.bgIframe = new dijit.BackgroundIframe(this.domNode);
+
+			// Setup fade-in and fade-out functions.
+			this.fadeIn = dojo.fadeIn({ node: this.domNode, duration: this.duration, onEnd: dojo.hitch(this, "_onShow") });
+			this.fadeOut = dojo.fadeOut({ node: this.domNode, duration: this.duration, onEnd: dojo.hitch(this, "_onHide") });
+
+		},
+
+		show: function(/*String*/ innerHTML, /*DomNode*/ aroundNode, /*String[]?*/ position){
+			// summary:
+			//	Display tooltip w/specified contents to right specified node
+			//	(To left if there's no space on the right, or if LTR==right)
+
+			if(this.aroundNode && this.aroundNode === aroundNode){
+				return;
+			}
+
+			if(this.fadeOut.status() == "playing"){
+				// previous tooltip is being hidden; wait until the hide completes then show new one
+				this._onDeck=arguments;
+				return;
+			}
+			this.containerNode.innerHTML=innerHTML;
+
+			// Firefox bug. when innerHTML changes to be shorter than previous
+			// one, the node size will not be updated until it moves.
+			this.domNode.style.top = (this.domNode.offsetTop + 1) + "px";
+
+			// position the element and change CSS according to position[] (a list of positions to try)
+			var align = {};
+			var ltr = this.isLeftToRight();
+			dojo.forEach( (position && position.length) ? position : dijit.Tooltip.defaultPosition, function(pos){
+				switch(pos){
+					case "after":				
+						align[ltr ? "BR" : "BL"] = ltr ? "BL" : "BR";
+						break;
+					case "before":
+						align[ltr ? "BL" : "BR"] = ltr ? "BR" : "BL";
+						break;
+					case "below":
+						// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+						align[ltr ? "BL" : "BR"] = ltr ? "TL" : "TR";
+						align[ltr ? "BR" : "BL"] = ltr ? "TR" : "TL";
+						break;
+					case "above":
+					default:
+						// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+						align[ltr ? "TL" : "TR"] = ltr ? "BL" : "BR";
+						align[ltr ? "TR" : "TL"] = ltr ? "BR" : "BL";
+						break;
+				}
+			});
+			var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, align, dojo.hitch(this, "orient"));
+
+			// show it
+			dojo.style(this.domNode, "opacity", 0);
+			this.fadeIn.play();
+			this.isShowingNow = true;
+			this.aroundNode = aroundNode;
+		},
+
+		orient: function(/* DomNode */ node, /* String */ aroundCorner, /* String */ tooltipCorner){
+			// summary: private function to set CSS for tooltip node based on which position it's in
+			node.className = "dijitTooltip " +
+				{
+					"BL-TL": "dijitTooltipBelow dijitTooltipABLeft",
+					"TL-BL": "dijitTooltipAbove dijitTooltipABLeft",
+					"BR-TR": "dijitTooltipBelow dijitTooltipABRight",
+					"TR-BR": "dijitTooltipAbove dijitTooltipABRight",
+					"BR-BL": "dijitTooltipRight",
+					"BL-BR": "dijitTooltipLeft"
+				}[aroundCorner + "-" + tooltipCorner];
+		},
+
+		_onShow: function(){
+			if(dojo.isIE){
+				// the arrow won't show up on a node w/an opacity filter
+				this.domNode.style.filter="";
+			}
+		},
+
+		hide: function(aroundNode){
+			// summary: hide the tooltip
+			if(!this.aroundNode || this.aroundNode !== aroundNode){
+				return;
+			}
+			if(this._onDeck){
+				// this hide request is for a show() that hasn't even started yet;
+				// just cancel the pending show()
+				this._onDeck=null;
+				return;
+			}
+			this.fadeIn.stop();
+			this.isShowingNow = false;
+			this.aroundNode = null;
+			this.fadeOut.play();
+		},
+
+		_onHide: function(){
+			this.domNode.style.cssText="";	// to position offscreen again
+			if(this._onDeck){
+				// a show request has been queued up; do it now
+				this.show.apply(this, this._onDeck);
+				this._onDeck=null;
+			}
+		}
+
+	}
+);
+
+dijit.showTooltip = function(/*String*/ innerHTML, /*DomNode*/ aroundNode, /*String[]?*/ position){
+	// summary:
+	//	Display tooltip w/specified contents in specified position.
+	//	See description of dijit.Tooltip.defaultPosition for details on position parameter.
+	//	If position is not specified then dijit.Tooltip.defaultPosition is used.
+	if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
+	return dijit._masterTT.show(innerHTML, aroundNode, position);
+};
+
+dijit.hideTooltip = function(aroundNode){
+	// summary: hide the tooltip
+	if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
+	return dijit._masterTT.hide(aroundNode);
+};
+
+dojo.declare(
+	"dijit.Tooltip",
+	dijit._Widget,
+	{
+		// summary
+		//		Pops up a tooltip (a help message) when you hover over a node.
+
+		// label: String
+		//		Text to display in the tooltip.
+		//		Specified as innerHTML when creating the widget from markup.
+		label: "",
+
+		// showDelay: Integer
+		//		Number of milliseconds to wait after hovering over/focusing on the object, before
+		//		the tooltip is displayed.
+		showDelay: 400,
+
+		// connectId: String[]
+		//		Id(s) of domNodes to attach the tooltip to.
+		//		When user hovers over any of the specified dom nodes, the tooltip will appear.
+		connectId: [],
+
+		//	position: String[]
+		//		See description of dijit.Tooltip.defaultPosition for details on position parameter.
+		position: [],
+
+		postCreate: function(){
+			if(this.srcNodeRef){
+				this.srcNodeRef.style.display = "none";
+			}
+
+			this._connectNodes = [];
+			
+			dojo.forEach(this.connectId, function(id) {
+				var node = dojo.byId(id);
+				if (node) {
+					this._connectNodes.push(node);
+					dojo.forEach(["onMouseOver", "onMouseOut", "onFocus", "onBlur", "onHover", "onUnHover"], function(event){
+						this.connect(node, event.toLowerCase(), "_"+event);
+					}, this);
+					if(dojo.isIE){
+						// BiDi workaround
+						node.style.zoom = 1;
+					}
+				}
+			}, this);
+		},
+
+		_onMouseOver: function(/*Event*/ e){
+			this._onHover(e);
+		},
+
+		_onMouseOut: function(/*Event*/ e){
+			if(dojo.isDescendant(e.relatedTarget, e.target)){
+				// false event; just moved from target to target child; ignore.
+				return;
+			}
+			this._onUnHover(e);
+		},
+
+		_onFocus: function(/*Event*/ e){
+			this._focus = true;
+			this._onHover(e);
+			this.inherited(arguments);
+		},
+		
+		_onBlur: function(/*Event*/ e){
+			this._focus = false;
+			this._onUnHover(e);
+			this.inherited(arguments);
+		},
+
+		_onHover: function(/*Event*/ e){
+			if(!this._showTimer){
+				var target = e.target;
+				this._showTimer = setTimeout(dojo.hitch(this, function(){this.open(target)}), this.showDelay);
+			}
+		},
+
+		_onUnHover: function(/*Event*/ e){
+			// keep a tooltip open if the associated element has focus
+			if(this._focus){ return; }
+			if(this._showTimer){
+				clearTimeout(this._showTimer);
+				delete this._showTimer;
+			}
+			this.close();
+		},
+
+		open: function(/*DomNode*/ target){
+ 			// summary: display the tooltip; usually not called directly.
+			target = target || this._connectNodes[0];
+			if(!target){ return; }
+
+			if(this._showTimer){
+				clearTimeout(this._showTimer);
+				delete this._showTimer;
+			}
+			dijit.showTooltip(this.label || this.domNode.innerHTML, target, this.position);
+			
+			this._connectNode = target;
+		},
+
+		close: function(){
+			// summary: hide the tooltip; usually not called directly.
+			dijit.hideTooltip(this._connectNode);
+			delete this._connectNode;
+			if(this._showTimer){
+				clearTimeout(this._showTimer);
+				delete this._showTimer;
+			}
+		},
+
+		uninitialize: function(){
+			this.close();
+		}
+	}
+);
+
+// dijit.Tooltip.defaultPosition: String[]
+//		This variable controls the position of tooltips, if the position is not specified to
+//		the Tooltip widget or *TextBox widget itself.  It's an array of strings with the following values:
+//
+//			* before: places tooltip to the left of the target node/widget, or to the right in
+//			  the case of RTL scripts like Hebrew and Arabic
+//			* after: places tooltip to the right of the target node/widget, or to the left in
+//			  the case of RTL scripts like Hebrew and Arabic
+//			* above: tooltip goes above target node
+//			* below: tooltip goes below target node
+//
+//		The list is positions is tried, in order, until a position is found where the tooltip fits
+//		within the viewport.
+//
+//		Be careful setting this parameter.  A value of "above" may work fine until the user scrolls
+//		the screen so that there's no room above the target node.   Nodes with drop downs, like
+//		DropDownButton or FilteringSelect, are especially problematic, in that you need to be sure
+//		that the drop down and tooltip don't overlap, even when the viewport is scrolled so that there
+//		is only room below (or above) the target node, but not both.
+dijit.Tooltip.defaultPosition = ["after", "before"];
+
+}
+
+if(!dojo._hasResource["dojo.cookie"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cookie"] = true;
+dojo.provide("dojo.cookie");
+
+
+
+/*=====
+dojo.__cookieProps = function(){
+	//	expires: Date|String|Number?
+	//		If a number, the number of days from today at which the cookie
+	//		will expire. If a date, the date past which the cookie will expire.
+	//		If expires is in the past, the cookie will be deleted.
+	//		If expires is omitted or is 0, the cookie will expire when the browser closes. << FIXME: 0 seems to disappear right away? FF3.
+	//	path: String?
+	//		The path to use for the cookie.
+	//	domain: String?
+	//		The domain to use for the cookie.
+	//	secure: Boolean?
+	//		Whether to only send the cookie on secure connections
+	this.expires = expires;
+	this.path = path;
+	this.domain = domain;
+	this.secure = secure;
+}
+=====*/
+
+
+dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){
+	//	summary: 
+	//		Get or set a cookie.
+	//	description:
+	// 		If one argument is passed, returns the value of the cookie
+	// 		For two or more arguments, acts as a setter.
+	//	name:
+	//		Name of the cookie
+	//	value:
+	//		Value for the cookie
+	//	props: 
+	//		Properties for the cookie
+	//	example:
+	//		set a cookie with the JSON-serialized contents of an object which
+	//		will expire 5 days from now:
+	//	|	dojo.cookie("configObj", dojo.toJson(config), { expires: 5 });
+	//	
+	//	example:
+	//		de-serialize a cookie back into a JavaScript object:
+	//	|	var config = dojo.fromJson(dojo.cookie("configObj"));
+	//	
+	//	example:
+	//		delete a cookie:
+	//	|	dojo.cookie("configObj", null, {expires: -1});
+	var c = document.cookie;
+	if(arguments.length == 1){
+		var matches = c.match(new RegExp("(?:^|; )" + dojo.regexp.escapeString(name) + "=([^;]*)"));
+		return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined
+	}else{
+		props = props || {};
+// FIXME: expires=0 seems to disappear right away, not on close? (FF3)  Change docs?
+		var exp = props.expires;
+		if(typeof exp == "number"){ 
+			var d = new Date();
+			d.setTime(d.getTime() + exp*24*60*60*1000);
+			exp = props.expires = d;
+		}
+		if(exp && exp.toUTCString){ props.expires = exp.toUTCString(); }
+
+		value = encodeURIComponent(value);
+		var updatedCookie = name + "=" + value;
+		for(propName in props){
+			updatedCookie += "; " + propName;
+			var propValue = props[propName];
+			if(propValue !== true){ updatedCookie += "=" + propValue; }
+		}
+		document.cookie = updatedCookie;
+	}
+};
+
+dojo.cookie.isSupported = function(){
+	//	summary:
+	//		Use to determine if the current browser supports cookies or not.
+	//		
+	//		Returns true if user allows cookies.
+	//		Returns false if user doesn't allow cookies.
+
+	if(!("cookieEnabled" in navigator)){
+		this("__djCookieTest__", "CookiesAllowed");
+		navigator.cookieEnabled = this("__djCookieTest__") == "CookiesAllowed";
+		if(navigator.cookieEnabled){
+			this("__djCookieTest__", "", {expires: -1});
+		}
+	}
+	return navigator.cookieEnabled;
+};
+
+}
+
+if(!dojo._hasResource["dijit.Tree"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Tree"] = true;
+dojo.provide("dijit.Tree");
+
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit._TreeNode",
+	[dijit._Widget, dijit._Templated, dijit._Container, dijit._Contained],
+{
+	// summary
+	//		Single node within a tree
+
+	// item: dojo.data.Item
+	//		the dojo.data entry this tree represents
+	item: null,	
+
+	isTreeNode: true,
+
+	// label: String
+	//		Text of this tree node
+	label: "",
+	
+	isExpandable: null, // show expando node
+	
+	isExpanded: false,
+
+	// state: String
+	//		dynamic loading-related stuff.
+	//		When an empty folder node appears, it is "UNCHECKED" first,
+	//		then after dojo.data query it becomes "LOADING" and, finally "LOADED"	
+	state: "UNCHECKED",
+	
+	templateString:"<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><div dojoAttachPoint=\"contentNode\" class=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"iconNode\" class=\"dijitInline dijitTreeIcon\" waiRole=\"presentation\"></div>\n\t\t\t<span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onNodeFocus\"></span>\n\t\t</div\n\t></div>\n</div>\n",		
+
+	postCreate: function(){
+		// set label, escaping special characters
+		this.setLabelNode(this.label);
+
+		// set expand icon for leaf
+		this._setExpando();
+
+		// set icon and label class based on item
+		this._updateItemClasses(this.item);
+
+		if(this.isExpandable){
+			dijit.setWaiState(this.labelNode, "expanded", this.isExpanded);
+		}
+	},
+
+	markProcessing: function(){
+		// summary: visually denote that tree is loading data, etc.
+		this.state = "LOADING";
+		this._setExpando(true);	
+	},
+
+	unmarkProcessing: function(){
+		// summary: clear markup from markProcessing() call
+		this._setExpando(false);	
+	},
+
+	_updateItemClasses: function(item){
+		// summary: set appropriate CSS classes for icon and label dom node (used to allow for item updates to change respective CSS)
+		var tree = this.tree, model = tree.model;
+		if(tree._v10Compat && item === model.root){
+			// For back-compat with 1.0, need to use null to specify root item (TODO: remove in 2.0)
+			item = null;
+		}
+		this.iconNode.className = "dijitInline dijitTreeIcon " + tree.getIconClass(item, this.isExpanded);
+		this.labelNode.className = "dijitTreeLabel " + tree.getLabelClass(item, this.isExpanded);
+	},
+
+	_updateLayout: function(){
+		// summary: set appropriate CSS classes for this.domNode
+		var parent = this.getParent();
+		if(!parent || parent.rowNode.style.display == "none"){
+			/* if we are hiding the root node then make every first level child look like a root node */
+			dojo.addClass(this.domNode, "dijitTreeIsRoot");
+		}else{
+			dojo.toggleClass(this.domNode, "dijitTreeIsLast", !this.getNextSibling());
+		}
+	},
+
+	_setExpando: function(/*Boolean*/ processing){
+		// summary: set the right image for the expando node
+
+		// apply the appropriate class to the expando node
+		var styles = ["dijitTreeExpandoLoading", "dijitTreeExpandoOpened",
+			"dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"];
+		var idx = processing ? 0 : (this.isExpandable ?	(this.isExpanded ? 1 : 2) : 3);
+		dojo.forEach(styles,
+			function(s){
+				dojo.removeClass(this.expandoNode, s);
+			}, this
+		);
+		dojo.addClass(this.expandoNode, styles[idx]);
+
+		// provide a non-image based indicator for images-off mode
+		this.expandoNodeText.innerHTML =
+			processing ? "*" :
+				(this.isExpandable ?
+					(this.isExpanded ? "-" : "+") : "*");
+	},	
+
+	expand: function(){
+		// summary: show my children
+		if(this.isExpanded){ return; }
+		// cancel in progress collapse operation
+		if(this._wipeOut.status() == "playing"){
+			this._wipeOut.stop();
+		}
+
+		this.isExpanded = true;
+		dijit.setWaiState(this.labelNode, "expanded", "true");
+		dijit.setWaiRole(this.containerNode, "group");
+		this.contentNode.className = "dijitTreeContent dijitTreeContentExpanded";
+		this._setExpando();
+		this._updateItemClasses(this.item);
+
+		this._wipeIn.play();
+	},
+
+	collapse: function(){					
+		if(!this.isExpanded){ return; }
+
+		// cancel in progress expand operation
+		if(this._wipeIn.status() == "playing"){
+			this._wipeIn.stop();
+		}
+
+		this.isExpanded = false;
+		dijit.setWaiState(this.labelNode, "expanded", "false");
+		this.contentNode.className = "dijitTreeContent";
+		this._setExpando();
+		this._updateItemClasses(this.item);
+
+		this._wipeOut.play();
+	},
+
+	setLabelNode: function(label){
+		this.labelNode.innerHTML="";
+		this.labelNode.appendChild(dojo.doc.createTextNode(label));
+	},
+
+	setChildItems: function(/* Object[] */ items){
+		// summary:
+		//		Sets the child items of this node, removing/adding nodes
+		//		from current children to match specified items[] array.
+
+		var tree = this.tree,
+			model = tree.model;
+
+		// Orphan all my existing children.
+		// If items contains some of the same items as before then we will reattach them.
+		// Don't call this.removeChild() because that will collapse the tree etc.
+		this.getChildren().forEach(function(child){
+			dijit._Container.prototype.removeChild.call(this, child);
+		}, this);
+
+		this.state = "LOADED";
+
+		if(items && items.length > 0){
+			this.isExpandable = true;
+			if(!this.containerNode){ // maybe this node was unfolderized and still has container
+				this.containerNode = this.tree.containerNodeTemplate.cloneNode(true);
+				this.domNode.appendChild(this.containerNode);
+			}
+
+			// Create _TreeNode widget for each specified tree node, unless one already
+			// exists and isn't being used (presumably it's from a DnD move and was recently
+			// released
+			dojo.forEach(items, function(item){
+				var id = model.getIdentity(item),
+					existingNode = tree._itemNodeMap[id],
+					node = 
+						( existingNode && !existingNode.getParent() ) ?
+						existingNode :
+						new dijit._TreeNode({
+							item: item,
+							tree: tree,
+							isExpandable: model.mayHaveChildren(item),
+							label: tree.getLabel(item)
+						});
+				this.addChild(node);
+				// note: this won't work if there are two nodes for one item (multi-parented items); will be fixed later
+				tree._itemNodeMap[id] = node;
+				if(this.tree.persist){
+					if(tree._openedItemIds[id]){
+						tree._expandNode(node);
+					}
+				}
+			}, this);
+
+			// note that updateLayout() needs to be called on each child after
+			// _all_ the children exist
+			dojo.forEach(this.getChildren(), function(child, idx){
+				child._updateLayout();
+			});
+		}else{
+			this.isExpandable=false;
+		}
+
+		if(this._setExpando){
+			// change expando to/from dot or + icon, as appropriate
+			this._setExpando(false);
+		}
+
+		// On initial tree show, put focus on either the root node of the tree,
+		// or the first child, if the root node is hidden
+		if(!this.parent){
+			var fc = this.tree.showRoot ? this : this.getChildren()[0],
+				tabnode = fc ? fc.labelNode : this.domNode;
+			tabnode.setAttribute("tabIndex", "0");
+		}
+
+		// create animations for showing/hiding the children (if children exist)
+		if(this.containerNode && !this._wipeIn){
+			this._wipeIn = dojo.fx.wipeIn({node: this.containerNode, duration: 150});
+			this._wipeOut = dojo.fx.wipeOut({node: this.containerNode, duration: 150});
+		}
+	},
+
+	removeChild: function(/* treeNode */ node){
+		this.inherited(arguments);
+
+		var children = this.getChildren();		
+		if(children.length == 0){
+			this.isExpandable = false;
+			this.collapse();
+		}
+
+		dojo.forEach(children, function(child){
+				child._updateLayout();
+		});
+	},
+
+	makeExpandable: function(){
+		//summary
+		//		if this node wasn't already showing the expando node,
+		//		turn it into one and call _setExpando()
+		this.isExpandable = true;
+		this._setExpando(false);
+	},
+
+	_onNodeFocus: function(evt){
+		var node = dijit.getEnclosingWidget(evt.target);
+		this.tree._onTreeFocus(node);
+	}
+});
+
+dojo.declare(
+	"dijit.Tree",
+	[dijit._Widget, dijit._Templated],
+{
+	// summary
+	//	This widget displays hierarchical data from a store.  A query is specified
+	//	to get the "top level children" from a data store, and then those items are
+	//	queried for their children and so on (but lazily, as the user clicks the expand node).
+	//
+	//	Thus in the default mode of operation this widget is technically a forest, not a tree,
+	//	in that there can be multiple "top level children".  However, if you specify label,
+	//	then a special top level node (not corresponding to any item in the datastore) is
+	//	created, to father all the top level children.
+
+	// store: String||dojo.data.Store
+	//	The store to get data to display in the tree.
+	//	May remove for 2.0 in favor of "model".
+	store: null,
+
+	// model: dijit.Tree.model
+	//	Alternate interface from store to access data (and changes to data) in the tree
+	model: null,
+
+	// query: anything
+	//	Specifies datastore query to return the root item for the tree.
+	//
+	//	Deprecated functionality: if the query returns multiple items, the tree is given
+	//	a fake root node (not corresponding to any item in the data store), 
+	//	whose children are the items that match this query.
+	//
+	//	The root node is shown or hidden based on whether a label is specified.
+	//
+	//	Having a query return multiple items is deprecated.
+	//	If your store doesn't have a root item, wrap the store with
+	//	dijit.tree.ForestStoreModel, and specify model=myModel
+	//
+	// example:
+	//		{type:'continent'}
+	query: null,
+
+	// label: String
+	//	Deprecated.  Use dijit.tree.ForestStoreModel directly instead.
+	//	Used in conjunction with query parameter.
+	//	If a query is specified (rather than a root node id), and a label is also specified,
+	//	then a fake root node is created and displayed, with this label.
+	label: "",
+
+	// showRoot: Boolean
+	//	Should the root node be displayed, or hidden?
+	showRoot: true,
+
+	// childrenAttr: String[]
+	//		one ore more attributes that holds children of a tree node
+	childrenAttr: ["children"],
+
+	// openOnClick: Boolean
+	//		If true, clicking a folder node's label will open it, rather than calling onClick()
+	openOnClick: false,
+
+	templateString:"<div class=\"dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onclick:_onClick,onkeypress:_onKeyPress\">\n</div>\n",		
+
+	isExpandable: true,
+
+	isTree: true,
+
+	// persist: Boolean
+	//	enables/disables use of cookies for state saving.
+	persist: true,
+	
+	// dndController: String
+	//	class name to use as as the dnd controller
+	dndController: null,
+
+	//parameters to pull off of the tree and pass on to the dndController as its params
+	dndParams: ["onDndDrop","itemCreator","onDndCancel","checkAcceptance", "checkItemAcceptance"],
+
+	//declare the above items so they can be pulled from the tree's markup
+	onDndDrop:null,
+	itemCreator:null,
+	onDndCancel:null,
+	checkAcceptance:null,	
+	checkItemAcceptance:null,
+
+	_publish: function(/*String*/ topicName, /*Object*/ message){
+		// summary:
+		//		Publish a message for this widget/topic
+		dojo.publish(this.id, [dojo.mixin({tree: this, event: topicName}, message||{})]);
+	},
+
+	postMixInProperties: function(){
+		this.tree = this;
+
+		this._itemNodeMap={};
+
+		if(!this.cookieName){
+			this.cookieName = this.id + "SaveStateCookie";
+		}
+	},
+
+	postCreate: function(){
+		// load in which nodes should be opened automatically
+		if(this.persist){
+			var cookie = dojo.cookie(this.cookieName);
+			this._openedItemIds = {};
+			if(cookie){
+				dojo.forEach(cookie.split(','), function(item){
+					this._openedItemIds[item] = true;
+				}, this);
+			}
+		}
+		
+		// make template for container node (we will clone this and insert it into
+		// any nodes that have children)
+		var div = dojo.doc.createElement('div');
+		div.style.display = 'none';
+		div.className = "dijitTreeContainer";	
+		dijit.setWaiRole(div, "presentation");
+		this.containerNodeTemplate = div;
+
+		// Create glue between store and Tree, if not specified directly by user
+		if(!this.model){
+			this._store2model();
+		}
+
+		// monitor changes to items
+		this.connect(this.model, "onChange", "_onItemChange");
+		this.connect(this.model, "onChildrenChange", "_onItemChildrenChange");
+		// TODO: monitor item deletes so we don't end up w/orphaned nodes?
+
+		this._load();
+
+		this.inherited("postCreate", arguments);
+
+		if(this.dndController){
+			if(dojo.isString(this.dndController)){
+				this.dndController= dojo.getObject(this.dndController);
+			}	
+			var params={};
+			for (var i=0; i<this.dndParams.length;i++){
+				if(this[this.dndParams[i]]){
+					params[this.dndParams[i]]=this[this.dndParams[i]];
+				}
+			}
+			this.dndController= new this.dndController(this, params);
+		}
+	},
+
+	_store2model: function(){
+		// summary: user specified a store&query rather than model, so create model from store/query
+		this._v10Compat = true;
+		dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");
+
+		var modelParams = {
+			id: this.id + "_ForestStoreModel",
+			store: this.store,
+			query: this.query,
+			childrenAttrs: this.childrenAttr
+		};
+
+		// Only override the model's mayHaveChildren() method if the user has specified an override
+		if(this.params.mayHaveChildren){
+			modelParams.mayHaveChildren = dojo.hitch(this, "mayHaveChildren");
+		}
+					
+		if(this.params.getItemChildren){
+			modelParams.getChildren = dojo.hitch(this, function(item, onComplete, onError){
+				this.getItemChildren((this._v10Compat && item === this.model.root) ? null : item, onComplete, onError);
+			});
+		}
+		this.model = new dijit.tree.ForestStoreModel(modelParams);
+		
+		// For backwards compatibility, the visibility of the root node is controlled by
+		// whether or not the user has specified a label
+		this.showRoot = Boolean(this.label);
+	},
+
+	_load: function(){
+		// summary: initial load of the tree
+		// load root node (possibly hidden) and it's children
+		this.model.getRoot(
+			dojo.hitch(this, function(item){
+				var rn = this.rootNode = new dijit._TreeNode({
+					item: item,
+					tree: this,
+					isExpandable: true,
+					label: this.label || this.getLabel(item)
+				});
+				if(!this.showRoot){
+					rn.rowNode.style.display="none";
+				}
+				this.domNode.appendChild(rn.domNode);
+				this._itemNodeMap[this.model.getIdentity(item)] = rn;
+
+				rn._updateLayout();		// sets "dijitTreeIsRoot" CSS classname
+
+				// load top level children
+				this._expandNode(rn);
+			}),
+			function(err){
+				console.error(this, ": error loading root: ", err);
+			}
+		);
+	},
+
+	////////////// Data store related functions //////////////////////
+	// These just get passed to the model; they are here for back-compat
+
+	mayHaveChildren: function(/*dojo.data.Item*/ item){
+		// summary
+		//		User overridable function to tell if an item has or may have children.
+		//		Controls whether or not +/- expando icon is shown.
+		//		(For efficiency reasons we may not want to check if an element actually
+		//		has children until user clicks the expando node)
+	},
+
+	getItemChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete){
+		// summary
+		// 		User overridable function that return array of child items of given parent item,
+		//		or if parentItem==null then return top items in tree
+	},
+
+	///////////////////////////////////////////////////////
+	// Functions for converting an item to a TreeNode
+	getLabel: function(/*dojo.data.Item*/ item){
+		// summary: user overridable function to get the label for a tree node (given the item)
+		return this.model.getLabel(item);	// String
+	},
+
+	getIconClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+		// summary: user overridable function to return CSS class name to display icon
+		return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf"
+	},
+
+	getLabelClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+		// summary: user overridable function to return CSS class name to display label
+	},
+
+	/////////// Keyboard and Mouse handlers ////////////////////
+
+	_onKeyPress: function(/*Event*/ e){
+		// summary: translates keypress events into commands for the controller
+		if(e.altKey){ return; }
+		var treeNode = dijit.getEnclosingWidget(e.target);
+		if(!treeNode){ return; }
+
+		// Note: On IE e.keyCode is not 0 for printables so check e.charCode.
+		// In dojo charCode is universally 0 for non-printables.
+		if(e.charCode){  // handle printables (letter navigation)
+			// Check for key navigation.
+			var navKey = e.charCode;
+			if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
+				navKey = (String.fromCharCode(navKey)).toLowerCase();
+				this._onLetterKeyNav( { node: treeNode, key: navKey } );
+				dojo.stopEvent(e);
+			}
+		}else{  // handle non-printables (arrow keys)
+			var map = this._keyHandlerMap;
+			if(!map){
+				// setup table mapping keys to events
+				map = {};
+				map[dojo.keys.ENTER]="_onEnterKey";
+				map[this.isLeftToRight() ? dojo.keys.LEFT_ARROW : dojo.keys.RIGHT_ARROW]="_onLeftArrow";
+				map[this.isLeftToRight() ? dojo.keys.RIGHT_ARROW : dojo.keys.LEFT_ARROW]="_onRightArrow";
+				map[dojo.keys.UP_ARROW]="_onUpArrow";
+				map[dojo.keys.DOWN_ARROW]="_onDownArrow";
+				map[dojo.keys.HOME]="_onHomeKey";
+				map[dojo.keys.END]="_onEndKey";
+				this._keyHandlerMap = map;
+			}
+			if(this._keyHandlerMap[e.keyCode]){
+				this[this._keyHandlerMap[e.keyCode]]( { node: treeNode, item: treeNode.item } );	
+				dojo.stopEvent(e);
+			}
+		}
+	},
+
+	_onEnterKey: function(/*Object*/ message){
+		this._publish("execute", { item: message.item, node: message.node} );
+		this.onClick(message.item, message.node);
+	},
+
+	_onDownArrow: function(/*Object*/ message){
+		// summary: down arrow pressed; get next visible node, set focus there
+		var node = this._getNextNode(message.node);
+		if(node && node.isTreeNode){
+			this.focusNode(node);
+		}	
+	},
+
+	_onUpArrow: function(/*Object*/ message){
+		// summary: up arrow pressed; move to previous visible node
+
+		var node = message.node;
+
+		// if younger siblings		
+		var previousSibling = node.getPreviousSibling();
+		if(previousSibling){
+			node = previousSibling;
+			// if the previous node is expanded, dive in deep
+			while(node.isExpandable && node.isExpanded && node.hasChildren()){
+				// move to the last child
+				var children = node.getChildren();
+				node = children[children.length-1];
+			}
+		}else{
+			// if this is the first child, return the parent
+			// unless the parent is the root of a tree with a hidden root
+			var parent = node.getParent();
+			if(!(!this.showRoot && parent === this.rootNode)){
+				node = parent;
+			}
+		}
+
+		if(node && node.isTreeNode){
+			this.focusNode(node);
+		}
+	},
+
+	_onRightArrow: function(/*Object*/ message){
+		// summary: right arrow pressed; go to child node
+		var node = message.node;
+
+		// if not expanded, expand, else move to 1st child
+		if(node.isExpandable && !node.isExpanded){
+			this._expandNode(node);
+		}else if(node.hasChildren()){
+			node = node.getChildren()[0];
+			if(node && node.isTreeNode){
+				this.focusNode(node);
+			}
+		}
+	},
+
+	_onLeftArrow: function(/*Object*/ message){
+		// summary:
+		//		Left arrow pressed.
+		//		If not collapsed, collapse, else move to parent.
+
+		var node = message.node;
+
+		if(node.isExpandable && node.isExpanded){
+			this._collapseNode(node);
+		}else{
+			node = node.getParent();
+			if(node && node.isTreeNode){
+				this.focusNode(node);
+			}
+		}
+	},
+
+	_onHomeKey: function(){
+		// summary: home pressed; get first visible node, set focus there
+		var node = this._getRootOrFirstNode();
+		if(node){
+			this.focusNode(node);
+		}
+	},
+
+	_onEndKey: function(/*Object*/ message){
+		// summary: end pressed; go to last visible node
+
+		var node = this;
+		while(node.isExpanded){
+			var c = node.getChildren();
+			node = c[c.length - 1];
+		}
+
+		if(node && node.isTreeNode){
+			this.focusNode(node);
+		}
+	},
+
+	_onLetterKeyNav: function(message){
+		// summary: letter key pressed; search for node starting with first char = key
+		var node = startNode = message.node,
+			key = message.key;
+		do{
+			node = this._getNextNode(node);
+			//check for last node, jump to first node if necessary
+			if(!node){
+				node = this._getRootOrFirstNode();
+			}
+		}while(node !== startNode && (node.label.charAt(0).toLowerCase() != key));
+		if(node && node.isTreeNode){
+			// no need to set focus if back where we started
+			if(node !== startNode){
+				this.focusNode(node);
+			}
+		}
+	},
+
+	_onClick: function(/*Event*/ e){
+		// summary: translates click events into commands for the controller to process
+		var domElement = e.target;
+
+		// find node
+		var nodeWidget = dijit.getEnclosingWidget(domElement);	
+		if(!nodeWidget || !nodeWidget.isTreeNode){
+			return;
+		}
+
+		if( (this.openOnClick && nodeWidget.isExpandable) ||
+			(domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText) ){
+			// expando node was clicked, or label of a folder node was clicked; open it
+			if(nodeWidget.isExpandable){
+				this._onExpandoClick({node:nodeWidget});
+			}
+		}else{
+			this._publish("execute", { item: nodeWidget.item, node: nodeWidget} );
+			this.onClick(nodeWidget.item, nodeWidget);
+			this.focusNode(nodeWidget);
+		}
+		dojo.stopEvent(e);
+	},
+
+	_onExpandoClick: function(/*Object*/ message){
+		// summary: user clicked the +/- icon; expand or collapse my children.
+		var node = message.node;
+		
+		// If we are collapsing, we might be hiding the currently focused node.
+		// Also, clicking the expando node might have erased focus from the current node.
+		// For simplicity's sake just focus on the node with the expando.
+		this.focusNode(node);
+
+		if(node.isExpanded){
+			this._collapseNode(node);
+		}else{
+			this._expandNode(node);
+		}
+	},
+
+	onClick: function(/* dojo.data */ item, /*TreeNode*/ node){
+		// summary: user overridable function for executing a tree item
+	},
+
+	_getNextNode: function(node){
+		// summary: get next visible node
+
+		if(node.isExpandable && node.isExpanded && node.hasChildren()){
+			// if this is an expanded node, get the first child
+			return node.getChildren()[0];		// _TreeNode	
+		}else{
+			// find a parent node with a sibling
+			while(node && node.isTreeNode){
+				var returnNode = node.getNextSibling();
+				if(returnNode){
+					return returnNode;		// _TreeNode
+				}
+				node = node.getParent();
+			}
+			return null;
+		}
+	},
+
+	_getRootOrFirstNode: function(){
+		// summary: get first visible node
+		return this.showRoot ? this.rootNode : this.rootNode.getChildren()[0];
+	},
+
+	_collapseNode: function(/*_TreeNode*/ node){
+		// summary: called when the user has requested to collapse the node
+
+		if(node.isExpandable){
+			if(node.state == "LOADING"){
+				// ignore clicks while we are in the process of loading data
+				return;
+			}
+
+			node.collapse();
+			if(this.persist && node.item){
+				delete this._openedItemIds[this.model.getIdentity(node.item)];
+				this._saveState();
+			}
+		}
+	},
+
+	_expandNode: function(/*_TreeNode*/ node){
+		// summary: called when the user has requested to expand the node
+
+		if(!node.isExpandable){
+			return;
+		}
+
+		var model = this.model,
+			item = node.item;
+
+		switch(node.state){
+			case "LOADING":
+				// ignore clicks while we are in the process of loading data
+				return;
+
+			case "UNCHECKED":
+				// need to load all the children, and then expand
+				node.markProcessing();
+				var _this = this;
+				model.getChildren(item, function(items){
+						node.unmarkProcessing();
+						node.setChildItems(items);
+						_this._expandNode(node);
+					},
+					function(err){
+						console.error(_this, ": error loading root children: ", err);
+					});
+				break;
+
+			default:
+				// data is already loaded; just proceed
+				node.expand();
+				if(this.persist && item){
+					this._openedItemIds[model.getIdentity(item)] = true;
+					this._saveState();
+				}
+		}
+	},
+
+	////////////////// Miscellaneous functions ////////////////
+
+	blurNode: function(){
+		// summary
+		//	Removes focus from the currently focused node (which must be visible).
+		//	Usually not called directly (just call focusNode() on another node instead)
+		var node = this.lastFocused;
+		if(!node){ return; }
+		var labelNode = node.labelNode;
+		dojo.removeClass(labelNode, "dijitTreeLabelFocused");
+		labelNode.setAttribute("tabIndex", "-1");
+		dijit.setWaiState(labelNode, "selected", false);
+		this.lastFocused = null;
+	},
+
+	focusNode: function(/* _tree.Node */ node){
+		// summary
+		//	Focus on the specified node (which must be visible)
+
+		// set focus so that the label will be voiced using screen readers
+		node.labelNode.focus();
+	},
+
+	_onBlur: function(){
+		// summary:
+		// 		We've moved away from the whole tree.  The currently "focused" node
+		//		(see focusNode above) should remain as the lastFocused node so we can
+		//		tab back into the tree.  Just change CSS to get rid of the dotted border
+		//		until that time
+
+		this.inherited(arguments);
+		if(this.lastFocused){
+			var labelNode = this.lastFocused.labelNode;
+			dojo.removeClass(labelNode, "dijitTreeLabelFocused");	
+		}
+	},
+
+	_onTreeFocus: function(/*Widget*/ node){
+		// summary:
+		//		called from onFocus handler of treeitem labelNode to set styles, wai state and tabindex
+		//		for currently focused treeitem.
+		
+		if (node){
+			if(node != this.lastFocused){
+				this.blurNode();
+			}
+			var labelNode = node.labelNode;
+			// set tabIndex so that the tab key can find this node
+			labelNode.setAttribute("tabIndex", "0");
+			dijit.setWaiState(labelNode, "selected", true);
+			dojo.addClass(labelNode, "dijitTreeLabelFocused");
+			this.lastFocused = node;
+		}
+	},
+
+	//////////////// Events from the model //////////////////////////
+	
+	_onItemDelete: function(/*Object*/ item){
+		//summary: delete event from the store
+		// TODO: currently this isn't called, and technically doesn't need to be,
+		// but it would help with garbage collection
+
+		var identity = this.model.getIdentity(item);
+		var node = this._itemNodeMap[identity];
+
+		if(node){
+			var parent = node.getParent();
+			if(parent){
+				// if node has not already been orphaned from a _onSetItem(parent, "children", ..) call...
+				parent.removeChild(node);
+			}
+			delete this._itemNodeMap[identity];
+			node.destroyRecursive();
+		}
+	},
+
+	_onItemChange: function(/*Item*/ item){
+		//summary: set data event on an item in the store
+		var model = this.model,
+			identity = model.getIdentity(item),
+			node = this._itemNodeMap[identity];
+
+		if(node){
+			node.setLabelNode(this.getLabel(item));
+			node._updateItemClasses(item);
+		}
+	},
+
+	_onItemChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+		//summary: set data event on an item in the store
+		var model = this.model,
+			identity = model.getIdentity(parent),
+			parentNode = this._itemNodeMap[identity];
+
+		if(parentNode){
+			parentNode.setChildItems(newChildrenList);
+		}
+	},
+
+	/////////////// Miscellaneous funcs
+	
+	_saveState: function(){
+		//summary: create and save a cookie with the currently expanded nodes identifiers
+		if(!this.persist){
+			return;
+		}
+		var ary = [];
+		for(var id in this._openedItemIds){
+			ary.push(id);
+		}
+		dojo.cookie(this.cookieName, ary.join(","));
+	},
+
+	destroy: function(){
+		if(this.rootNode){
+			this.rootNode.destroyRecursive();
+		}
+		this.rootNode = null;
+		this.inherited(arguments);
+	},
+	
+	destroyRecursive: function(){
+		// A tree is treated as a leaf, not as a node with children (like a grid),
+		// but defining destroyRecursive for back-compat.
+		this.destroy();
+	}
+});
+
+
+dojo.declare(
+	"dijit.tree.TreeStoreModel",
+	null,
+{
+	// summary
+	//		Implements dijit.Tree.model connecting to a store with a single
+	//		root item.  Any methods passed into the constructor will override
+	//		the ones defined here.
+
+	// store: dojo.data.Store
+	//		Underlying store
+	store: null,
+
+	// childrenAttrs: String[]
+	//		one ore more attributes that holds children of a tree node
+	childrenAttrs: ["children"],
+	
+	// root: dojo.data.Item
+	//		Pointer to the root item (read only, not a parameter)
+	root: null,
+
+	// query: anything
+	//		Specifies datastore query to return the root item for the tree.
+	//		Must only return a single item.   Alternately can just pass in pointer
+	//		to root item.
+	// example:
+	//		{id:'ROOT'}
+	query: null,
+
+	constructor: function(/* Object */ args){
+		// summary: passed the arguments listed above (store, etc)
+		dojo.mixin(this, args);
+
+		this.connects = [];
+
+		var store = this.store;
+		if(!store.getFeatures()['dojo.data.api.Identity']){
+			throw new Error("dijit.Tree: store must support dojo.data.Identity");			
+		}
+
+		// if the store supports Notification, subscribe to the notification events
+		if(store.getFeatures()['dojo.data.api.Notification']){
+			this.connects = this.connects.concat([
+				dojo.connect(store, "onNew", this, "_onNewItem"),
+				dojo.connect(store, "onDelete", this, "_onDeleteItem"),
+				dojo.connect(store, "onSet", this, "_onSetItem")
+			]);
+		}
+	},
+
+	destroy: function(){
+		dojo.forEach(this.connects, dojo.disconnect);
+	},
+
+	// =======================================================================
+	// Methods for traversing hierarchy
+
+	getRoot: function(onItem, onError){
+		// summary:
+		//		Calls onItem with the root item for the tree, possibly a fabricated item.
+		//		Calls onError on error.
+		if(this.root){
+			onItem(this.root);
+		}else{
+			this.store.fetch({
+				query: this.query,
+				onComplete: dojo.hitch(this, function(items){
+					if(items.length != 1){
+						throw new Error(this.declaredClass + ": query " + query + " returned " + items.length +
+						 	" items, but must return exactly one item");
+					}
+					this.root = items[0];
+					onItem(this.root);
+				}),
+				onError: onError
+			});
+		}
+	},
+
+	mayHaveChildren: function(/*dojo.data.Item*/ item){
+		// summary
+		//		Tells if an item has or may have children.  Implementing logic here
+		//		avoids showing +/- expando icon for nodes that we know don't have children.
+		//		(For efficiency reasons we may not want to check if an element actually
+		//		has children until user clicks the expando node)
+		return dojo.some(this.childrenAttrs, function(attr){
+			return this.store.hasAttribute(item, attr);
+		}, this);
+	},
+
+	getChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete, /*function*/ onError){
+		// summary
+		// 		Calls onComplete() with array of child items of given parent item, all loaded.
+
+		var store = this.store;
+
+		// get children of specified item
+		var childItems = [];
+		for (var i=0; i<this.childrenAttrs.length; i++){
+			var vals = store.getValues(parentItem, this.childrenAttrs[i]);
+			childItems = childItems.concat(vals);
+		}
+
+		// count how many items need to be loaded
+		var _waitCount = 0;
+		dojo.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } });
+
+		if(_waitCount == 0){
+			// all items are already loaded.  proceed...
+			onComplete(childItems);
+		}else{
+			// still waiting for some or all of the items to load
+			var onItem = function onItem(item){
+				if(--_waitCount == 0){
+					// all nodes have been loaded, send them to the tree
+					onComplete(childItems);
+				}
+			}
+			dojo.forEach(childItems, function(item){
+				if(!store.isItemLoaded(item)){
+					store.loadItem({
+						item: item,
+						onItem: onItem,
+						onError: onError
+					});
+				}
+			});
+		}
+	},
+
+	// =======================================================================
+	// Inspecting items
+
+	getIdentity: function(/* item */ item){
+		return this.store.getIdentity(item);	// Object
+	},
+
+	getLabel: function(/*dojo.data.Item*/ item){
+		// summary: get the label for an item
+		return this.store.getLabel(item);	// String
+	},
+
+	// =======================================================================
+	// Write interface
+
+	newItem: function(/* Object? */ args, /*Item*/ parent){
+		// summary
+		//		Creates a new item.   See dojo.data.api.Write for details on args.
+		//		Used in drag & drop when item from external source dropped onto tree.
+		var pInfo = {parent: parent, attribute: this.childrenAttrs[0]};
+		return this.store.newItem(args, pInfo);
+	},
+
+	pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy){
+		// summary
+		//		Move or copy an item from one parent item to another.
+		//		Used in drag & drop
+		var store = this.store,
+			parentAttr = this.childrenAttrs[0];	// name of "children" attr in parent item
+
+		// remove child from source item, and record the attributee that child occurred in	
+		if(oldParentItem){
+			dojo.forEach(this.childrenAttrs, function(attr){
+				if(store.containsValue(oldParentItem, attr, childItem)){
+					if(!bCopy){
+						var values = dojo.filter(store.getValues(oldParentItem, attr), function(x){
+							return x != childItem;
+						});
+						store.setValues(oldParentItem, attr, values);
+					}
+					parentAttr = attr;
+				}
+			});
+		}
+
+		// modify target item's children attribute to include this item
+		if(newParentItem){
+			store.setValues(newParentItem, parentAttr,
+				store.getValues(newParentItem, parentAttr).concat(childItem));
+		}
+	},
+
+	// =======================================================================
+	// Callbacks
+	
+	onChange: function(/*dojo.data.Item*/ item){
+		// summary
+		//		Callback whenever an item has changed, so that Tree
+		//		can update the label, icon, etc.   Note that changes
+		//		to an item's children or parent(s) will trigger an
+		//		onChildrenChange() so you can ignore those changes here.
+	},
+
+	onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+		// summary
+		//		Callback to do notifications about new, updated, or deleted items.
+	},
+
+	// =======================================================================
+	///Events from data store
+
+	_onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+		// summary: handler for when new items appear in the store.
+
+		//	In this case there's no correspond onSet() call on the parent of this
+		//	item, so need to get the new children list of the parent manually somehow.
+		if(!parentInfo){
+			return;
+		}
+		this.getChildren(parentInfo.item, dojo.hitch(this, function(children){
+			// NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+			this.onChildrenChange(parentInfo.item, children);
+		}));
+	},
+	
+	_onDeleteItem: function(/*Object*/ item){
+		// summary: handler for delete notifications from underlying store
+	},
+
+	_onSetItem: function(/* item */ item, 
+					/* attribute-name-string */ attribute, 
+					/* object | array */ oldValue,
+					/* object | array */ newValue){
+		//summary: set data event on an item in the store
+	
+		if(dojo.indexOf(this.childrenAttrs, attribute) != -1){
+			// item's children list changed
+			this.getChildren(item, dojo.hitch(this, function(children){
+				// NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+				this.onChildrenChange(item, children);
+			}));
+		}else{
+			// item's label/icon/etc. changed.
+			this.onChange(item);
+		}
+	}
+});
+
+dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
+	// summary
+	//		Interface between Tree and a dojo.store that doesn't have a root item, ie,
+	//		has multiple "top level" items.
+	//
+	// description
+	//		Use this class to wrap a dojo.store, making all the items matching the specified query
+	//		appear as children of a fabricated "root item".  If no query is specified then all the
+	//		items returned by fetch() on the underlying store become children of the root item.
+	//		It allows dijit.Tree to assume a single root item, even if the store doesn't have one.
+
+	// Parameters to constructor
+
+	// rootId: String
+	//	ID of fabricated root item
+	rootId: "$root$",
+
+	// rootLabel: String
+	//	Label of fabricated root item
+	rootLabel: "ROOT",
+
+	// query: String
+	//	Specifies the set of children of the root item.
+	// example:
+	//		{type:'continent'}
+	query: null,
+
+	// End of parameters to constructor
+
+	constructor: function(params){
+		// Make dummy root item
+		this.root = {
+			store: this,
+			root: true,
+			id: params.rootId,
+			label: params.rootLabel,
+			children: params.rootChildren	// optional param
+		};
+	},
+
+	// =======================================================================
+	// Methods for traversing hierarchy
+
+	mayHaveChildren: function(/*dojo.data.Item*/ item){
+		// summary
+		//		Tells if an item has or may have children.  Implementing logic here
+		//		avoids showing +/- expando icon for nodes that we know don't have children.
+		//		(For efficiency reasons we may not want to check if an element actually
+		//		has children until user clicks the expando node)
+		return item === this.root || this.inherited(arguments);
+	},
+
+	getChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ callback, /*function*/ onError){
+		// summary
+		// 		Calls onComplete() with array of child items of given parent item, all loaded.
+		if(parentItem === this.root){
+			if(this.root.children){
+				// already loaded, just return
+				callback(this.root.children);
+			}else{
+				this.store.fetch({
+					query: this.query,
+					onComplete: dojo.hitch(this, function(items){
+						this.root.children = items;
+						callback(items);
+					}),
+					onError: onError
+				});
+			}
+		}else{
+			this.inherited(arguments);
+		}
+	},
+
+	// =======================================================================
+	// Inspecting items
+
+	getIdentity: function(/* item */ item){
+		return (item === this.root) ? this.root.id : this.inherited(arguments);
+	},
+
+	getLabel: function(/* item */ item){
+		return	(item === this.root) ? this.root.label : this.inherited(arguments);
+	},
+
+	// =======================================================================
+	// Write interface
+
+	newItem: function(/* Object? */ args, /*Item*/ parent){
+		// summary
+		//		Creates a new item.   See dojo.data.api.Write for details on args.
+		//		Used in drag & drop when item from external source dropped onto tree.
+		if(parent===this.root){
+			this.onNewRootItem(args);
+			return this.store.newItem(args);
+		}else{
+			return this.inherited(arguments);
+		}
+	},
+ 
+	onNewRootItem: function(args){
+		// summary:
+		//		User can override this method to modify a new element that's being
+		//		added to the root of the tree, for example to add a flag like root=true
+	},
+
+	pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy){
+		// summary
+		//		Move or copy an item from one parent item to another.
+		//		Used in drag & drop
+		if(oldParentItem === this.root){
+			if(!bCopy){
+				// It's onLeaveRoot()'s responsibility to modify the item so it no longer matches
+				// this.query... thus triggering an onChildrenChange() event to notify the Tree
+				// that this element is no longer a child of the root node
+				this.onLeaveRoot(childItem);
+			}
+		}
+		dijit.tree.TreeStoreModel.prototype.pasteItem.call(this, childItem,
+			oldParentItem === this.root ? null : oldParentItem,
+			newParentItem === this.root ? null : newParentItem
+		);
+		if(newParentItem === this.root){
+			// It's onAddToRoot()'s responsibility to modify the item so it matches
+			// this.query... thus triggering an onChildrenChange() event to notify the Tree
+			// that this element is now a child of the root node
+			this.onAddToRoot(childItem);
+		}
+	},
+
+	// =======================================================================
+	// Callbacks
+	
+	onAddToRoot: function(/* item */ item){
+		// summary
+		//		Called when item added to root of tree; user must override
+		//		to modify the item so that it matches the query for top level items
+		// example
+		//	|	store.setValue(item, "root", true);
+		console.log(this, ": item ", item, " added to root");
+	},
+
+	onLeaveRoot: function(/* item */ item){
+		// summary
+		//		Called when item removed from root of tree; user must override
+		//		to modify the item so it doesn't match the query for top level items
+		// example
+		// 	|	store.unsetAttribute(item, "root");
+		console.log(this, ": item ", item, " removed from root");
+	},
+	
+	// =======================================================================
+	// Events from data store
+
+	_requeryTop: function(){
+		// reruns the query for the children of the root node,
+		// sending out an onSet notification if those children have changed
+		var _this = this,
+			oldChildren = this.root.children;
+		this.store.fetch({
+			query: this.query,
+			onComplete: function(newChildren){
+				_this.root.children = newChildren;
+
+				// If the list of children or the order of children has changed...	
+				if(oldChildren.length != newChildren.length ||
+					dojo.some(oldChildren, function(item, idx){ return newChildren[idx] != item;})){
+					_this.onChildrenChange(_this.root, newChildren);
+				}
+			}
+		});
+	},
+
+	_onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+		// summary: handler for when new items appear in the store.
+
+		//		In theory, any new item could be a top level item.
+		//		Do the safe but inefficient thing by requerying the top
+		//		level items.   User can override this function to do something
+		//		more efficient.
+		this._requeryTop();
+
+		this.inherited(arguments);
+	},
+
+	_onDeleteItem: function(/*Object*/ item){
+		// summary: handler for delete notifications from underlying store
+
+		// check if this was a child of root, and if so send notification that root's children
+		// have changed
+		if(dojo.indexOf(this.root.children, item) != -1){
+			this._requeryTop();
+		}
+
+		this.inherited(arguments);
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.form.TextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.TextBox"] = true;
+dojo.provide("dijit.form.TextBox");
+
+
+
+dojo.declare(
+	"dijit.form.TextBox",
+	dijit.form._FormValueWidget,
+	{
+		//	summary:
+		//		A base class for textbox form inputs
+		//
+		//	trim: Boolean
+		//		Removes leading and trailing whitespace if true.  Default is false.
+		trim: false,
+
+		//	uppercase: Boolean
+		//		Converts all characters to uppercase if true.  Default is false.
+		uppercase: false,
+
+		//	lowercase: Boolean
+		//		Converts all characters to lowercase if true.  Default is false.
+		lowercase: false,
+
+		//	propercase: Boolean
+		//		Converts the first character of each word to uppercase if true.
+		propercase: false,
+
+		//	maxLength: String
+		//		HTML INPUT tag maxLength declaration.
+		maxLength: "",
+
+		templateString:"<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode' name=\"${name}\"\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse,onfocus:_onMouse,onblur:_onMouse,onkeypress:_onKeyPress,onkeyup'\n\tautocomplete=\"off\" type=\"${type}\"\n\t/>\n",
+		baseClass: "dijitTextBox",
+
+		attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+			{maxLength:"focusNode"}),
+
+		getDisplayedValue: function(){
+			//	summary:
+			//		Returns the formatted value that the user sees in the textbox, which may be different
+			//		from the serialized value that's actually sent to the server (see dijit.form.ValidationTextBox.serialize)
+			return this.filter(this.textbox.value);
+		},
+
+		getValue: function(){
+			return this.parse(this.getDisplayedValue(), this.constraints);
+		},
+
+		setValue: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+			//	summary: 
+			//		Sets the value of the widget to "value" which can be of
+			//		any type as determined by the widget.
+			//
+			//	value:
+			//		The visual element value is also set to a corresponding,
+			//		but not necessarily the same, value.
+			//
+			//	formattedValue:
+			//		If specified, used to set the visual element value,
+			//		otherwise a computed visual value is used.
+			//
+			//	priorityChange:
+			//		If true, an onChange event is fired immediately instead of 
+			//		waiting for the next blur event.
+
+			var filteredValue = this.filter(value);
+			if((((typeof filteredValue == typeof value) && (value !== undefined/*#5317*/)) || (value === null/*#5329*/)) && (formattedValue == null || formattedValue == undefined)){
+				formattedValue = this.format(filteredValue, this.constraints);
+			}
+			if(formattedValue != null && formattedValue != undefined){
+				this.textbox.value = formattedValue;
+			}
+			dijit.form.TextBox.superclass.setValue.call(this, filteredValue, priorityChange);
+		},
+
+		setDisplayedValue: function(/*String*/value, /*Boolean?*/ priorityChange){
+			//	summary: 
+			//		Sets the value of the visual element to the string "value".
+			//		The widget value is also set to a corresponding,
+			//		but not necessarily the same, value.
+			//
+			//	priorityChange:
+			//		If true, an onChange event is fired immediately instead of 
+			//		waiting for the next blur event.
+
+			this.textbox.value = value;
+			this.setValue(this.getValue(), priorityChange);
+		},
+
+		format: function(/* String */ value, /* Object */ constraints){
+			//	summary:
+			//		Replacable function to convert a value to a properly formatted string
+			return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value));
+		},
+
+		parse: function(/* String */ value, /* Object */ constraints){
+			//	summary:
+			//		Replacable function to convert a formatted string to a value
+			return value;
+		},
+
+		postCreate: function(){
+			// setting the value here is needed since value="" in the template causes "undefined"
+			// and setting in the DOM (instead of the JS object) helps with form reset actions
+			this.textbox.setAttribute("value", this.getDisplayedValue());
+			this.inherited(arguments);
+
+			/*#5297:if(this.srcNodeRef){
+				dojo.style(this.textbox, "cssText", this.style);
+				this.textbox.className += " " + this["class"];
+			}*/
+			this._layoutHack();
+		},
+
+		filter: function(val){
+			//	summary:
+			//		Apply specified filters to textbox value
+			if(val === null || val === undefined){ return ""; }
+			else if(typeof val != "string"){ return val; }
+			if(this.trim){
+				val = dojo.trim(val);
+			}
+			if(this.uppercase){
+				val = val.toUpperCase();
+			}
+			if(this.lowercase){
+				val = val.toLowerCase();
+			}
+			if(this.propercase){
+				val = val.replace(/[^\s]+/g, function(word){
+					return word.substring(0,1).toUpperCase() + word.substring(1);
+				});
+			}
+			return val;
+		},
+
+		_setBlurValue: function(){
+			this.setValue(this.getValue(), (this.isValid ? this.isValid() : true));
+		},
+
+		_onBlur: function(){
+			this._setBlurValue();
+			this.inherited(arguments);
+		},
+
+		onkeyup: function(){
+			//	summary:
+			//		User replaceable keyup event handler
+		}
+	}
+);
+
+dijit.selectInputText = function(/*DomNode*/element, /*Number?*/ start, /*Number?*/ stop){
+	//	summary:
+	//		Select text in the input element argument, from start (default 0), to stop (default end).
+
+	// TODO: use functions in _editor/selection.js?
+	var _window = dojo.global;
+	var _document = dojo.doc;
+	element = dojo.byId(element);
+	if(isNaN(start)){ start = 0; }
+	if(isNaN(stop)){ stop = element.value ? element.value.length : 0; }
+	element.focus();
+	if(_document["selection"] && dojo.body()["createTextRange"]){ // IE
+		if(element.createTextRange){
+			var range = element.createTextRange();
+			with(range){
+				collapse(true);
+				moveStart("character", start);
+				moveEnd("character", stop);
+				select();
+			}
+		}
+	}else if(_window["getSelection"]){
+		var selection = _window.getSelection();
+		// FIXME: does this work on Safari?
+		if(element.setSelectionRange){
+			element.setSelectionRange(start, stop);
+		}
+	}
+}
+
+}
+
+if(!dojo._hasResource["dijit.InlineEditBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.InlineEditBox"] = true;
+dojo.provide("dijit.InlineEditBox");
+
+
+
+
+
+
+
+
+
+
+dojo.declare("dijit.InlineEditBox",
+	dijit._Widget,
+	{
+	// summary: An element with in-line edit capabilitites
+	//
+	// description:
+	//		Behavior for an existing node (`<p>`, `<div>`, `<span>`, etc.) so that
+	// 		when you click it, an editor shows up in place of the original
+	//		text.  Optionally, Save and Cancel button are displayed below the edit widget.
+	//		When Save is clicked, the text is pulled from the edit
+	//		widget and redisplayed and the edit widget is again hidden.
+	//		By default a plain Textarea widget is used as the editor (or for
+	//		inline values a TextBox), but you can specify an editor such as
+	//		dijit.Editor (for editing HTML) or a Slider (for adjusting a number).
+	//		An edit widget must support the following API to be used:
+	//		String getDisplayedValue() OR String getValue()
+	//		void setDisplayedValue(String) OR void setValue(String)
+	//		void focus()
+	//
+	// editing: Boolean
+	//		Is the node currently in edit mode?
+	editing: false,
+
+	// autoSave: Boolean
+	//		Changing the value automatically saves it; don't have to push save button
+	//		(and save button isn't even displayed)
+	autoSave: true,
+
+	// buttonSave: String
+	//		Save button label
+	buttonSave: "",
+
+	// buttonCancel: String
+	//		Cancel button label
+	buttonCancel: "",
+
+	// renderAsHtml: Boolean
+	//		Set this to true if the specified Editor's value should be interpreted as HTML
+	//		rather than plain text (ie, dijit.Editor)
+	renderAsHtml: false,
+
+	// editor: String
+	//		Class name for Editor widget
+	editor: "dijit.form.TextBox",
+
+	// editorParams: Object
+	//		Set of parameters for editor, like {required: true}
+	editorParams: {},
+
+	onChange: function(value){
+		// summary: User should set this handler to be notified of changes to value
+	},
+
+	// width: String
+	//		Width of editor.  By default it's width=100% (ie, block mode)
+	width: "100%",
+
+	// value: String
+	//		The display value of the widget in read-only mode
+	value: "",
+
+	// noValueIndicator: String
+	//		The text that gets displayed when there is no value (so that the user has a place to click to edit)
+	noValueIndicator: "<span style='font-family: wingdings; text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>",
+
+	postMixInProperties: function(){
+		this.inherited('postMixInProperties', arguments);
+
+		// save pointer to original source node, since Widget nulls-out srcNodeRef
+		this.displayNode = this.srcNodeRef;
+
+		// connect handlers to the display node
+		var events = {
+			ondijitclick: "_onClick",
+			onmouseover: "_onMouseOver",
+			onmouseout: "_onMouseOut",
+			onfocus: "_onMouseOver",
+			onblur: "_onMouseOut"			
+		};
+		for(var name in events){
+			this.connect(this.displayNode, name, events[name]);
+		}
+		dijit.setWaiRole(this.displayNode, "button");
+		if(!this.displayNode.getAttribute("tabIndex")){
+			this.displayNode.setAttribute("tabIndex", 0);
+		}
+
+		this.setValue(this.value || this.displayNode.innerHTML);
+	},
+
+	setDisabled: function(/*Boolean*/ disabled){
+		// summary:
+		//		Set disabled state of widget.
+
+		this.disabled = disabled;
+		dijit.setWaiState(this.focusNode || this.domNode, "disabled", disabled);
+	},
+
+	_onMouseOver: function(){
+		dojo.addClass(this.displayNode, this.disabled ? "dijitDisabledClickableRegion" : "dijitClickableRegion");
+	},
+
+	_onMouseOut: function(){
+		dojo.removeClass(this.displayNode, this.disabled ? "dijitDisabledClickableRegion" : "dijitClickableRegion");
+	},
+
+	_onClick: function(/*Event*/ e){
+		if(this.disabled){ return; }
+		if(e){ dojo.stopEvent(e); }
+		this._onMouseOut();
+
+		// Since FF gets upset if you move a node while in an event handler for that node...
+		setTimeout(dojo.hitch(this, "_edit"), 0);
+	},
+
+	_edit: function(){
+		// summary: display the editor widget in place of the original (read only) markup
+
+		this.editing = true;
+
+		var editValue = 
+				(this.renderAsHtml ?
+				this.value :
+				this.value.replace(/\s*\r?\n\s*/g,"").replace(/<br\/?>/gi, "\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&"));
+
+		// Placeholder for edit widget
+		// Put place holder (and eventually editWidget) before the display node so that it's positioned correctly
+		// when Calendar dropdown appears, which happens automatically on focus.
+		var placeholder = dojo.doc.createElement("span");
+		dojo.place(placeholder, this.domNode, "before");
+
+		var ew = this.editWidget = new dijit._InlineEditor({
+			value: dojo.trim(editValue),
+			autoSave: this.autoSave,
+			buttonSave: this.buttonSave,
+			buttonCancel: this.buttonCancel,
+			renderAsHtml: this.renderAsHtml,
+			editor: this.editor,
+			editorParams: this.editorParams,
+			style: dojo.getComputedStyle(this.displayNode),
+			save: dojo.hitch(this, "save"),
+			cancel: dojo.hitch(this, "cancel"),
+			width: this.width
+		}, placeholder);
+
+		// to avoid screen jitter, we first create the editor with position:absolute, visibility:hidden,
+		// and then when it's finished rendering, we switch from display mode to editor
+		var ews = ew.domNode.style;
+		this.displayNode.style.display="none";
+		ews.position = "static";
+		ews.visibility = "visible";
+
+		// Replace the display widget with edit widget, leaving them both displayed for a brief time so that
+		// focus can be shifted without incident.  (browser may needs some time to render the editor.)
+		this.domNode = ew.domNode;
+		setTimeout(function(){
+			ew.focus();
+		}, 100);
+	},
+
+	_showText: function(/*Boolean*/ focus){
+		// summary: revert to display mode, and optionally focus on display node
+
+		// display the read-only text and then quickly hide the editor (to avoid screen jitter)
+		this.displayNode.style.display="";
+		var ew = this.editWidget;
+		var ews = ew.domNode.style;
+		ews.position="absolute";
+		ews.visibility="hidden";
+
+		this.domNode = this.displayNode;
+
+		if(focus){
+			dijit.focus(this.displayNode);
+		}
+		ews.display = "none";
+		// give the browser some time to render the display node and then shift focus to it
+		// and hide the edit widget before garbage collecting the edit widget
+		setTimeout(function(){
+			ew.destroy();
+			delete ew;
+			if(dojo.isIE){
+				// messing with the DOM tab order can cause IE to focus the body - so restore
+				dijit.focus(dijit.getFocus());
+			}
+		}, 1000); // no hurry - wait for things to quiesce
+	},
+
+	save: function(/*Boolean*/ focus){
+		// summary:
+		//		Save the contents of the editor and revert to display mode.
+		// focus: Boolean
+		//		Focus on the display mode text
+		this.editing = false;
+
+		var value = this.editWidget.getValue() + "";
+		if(!this.renderAsHtml){
+			value = value.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;")
+				.replace(/\n/g, "<br>");
+		}
+		this.setValue(value);
+
+		// tell the world that we have changed
+		this.onChange(value);
+
+		this._showText(focus);	
+	},
+
+	setValue: function(/*String*/ val){
+		// summary: inserts specified HTML value into this node, or an "input needed" character if node is blank
+		this.value = val;
+		this.displayNode.innerHTML = dojo.trim(val) || this.noValueIndicator;
+	},
+
+	getValue: function(){
+		return this.value;
+	},
+
+	cancel: function(/*Boolean*/ focus){
+		// summary:
+		//		Revert to display mode, discarding any changes made in the editor
+		this.editing = false;
+		this._showText(focus);
+	}
+});
+
+dojo.declare(
+	"dijit._InlineEditor",
+	 [dijit._Widget, dijit._Templated],
+{
+	// summary:
+	// 		internal widget used by InlineEditBox, displayed when in editing mode
+	//		to display the editor and maybe save/cancel buttons.  Calling code should
+	//		connect to save/cancel methods to detect when editing is finished
+	//
+	//		Has mainly the same parameters as InlineEditBox, plus these values:
+	//
+	// style: Object
+	//		Set of CSS attributes of display node, to replicate in editor
+	//
+	// value: String
+	//		Value as an HTML string or plain text string, depending on renderAsHTML flag
+
+	templateString:"<fieldset dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\" \n\t><input dojoAttachPoint=\"editorPlaceholder\"\n\t/><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" disabled=\"true\">${buttonSave}</button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\">${buttonCancel}</button\n\t></span\n></fieldset>\n",
+	widgetsInTemplate: true,
+
+	postMixInProperties: function(){
+		this.inherited('postMixInProperties', arguments);
+		this.messages = dojo.i18n.getLocalization("dijit", "common", this.lang);
+		dojo.forEach(["buttonSave", "buttonCancel"], function(prop){
+			if(!this[prop]){ this[prop] = this.messages[prop]; }
+		}, this);
+	},
+
+	postCreate: function(){
+		// Create edit widget in place in the template
+		var cls = dojo.getObject(this.editor);
+		var ew = this.editWidget = new cls(this.editorParams, this.editorPlaceholder);
+
+		// Copy the style from the source
+		// Don't copy ALL properties though, just the necessary/applicable ones
+		var srcStyle = this.style;
+		dojo.forEach(["fontWeight","fontFamily","fontSize","fontStyle"], function(prop){
+			ew.focusNode.style[prop]=srcStyle[prop];
+		}, this);
+		dojo.forEach(["marginTop","marginBottom","marginLeft", "marginRight"], function(prop){
+			this.domNode.style[prop]=srcStyle[prop];
+		}, this);
+		if(this.width=="100%"){
+			// block mode
+			ew.domNode.style.width = "100%";	// because display: block doesn't work for table widgets
+			this.domNode.style.display="block";
+		}else{
+			// inline-block mode
+			ew.domNode.style.width = this.width + (Number(this.width)==this.width ? "px" : "");			
+		}
+
+		this.connect(ew, "onChange", "_onChange");
+
+		// Monitor keypress on the edit widget.   Note that edit widgets do a stopEvent() on ESC key (to
+		// prevent Dialog from closing when the user just wants to revert the value in the edit widget),
+		// so this is the only way we can see the key press event.
+		this.connect(ew.focusNode || ew.domNode, "onkeypress", "_onKeyPress");
+
+		// priorityChange=false will prevent bogus onChange event
+		(this.editWidget.setDisplayedValue||this.editWidget.setValue).call(this.editWidget, this.value, false);
+
+		this._initialText = this.getValue();
+
+		if(this.autoSave){
+			this.buttonContainer.style.display="none";
+		}
+	},
+
+	destroy: function(){
+		this.editWidget.destroy();
+		this.inherited(arguments);
+	},
+
+	getValue: function(){
+		var ew = this.editWidget;
+		return ew.getDisplayedValue ? ew.getDisplayedValue() : ew.getValue();
+	},
+
+	_onKeyPress: function(e){
+		// summary: Callback when keypress in the edit box (see template).
+		// description:
+		//		For autoSave widgets, if Esc/Enter, call cancel/save.
+		//		For non-autoSave widgets, enable save button if the text value is
+		//		different than the original value.
+		if(this._exitInProgress){
+			return;
+		}
+		if(this.autoSave){
+			if(e.altKey || e.ctrlKey){ return; }
+			// If Enter/Esc pressed, treat as save/cancel.
+			if(e.keyCode == dojo.keys.ESCAPE){
+				dojo.stopEvent(e);
+				this._exitInProgress = true;
+				this.cancel(true);
+			}else if(e.keyCode == dojo.keys.ENTER){
+				dojo.stopEvent(e);
+				this._exitInProgress = true;
+				this.save(true);
+			}else if(e.keyCode == dojo.keys.TAB){
+				this._exitInProgress = true;
+				// allow the TAB to change focus before we mess with the DOM: #6227
+				// Expounding by request:
+				// 	The current focus is on the edit widget input field.
+				//	save() will hide and destroy this widget.
+				//	We want the focus to jump from the currently hidden
+				//	displayNode, but since it's hidden, it's impossible to
+				//	unhide it, focus it, and then have the browser focus
+				//	away from it to the next focusable element since each
+				//	of these events is asynchronous and the focus-to-next-element
+				//	is already queued.
+				//	So we allow the browser time to unqueue the move-focus event 
+				//	before we do all the hide/show stuff.
+				setTimeout(dojo.hitch(this, "save", false), 0);
+			}
+		}else{
+			var _this = this;
+			// Delay before calling getValue().
+			// The delay gives the browser a chance to update the Textarea.
+			setTimeout(
+				function(){
+					_this.saveButton.setAttribute("disabled", _this.getValue() == _this._initialText);
+				}, 100);
+		}
+	},
+
+	_onBlur: function(){
+		// summary:
+		//	Called when focus moves outside the editor
+		this.inherited(arguments);
+		if(this._exitInProgress){
+			// when user clicks the "save" button, focus is shifted back to display text, causing this
+			// function to be called, but in that case don't do anything
+			return;
+		}
+		if(this.autoSave){
+			this._exitInProgress = true;
+			if(this.getValue() == this._initialText){
+				this.cancel(false);
+			}else{
+				this.save(false);
+			}
+		}
+	},
+
+	enableSave: function(){
+		// summary: User replacable function returning a Boolean to indicate
+		// 	if the Save button should be enabled or not - usually due to invalid conditions
+		return this.editWidget.isValid ? this.editWidget.isValid() : true; // Boolean
+	},
+
+	_onChange: function(){
+		// summary:
+		//	Called when the underlying widget fires an onChange event,
+		//	which means that the user has finished entering the value
+		if(this._exitInProgress){
+			// TODO: the onChange event might happen after the return key for an async widget
+			// like FilteringSelect.  Shouldn't be deleting the edit widget on end-of-edit
+			return;
+		}
+		if(this.autoSave){
+			this._exitInProgress = true;
+			this.save(true);
+		}else{
+			// in case the keypress event didn't get through (old problem with Textarea that has been fixed
+			// in theory) or if the keypress event comes too quickly and the value inside the Textarea hasn't
+			// been updated yet)
+			this.saveButton.setAttribute("disabled", (this.getValue() == this._initialText) || !this.enableSave());
+		}
+	},
+	
+	enableSave: function(){
+		// summary: User replacable function returning a Boolean to indicate
+		// 	if the Save button should be enabled or not - usually due to invalid conditions
+		return this.editWidget.isValid ? this.editWidget.isValid() : true;
+	},
+
+	focus: function(){
+		this.editWidget.focus();
+		dijit.selectInputText(this.editWidget.focusNode);
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.form.CheckBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.CheckBox"] = true;
+dojo.provide("dijit.form.CheckBox");
+
+
+
+dojo.declare(
+	"dijit.form.CheckBox",
+	dijit.form.ToggleButton,
+	{
+		// summary:
+		// 		Same as an HTML checkbox, but with fancy styling.
+		//
+		// description:
+		// User interacts with real html inputs.
+		// On onclick (which occurs by mouse click, space-bar, or
+		// using the arrow keys to switch the selected radio button),
+		// we update the state of the checkbox/radio.
+		//
+		// There are two modes:
+		//   1. High contrast mode
+		//   2. Normal mode
+		// In case 1, the regular html inputs are shown and used by the user.
+		// In case 2, the regular html inputs are invisible but still used by
+		// the user. They are turned quasi-invisible and overlay the background-image.
+
+		templateString:"<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \ttype=\"${type}\" name=\"${name}\"\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n",
+
+		baseClass: "dijitCheckBox",
+
+		//	Value of "type" attribute for <input>
+		type: "checkbox",
+
+		// value: Value
+		//	equivalent to value field on normal checkbox (if checked, the value is passed as
+		//	the value when form is submitted)
+		value: "on",
+
+		setValue: function(/*String or Boolean*/ newValue){
+			// summary:
+			//		When passed a boolean, controls whether or not the CheckBox is checked.
+			//		If passed a string, changes the value attribute of the CheckBox (the one
+			//		specified as "value" when the CheckBox was constructed (ex: <input
+			//		dojoType="dijit.CheckBox" value="chicken">)
+			if(typeof newValue == "string"){
+				this.setAttribute('value', newValue);
+				newValue = true;
+			}
+			this.setAttribute('checked', newValue);
+		},
+
+		_getValueDeprecated: false, // remove when _FormWidget:_getValueDeprecated is removed
+		getValue: function(){
+			// summary:
+			//		If the CheckBox is checked, returns the value attribute.
+			//		Otherwise returns false.
+			return (this.checked ? this.value : false);
+		},
+
+		reset: function(){
+			this.inherited(arguments);
+			this.setAttribute('value', this._resetValueAttr);
+		},
+
+		postCreate: function(){
+			this.inherited(arguments);
+			this._resetValueAttr = this.value;
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.form.RadioButton",
+	dijit.form.CheckBox,
+	{
+		// summary:
+		// 		Same as an HTML radio, but with fancy styling.
+		//
+		// description:
+		// Implementation details
+		//
+		// Specialization:
+		// We keep track of dijit radio groups so that we can update the state
+		// of all the siblings (the "context") in a group based on input
+		// events. We don't rely on browser radio grouping.
+
+		type: "radio",
+		baseClass: "dijitRadio",
+
+		// This shared object keeps track of all widgets, grouped by name
+		_groups: {},
+
+		postCreate: function(){
+			// add this widget to _groups
+			(this._groups[this.name] = this._groups[this.name] || []).push(this);
+
+			this.inherited(arguments);
+		},
+
+		uninitialize: function(){
+			// remove this widget from _groups
+			dojo.forEach(this._groups[this.name], function(widget, i, arr){
+				if(widget === this){
+					arr.splice(i, 1);
+					return;
+				}
+			}, this);
+		},
+
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			// If I am being checked then have to deselect currently checked radio button
+			this.inherited(arguments);
+			switch(attr){
+				case "checked":
+					if(this.checked){
+						dojo.forEach(this._groups[this.name], function(widget){
+							if(widget != this && widget.checked){
+								widget.setAttribute('checked', false);
+							}
+						}, this);
+					}
+			}
+		},
+
+		_clicked: function(/*Event*/ e){
+			if(!this.checked){
+				this.setAttribute('checked', true);
+			}
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.form.ValidationTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.ValidationTextBox"] = true;
+dojo.provide("dijit.form.ValidationTextBox");
+
+
+
+
+
+
+
+
+/*=====
+	dijit.form.ValidationTextBox.__Constraints = function(){
+		// locale: String
+		//		locale used for validation, picks up value from this widget's lang attribute
+		// _flags_: anything
+		//		various flags passed to regExpGen function
+		this.locale = "";
+		this._flags_ = "";
+	}
+=====*/
+
+dojo.declare(
+	"dijit.form.ValidationTextBox",
+	dijit.form.TextBox,
+	{
+		// summary:
+		//		A TextBox subclass with the ability to validate content of various types and provide user feedback.
+
+		templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class=\"dijitReset\" dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus:_update,onkeyup:_onkeyup,onblur:_onMouse,onkeypress:_onKeyPress' autocomplete=\"off\"\n\t\t\ttype='${type}' name='${name}'\n\t\t/></div\n\t></div\n></div>\n",
+		baseClass: "dijitTextBox",
+
+		// default values for new subclass properties
+		// required: Boolean
+		//		Can be true or false, default is false.
+		required: false,
+
+		// promptMessage: String
+		//		Hint string
+		promptMessage: "",
+
+		// invalidMessage: String
+		// 		The message to display if value is invalid.
+		invalidMessage: "$_unset_$", // read from the message file if not overridden
+
+		// constraints: dijit.form.ValidationTextBox.__Constraints
+		//		user-defined object needed to pass parameters to the validator functions
+		constraints: {},
+
+		// regExp: String
+		//		regular expression string used to validate the input
+		//		Do not specify both regExp and regExpGen
+		regExp: ".*",
+
+		// regExpGen: Function
+		//		user replaceable function used to generate regExp when dependent on constraints
+		//		Do not specify both regExp and regExpGen
+		regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/constraints){ return this.regExp; },
+
+		// state: String
+		//		Shows current state (ie, validation result) of input (Normal, Warning, or Error)
+		state: "",
+
+		//	tooltipPosition: String[]
+		//		See description of dijit.Tooltip.defaultPosition for details on this parameter.
+		tooltipPosition: [],
+
+		setValue: function(){
+			this.inherited(arguments);
+			this.validate(this._focused);
+		},
+
+		validator: function(/*anything*/value, /*dijit.form.ValidationTextBox.__Constraints*/constraints){
+			// summary: user replaceable function used to validate the text input against the regular expression.
+			return (new RegExp("^(" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) &&
+				(!this.required || !this._isEmpty(value)) &&
+				(this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean
+		},
+
+		isValid: function(/*Boolean*/ isFocused){
+			// summary: Need to over-ride with your own validation code in subclasses
+			return this.validator(this.textbox.value, this.constraints);
+		},
+
+		_isEmpty: function(value){
+			// summary: Checks for whitespace
+			return /^\s*$/.test(value); // Boolean
+		},
+
+		getErrorMessage: function(/*Boolean*/ isFocused){
+			// summary: return an error message to show if appropriate
+			return this.invalidMessage; // String
+		},
+
+		getPromptMessage: function(/*Boolean*/ isFocused){
+			// summary: return a hint to show if appropriate
+			return this.promptMessage; // String
+		},
+
+		validate: function(/*Boolean*/ isFocused){
+			// summary:
+			//		Called by oninit, onblur, and onkeypress.
+			// description:
+			//		Show missing or invalid messages if appropriate, and highlight textbox field.
+			var message = "";
+			var isValid = this.isValid(isFocused);
+			var isEmpty = this._isEmpty(this.textbox.value);
+			this.state = (isValid || (!this._hasBeenBlurred && isEmpty)) ? "" : "Error";
+			this._setStateClass();
+			dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
+			if(isFocused){
+				if(isEmpty){
+					message = this.getPromptMessage(true);
+				}
+				if(!message && this.state == "Error"){
+					message = this.getErrorMessage(true);
+				}
+			}
+			this.displayMessage(message);
+			return isValid;
+		},
+
+		// currently displayed message
+		_message: "",
+
+		displayMessage: function(/*String*/ message){
+			// summary:
+			//		User overridable method to display validation errors/hints.
+			//		By default uses a tooltip.
+			if(this._message == message){ return; }
+			this._message = message;
+			dijit.hideTooltip(this.domNode);
+			if(message){
+				dijit.showTooltip(message, this.domNode, this.tooltipPosition);
+			}
+		},
+
+		_refreshState: function(){
+			this.validate(this._focused);
+		},
+
+		_update: function(/*Event*/e){
+			this._refreshState();
+			this._onMouse(e);	// update CSS classes
+		},
+
+		_onkeyup: function(/*Event*/e){
+			this._update(e);
+			this.onkeyup(e);
+		},
+
+		//////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+		constructor: function(){
+			this.constraints = {};
+		},
+
+		postMixInProperties: function(){
+			this.inherited(arguments);
+			this.constraints.locale = this.lang;
+			this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
+			if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; }
+			var p = this.regExpGen(this.constraints);
+			this.regExp = p;
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.form.MappedTextBox",
+	dijit.form.ValidationTextBox,
+	{
+		// summary:
+		//		A dijit.form.ValidationTextBox subclass which provides a visible formatted display and a serializable
+		//		value in a hidden input field which is actually sent to the server.  The visible display may
+		//		be locale-dependent and interactive.  The value sent to the server is stored in a hidden
+		//		input field which uses the `name` attribute declared by the original widget.  That value sent
+		//		to the serveris defined by the dijit.form.MappedTextBox.serialize method and is typically
+		//		locale-neutral.
+
+		serialize: function(/*anything*/val, /*Object?*/options){
+			// summary: user replaceable function used to convert the getValue() result to a String
+			return val.toString ? val.toString() : ""; // String
+		},
+
+		toString: function(){
+			// summary: display the widget as a printable string using the widget's value
+			var val = this.filter(this.getValue());
+			return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String
+		},
+
+		validate: function(){
+			this.valueNode.value = this.toString();
+			return this.inherited(arguments);
+		},
+
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			this.inherited(arguments);
+			switch(attr){
+				case "disabled":
+					if(this.valueNode){
+						this.valueNode.disabled = this.disabled;
+					}
+			}
+		},
+
+		postCreate: function(){
+			var textbox = this.textbox;
+			var valueNode = (this.valueNode = dojo.doc.createElement("input"));
+			valueNode.setAttribute("type", textbox.type);
+			valueNode.setAttribute("value", this.toString());
+			dojo.style(valueNode, "display", "none");
+			valueNode.name = this.textbox.name;
+			valueNode.disabled = this.textbox.disabled;
+			this.textbox.name = this.textbox.name + "_displayed_";
+			this.textbox.removeAttribute("name");
+			dojo.place(valueNode, textbox, "after");
+
+			this.inherited(arguments);
+		}
+	}
+);
+
+/*=====
+	dijit.form.RangeBoundTextBox.__Constraints = function(){
+		// min: Number
+		//		Minimum signed value.  Default is -Infinity
+		// max: Number
+		//		Maximum signed value.  Default is +Infinity
+		this.min = min;
+		this.max = max;
+	}
+=====*/
+
+dojo.declare(
+	"dijit.form.RangeBoundTextBox",
+	dijit.form.MappedTextBox,
+	{
+		// summary:
+		//		A dijit.form.MappedTextBox subclass which defines a range of valid values
+		//
+		// constraints: dijit.form.RangeBoundTextBox.__Constraints
+		//
+		// rangeMessage: String
+		//		The message to display if value is out-of-range
+
+		/*=====
+		constraints: {},
+		======*/
+		rangeMessage: "",
+
+		compare: function(/*anything*/val1, /*anything*/val2){
+			// summary: compare 2 values
+			return val1 - val2; // anything
+		},
+
+		rangeCheck: function(/*Number*/ primitive, /*dijit.form.RangeBoundTextBox.__Constraints*/ constraints){
+			// summary: user replaceable function used to validate the range of the numeric input value
+			var isMin = "min" in constraints;
+			var isMax = "max" in constraints;
+			if(isMin || isMax){
+				return (!isMin || this.compare(primitive,constraints.min) >= 0) &&
+					(!isMax || this.compare(primitive,constraints.max) <= 0);
+			}
+			return true; // Boolean
+		},
+
+		isInRange: function(/*Boolean*/ isFocused){
+			// summary: Need to over-ride with your own validation code in subclasses
+			return this.rangeCheck(this.getValue(), this.constraints);
+		},
+
+		isValid: function(/*Boolean*/ isFocused){
+			return this.inherited(arguments) &&
+				((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean
+		},
+
+		getErrorMessage: function(/*Boolean*/ isFocused){
+			if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this, false) && !this.isInRange(isFocused)){ return this.rangeMessage; } // String
+			return this.inherited(arguments);
+		},
+
+		postMixInProperties: function(){
+			this.inherited(arguments);
+			if(!this.rangeMessage){
+				this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
+				this.rangeMessage = this.messages.rangeMessage;
+			}
+		},
+
+		postCreate: function(){
+			this.inherited(arguments);
+			if(this.constraints.min !== undefined){
+				dijit.setWaiState(this.focusNode, "valuemin", this.constraints.min);
+			}
+			if(this.constraints.max !== undefined){
+				dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max);
+			}
+		},
+		
+		setValue: function(/*Number*/ value, /*Boolean?*/ priorityChange){
+			dijit.setWaiState(this.focusNode, "valuenow", value);
+			this.inherited('setValue', arguments);
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.form.ComboBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.ComboBox"] = true;
+dojo.provide("dijit.form.ComboBox");
+
+
+
+
+dojo.declare(
+	"dijit.form.ComboBoxMixin",
+	null,
+	{
+		// item: Object
+		//		This is the item returned by the dojo.data.store implementation that
+		//		provides the data for this cobobox, it's the currently selected item.
+		item: null,
+
+		// pageSize: Integer
+		//		Argument to data provider.
+		//		Specifies number of search results per page (before hitting "next" button)
+		pageSize: Infinity,
+
+		// store: Object
+		//		Reference to data provider object used by this ComboBox
+		store: null,
+
+		// query: Object
+		//		A query that can be passed to 'store' to initially filter the items,
+		//		before doing further filtering based on `searchAttr` and the key.
+		//		Any reference to the `searchAttr` is ignored.
+		query: {},
+
+		// autoComplete: Boolean
+		//		If you type in a partial string, and then tab out of the `<input>` box,
+		//		automatically copy the first entry displayed in the drop down list to
+		//		the `<input>` field
+		autoComplete: true,
+
+		// searchDelay: Integer
+		//		Delay in milliseconds between when user types something and we start
+		//		searching based on that value
+		searchDelay: 100,
+
+		// searchAttr: String
+		//		Searches pattern match against this field
+		searchAttr: "name",
+
+		// queryExpr: String
+		//		dojo.data query expression pattern.
+		//		`${0}` will be substituted for the user text.
+		//		`*` is used for wildcards.
+		//		`${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is"
+		queryExpr: "${0}*",
+
+		// ignoreCase: Boolean
+		//		Set true if the ComboBox should ignore case when matching possible items
+		ignoreCase: true,
+
+		// hasDownArrow: Boolean
+		//		Set this textbox to have a down arrow button.
+		//		Defaults to true.
+		hasDownArrow:true,
+
+		templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"comboNode\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input type=\"text\" autocomplete=\"off\" name=\"${name}\" class='dijitReset'\n\t\t\tdojoAttachEvent=\"onkeypress:_onKeyPress, onfocus:_update, compositionend,onkeyup\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t\t/></div\n\t></div\n></div>\n",
+
+		baseClass:"dijitComboBox",
+
+		_getCaretPos: function(/*DomNode*/ element){
+			// khtml 3.5.2 has selection* methods as does webkit nightlies from 2005-06-22
+			var pos = 0;
+			if(typeof(element.selectionStart)=="number"){
+				// FIXME: this is totally borked on Moz < 1.3. Any recourse?
+				pos = element.selectionStart;
+			}else if(dojo.isIE){
+				// in the case of a mouse click in a popup being handled,
+				// then the dojo.doc.selection is not the textarea, but the popup
+				// var r = dojo.doc.selection.createRange();
+				// hack to get IE 6 to play nice. What a POS browser.
+				var tr = dojo.doc.selection.createRange().duplicate();
+				var ntr = element.createTextRange();
+				tr.move("character",0);
+				ntr.move("character",0);
+				try{
+					// If control doesnt have focus, you get an exception.
+					// Seems to happen on reverse-tab, but can also happen on tab (seems to be a race condition - only happens sometimes).
+					// There appears to be no workaround for this - googled for quite a while.
+					ntr.setEndPoint("EndToEnd", tr);
+					pos = String(ntr.text).replace(/\r/g,"").length;
+				}catch(e){
+					// If focus has shifted, 0 is fine for caret pos.
+				}
+			}
+			return pos;
+		},
+
+		_setCaretPos: function(/*DomNode*/ element, /*Number*/ location){
+			location = parseInt(location);
+			dijit.selectInputText(element, location, location);
+		},
+
+		_setAttribute: function(/*String*/ attr, /*anything*/ value){
+			// summary: additional code to set disablbed state of combobox node
+			if (attr == "disabled"){
+				dijit.setWaiState(this.comboNode, "disabled", value);
+			}
+		},	
+		
+		_onKeyPress: function(/*Event*/ evt){
+			// summary: handles keyboard events
+
+			//except for pasting case - ctrl + v(118)
+			if(evt.altKey || (evt.ctrlKey && evt.charCode != 118)){
+				return;
+			}
+			var doSearch = false;
+			var pw = this._popupWidget;
+			var dk = dojo.keys;
+			if(this._isShowingNow){
+				pw.handleKey(evt);
+			}
+			switch(evt.keyCode){
+				case dk.PAGE_DOWN:
+				case dk.DOWN_ARROW:
+					if(!this._isShowingNow||this._prev_key_esc){
+						this._arrowPressed();
+						doSearch=true;
+					}else{
+						this._announceOption(pw.getHighlightedOption());
+					}
+					dojo.stopEvent(evt);
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					break;
+
+				case dk.PAGE_UP:
+				case dk.UP_ARROW:
+					if(this._isShowingNow){
+						this._announceOption(pw.getHighlightedOption());
+					}
+					dojo.stopEvent(evt);
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					break;
+
+				case dk.ENTER:
+					// prevent submitting form if user presses enter. Also
+					// prevent accepting the value if either Next or Previous
+					// are selected
+					var highlighted;
+					if(	this._isShowingNow && 
+						(highlighted = pw.getHighlightedOption())
+					){
+						// only stop event on prev/next
+						if(highlighted == pw.nextButton){
+							this._nextSearch(1);
+							dojo.stopEvent(evt);
+							break;
+						}else if(highlighted == pw.previousButton){
+							this._nextSearch(-1);
+							dojo.stopEvent(evt);
+							break;
+						}
+					}else{
+						this.setDisplayedValue(this.getDisplayedValue());
+					}
+					// default case:
+					// prevent submit, but allow event to bubble
+					evt.preventDefault();
+					// fall through
+
+				case dk.TAB:
+					var newvalue = this.getDisplayedValue();
+					// #4617: 
+					//		if the user had More Choices selected fall into the
+					//		_onBlur handler
+					if(pw && (
+						newvalue == pw._messages["previousMessage"] ||
+						newvalue == pw._messages["nextMessage"])
+					){
+						break;
+					}
+					if(this._isShowingNow){
+						this._prev_key_backspace = false;
+						this._prev_key_esc = false;
+						if(pw.getHighlightedOption()){
+							pw.setValue({ target: pw.getHighlightedOption() }, true);
+						}
+						this._hideResultList();
+					}
+					break;
+
+				case dk.SPACE:
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					if(this._isShowingNow && pw.getHighlightedOption()){
+						dojo.stopEvent(evt);
+						this._selectOption();
+						this._hideResultList();
+					}else{
+						doSearch = true;
+					}
+					break;
+
+				case dk.ESCAPE:
+					this._prev_key_backspace = false;
+					this._prev_key_esc = true;
+					if(this._isShowingNow){
+						dojo.stopEvent(evt);
+						this._hideResultList();
+					}
+					this.inherited(arguments);
+					break;
+
+				case dk.DELETE:
+				case dk.BACKSPACE:
+					this._prev_key_esc = false;
+					this._prev_key_backspace = true;
+					doSearch = true;
+					break;
+
+				case dk.RIGHT_ARROW: // fall through
+				case dk.LEFT_ARROW: 
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					break;
+
+				default: // non char keys (F1-F12 etc..)  shouldn't open list
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					if(dojo.isIE || evt.charCode != 0){
+						doSearch = true;
+					}
+			}
+			if(this.searchTimer){
+				clearTimeout(this.searchTimer);
+			}
+			if(doSearch){
+				// need to wait a tad before start search so that the event
+				// bubbles through DOM and we have value visible
+				setTimeout(dojo.hitch(this, "_startSearchFromInput"),1);
+			}
+		},
+
+		_autoCompleteText: function(/*String*/ text){
+			// summary:
+			// 		Fill in the textbox with the first item from the drop down
+			// 		list, and highlight the characters that were
+			// 		auto-completed. For example, if user typed "CA" and the
+			// 		drop down list appeared, the textbox would be changed to
+			// 		"California" and "ifornia" would be highlighted.
+
+			var fn = this.focusNode;
+
+			// IE7: clear selection so next highlight works all the time
+			dijit.selectInputText(fn, fn.value.length);
+			// does text autoComplete the value in the textbox?
+			var caseFilter = this.ignoreCase? 'toLowerCase' : 'substr';
+			if(text[caseFilter](0).indexOf(this.focusNode.value[caseFilter](0)) == 0){
+				var cpos = this._getCaretPos(fn);
+				// only try to extend if we added the last character at the end of the input
+				if((cpos+1) > fn.value.length){
+					// only add to input node as we would overwrite Capitalisation of chars
+					// actually, that is ok
+					fn.value = text;//.substr(cpos);
+					// visually highlight the autocompleted characters
+					dijit.selectInputText(fn, cpos);
+				}
+			}else{
+				// text does not autoComplete; replace the whole value and highlight
+				fn.value = text;
+				dijit.selectInputText(fn);
+			}
+		},
+
+		_openResultList: function(/*Object*/ results, /*Object*/ dataObject){
+			if(	this.disabled || 
+				this.readOnly || 
+				(dataObject.query[this.searchAttr] != this._lastQuery)
+			){
+				return;
+			}
+			this._popupWidget.clearResultList();
+			if(!results.length){
+				this._hideResultList();
+				return;
+			}
+
+			// Fill in the textbox with the first item from the drop down list,
+			// and highlight the characters that were auto-completed. For
+			// example, if user typed "CA" and the drop down list appeared, the
+			// textbox would be changed to "California" and "ifornia" would be
+			// highlighted.
+
+			var zerothvalue = new String(this.store.getValue(results[0], this.searchAttr));
+			if(zerothvalue && this.autoComplete && !this._prev_key_backspace &&
+				(dataObject.query[this.searchAttr] != "*")){
+				// when the user clicks the arrow button to show the full list,
+				// startSearch looks for "*".
+				// it does not make sense to autocomplete
+				// if they are just previewing the options available.
+				this._autoCompleteText(zerothvalue);
+			}
+			this._popupWidget.createOptions(
+				results, 
+				dataObject, 
+				dojo.hitch(this, "_getMenuLabelFromItem")
+			);
+
+			// show our list (only if we have content, else nothing)
+			this._showResultList();
+
+			// #4091:
+			//		tell the screen reader that the paging callback finished by
+			//		shouting the next choice
+			if(dataObject.direction){
+				if(1 == dataObject.direction){
+					this._popupWidget.highlightFirstOption();
+				}else if(-1 == dataObject.direction){
+					this._popupWidget.highlightLastOption();
+				}
+				this._announceOption(this._popupWidget.getHighlightedOption());
+			}
+		},
+
+		_showResultList: function(){
+			this._hideResultList();
+			var items = this._popupWidget.getItems(),
+				visibleCount = Math.min(items.length,this.maxListLength);
+			this._arrowPressed();
+			// hide the tooltip
+			this.displayMessage("");
+			
+			// Position the list and if it's too big to fit on the screen then
+			// size it to the maximum possible height
+			// Our dear friend IE doesnt take max-height so we need to
+			// calculate that on our own every time
+
+			// TODO: want to redo this, see 
+			//		http://trac.dojotoolkit.org/ticket/3272
+			//	and
+			//		http://trac.dojotoolkit.org/ticket/4108
+
+			with(this._popupWidget.domNode.style){
+				// natural size of the list has changed, so erase old
+				// width/height settings, which were hardcoded in a previous
+				// call to this function (via dojo.marginBox() call) 
+				width = "";
+				height = "";
+			}
+			var best = this.open();
+			// #3212:
+			//		only set auto scroll bars if necessary prevents issues with
+			//		scroll bars appearing when they shouldn't when node is made
+			//		wider (fractional pixels cause this)
+			var popupbox = dojo.marginBox(this._popupWidget.domNode);
+			this._popupWidget.domNode.style.overflow = 
+				((best.h==popupbox.h)&&(best.w==popupbox.w)) ? "hidden" : "auto";
+			// #4134:
+			//		borrow TextArea scrollbar test so content isn't covered by
+			//		scrollbar and horizontal scrollbar doesn't appear
+			var newwidth = best.w;
+			if(best.h < this._popupWidget.domNode.scrollHeight){
+				newwidth += 16;
+			}
+			dojo.marginBox(this._popupWidget.domNode, {
+				h: best.h,
+				w: Math.max(newwidth, this.domNode.offsetWidth)
+			});
+			dijit.setWaiState(this.comboNode, "expanded", "true");
+		},
+
+		_hideResultList: function(){
+			if(this._isShowingNow){
+				dijit.popup.close(this._popupWidget);
+				this._arrowIdle();
+				this._isShowingNow=false;
+				dijit.setWaiState(this.comboNode, "expanded", "false");
+				dijit.removeWaiState(this.focusNode,"activedescendant");
+			}
+		},
+
+		_setBlurValue: function(){
+			// if the user clicks away from the textbox OR tabs away, set the
+			// value to the textbox value
+			// #4617: 
+			//		if value is now more choices or previous choices, revert
+			//		the value
+			var newvalue=this.getDisplayedValue();
+			var pw = this._popupWidget;
+			if(pw && (
+				newvalue == pw._messages["previousMessage"] ||
+				newvalue == pw._messages["nextMessage"]
+				)
+			){
+				this.setValue(this._lastValueReported, true);
+			}else{
+				this.setDisplayedValue(newvalue);
+			}
+		},
+
+		_onBlur: function(){
+			// summary: called magically when focus has shifted away from this widget and it's dropdown
+			this._hideResultList();
+			this._arrowIdle();
+			this.inherited(arguments);
+		},
+
+		_announceOption: function(/*Node*/ node){
+			// summary:
+			//		a11y code that puts the highlighted option in the textbox
+			//		This way screen readers will know what is happening in the
+			//		menu
+
+			if(node == null){
+				return;
+			}
+			// pull the text value from the item attached to the DOM node
+			var newValue;
+			if( node == this._popupWidget.nextButton ||
+				node == this._popupWidget.previousButton){
+				newValue = node.innerHTML;
+			}else{
+				newValue = this.store.getValue(node.item, this.searchAttr);
+			}
+			// get the text that the user manually entered (cut off autocompleted text)
+			this.focusNode.value = this.focusNode.value.substring(0, this._getCaretPos(this.focusNode));
+			//set up ARIA activedescendant
+			dijit.setWaiState(this.focusNode, "activedescendant", dojo.attr(node, "id")); 
+			// autocomplete the rest of the option to announce change
+			this._autoCompleteText(newValue);
+		},
+
+		_selectOption: function(/*Event*/ evt){
+			var tgt = null;
+			if(!evt){
+				evt ={ target: this._popupWidget.getHighlightedOption()};
+			}
+				// what if nothing is highlighted yet?
+			if(!evt.target){
+				// handle autocompletion where the the user has hit ENTER or TAB
+				this.setDisplayedValue(this.getDisplayedValue());
+				return;
+			// otherwise the user has accepted the autocompleted value
+			}else{
+				tgt = evt.target;
+			}
+			if(!evt.noHide){
+				this._hideResultList();
+				this._setCaretPos(this.focusNode, this.store.getValue(tgt.item, this.searchAttr).length);
+			}
+			this._doSelect(tgt);
+		},
+
+		_doSelect: function(tgt){
+			this.item = tgt.item;
+			this.setValue(this.store.getValue(tgt.item, this.searchAttr), true);
+		},
+
+		_onArrowMouseDown: function(evt){
+			// summary: callback when arrow is clicked
+			if(this.disabled || this.readOnly){
+				return;
+			}
+			dojo.stopEvent(evt);
+			this.focus();
+			if(this._isShowingNow){
+				this._hideResultList();
+			}else{
+				// forces full population of results, if they click
+				// on the arrow it means they want to see more options
+				this._startSearch("");
+			}
+		},
+
+		_startSearchFromInput: function(){
+			this._startSearch(this.focusNode.value);
+		},
+
+		_getQueryString: function(/*String*/ text){
+			return dojo.string.substitute(this.queryExpr, [text]);
+		},
+
+		_startSearch: function(/*String*/ key){
+			if(!this._popupWidget){
+				var popupId = this.id + "_popup";
+				this._popupWidget = new dijit.form._ComboBoxMenu({
+					onChange: dojo.hitch(this, this._selectOption),
+					id:popupId
+				});
+				dijit.removeWaiState(this.focusNode,"activedescendant");
+				dijit.setWaiState(this.textbox,"owns",popupId); // associate popup with textbox
+			}
+			// create a new query to prevent accidentally querying for a hidden
+			// value from FilteringSelect's keyField
+			this.item = null; // #4872
+			var query = dojo.clone(this.query); // #5970
+			this._lastQuery = query[this.searchAttr] = this._getQueryString(key);
+			// #5970: set _lastQuery, *then* start the timeout
+			// otherwise, if the user types and the last query returns before the timeout,
+			// _lastQuery won't be set and their input gets rewritten
+			this.searchTimer=setTimeout(dojo.hitch(this, function(query, _this){
+				var dataObject = this.store.fetch({
+					queryOptions: {
+						ignoreCase: this.ignoreCase, 
+						deep: true
+					},
+					query: query,
+					onComplete: dojo.hitch(this, "_openResultList"), 
+					onError: function(errText){
+						console.error('dijit.form.ComboBox: ' + errText);
+						dojo.hitch(_this, "_hideResultList")();
+					},
+					start:0,
+					count:this.pageSize
+				});
+
+				var nextSearch = function(dataObject, direction){
+					dataObject.start += dataObject.count*direction;
+					// #4091:
+					//		tell callback the direction of the paging so the screen
+					//		reader knows which menu option to shout
+					dataObject.direction = direction;
+					this.store.fetch(dataObject);
+				}
+				this._nextSearch = this._popupWidget.onPage = dojo.hitch(this, nextSearch, dataObject);
+			}, query, this), this.searchDelay);
+		},
+
+		_getValueField:function(){
+			return this.searchAttr;
+		},
+
+		/////////////// Event handlers /////////////////////
+
+		_arrowPressed: function(){
+			if(!this.disabled && !this.readOnly && this.hasDownArrow){
+				dojo.addClass(this.downArrowNode, "dijitArrowButtonActive");
+			}
+		},
+
+		_arrowIdle: function(){
+			if(!this.disabled && !this.readOnly && this.hasDownArrow){
+				dojo.removeClass(this.downArrowNode, "dojoArrowButtonPushed");
+			}
+		},
+
+		// FIXME: 
+		//		this is public so we can't remove until 2.0, but the name
+		//		SHOULD be "compositionEnd"
+
+		compositionend: function(/*Event*/ evt){
+			//	summary:
+			//		When inputting characters using an input method, such as
+			//		Asian languages, it will generate this event instead of
+			//		onKeyDown event Note: this event is only triggered in FF
+			//		(not in IE)
+			this.onkeypress({charCode:-1});
+		},
+
+		//////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+		constructor: function(){
+			this.query={};
+		},
+
+		postMixInProperties: function(){
+			if(!this.hasDownArrow){
+				this.baseClass = "dijitTextBox";
+			}
+			if(!this.store){
+				var srcNodeRef = this.srcNodeRef;
+
+				// if user didn't specify store, then assume there are option tags
+				this.store = new dijit.form._ComboBoxDataStore(srcNodeRef);
+
+				// if there is no value set and there is an option list, set
+				// the value to the first value to be consistent with native
+				// Select
+
+				// Firefox and Safari set value
+				// IE6 and Opera set selectedIndex, which is automatically set
+				// by the selected attribute of an option tag
+				// IE6 does not set value, Opera sets value = selectedIndex
+				if(	!this.value || (
+						(typeof srcNodeRef.selectedIndex == "number") && 
+						srcNodeRef.selectedIndex.toString() === this.value)
+				){
+					var item = this.store.fetchSelectedItem();
+					if(item){
+						this.value = this.store.getValue(item, this._getValueField());
+					}
+				}
+			}
+		},
+		
+		_postCreate:function(){
+			//find any associated label element and add to combobox node.
+			var label=dojo.query('label[for="'+this.id+'"]');
+			if(label.length){
+				label[0].id = (this.id+"_label");
+				var cn=this.comboNode;
+				dijit.setWaiState(cn, "labelledby", label[0].id);
+				dijit.setWaiState(cn, "disabled", this.disabled);
+				
+			}
+		},
+
+		uninitialize:function(){
+			if(this._popupWidget){
+				this._hideResultList();
+				this._popupWidget.destroy()
+			}
+		},
+
+		_getMenuLabelFromItem:function(/*Item*/ item){
+			return {
+				html: false, 
+				label: this.store.getValue(item, this.searchAttr)
+			};
+		},
+
+		open:function(){
+			this._isShowingNow=true;
+			return dijit.popup.open({
+				popup: this._popupWidget,
+				around: this.domNode,
+				parent: this
+			});
+		},
+		
+		reset:function(){
+			//	summary:
+			//		Additionally reset the .item (to clean up).
+			this.item = null;
+			this.inherited(arguments);
+		}
+		
+	}
+);
+
+dojo.declare(
+	"dijit.form._ComboBoxMenu",
+	[dijit._Widget, dijit._Templated],
+
+	{
+		//	summary:
+		//		Focus-less div based menu for internal use in ComboBox
+
+		templateString: "<ul class='dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow:\"auto\";'>"
+				+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton'></li>"
+				+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton'></li>"
+			+"</ul>",
+		_messages: null,
+
+		postMixInProperties: function(){
+			this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang);
+			this.inherited("postMixInProperties", arguments);
+		},
+
+		setValue: function(/*Object*/ value){
+			this.value = value;
+			this.onChange(value);
+		},
+
+		// stubs
+		onChange: function(/*Object*/ value){},
+		onPage: function(/*Number*/ direction){},
+
+		postCreate:function(){
+			// fill in template with i18n messages
+			this.previousButton.innerHTML = this._messages["previousMessage"];
+			this.nextButton.innerHTML = this._messages["nextMessage"];
+			this.inherited("postCreate", arguments);
+		},
+
+		onClose:function(){
+			this._blurOptionNode();
+		},
+
+		_createOption:function(/*Object*/ item, labelFunc){
+			//	summary: 
+			//		creates an option to appear on the popup menu subclassed by
+			//		FilteringSelect
+
+			var labelObject = labelFunc(item);
+			var menuitem = dojo.doc.createElement("li");
+			dijit.setWaiRole(menuitem, "option");
+			if(labelObject.html){
+				menuitem.innerHTML = labelObject.label;
+			}else{
+				menuitem.appendChild(
+					dojo.doc.createTextNode(labelObject.label)
+				);
+			}
+			// #3250: in blank options, assign a normal height
+			if(menuitem.innerHTML == ""){
+				menuitem.innerHTML = "&nbsp;";
+			}
+			menuitem.item=item;
+			return menuitem;
+		},
+
+		createOptions: function(results, dataObject, labelFunc){
+			//this._dataObject=dataObject;
+			//this._dataObject.onComplete=dojo.hitch(comboBox, comboBox._openResultList);
+			// display "Previous . . ." button
+			this.previousButton.style.display = (dataObject.start == 0) ? "none" : "";
+			dojo.attr(this.previousButton, "id", this.id + "_prev");
+			// create options using _createOption function defined by parent
+			// ComboBox (or FilteringSelect) class
+			// #2309:
+			//		iterate over cache nondestructively
+			dojo.forEach(results, function(item, i){
+				var menuitem = this._createOption(item, labelFunc);
+				menuitem.className = "dijitMenuItem";
+				dojo.attr(menuitem, "id", this.id + i);
+				this.domNode.insertBefore(menuitem, this.nextButton);
+			}, this);
+			// display "Next . . ." button
+			this.nextButton.style.display = (dataObject.count == results.length) ? "" : "none";
+			dojo.attr(this.nextButton,"id", this.id + "_next")
+		},
+
+		clearResultList: function(){
+			// keep the previous and next buttons of course
+			while(this.domNode.childNodes.length>2){
+				this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
+			}
+		},
+
+		// these functions are called in showResultList
+		getItems: function(){
+			return this.domNode.childNodes;
+		},
+
+		getListLength: function(){
+			return this.domNode.childNodes.length-2;
+		},
+
+		_onMouseDown: function(/*Event*/ evt){
+			dojo.stopEvent(evt);
+		},
+
+		_onMouseUp: function(/*Event*/ evt){
+			if(evt.target === this.domNode){
+				return;
+			}else if(evt.target==this.previousButton){
+				this.onPage(-1);
+			}else if(evt.target==this.nextButton){
+				this.onPage(1);
+			}else{
+				var tgt = evt.target;
+				// while the clicked node is inside the div
+				while(!tgt.item){
+					// recurse to the top
+					tgt = tgt.parentNode;
+				}
+				this.setValue({ target: tgt }, true);
+			}
+		},
+
+		_onMouseOver: function(/*Event*/ evt){
+			if(evt.target === this.domNode){ return; }
+			var tgt = evt.target;
+			if(!(tgt == this.previousButton || tgt == this.nextButton)){
+				// while the clicked node is inside the div
+				while(!tgt.item){
+					// recurse to the top
+					tgt = tgt.parentNode;
+				}
+			}
+			this._focusOptionNode(tgt);
+		},
+
+		_onMouseOut:function(/*Event*/ evt){
+			if(evt.target === this.domNode){ return; }
+			this._blurOptionNode();
+		},
+
+		_focusOptionNode:function(/*DomNode*/ node){
+			// summary:
+			//	does the actual highlight
+			if(this._highlighted_option != node){
+				this._blurOptionNode();
+				this._highlighted_option = node;
+				dojo.addClass(this._highlighted_option, "dijitMenuItemHover");
+			}
+		},
+
+		_blurOptionNode:function(){
+			// summary:
+			//	removes highlight on highlighted option
+			if(this._highlighted_option){
+				dojo.removeClass(this._highlighted_option, "dijitMenuItemHover");
+				this._highlighted_option = null;
+			}
+		},
+
+		_highlightNextOption:function(){
+			//	summary:
+			// 		Highlight the item just below the current selection.
+			// 		If nothing selected, highlight first option
+
+			// because each press of a button clears the menu,
+			// the highlighted option sometimes becomes detached from the menu!
+			// test to see if the option has a parent to see if this is the case.
+			var fc = this.domNode.firstChild;
+			if(!this.getHighlightedOption()){
+				this._focusOptionNode(fc.style.display=="none" ? fc.nextSibling : fc);
+			}else{
+				var ns = this._highlighted_option.nextSibling;
+				if(ns && ns.style.display!="none"){
+					this._focusOptionNode(ns);
+				}
+			}
+			// scrollIntoView is called outside of _focusOptionNode because in IE putting it inside causes the menu to scroll up on mouseover
+			dijit.scrollIntoView(this._highlighted_option);
+		},
+
+		highlightFirstOption:function(){
+			//	summary:
+			// 		Highlight the first real item in the list (not Previous Choices).
+			this._focusOptionNode(this.domNode.firstChild.nextSibling);
+			dijit.scrollIntoView(this._highlighted_option);
+		},
+
+		highlightLastOption:function(){
+			//	summary:
+			// 		Highlight the last real item in the list (not More Choices).
+			this._focusOptionNode(this.domNode.lastChild.previousSibling);
+			dijit.scrollIntoView(this._highlighted_option);
+		},
+
+		_highlightPrevOption:function(){
+			//	summary:
+			// 		Highlight the item just above the current selection.
+			// 		If nothing selected, highlight last option (if
+			// 		you select Previous and try to keep scrolling up the list)
+			var lc = this.domNode.lastChild;
+			if(!this.getHighlightedOption()){
+				this._focusOptionNode(lc.style.display == "none" ? lc.previousSibling : lc);
+			}else{
+				var ps = this._highlighted_option.previousSibling;
+				if(ps && ps.style.display != "none"){
+					this._focusOptionNode(ps);
+				}
+			}
+			dijit.scrollIntoView(this._highlighted_option);
+		},
+
+		_page:function(/*Boolean*/ up){
+			var scrollamount = 0;
+			var oldscroll = this.domNode.scrollTop;
+			var height = dojo.style(this.domNode, "height");
+			// if no item is highlighted, highlight the first option
+			if(!this.getHighlightedOption()){
+				this._highlightNextOption();
+			}
+			while(scrollamount<height){
+				if(up){
+					// stop at option 1
+					if(!this.getHighlightedOption().previousSibling ||
+						this._highlighted_option.previousSibling.style.display == "none"){
+						break;
+					}
+					this._highlightPrevOption();
+				}else{
+					// stop at last option
+					if(!this.getHighlightedOption().nextSibling ||
+						this._highlighted_option.nextSibling.style.display == "none"){
+						break;
+					}
+					this._highlightNextOption();
+				}
+				// going backwards
+				var newscroll=this.domNode.scrollTop;
+				scrollamount+=(newscroll-oldscroll)*(up ? -1:1);
+				oldscroll=newscroll;
+			}
+		},
+
+		pageUp: function(){ this._page(true); },
+
+		pageDown: function(){ this._page(false); },
+
+		getHighlightedOption: function(){
+			//	summary:
+			//		Returns the highlighted option.
+			var ho = this._highlighted_option;
+			return (ho && ho.parentNode) ? ho : null;
+		},
+
+		handleKey: function(evt){
+			switch(evt.keyCode){
+				case dojo.keys.DOWN_ARROW:
+					this._highlightNextOption();
+					break;
+				case dojo.keys.PAGE_DOWN:
+					this.pageDown();
+					break;	
+				case dojo.keys.UP_ARROW:
+					this._highlightPrevOption();
+					break;
+				case dojo.keys.PAGE_UP:
+					this.pageUp();
+					break;	
+			}
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.form.ComboBox",
+	[dijit.form.ValidationTextBox, dijit.form.ComboBoxMixin],
+	{
+		//	summary:
+		//		Auto-completing text box, and base class for dijit.form.FilteringSelect.
+		// 
+		//	description:
+		//		The drop down box's values are populated from an class called
+		//		a data provider, which returns a list of values based on the characters
+		//		that the user has typed into the input box.
+		// 
+		//		Some of the options to the ComboBox are actually arguments to the data
+		//		provider.
+		// 
+		//		You can assume that all the form widgets (and thus anything that mixes
+		//		in dijit.formComboBoxMixin) will inherit from dijit.form._FormWidget and thus the `this`
+		//		reference will also "be a" _FormWidget.
+
+		postMixInProperties: function(){
+			// this.inherited(arguments); // ??
+			dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this, arguments);
+			dijit.form.ValidationTextBox.prototype.postMixInProperties.apply(this, arguments);
+		},
+
+		postCreate: function(){
+			dijit.form.ComboBoxMixin.prototype._postCreate.apply(this, arguments);
+			dijit.form.ValidationTextBox.prototype.postCreate.apply(this, arguments);
+		},
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			dijit.form.ValidationTextBox.prototype.setAttribute.apply(this, arguments);
+			dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this, arguments);
+		}
+		
+	}
+);
+
+dojo.declare("dijit.form._ComboBoxDataStore", null, {
+	//	summary:
+	//		Inefficient but small data store specialized for inlined ComboBox data
+	//
+	//	description:
+	//		Provides a store for inlined data like:
+	//
+	//	|	<select>
+	//	|		<option value="AL">Alabama</option>
+	//	|		...
+	//
+	//		Actually. just implements the subset of dojo.data.Read/Notification
+	//		needed for ComboBox and FilteringSelect to work.
+	//
+	//		Note that an item is just a pointer to the <option> DomNode.
+
+	constructor: function( /*DomNode*/ root){
+		this.root = root;
+/*
+		//	TODO: this was added in #3858 but unclear why/if it's needed;  doesn't seem to be.
+		//	If it is needed then can we just hide the select itself instead?
+		dojo.query("> option", root).forEach(function(node){
+			node.style.display="none";
+		});
+*/
+	},
+
+	getValue: function(	/* item */ item, 
+						/* attribute-name-string */ attribute, 
+						/* value? */ defaultValue){
+		return (attribute == "value") ? item.value : (item.innerText || item.textContent || '');
+	},
+
+	isItemLoaded: function(/* anything */ something) {
+		return true;
+	},
+
+	fetch: function(/* Object */ args){
+		//	summary:
+		//		Given a query and set of defined options, such as a start and count of items to return,
+		//		this method executes the query and makes the results available as data items.
+		//		Refer to dojo.data.api.Read.fetch() more details.
+		//
+		//	description:
+		//		Given a query like
+		//
+		//	|	{
+		// 	|		query: {name: "Cal*"},
+		//	|		start: 30,
+		//	|		count: 20,
+		//	|		ignoreCase: true,
+		//	|		onComplete: function(/* item[] */ items, /* Object */ args){...}
+		// 	|	}
+		//
+		//		will call `onComplete()` with the results of the query (and the argument to this method)
+
+		// convert query to regex (ex: convert "first\last*" to /^first\\last.*$/i) and get matching vals
+		var query = "^" + args.query.name
+				.replace(/([\\\|\(\)\[\{\^\$\+\?\.\<\>])/g, "\\$1")
+				.replace("*", ".*") + "$",
+			matcher = new RegExp(query, args.queryOptions.ignoreCase ? "i" : ""),
+			items = dojo.query("> option", this.root).filter(function(option){
+				return (option.innerText || option.textContent || '').match(matcher);
+			} );
+
+		var start = args.start || 0,
+			end = ("count" in args && args.count != Infinity) ? (start + args.count) : items.length ;
+		args.onComplete(items.slice(start, end), args);
+		return args; // Object
+		// TODO: I don't need to return the length?
+	},
+
+	close: function(/*dojo.data.api.Request || args || null */ request){
+		return;
+	},
+
+	getLabel: function(/* item */ item){
+		return item.innerHTML;
+	},
+
+	getIdentity: function(/* item */ item){
+		return dojo.attr(item, "value");
+	},
+
+	fetchItemByIdentity: function(/* Object */ args){
+		//	summary:
+		//		Given the identity of an item, this method returns the item that has
+		//		that identity through the onItem callback.
+		//		Refer to dojo.data.api.Identity.fetchItemByIdentity() for more details.
+		//
+		//	description:
+		//		Given arguments like:
+		//
+		//	|		{identity: "CA", onItem: function(item){...}
+		//
+		//		Call `onItem()` with the DOM node `<option value="CA">California</option>`
+		var item = dojo.query("option[value='" + args.identity + "']", this.root)[0];
+		args.onItem(item);
+	},
+	
+	fetchSelectedItem: function(){
+		//	summary:
+		//		Get the option marked as selected, like `<option selected>`.
+		//		Not part of dojo.data API.
+		var root = this.root,
+			si = root.selectedIndex;
+		return dojo.query("> option:nth-child(" +
+			(si != -1 ? si+1 : 1) + ")",
+			root)[0];	// dojo.data.Item
+	}
+});
+
+}
+
+if(!dojo._hasResource["dojo.cldr.monetary"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cldr.monetary"] = true;
+dojo.provide("dojo.cldr.monetary");
+
+dojo.cldr.monetary.getData = function(/*String*/code){
+// summary: A mapping of currency code to currency-specific formatting information. Returns a unique object with properties: places, round.
+// code: an [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code
+
+// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/currencyData/fractions
+
+	var placesData = {
+		ADP:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,DJF:0,ESP:0,GNF:0,
+		IQD:3,ITL:0,JOD:3,JPY:0,KMF:0,KRW:0,KWD:3,LUF:0,LYD:3,
+		MGA:0,MGF:0,OMR:3,PYG:0,RWF:0,TND:3,TRL:0,VUV:0,XAF:0,
+		XOF:0,XPF:0
+	};
+
+	var roundingData = {CHF:5};
+
+	var places = placesData[code], round = roundingData[code];
+	if(typeof places == "undefined"){ places = 2; }
+	if(typeof round == "undefined"){ round = 0; }
+
+	return {places: places, round: round}; // Object
+};
+
+}
+
+if(!dojo._hasResource["dojo.currency"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.currency"] = true;
+dojo.provide("dojo.currency");
+
+
+
+
+
+
+/*=====
+dojo.currency = {
+	// summary: localized formatting and parsing routines for currencies
+}
+=====*/
+
+dojo.currency._mixInDefaults = function(options){
+	options = options || {};
+	options.type = "currency";
+
+	// Get locale-depenent currency data, like the symbol
+	var bundle = dojo.i18n.getLocalization("dojo.cldr", "currency", options.locale) || {};
+
+	// Mixin locale-independent currency data, like # of places
+	var iso = options.currency;
+	var data = dojo.cldr.monetary.getData(iso);
+
+	dojo.forEach(["displayName","symbol","group","decimal"], function(prop){
+		data[prop] = bundle[iso+"_"+prop];
+	});
+
+	data.fractional = [true, false];
+
+	// Mixin with provided options
+	return dojo.mixin(data, options);
+}
+
+dojo.currency.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
+// summary:
+//		Format a Number as a currency, using locale-specific settings
+//
+// description:
+//		Create a string from a Number using a known, localized pattern.
+//		[Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Elements) appropriate to the locale are chosen from the [CLDR](http://unicode.org/cldr)
+//		as well as the appropriate symbols and delimiters.
+//
+// value:
+//		the number to be formatted.
+
+	return dojo.number.format(value, dojo.currency._mixInDefaults(options));
+}
+
+dojo.currency.regexp = function(/*dojo.number.__RegexpOptions?*/options){
+//
+// summary:
+//		Builds the regular needed to parse a currency value
+//
+// description:
+//		Returns regular expression with positive and negative match, group and decimal separators
+//		Note: the options.places default, the number of decimal places to accept, is defined by the currency type.
+	return dojo.number.regexp(dojo.currency._mixInDefaults(options)); // String
+}
+
+/*=====
+dojo.declare("dojo.currency.__ParseOptions", [dojo.number.__ParseOptions], {
+	//	type: String?
+	//		currency, set by default.
+	//	symbol: String?
+	//		override currency symbol. Normally, will be looked up in table of supported currencies,
+	//		and ISO currency code will be used if not found.  See dojo.i18n.cldr.nls->currency.js
+	//	places: Number?
+	//		number of decimal places to accept.  Default is defined by currency.
+	//	fractional: Boolean?|Array?
+	//		where places are implied by pattern or explicit 'places' parameter, whether to include the fractional portion.
+	//		By default for currencies, it the fractional portion is optional.
+	type: "",
+	symbol: "",
+	places: "",
+	fractional: ""
+});
+=====*/
+
+dojo.currency.parse = function(/*String*/expression, /*dojo.currency.__ParseOptions?*/options){
+	//
+	// summary:
+	//		Convert a properly formatted currency string to a primitive Number,
+	//		using locale-specific settings.
+	//
+	// description:
+	//		Create a Number from a string using a known, localized pattern.
+	//		[Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) are chosen appropriate to the locale.
+	//
+	// expression: A string representation of a Number
+
+	return dojo.number.parse(expression, dojo.currency._mixInDefaults(options));
+}
+
+}
+
+if(!dojo._hasResource["dijit.form.NumberTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.NumberTextBox"] = true;
+dojo.provide("dijit.form.NumberTextBox");
+
+
+
+
+/*=====
+dojo.declare(
+	"dijit.form.NumberTextBox.__Constraints",
+	[dijit.form.RangeBoundTextBox.__Constraints, dojo.number.__FormatOptions, dojo.number.__ParseOptions]
+);
+=====*/
+
+dojo.declare(
+	"dijit.form.NumberTextBoxMixin",
+	null,
+	{
+		// summary:
+		//		A mixin for all number textboxes
+
+		regExpGen: dojo.number.regexp,
+
+		/*=====
+		// constraints: dijit.form.NumberTextBox.__Constraints 
+		constraints: {},
+		======*/
+
+		// editOptions: Object
+		//		properties to mix into constraints when the value is being edited
+		editOptions: { pattern: '#.######' },
+
+		_onFocus: function(){
+			this.setValue(this.getValue(), false);	
+			this.inherited(arguments);
+		},
+
+		_formatter: dojo.number.format,
+
+		format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){
+			//	summary: formats the value as a Number, according to constraints
+
+			if(typeof value == "string") { return value; }
+			if(isNaN(value)){ return ""; }
+			if(this.editOptions && this._focused){
+				constraints = dojo.mixin(dojo.mixin({}, this.editOptions), this.constraints);
+			}
+			return this._formatter(value, constraints);
+		},
+
+		parse: dojo.number.parse,
+		/*=====
+		parse: function(value, constraints){
+			//	summary: parses the value as a Number, according to constraints
+			//	value: String
+			//
+			//	constraints: dojo.number.__ParseOptions
+		},
+		=====*/
+
+		filter: function(/*Number*/ value){
+			if(typeof value == "string"){ return this.inherited('filter', arguments); }
+			return isNaN(value) ? '' : value;
+		},
+
+		value: NaN
+	}
+);
+
+dojo.declare(
+	"dijit.form.NumberTextBox",
+	[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],
+	{
+		// summary:
+		//		A validating, serializable, range-bound text box.
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.form.CurrencyTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.CurrencyTextBox"] = true;
+dojo.provide("dijit.form.CurrencyTextBox");
+
+//FIXME: dojo.experimental throws an unreadable exception?
+//dojo.experimental("dijit.form.CurrencyTextBox");
+
+
+
+
+dojo.declare(
+	"dijit.form.CurrencyTextBox",
+	dijit.form.NumberTextBox,
+	{
+		// summary:
+		//		A validating currency textbox
+		//
+		// constraints: dijit.form._DateTimeTextBox.__Constraints 
+		//
+		// currency: String
+		//		the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+		currency: "",
+
+		/*=====
+		constraints: {},
+		======*/
+
+		regExpGen: dojo.currency.regexp,
+		_formatter: dojo.currency.format,
+/*=====
+		parse: function(value, constraints){
+			//	summary: parses the value as a Currency, according to constraints
+			//	value: String
+			//
+			//	constraints: dojo.currency.__ParseOptions
+		},
+=====*/
+		parse: dojo.currency.parse,
+
+		postMixInProperties: function(){
+			if(this.constraints === dijit.form.ValidationTextBox.prototype.constraints){
+				// declare a constraints property on 'this' so we don't overwrite the shared default object in 'prototype'
+				this.constraints = {};
+			}
+			this.constraints.currency = this.currency;
+			dijit.form.CurrencyTextBox.superclass.postMixInProperties.apply(this, arguments);
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dojo.cldr.supplemental"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cldr.supplemental"] = true;
+dojo.provide("dojo.cldr.supplemental");
+
+
+
+dojo.cldr.supplemental.getFirstDayOfWeek = function(/*String?*/locale){
+// summary: Returns a zero-based index for first day of the week
+// description:
+//		Returns a zero-based index for first day of the week, as used by the local (Gregorian) calendar.
+//		e.g. Sunday (returns 0), or Monday (returns 1)
+
+	// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/firstDay
+	var firstDay = {/*default is 1=Monday*/
+		mv:5,
+		ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,lb:6,ly:6,ma:6,om:6,qa:6,sa:6,
+		sd:6,so:6,tn:6,ye:6,
+		as:0,au:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,ie:0,il:0,is:0,jm:0,jp:0,kg:0,kr:0,la:0,
+		mh:0,mo:0,mp:0,mt:0,nz:0,ph:0,pk:0,sg:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,vi:0,za:0,zw:0,
+		et:0,mw:0,ng:0,tj:0,
+// variant. do not use?		gb:0,
+		sy:4
+	};
+
+	var country = dojo.cldr.supplemental._region(locale);
+	var dow = firstDay[country];
+	return (dow === undefined) ? 1 : dow; /*Number*/
+};
+
+dojo.cldr.supplemental._region = function(/*String?*/locale){
+	locale = dojo.i18n.normalizeLocale(locale);
+	var tags = locale.split('-');
+	var region = tags[1];
+	if(!region){
+		// IE often gives language only (#2269)
+		// Arbitrary mappings of language-only locales to a country:
+        region = {de:"de", en:"us", es:"es", fi:"fi", fr:"fr", hu:"hu", it:"it",
+        ja:"jp", ko:"kr", nl:"nl", pt:"br", sv:"se", zh:"cn"}[tags[0]];
+	}else if(region.length == 4){
+		// The ISO 3166 country code is usually in the second position, unless a
+		// 4-letter script is given. See http://www.ietf.org/rfc/rfc4646.txt
+		region = tags[2];
+	}
+	return region;
+}
+
+dojo.cldr.supplemental.getWeekend = function(/*String?*/locale){
+// summary: Returns a hash containing the start and end days of the weekend
+// description:
+//		Returns a hash containing the start and end days of the weekend according to local custom using locale,
+//		or by default in the user's locale.
+//		e.g. {start:6, end:0}
+
+	// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/weekend{Start,End}
+	var weekendStart = {/*default is 6=Saturday*/
+		eg:5,il:5,sy:5,
+		'in':0,
+		ae:4,bh:4,dz:4,iq:4,jo:4,kw:4,lb:4,ly:4,ma:4,om:4,qa:4,sa:4,sd:4,tn:4,ye:4		
+	};
+
+	var weekendEnd = {/*default is 0=Sunday*/
+		ae:5,bh:5,dz:5,iq:5,jo:5,kw:5,lb:5,ly:5,ma:5,om:5,qa:5,sa:5,sd:5,tn:5,ye:5,af:5,ir:5,
+		eg:6,il:6,sy:6
+	};
+
+	var country = dojo.cldr.supplemental._region(locale);
+	var start = weekendStart[country];
+	var end = weekendEnd[country];
+	if(start === undefined){start=6;}
+	if(end === undefined){end=0;}
+	return {start:start, end:end}; /*Object {start,end}*/
+};
+
+}
+
+if(!dojo._hasResource["dojo.date"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.date"] = true;
+dojo.provide("dojo.date");
+
+/*=====
+dojo.date = {
+	// summary: Date manipulation utilities
+}
+=====*/
+
+dojo.date.getDaysInMonth = function(/*Date*/dateObject){
+	//	summary:
+	//		Returns the number of days in the month used by dateObject
+	var month = dateObject.getMonth();
+	var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+	if(month == 1 && dojo.date.isLeapYear(dateObject)){ return 29; } // Number
+	return days[month]; // Number
+}
+
+dojo.date.isLeapYear = function(/*Date*/dateObject){
+	//	summary:
+	//		Determines if the year of the dateObject is a leap year
+	//	description:
+	//		Leap years are years with an additional day YYYY-02-29, where the
+	//		year number is a multiple of four with the following exception: If
+	//		a year is a multiple of 100, then it is only a leap year if it is
+	//		also a multiple of 400. For example, 1900 was not a leap year, but
+	//		2000 is one.
+
+	var year = dateObject.getFullYear();
+	return !(year%400) || (!(year%4) && !!(year%100)); // Boolean
+}
+
+// FIXME: This is not localized
+dojo.date.getTimezoneName = function(/*Date*/dateObject){
+	//	summary:
+	//		Get the user's time zone as provided by the browser
+	// dateObject:
+	//		Needed because the timezone may vary with time (daylight savings)
+	//	description:
+	//		Try to get time zone info from toString or toLocaleString method of
+	//		the Date object -- UTC offset is not a time zone.  See
+	//		http://www.twinsun.com/tz/tz-link.htm Note: results may be
+	//		inconsistent across browsers.
+
+	var str = dateObject.toString(); // Start looking in toString
+	var tz = ''; // The result -- return empty string if nothing found
+	var match;
+
+	// First look for something in parentheses -- fast lookup, no regex
+	var pos = str.indexOf('(');
+	if(pos > -1){
+		tz = str.substring(++pos, str.indexOf(')'));
+	}else{
+		// If at first you don't succeed ...
+		// If IE knows about the TZ, it appears before the year
+		// Capital letters or slash before a 4-digit year 
+		// at the end of string
+		var pat = /([A-Z\/]+) \d{4}$/;
+		if((match = str.match(pat))){
+			tz = match[1];
+		}else{
+		// Some browsers (e.g. Safari) glue the TZ on the end
+		// of toLocaleString instead of putting it in toString
+			str = dateObject.toLocaleString();
+			// Capital letters or slash -- end of string, 
+			// after space
+			pat = / ([A-Z\/]+)$/;
+			if((match = str.match(pat))){
+				tz = match[1];
+			}
+		}
+	}
+
+	// Make sure it doesn't somehow end up return AM or PM
+	return (tz == 'AM' || tz == 'PM') ? '' : tz; // String
+}
+
+// Utility methods to do arithmetic calculations with Dates
+
+dojo.date.compare = function(/*Date*/date1, /*Date?*/date2, /*String?*/portion){
+	//	summary:
+	//		Compare two date objects by date, time, or both.
+	//	description:
+	//  	Returns 0 if equal, positive if a > b, else negative.
+	//	date1:
+	//		Date object
+	//	date2:
+	//		Date object.  If not specified, the current Date is used.
+	//	portion:
+	//		A string indicating the "date" or "time" portion of a Date object.
+	//		Compares both "date" and "time" by default.  One of the following:
+	//		"date", "time", "datetime"
+
+	// Extra step required in copy for IE - see #3112
+	date1 = new Date(Number(date1));
+	date2 = new Date(Number(date2 || new Date()));
+
+	if(portion !== "undefined"){
+		if(portion == "date"){
+			// Ignore times and compare dates.
+			date1.setHours(0, 0, 0, 0);
+			date2.setHours(0, 0, 0, 0);
+		}else if(portion == "time"){
+			// Ignore dates and compare times.
+			date1.setFullYear(0, 0, 0);
+			date2.setFullYear(0, 0, 0);
+		}
+	}
+	
+	if(date1 > date2){ return 1; } // int
+	if(date1 < date2){ return -1; } // int
+	return 0; // int
+};
+
+dojo.date.add = function(/*Date*/date, /*String*/interval, /*int*/amount){
+	//	summary:
+	//		Add to a Date in intervals of different size, from milliseconds to years
+	//	date: Date
+	//		Date object to start with
+	//	interval:
+	//		A string representing the interval.  One of the following:
+	//			"year", "month", "day", "hour", "minute", "second",
+	//			"millisecond", "quarter", "week", "weekday"
+	//	amount:
+	//		How much to add to the date.
+
+	var sum = new Date(Number(date)); // convert to Number before copying to accomodate IE (#3112)
+	var fixOvershoot = false;
+	var property = "Date";
+
+	switch(interval){
+		case "day":
+			break;
+		case "weekday":
+			//i18n FIXME: assumes Saturday/Sunday weekend, but this is not always true.  see dojo.cldr.supplemental
+
+			// Divide the increment time span into weekspans plus leftover days
+			// e.g., 8 days is one 5-day weekspan / and two leftover days
+			// Can't have zero leftover days, so numbers divisible by 5 get
+			// a days value of 5, and the remaining days make up the number of weeks
+			var days, weeks;
+			var mod = amount % 5;
+			if(!mod){
+				days = (amount > 0) ? 5 : -5;
+				weeks = (amount > 0) ? ((amount-5)/5) : ((amount+5)/5);
+			}else{
+				days = mod;
+				weeks = parseInt(amount/5);
+			}
+			// Get weekday value for orig date param
+			var strt = date.getDay();
+			// Orig date is Sat / positive incrementer
+			// Jump over Sun
+			var adj = 0;
+			if(strt == 6 && amount > 0){
+				adj = 1;
+			}else if(strt == 0 && amount < 0){
+			// Orig date is Sun / negative incrementer
+			// Jump back over Sat
+				adj = -1;
+			}
+			// Get weekday val for the new date
+			var trgt = strt + days;
+			// New date is on Sat or Sun
+			if(trgt == 0 || trgt == 6){
+				adj = (amount > 0) ? 2 : -2;
+			}
+			// Increment by number of weeks plus leftover days plus
+			// weekend adjustments
+			amount = (7 * weeks) + days + adj;
+			break;
+		case "year":
+			property = "FullYear";
+			// Keep increment/decrement from 2/29 out of March
+			fixOvershoot = true;
+			break;
+		case "week":
+			amount *= 7;
+			break;
+		case "quarter":
+			// Naive quarter is just three months
+			amount *= 3;
+			// fallthrough...
+		case "month":
+			// Reset to last day of month if you overshoot
+			fixOvershoot = true;
+			property = "Month";
+			break;
+		case "hour":
+		case "minute":
+		case "second":
+		case "millisecond":
+			property = "UTC"+interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
+	}
+
+	if(property){
+		sum["set"+property](sum["get"+property]()+amount);
+	}
+
+	if(fixOvershoot && (sum.getDate() < date.getDate())){
+		sum.setDate(0);
+	}
+
+	return sum; // Date
+};
+
+dojo.date.difference = function(/*Date*/date1, /*Date?*/date2, /*String?*/interval){
+	//	summary:
+	//		Get the difference in a specific unit of time (e.g., number of
+	//		months, weeks, days, etc.) between two dates, rounded to the
+	//		nearest integer.
+	//	date1:
+	//		Date object
+	//	date2:
+	//		Date object.  If not specified, the current Date is used.
+	//	interval:
+	//		A string representing the interval.  One of the following:
+	//			"year", "month", "day", "hour", "minute", "second",
+	//			"millisecond", "quarter", "week", "weekday"
+	//		Defaults to "day".
+
+	date2 = date2 || new Date();
+	interval = interval || "day";
+	var yearDiff = date2.getFullYear() - date1.getFullYear();
+	var delta = 1; // Integer return value
+
+	switch(interval){
+		case "quarter":
+			var m1 = date1.getMonth();
+			var m2 = date2.getMonth();
+			// Figure out which quarter the months are in
+			var q1 = Math.floor(m1/3) + 1;
+			var q2 = Math.floor(m2/3) + 1;
+			// Add quarters for any year difference between the dates
+			q2 += (yearDiff * 4);
+			delta = q2 - q1;
+			break;
+		case "weekday":
+			var days = Math.round(dojo.date.difference(date1, date2, "day"));
+			var weeks = parseInt(dojo.date.difference(date1, date2, "week"));
+			var mod = days % 7;
+
+			// Even number of weeks
+			if(mod == 0){
+				days = weeks*5;
+			}else{
+				// Weeks plus spare change (< 7 days)
+				var adj = 0;
+				var aDay = date1.getDay();
+				var bDay = date2.getDay();
+
+				weeks = parseInt(days/7);
+				mod = days % 7;
+				// Mark the date advanced by the number of
+				// round weeks (may be zero)
+				var dtMark = new Date(date1);
+				dtMark.setDate(dtMark.getDate()+(weeks*7));
+				var dayMark = dtMark.getDay();
+
+				// Spare change days -- 6 or less
+				if(days > 0){
+					switch(true){
+						// Range starts on Sat
+						case aDay == 6:
+							adj = -1;
+							break;
+						// Range starts on Sun
+						case aDay == 0:
+							adj = 0;
+							break;
+						// Range ends on Sat
+						case bDay == 6:
+							adj = -1;
+							break;
+						// Range ends on Sun
+						case bDay == 0:
+							adj = -2;
+							break;
+						// Range contains weekend
+						case (dayMark + mod) > 5:
+							adj = -2;
+					}
+				}else if(days < 0){
+					switch(true){
+						// Range starts on Sat
+						case aDay == 6:
+							adj = 0;
+							break;
+						// Range starts on Sun
+						case aDay == 0:
+							adj = 1;
+							break;
+						// Range ends on Sat
+						case bDay == 6:
+							adj = 2;
+							break;
+						// Range ends on Sun
+						case bDay == 0:
+							adj = 1;
+							break;
+						// Range contains weekend
+						case (dayMark + mod) < 0:
+							adj = 2;
+					}
+				}
+				days += adj;
+				days -= (weeks*2);
+			}
+			delta = days;
+			break;
+		case "year":
+			delta = yearDiff;
+			break;
+		case "month":
+			delta = (date2.getMonth() - date1.getMonth()) + (yearDiff * 12);
+			break;
+		case "week":
+			// Truncate instead of rounding
+			// Don't use Math.floor -- value may be negative
+			delta = parseInt(dojo.date.difference(date1, date2, "day")/7);
+			break;
+		case "day":
+			delta /= 24;
+			// fallthrough
+		case "hour":
+			delta /= 60;
+			// fallthrough
+		case "minute":
+			delta /= 60;
+			// fallthrough
+		case "second":
+			delta /= 1000;
+			// fallthrough
+		case "millisecond":
+			delta *= date2.getTime() - date1.getTime();
+	}
+
+	// Round for fractional values and DST leaps
+	return Math.round(delta); // Number (integer)
+};
+
+}
+
+if(!dojo._hasResource["dojo.date.locale"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.date.locale"] = true;
+dojo.provide("dojo.date.locale");
+
+// Localization methods for Date.   Honor local customs using locale-dependent dojo.cldr data.
+
+
+
+
+
+
+
+// Load the bundles containing localization information for
+// names and formats
+
+
+//NOTE: Everything in this module assumes Gregorian calendars.
+// Other calendars will be implemented in separate modules.
+
+(function(){
+	// Format a pattern without literals
+	function formatPattern(dateObject, bundle, fullYear, pattern){
+		return pattern.replace(/([a-z])\1*/ig, function(match){
+			var s, pad;
+			var c = match.charAt(0);
+			var l = match.length;
+			var widthList = ["abbr", "wide", "narrow"];
+			switch(c){
+				case 'G':
+					s = bundle[(l < 4) ? "eraAbbr" : "eraNames"][dateObject.getFullYear() < 0 ? 0 : 1];
+					break;
+				case 'y':
+					s = dateObject.getFullYear();
+					switch(l){
+						case 1:
+							break;
+						case 2:
+							if(!fullYear){
+								s = String(s); s = s.substr(s.length - 2);
+								break;
+							}
+							// fallthrough
+						default:
+							pad = true;
+					}
+					break;
+				case 'Q':
+				case 'q':
+					s = Math.ceil((dateObject.getMonth()+1)/3);
+//					switch(l){
+//						case 1: case 2:
+							pad = true;
+//							break;
+//						case 3: case 4: // unimplemented
+//					}
+					break;
+				case 'M':
+				case 'L':
+					var m = dateObject.getMonth();
+					var widthM;
+					switch(l){
+						case 1: case 2:
+							s = m+1; pad = true;
+							break;
+						case 3: case 4: case 5:
+							widthM = widthList[l-3];
+							break;
+					}
+					if(widthM){
+						var typeM = (c == "L") ? "standalone" : "format";
+						var propM = ["months", typeM, widthM].join("-");
+						s = bundle[propM][m];
+					}
+					break;
+				case 'w':
+					var firstDay = 0;
+					s = dojo.date.locale._getWeekOfYear(dateObject, firstDay); pad = true;
+					break;
+				case 'd':
+					s = dateObject.getDate(); pad = true;
+					break;
+				case 'D':
+					s = dojo.date.locale._getDayOfYear(dateObject); pad = true;
+					break;
+				case 'E':
+				case 'e':
+				case 'c': // REVIEW: don't see this in the spec?
+					var d = dateObject.getDay();
+					var widthD;
+					switch(l){
+						case 1: case 2:
+							if(c == 'e'){
+								var first = dojo.cldr.supplemental.getFirstDayOfWeek(options.locale);
+								d = (d-first+7)%7;
+							}
+							if(c != 'c'){
+								s = d+1; pad = true;
+								break;
+							}
+							// else fallthrough...
+						case 3: case 4: case 5:
+							widthD = widthList[l-3];
+							break;
+					}
+					if(widthD){
+						var typeD = (c == "c") ? "standalone" : "format";
+						var propD = ["days", typeD, widthD].join("-");
+						s = bundle[propD][d];
+					}
+					break;
+				case 'a':
+					var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm';
+					s = bundle[timePeriod];
+					break;
+				case 'h':
+				case 'H':
+				case 'K':
+				case 'k':
+					var h = dateObject.getHours();
+					// strange choices in the date format make it impossible to write this succinctly
+					switch (c){
+						case 'h': // 1-12
+							s = (h % 12) || 12;
+							break;
+						case 'H': // 0-23
+							s = h;
+							break;
+						case 'K': // 0-11
+							s = (h % 12);
+							break;
+						case 'k': // 1-24
+							s = h || 24;
+							break;
+					}
+					pad = true;
+					break;
+				case 'm':
+					s = dateObject.getMinutes(); pad = true;
+					break;
+				case 's':
+					s = dateObject.getSeconds(); pad = true;
+					break;
+				case 'S':
+					s = Math.round(dateObject.getMilliseconds() * Math.pow(10, l-3)); pad = true;
+					break;
+				case 'v': // FIXME: don't know what this is. seems to be same as z?
+				case 'z':
+					// We only have one timezone to offer; the one from the browser
+					s = dojo.date.getTimezoneName(dateObject);
+					if(s){break;}
+					l=4;
+					// fallthrough... use GMT if tz not available
+				case 'Z':
+					var offset = dateObject.getTimezoneOffset();
+					var tz = [
+						(offset<=0 ? "+" : "-"),
+						dojo.string.pad(Math.floor(Math.abs(offset)/60), 2),
+						dojo.string.pad(Math.abs(offset)% 60, 2)
+					];
+					if(l==4){
+						tz.splice(0, 0, "GMT");
+						tz.splice(3, 0, ":");
+					}
+					s = tz.join("");
+					break;
+//				case 'Y': case 'u': case 'W': case 'F': case 'g': case 'A':
+//					console.debug(match+" modifier unimplemented");
+				default:
+					throw new Error("dojo.date.locale.format: invalid pattern char: "+pattern);
+			}
+			if(pad){ s = dojo.string.pad(s, l); }
+			return s;
+		});
+	}
+
+/*=====
+	dojo.date.locale.__FormatOptions = function(){
+	//	selector: String
+	//		choice of 'time','date' (default: date and time)
+	//	formatLength: String
+	//		choice of long, short, medium or full (plus any custom additions).  Defaults to 'short'
+	//	datePattern:String
+	//		override pattern with this string
+	//	timePattern:String
+	//		override pattern with this string
+	//	am: String
+	//		override strings for am in times
+	//	pm: String
+	//		override strings for pm in times
+	//	locale: String
+	//		override the locale used to determine formatting rules
+	//	fullYear: Boolean
+	//		(format only) use 4 digit years whenever 2 digit years are called for
+	//	strict: Boolean
+	//		(parse only) strict parsing, off by default
+		this.selector = selector;
+		this.formatLength = formatLength;
+		this.datePattern = datePattern;
+		this.timePattern = timePattern;
+		this.am = am;
+		this.pm = pm;
+		this.locale = locale;
+		this.fullYear = fullYear;
+		this.strict = strict;
+	}
+=====*/
+
+dojo.date.locale.format = function(/*Date*/dateObject, /*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Format a Date object as a String, using locale-specific settings.
+	//
+	// description:
+	//		Create a string from a Date object using a known localized pattern.
+	//		By default, this method formats both date and time from dateObject.
+	//		Formatting patterns are chosen appropriate to the locale.  Different
+	//		formatting lengths may be chosen, with "full" used by default.
+	//		Custom patterns may be used or registered with translations using
+	//		the dojo.date.locale.addCustomFormats method.
+	//		Formatting patterns are implemented using [the syntax described at
+	//		unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
+	//
+	// dateObject:
+	//		the date and/or time to be formatted.  If a time only is formatted,
+	//		the values in the year, month, and day fields are irrelevant.  The
+	//		opposite is true when formatting only dates.
+
+	options = options || {};
+
+	var locale = dojo.i18n.normalizeLocale(options.locale);
+	var formatLength = options.formatLength || 'short';
+	var bundle = dojo.date.locale._getGregorianBundle(locale);
+	var str = [];
+	var sauce = dojo.hitch(this, formatPattern, dateObject, bundle, options.fullYear);
+	if(options.selector == "year"){
+		// Special case as this is not yet driven by CLDR data
+		var year = dateObject.getFullYear();
+		if(locale.match(/^zh|^ja/)){
+			year += "\u5E74";
+		}
+		return year;
+	}
+	if(options.selector != "time"){
+		var datePattern = options.datePattern || bundle["dateFormat-"+formatLength];
+		if(datePattern){str.push(_processPattern(datePattern, sauce));}
+	}
+	if(options.selector != "date"){
+		var timePattern = options.timePattern || bundle["timeFormat-"+formatLength];
+		if(timePattern){str.push(_processPattern(timePattern, sauce));}
+	}
+	var result = str.join(" "); //TODO: use locale-specific pattern to assemble date + time
+	return result; // String
+};
+
+dojo.date.locale.regexp = function(/*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Builds the regular needed to parse a localized date
+
+	return dojo.date.locale._parseInfo(options).regexp; // String
+};
+
+dojo.date.locale._parseInfo = function(/*dojo.date.locale.__FormatOptions?*/options){
+	options = options || {};
+	var locale = dojo.i18n.normalizeLocale(options.locale);
+	var bundle = dojo.date.locale._getGregorianBundle(locale);
+	var formatLength = options.formatLength || 'short';
+	var datePattern = options.datePattern || bundle["dateFormat-" + formatLength];
+	var timePattern = options.timePattern || bundle["timeFormat-" + formatLength];
+	var pattern;
+	if(options.selector == 'date'){
+		pattern = datePattern;
+	}else if(options.selector == 'time'){
+		pattern = timePattern;
+	}else{
+		pattern = datePattern + ' ' + timePattern; //TODO: use locale-specific pattern to assemble date + time
+	}
+
+	var tokens = [];
+	var re = _processPattern(pattern, dojo.hitch(this, _buildDateTimeRE, tokens, bundle, options));
+	return {regexp: re, tokens: tokens, bundle: bundle};
+};
+
+dojo.date.locale.parse = function(/*String*/value, /*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Convert a properly formatted string to a primitive Date object,
+	//		using locale-specific settings.
+	//
+	// description:
+	//		Create a Date object from a string using a known localized pattern.
+	//		By default, this method parses looking for both date and time in the string.
+	//		Formatting patterns are chosen appropriate to the locale.  Different
+	//		formatting lengths may be chosen, with "full" used by default.
+	//		Custom patterns may be used or registered with translations using
+	//		the dojo.date.locale.addCustomFormats method.
+	//	
+	//		Formatting patterns are implemented using [the syntax described at
+	//		unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
+	//		When two digit years are used, a century is chosen according to a sliding 
+	//		window of 80 years before and 20 years after present year, for both `yy` and `yyyy` patterns.
+	//		year < 100CE requires strict mode.
+	//
+	// value:
+	//		A string representation of a date
+
+	var info = dojo.date.locale._parseInfo(options);
+	var tokens = info.tokens, bundle = info.bundle;
+	var re = new RegExp("^" + info.regexp + "$");
+	var match = re.exec(value);
+	if(!match){ return null; } // null
+
+	var widthList = ['abbr', 'wide', 'narrow'];
+	var result = [1970,0,1,0,0,0,0]; // will get converted to a Date at the end
+	var amPm = "";
+	var valid = dojo.every(match, function(v, i){
+		if(!i){return true;}
+		var token=tokens[i-1];
+		var l=token.length;
+		switch(token.charAt(0)){
+			case 'y':
+				if(l != 2 && options.strict){
+					//interpret year literally, so '5' would be 5 A.D.
+					result[0] = v;
+				}else{
+					if(v<100){
+						v = Number(v);
+						//choose century to apply, according to a sliding window
+						//of 80 years before and 20 years after present year
+						var year = '' + new Date().getFullYear();
+						var century = year.substring(0, 2) * 100;
+						var cutoff = Math.min(Number(year.substring(2, 4)) + 20, 99);
+						var num = (v < cutoff) ? century + v : century - 100 + v;
+						result[0] = num;
+					}else{
+						//we expected 2 digits and got more...
+						if(options.strict){
+							return false;
+						}
+						//interpret literally, so '150' would be 150 A.D.
+						//also tolerate '1950', if 'yyyy' input passed to 'yy' format
+						result[0] = v;
+					}
+				}
+				break;
+			case 'M':
+				if(l>2){
+					var months = bundle['months-format-' + widthList[l-3]].concat();
+					if(!options.strict){
+						//Tolerate abbreviating period in month part
+						//Case-insensitive comparison
+						v = v.replace(".","").toLowerCase();
+						months = dojo.map(months, function(s){ return s.replace(".","").toLowerCase(); } );
+					}
+					v = dojo.indexOf(months, v);
+					if(v == -1){
+//						console.debug("dojo.date.locale.parse: Could not parse month name: '" + v + "'.");
+						return false;
+					}
+				}else{
+					v--;
+				}
+				result[1] = v;
+				break;
+			case 'E':
+			case 'e':
+				var days = bundle['days-format-' + widthList[l-3]].concat();
+				if(!options.strict){
+					//Case-insensitive comparison
+					v = v.toLowerCase();
+					days = dojo.map(days, function(d){return d.toLowerCase();});
+				}
+				v = dojo.indexOf(days, v);
+				if(v == -1){
+//					console.debug("dojo.date.locale.parse: Could not parse weekday name: '" + v + "'.");
+					return false;
+				}
+
+				//TODO: not sure what to actually do with this input,
+				//in terms of setting something on the Date obj...?
+				//without more context, can't affect the actual date
+				//TODO: just validate?
+				break;
+			case 'D':
+				result[1] = 0;
+				// fallthrough...
+			case 'd':
+				result[2] = v;
+				break;
+			case 'a': //am/pm
+				var am = options.am || bundle.am;
+				var pm = options.pm || bundle.pm;
+				if(!options.strict){
+					var period = /\./g;
+					v = v.replace(period,'').toLowerCase();
+					am = am.replace(period,'').toLowerCase();
+					pm = pm.replace(period,'').toLowerCase();
+				}
+				if(options.strict && v != am && v != pm){
+//					console.debug("dojo.date.locale.parse: Could not parse am/pm part.");
+					return false;
+				}
+
+				// we might not have seen the hours field yet, so store the state and apply hour change later
+				amPm = (v == pm) ? 'p' : (v == am) ? 'a' : '';
+				break;
+			case 'K': //hour (1-24)
+				if(v == 24){ v = 0; }
+				// fallthrough...
+			case 'h': //hour (1-12)
+			case 'H': //hour (0-23)
+			case 'k': //hour (0-11)
+				//TODO: strict bounds checking, padding
+				if(v > 23){
+//					console.debug("dojo.date.locale.parse: Illegal hours value");
+					return false;
+				}
+
+				//in the 12-hour case, adjusting for am/pm requires the 'a' part
+				//which could come before or after the hour, so we will adjust later
+				result[3] = v;
+				break;
+			case 'm': //minutes
+				result[4] = v;
+				break;
+			case 's': //seconds
+				result[5] = v;
+				break;
+			case 'S': //milliseconds
+				result[6] = v;
+//				break;
+//			case 'w':
+//TODO				var firstDay = 0;
+//			default:
+//TODO: throw?
+//				console.debug("dojo.date.locale.parse: unsupported pattern char=" + token.charAt(0));
+		}
+		return true;
+	});
+
+	var hours = +result[3];
+	if(amPm === 'p' && hours < 12){
+		result[3] = hours + 12; //e.g., 3pm -> 15
+	}else if(amPm === 'a' && hours == 12){
+		result[3] = 0; //12am -> 0
+	}
+
+	//TODO: implement a getWeekday() method in order to test 
+	//validity of input strings containing 'EEE' or 'EEEE'...
+
+	var dateObject = new Date(result[0], result[1], result[2], result[3], result[4], result[5], result[6]); // Date
+	if(options.strict){
+		dateObject.setFullYear(result[0]);
+	}
+
+	// Check for overflow.  The Date() constructor normalizes things like April 32nd...
+	//TODO: why isn't this done for times as well?
+	var allTokens = tokens.join("");
+	if(!valid ||
+		(allTokens.indexOf('M') != -1 && dateObject.getMonth() != result[1]) ||
+		(allTokens.indexOf('d') != -1 && dateObject.getDate() != result[2])){
+		return null;
+	}
+
+	return dateObject; // Date
+};
+
+function _processPattern(pattern, applyPattern, applyLiteral, applyAll){
+	//summary: Process a pattern with literals in it
+
+	// Break up on single quotes, treat every other one as a literal, except '' which becomes '
+	var identity = function(x){return x;};
+	applyPattern = applyPattern || identity;
+	applyLiteral = applyLiteral || identity;
+	applyAll = applyAll || identity;
+
+	//split on single quotes (which escape literals in date format strings) 
+	//but preserve escaped single quotes (e.g., o''clock)
+	var chunks = pattern.match(/(''|[^'])+/g); 
+	var literal = false;
+
+	dojo.forEach(chunks, function(chunk, i){
+		if(!chunk){
+			chunks[i]='';
+		}else{
+			chunks[i]=(literal ? applyLiteral : applyPattern)(chunk);
+			literal = !literal;
+		}
+	});
+	return applyAll(chunks.join(''));
+}
+
+function _buildDateTimeRE(tokens, bundle, options, pattern){
+	pattern = dojo.regexp.escapeString(pattern);
+	if(!options.strict){ pattern = pattern.replace(" a", " ?a"); } // kludge to tolerate no space before am/pm
+	return pattern.replace(/([a-z])\1*/ig, function(match){
+		// Build a simple regexp.  Avoid captures, which would ruin the tokens list
+		var s;
+		var c = match.charAt(0);
+		var l = match.length;
+		var p2 = '', p3 = '';
+		if(options.strict){
+			if(l > 1){ p2 = '0' + '{'+(l-1)+'}'; }
+			if(l > 2){ p3 = '0' + '{'+(l-2)+'}'; }
+		}else{
+			p2 = '0?'; p3 = '0{0,2}';
+		}
+		switch(c){
+			case 'y':
+				s = '\\d{2,4}';
+				break;
+			case 'M':
+				s = (l>2) ? '\\S+' : p2+'[1-9]|1[0-2]';
+				break;
+			case 'D':
+				s = p2+'[1-9]|'+p3+'[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]';
+				break;
+			case 'd':
+				s = p2+'[1-9]|[12]\\d|3[01]';
+				break;
+			case 'w':
+				s = p2+'[1-9]|[1-4][0-9]|5[0-3]';
+				break;
+		    case 'E':
+				s = '\\S+';
+				break;
+			case 'h': //hour (1-12)
+				s = p2+'[1-9]|1[0-2]';
+				break;
+			case 'k': //hour (0-11)
+				s = p2+'\\d|1[01]';
+				break;
+			case 'H': //hour (0-23)
+				s = p2+'\\d|1\\d|2[0-3]';
+				break;
+			case 'K': //hour (1-24)
+				s = p2+'[1-9]|1\\d|2[0-4]';
+				break;
+			case 'm':
+			case 's':
+				s = '[0-5]\\d';
+				break;
+			case 'S':
+				s = '\\d{'+l+'}';
+				break;
+			case 'a':
+				var am = options.am || bundle.am || 'AM';
+				var pm = options.pm || bundle.pm || 'PM';
+				if(options.strict){
+					s = am + '|' + pm;
+				}else{
+					s = am + '|' + pm;
+					if(am != am.toLowerCase()){ s += '|' + am.toLowerCase(); }
+					if(pm != pm.toLowerCase()){ s += '|' + pm.toLowerCase(); }
+				}
+				break;
+			default:
+			// case 'v':
+			// case 'z':
+			// case 'Z':
+				s = ".*";
+//				console.debug("parse of date format, pattern=" + pattern);
+		}
+
+		if(tokens){ tokens.push(match); }
+
+		return "(" + s + ")"; // add capture
+	}).replace(/[\xa0 ]/g, "[\\s\\xa0]"); // normalize whitespace.  Need explicit handling of \xa0 for IE.
+}
+})();
+
+(function(){
+var _customFormats = [];
+dojo.date.locale.addCustomFormats = function(/*String*/packageName, /*String*/bundleName){
+	// summary:
+	//		Add a reference to a bundle containing localized custom formats to be
+	//		used by date/time formatting and parsing routines.
+	//
+	// description:
+	//		The user may add custom localized formats where the bundle has properties following the
+	//		same naming convention used by dojo.cldr: `dateFormat-xxxx` / `timeFormat-xxxx`
+	//		The pattern string should match the format used by the CLDR.
+	//		See dojo.date.locale.format() for details.
+	//		The resources must be loaded by dojo.requireLocalization() prior to use
+
+	_customFormats.push({pkg:packageName,name:bundleName});
+};
+
+dojo.date.locale._getGregorianBundle = function(/*String*/locale){
+	var gregorian = {};
+	dojo.forEach(_customFormats, function(desc){
+		var bundle = dojo.i18n.getLocalization(desc.pkg, desc.name, locale);
+		gregorian = dojo.mixin(gregorian, bundle);
+	}, this);
+	return gregorian; /*Object*/
+};
+})();
+
+dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");
+
+dojo.date.locale.getNames = function(/*String*/item, /*String*/type, /*String?*/use, /*String?*/locale){
+	// summary:
+	//		Used to get localized strings from dojo.cldr for day or month names.
+	//
+	// item:
+	//	'months' || 'days'
+	// type:
+	//	'wide' || 'narrow' || 'abbr' (e.g. "Monday", "Mon", or "M" respectively, in English)
+	// use:
+	//	'standAlone' || 'format' (default)
+	// locale:
+	//	override locale used to find the names
+
+	var label;
+	var lookup = dojo.date.locale._getGregorianBundle(locale);
+	var props = [item, use, type];
+	if(use == 'standAlone'){
+		label = lookup[props.join('-')];
+	}
+	props[1] = 'format';
+
+	// return by copy so changes won't be made accidentally to the in-memory model
+	return (label || lookup[props.join('-')]).concat(); /*Array*/
+};
+
+dojo.date.locale.isWeekend = function(/*Date?*/dateObject, /*String?*/locale){
+	// summary:
+	//	Determines if the date falls on a weekend, according to local custom.
+
+	var weekend = dojo.cldr.supplemental.getWeekend(locale);
+	var day = (dateObject || new Date()).getDay();
+	if(weekend.end < weekend.start){
+		weekend.end += 7;
+		if(day < weekend.start){ day += 7; }
+	}
+	return day >= weekend.start && day <= weekend.end; // Boolean
+};
+
+// These are used only by format and strftime.  Do they need to be public?  Which module should they go in?
+
+dojo.date.locale._getDayOfYear = function(/*Date*/dateObject){
+	// summary: gets the day of the year as represented by dateObject
+	return dojo.date.difference(new Date(dateObject.getFullYear(), 0, 1), dateObject) + 1; // Number
+};
+
+dojo.date.locale._getWeekOfYear = function(/*Date*/dateObject, /*Number*/firstDayOfWeek){
+	if(arguments.length == 1){ firstDayOfWeek = 0; } // Sunday
+
+	var firstDayOfYear = new Date(dateObject.getFullYear(), 0, 1).getDay();
+	var adj = (firstDayOfYear - firstDayOfWeek + 7) % 7;
+	var week = Math.floor((dojo.date.locale._getDayOfYear(dateObject) + adj - 1) / 7);
+
+	// if year starts on the specified day, start counting weeks at 1
+	if(firstDayOfYear == firstDayOfWeek){ week++; }
+
+	return week; // Number
+};
+
+}
+
+if(!dojo._hasResource["dijit._Calendar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Calendar"] = true;
+dojo.provide("dijit._Calendar");
+
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit._Calendar",
+	[dijit._Widget, dijit._Templated],
+	{
+	//	
+	//	summary:
+	//		A simple GUI for choosing a date in the context of a monthly calendar.
+	//
+	//	description:
+	//		A simple GUI for choosing a date in the context of a monthly calendar.
+	//		This widget is used internally by other widgets and is not accessible
+	//		as a standalone widget.
+	//		This widget can't be used in a form because it doesn't serialize the date to an
+	//		`<input>` field.  For a form element, use dijit.form.DateTextBox instead.
+	//
+	//		Note that the parser takes all dates attributes passed in the
+	//		[RFC 3339 format](http://www.faqs.org/rfcs/rfc3339.html), e.g. `2005-06-30T08:05:00-07:00`
+	//		so that they are serializable and locale-independent.
+	//
+	//	example:
+	//	|	var calendar = new dijit._Calendar({}, dojo.byId("calendarNode"));
+	//
+	//	example:
+	//	|	<div dojoType="dijit._Calendar"></div>
+	//	
+		templateString:"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarDecrease\"><span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner\">-</span></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitCalendarMonthLabelSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel\"></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarIncrease\"><span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner\">+</span></div>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\"><span class=\"dijitCalendarDateLabel\"></span></td>\n\t\t</tr>\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\">\n\t\t\t\t<h3 class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span dojoAttachPoint=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\"></span>\n\t\t\t\t</h3>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\t\n",
+
+		// value: Date
+		// 	the currently selected Date
+		value: new Date(),
+
+		// dayWidth: String
+		// 	How to represent the days of the week in the calendar header. See dojo.date.locale
+		dayWidth: "narrow",
+
+		setValue: function(/*Date*/ value){
+			// summary: set the current date and update the UI.  If the date is disabled, the selection will
+			//	not change, but the display will change to the corresponding month.
+			if(!this.value || dojo.date.compare(value, this.value)){
+				value = new Date(value);
+				this.displayMonth = new Date(value);
+				if(!this.isDisabledDate(value, this.lang)){
+					this.value = value;
+					this.value.setHours(0,0,0,0);
+					this.onChange(this.value);
+				}
+				this._populateGrid();
+			}
+		},
+
+		_setText: function(node, text){
+			while(node.firstChild){
+				node.removeChild(node.firstChild);
+			}
+			node.appendChild(dojo.doc.createTextNode(text));
+		},
+
+		_populateGrid: function(){
+			var month = this.displayMonth;
+			month.setDate(1);
+			var firstDay = month.getDay();
+			var daysInMonth = dojo.date.getDaysInMonth(month);
+			var daysInPreviousMonth = dojo.date.getDaysInMonth(dojo.date.add(month, "month", -1));
+			var today = new Date();
+			var selected = this.value;
+
+			var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+			if(dayOffset > firstDay){ dayOffset -= 7; }
+
+			// Iterate through dates in the calendar and fill in date numbers and style info
+			dojo.query(".dijitCalendarDateTemplate", this.domNode).forEach(function(template, i){
+				i += dayOffset;
+				var date = new Date(month);
+				var number, clazz = "dijitCalendar", adj = 0;
+
+				if(i < firstDay){
+					number = daysInPreviousMonth - firstDay + i + 1;
+					adj = -1;
+					clazz += "Previous";
+				}else if(i >= (firstDay + daysInMonth)){
+					number = i - firstDay - daysInMonth + 1;
+					adj = 1;
+					clazz += "Next";
+				}else{
+					number = i - firstDay + 1;
+					clazz += "Current";
+				}
+
+				if(adj){
+					date = dojo.date.add(date, "month", adj);
+				}
+				date.setDate(number);
+
+				if(!dojo.date.compare(date, today, "date")){
+					clazz = "dijitCalendarCurrentDate " + clazz;
+				}
+
+				if(!dojo.date.compare(date, selected, "date")){
+					clazz = "dijitCalendarSelectedDate " + clazz;
+				}
+
+				if(this.isDisabledDate(date, this.lang)){
+					clazz = "dijitCalendarDisabledDate " + clazz;
+				}
+
+				var clazz2 = this.getClassForDate(date, this.lang);
+				if(clazz2){
+					clazz += clazz2 + " " + clazz;
+				}
+
+				template.className =  clazz + "Month dijitCalendarDateTemplate";
+				template.dijitDateValue = date.valueOf();
+				var label = dojo.query(".dijitCalendarDateLabel", template)[0];
+				this._setText(label, date.getDate());
+			}, this);
+
+			// Fill in localized month name
+			var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
+			this._setText(this.monthLabelNode, monthNames[month.getMonth()]);
+
+			// Fill in localized prev/current/next years
+			var y = month.getFullYear() - 1;
+			var d = new Date();
+			dojo.forEach(["previous", "current", "next"], function(name){
+				d.setFullYear(y++);
+				this._setText(this[name+"YearLabelNode"],
+					dojo.date.locale.format(d, {selector:'year', locale:this.lang}));
+			}, this);
+
+			// Set up repeating mouse behavior
+			var _this = this;
+			var typematic = function(nodeProp, dateProp, adj){
+				dijit.typematic.addMouseListener(_this[nodeProp], _this, function(count){
+					if(count >= 0){ _this._adjustDisplay(dateProp, adj); }
+				}, 0.8, 500);
+			};
+			typematic("incrementMonth", "month", 1);
+			typematic("decrementMonth", "month", -1);
+			typematic("nextYearLabelNode", "year", 1);
+			typematic("previousYearLabelNode", "year", -1);
+		},
+
+		goToToday: function(){
+			this.setValue(new Date());
+		},
+
+		postCreate: function(){
+			this.inherited(arguments);
+			
+			var cloneClass = dojo.hitch(this, function(clazz, n){
+				var template = dojo.query(clazz, this.domNode)[0];
+	 			for(var i=0; i<n; i++){
+					template.parentNode.appendChild(template.cloneNode(true));
+				}
+			});
+
+			// clone the day label and calendar day templates 6 times to make 7 columns
+			cloneClass(".dijitCalendarDayLabelTemplate", 6);
+			cloneClass(".dijitCalendarDateTemplate", 6);
+
+			// now make 6 week rows
+			cloneClass(".dijitCalendarWeekTemplate", 5);
+
+			// insert localized day names in the header
+			var dayNames = dojo.date.locale.getNames('days', this.dayWidth, 'standAlone', this.lang);
+			var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+			dojo.query(".dijitCalendarDayLabel", this.domNode).forEach(function(label, i){
+				this._setText(label, dayNames[(i + dayOffset) % 7]);
+			}, this);
+
+			// Fill in spacer element with all the month names (invisible) so that the maximum width will affect layout
+			var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
+			dojo.forEach(monthNames, function(name){
+				var monthSpacer = dojo.doc.createElement("div");
+				this._setText(monthSpacer, name);
+				this.monthLabelSpacer.appendChild(monthSpacer);
+			}, this);
+
+			this.value = null;
+			this.setValue(new Date());
+		},
+
+		_adjustDisplay: function(/*String*/part, /*int*/amount){
+			this.displayMonth = dojo.date.add(this.displayMonth, part, amount);
+			this._populateGrid();
+		},
+
+		_onDayClick: function(/*Event*/evt){
+			var node = evt.target;
+			dojo.stopEvent(evt);
+			while(!node.dijitDateValue){
+				node = node.parentNode;
+			}
+			if(!dojo.hasClass(node, "dijitCalendarDisabledDate")){
+				this.setValue(node.dijitDateValue);
+				this.onValueSelected(this.value);
+			}
+		},
+
+		onValueSelected: function(/*Date*/date){
+			// summary: a date cell was selected.  It may be the same as the previous value.
+		},
+
+		onChange: function(/*Date*/date){
+			// summary: called only when the selected date has changed
+		},
+
+		isDisabledDate: function(/*Date*/dateObject, /*String?*/locale){
+			// summary:
+			//	May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+/*=====
+			return false; // Boolean
+=====*/
+		},
+
+		getClassForDate: function(/*Date*/dateObject, /*String?*/locale){
+			// summary:
+			//  May be overridden to return CSS classes to associate with the date entry for the given dateObject,
+			//  for example to indicate a holiday in specified locale.
+
+/*=====
+			return ""; // String
+=====*/
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form._DateTimeTextBox"] = true;
+dojo.provide("dijit.form._DateTimeTextBox");
+
+
+
+
+
+
+/*=====
+dojo.declare(
+	"dijit.form._DateTimeTextBox.__Constraints",
+	[dijit.form.RangeBoundTextBox.__Constraints, dojo.date.locale.__FormatOptions]
+);
+=====*/
+
+dojo.declare(
+	"dijit.form._DateTimeTextBox",
+	dijit.form.RangeBoundTextBox,
+	{
+		// summary:
+		//		A validating, serializable, range-bound date or time text box.
+		//
+		// constraints: dijit.form._DateTimeTextBox.__Constraints 
+
+		/*=====
+		constraints: {},
+		======*/
+		regExpGen: dojo.date.locale.regexp,
+		compare: dojo.date.compare,
+		format: function(/*Date*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+			//	summary: formats the value as a Date, according to constraints
+			if(!value){ return ''; }
+			return dojo.date.locale.format(value, constraints);
+		},
+		parse: function(/*String*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+			//	summary: parses the value as a Date, according to constraints
+			return dojo.date.locale.parse(value, constraints) || undefined; /* can't return null to getValue since that's special */
+		},
+
+		serialize: dojo.date.stamp.toISOString,
+
+		//	value: Date
+		//		The value of this widget as a JavaScript Date object.  Use `getValue`/`setValue` to manipulate.
+		//		When passed to the parser in markup, must be specified according to `dojo.date.stamp.fromISOString`
+		value: new Date(""),	// value.toString()="NaN"
+
+		//	popupClass: String
+		//		Name of the popup widget class used to select a date/time
+		popupClass: "", // default is no popup = text only
+		_selector: "",
+
+		postMixInProperties: function(){
+			//dijit.form.RangeBoundTextBox.prototype.postMixInProperties.apply(this, arguments);
+			this.inherited(arguments);
+			if(!this.value || this.value.toString() == dijit.form._DateTimeTextBox.prototype.value.toString()){
+				this.value = undefined;
+			}
+			var constraints = this.constraints;
+			constraints.selector = this._selector;
+			constraints.fullYear = true; // see #5465 - always format with 4-digit years
+			var fromISO = dojo.date.stamp.fromISOString;
+			if(typeof constraints.min == "string"){ constraints.min = fromISO(constraints.min); }
+ 			if(typeof constraints.max == "string"){ constraints.max = fromISO(constraints.max); }
+		},
+
+		_onFocus: function(/*Event*/ evt){
+			// summary: open the TimePicker popup
+			this._open();
+		},
+
+		setValue: function(/*Date*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+			// summary:
+			//	Sets the date on this textbox.  Note that `value` must be a Javascript Date object.
+			this.inherited(arguments);
+			if(this._picker){
+				// #3948: fix blank date on popup only
+				if(!value){value=new Date();}
+				this._picker.setValue(value);
+			}
+		},
+
+		_open: function(){
+			// summary:
+			//	opens the TimePicker, and sets the onValueSelected value
+
+			if(this.disabled || this.readOnly || !this.popupClass){return;}
+
+			var textBox = this;
+
+			if(!this._picker){
+				var PopupProto=dojo.getObject(this.popupClass, false);
+				this._picker = new PopupProto({
+					onValueSelected: function(value){
+
+						textBox.focus(); // focus the textbox before the popup closes to avoid reopening the popup
+						setTimeout(dojo.hitch(textBox, "_close"), 1); // allow focus time to take
+
+						// this will cause InlineEditBox and other handlers to do stuff so make sure it's last
+						dijit.form._DateTimeTextBox.superclass.setValue.call(textBox, value, true);
+					},
+					lang: textBox.lang,
+					constraints: textBox.constraints,
+					isDisabledDate: function(/*Date*/ date){
+						// summary:
+						// 	disables dates outside of the min/max of the _DateTimeTextBox
+						var compare = dojo.date.compare;
+						var constraints = textBox.constraints;
+						return constraints && (constraints.min && (compare(constraints.min, date, "date") > 0) || 
+							(constraints.max && compare(constraints.max, date, "date") < 0));
+					}
+				});
+				this._picker.setValue(this.getValue() || new Date());
+			}
+			if(!this._opened){
+				dijit.popup.open({
+					parent: this,
+					popup: this._picker,
+					around: this.domNode,
+					onCancel: dojo.hitch(this, this._close),
+					onClose: function(){ textBox._opened=false; }
+				});
+				this._opened=true;
+			}
+			
+			dojo.marginBox(this._picker.domNode,{ w:this.domNode.offsetWidth });
+		},
+
+		_close: function(){
+			if(this._opened){
+				dijit.popup.close(this._picker);
+				this._opened=false;
+			}			
+		},
+
+		_onBlur: function(){
+			// summary: called magically when focus has shifted away from this widget and it's dropdown
+			this._close();
+			if(this._picker){
+				// teardown so that constraints will be rebuilt next time (redundant reference: #6002)
+				this._picker.destroy();
+				delete this._picker;
+			}
+			this.inherited(arguments);
+			// don't focus on <input>.  the user has explicitly focused on something else.
+		},
+
+		getDisplayedValue:function(){
+			return this.textbox.value;
+		},
+
+		setDisplayedValue:function(/*String*/ value, /*Boolean?*/ priorityChange){
+			this.setValue(this.parse(value, this.constraints), priorityChange, value);
+		},
+
+		destroy: function(){
+			if(this._picker){
+				this._picker.destroy();
+				delete this._picker;
+			}
+			this.inherited(arguments);
+		},
+
+		_onKeyPress: function(/*Event*/e){
+			if(dijit.form._DateTimeTextBox.superclass._onKeyPress.apply(this, arguments)){
+				if(this._opened && e.keyCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+					this._close();
+					dojo.stopEvent(e);
+				}
+			}
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.form.DateTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.DateTextBox"] = true;
+dojo.provide("dijit.form.DateTextBox");
+
+
+
+
+dojo.declare(
+	"dijit.form.DateTextBox",
+	dijit.form._DateTimeTextBox,
+	{
+		// summary:
+		//		A validating, serializable, range-bound date text box with a popup calendar
+
+		popupClass: "dijit._Calendar",
+		_selector: "date"
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.form.FilteringSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.FilteringSelect"] = true;
+dojo.provide("dijit.form.FilteringSelect");
+
+
+
+dojo.declare(
+	"dijit.form.FilteringSelect",
+	[dijit.form.MappedTextBox, dijit.form.ComboBoxMixin],
+	{
+		// summary
+		// An enhanced version of the HTML SELECT tag, populated dynamically
+		//
+		// description
+		// An enhanced version of the HTML SELECT tag, populated dynamically. It works
+		// very nicely with very large data sets because it can load and page data as needed.
+		// It also resembles ComboBox, but does not allow values outside of the provided ones.
+		//  
+		// Similar features:
+		//  - There is a drop down list of possible values.
+		//	- You can only enter a value from the drop down list.  (You can't
+		//	  enter an arbitrary value.)
+		//	- The value submitted with the form is the hidden value (ex: CA),
+		//	  not the displayed value a.k.a. label (ex: California)
+		// 
+		//	Enhancements over plain HTML version:
+		//	- If you type in some text then it will filter down the list of
+		//	  possible values in the drop down list.
+		//	- List can be specified either as a static list or via a javascript
+		//	  function (that can get the list from a server)
+		//
+		// searchAttr: String
+		//		Searches pattern match against this field
+		//
+		// labelAttr: String
+		//		Optional.  The text that actually appears in the drop down.
+		//		If not specified, the searchAttr text is used instead.
+		labelAttr: "",
+
+		// labelType: String
+		//		"html" or "text"
+		labelType: "text",
+
+		_isvalid:true,
+
+		_lastDisplayedValue: "",
+
+		isValid:function(){
+			return this._isvalid;
+		},
+
+		_callbackSetLabel: function(	/*Array*/ result, 
+						/*Object*/ dataObject, 
+						/*Boolean?*/ priorityChange){
+			// summary:
+			//		Callback function that dynamically sets the label of the
+			//		ComboBox
+
+			// setValue does a synchronous lookup,
+			// so it calls _callbackSetLabel directly,
+			// and so does not pass dataObject
+			// dataObject==null means do not test the lastQuery, just continue
+			if(dataObject && dataObject.query[this.searchAttr] != this._lastQuery){
+				return;
+			}
+			if(!result.length){
+				//#3268: do nothing on bad input
+				//this._setValue("", "");
+				//#3285: change CSS to indicate error
+				if(!this._focused){ this.valueNode.value=""; }
+				dijit.form.TextBox.superclass.setValue.call(this, undefined, !this._focused);
+				this._isvalid=false;
+				this.validate(this._focused);
+			}else{
+				this._setValueFromItem(result[0], priorityChange);
+			}
+		},
+
+		_openResultList: function(/*Object*/ results, /*Object*/ dataObject){
+			// #3285: tap into search callback to see if user's query resembles a match
+			if(dataObject.query[this.searchAttr] != this._lastQuery){
+				return;
+			}
+			this._isvalid = results.length != 0; // FIXME: should this be greater-than?
+			this.validate(true);
+			dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments);
+		},
+
+		getValue:function(){
+			// don't get the textbox value but rather the previously set hidden value
+			return this.valueNode.value;
+		},
+
+		_getValueField:function(){
+			// used for option tag selects
+			return "value";
+		},
+
+		_setValue:function(	/*String*/ value, 
+					/*String*/ displayedValue, 
+					/*Boolean?*/ priorityChange){
+			this.valueNode.value = value;
+			dijit.form.FilteringSelect.superclass.setValue.call(this, value, priorityChange, displayedValue);
+			this._lastDisplayedValue = displayedValue;
+		},
+
+		setValue: function(/*String*/ value, /*Boolean?*/ priorityChange){
+			// summary
+			//	Sets the value of the select.
+			//	Also sets the label to the corresponding value by reverse lookup.
+
+			//#3347: fetchItemByIdentity if no keyAttr specified
+			var self=this;
+			var handleFetchByIdentity = function(item, priorityChange){
+				if(item){
+					if(self.store.isItemLoaded(item)){
+						self._callbackSetLabel([item], undefined, priorityChange);
+					}else{
+						self.store.loadItem({
+							item: item, 
+							onItem: function(result, dataObject){
+								self._callbackSetLabel(result, dataObject, priorityChange);
+							}
+						});
+					}
+				}else{
+					self._isvalid=false;
+					// prevent errors from Tooltip not being created yet
+					self.validate(false);
+				}
+			}
+			this.store.fetchItemByIdentity({
+				identity: value, 
+				onItem: function(item){
+					handleFetchByIdentity(item, priorityChange);
+				}
+			});
+		},
+
+		_setValueFromItem: function(/*item*/ item, /*Boolean?*/ priorityChange){
+			//	summary:
+			//		Set the displayed valued in the input box, based on a
+			//		selected item.
+			//	description:
+			//		Users shouldn't call this function; they should be calling
+			//		setDisplayedValue() instead
+			this._isvalid=true;
+			this._setValue(	this.store.getIdentity(item), 
+							this.labelFunc(item, this.store), 
+							priorityChange);
+		},
+
+		labelFunc: function(/*item*/ item, /*dojo.data.store*/ store){
+			// summary: Event handler called when the label changes
+			// return: the label that the ComboBox should display
+			return store.getValue(item, this.searchAttr);
+		},
+
+		_doSelect: function(/*Event*/ tgt){
+			// summary:
+			//		ComboBox's menu callback function
+			//	description:
+			//		FilteringSelect overrides this to set both the visible and
+			//		hidden value from the information stored in the menu
+			this.item = tgt.item;
+			this._setValueFromItem(tgt.item, true);
+		},
+
+		setDisplayedValue:function(/*String*/ label, /*Boolean?*/ priorityChange){
+			// summary:
+			//		Set textbox to display label. Also performs reverse lookup
+			//		to set the hidden value. Used in InlineEditBox
+
+			if(this.store){
+				var query = dojo.clone(this.query); // #6196: populate query with user-specifics
+				this._lastQuery = query[this.searchAttr] = label;
+				// if the label is not valid, the callback will never set it,
+				// so the last valid value will get the warning textbox set the
+				// textbox value now so that the impending warning will make
+				// sense to the user
+				this.textbox.value = label;
+				this._lastDisplayedValue = label;
+				var _this = this;
+				this.store.fetch({
+					query: query, 
+					queryOptions: {
+						ignoreCase: this.ignoreCase, 
+						deep: true
+					}, 
+					onComplete: function(result, dataObject){
+						        dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange);
+					},
+					onError: function(errText){
+						console.error('dijit.form.FilteringSelect: ' + errText);
+						dojo.hitch(_this, "_setValue")(undefined, label, false);
+					}
+				});
+			}
+		},
+
+		_getMenuLabelFromItem:function(/*Item*/ item){
+			// internal function to help ComboBoxMenu figure out what to display
+			if(this.labelAttr){
+				return {
+					html: this.labelType=="html", 
+					label: this.store.getValue(item, this.labelAttr)
+				};
+			}else{
+				// because this function is called by ComboBoxMenu,
+				// this.inherited tries to find the superclass of ComboBoxMenu
+				return dijit.form.ComboBoxMixin.prototype._getMenuLabelFromItem.apply(this, arguments);
+			}
+		},
+
+		postMixInProperties: function(){
+			// FIXME: shouldn't this just be a call to inherited?
+			dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this, arguments);
+			dijit.form.MappedTextBox.prototype.postMixInProperties.apply(this, arguments);
+		},
+
+		postCreate: function(){
+			dijit.form.ComboBoxMixin.prototype._postCreate.apply(this, arguments);
+			dijit.form.MappedTextBox.prototype.postCreate.apply(this, arguments);
+		},
+		
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			dijit.form.MappedTextBox.prototype.setAttribute.apply(this, arguments);
+			dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this, arguments);
+		},
+
+		undo: function(){
+			this.setDisplayedValue(this._lastDisplayedValue);
+		},
+
+		_valueChanged: function(){
+			return this.getDisplayedValue()!=this._lastDisplayedValue;
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.form._Spinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form._Spinner"] = true;
+dojo.provide("dijit.form._Spinner");
+
+
+
+dojo.declare(
+	"dijit.form._Spinner",
+	dijit.form.RangeBoundTextBox,
+	{
+
+		// summary: Mixin for validation widgets with a spinner
+		// description: This class basically (conceptually) extends dijit.form.ValidationTextBox.
+		//	It modifies the template to have up/down arrows, and provides related handling code.
+
+		// defaultTimeout: Number
+		//	  number of milliseconds before a held key or button becomes typematic
+		defaultTimeout: 500,
+
+		// timeoutChangeRate: Number
+		//	  fraction of time used to change the typematic timer between events
+		//	  1.0 means that each typematic event fires at defaultTimeout intervals
+		//	  < 1.0 means that each typematic event fires at an increasing faster rate
+		timeoutChangeRate: 0.90,
+
+		// smallDelta: Number
+		//	  adjust the value by this much when spinning using the arrow keys/buttons
+		smallDelta: 1,
+		// largeDelta: Number
+		//	  adjust the value by this much when spinning using the PgUp/Dn keys
+		largeDelta: 10,
+
+		templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div class=\"dijitInputLayoutContainer\"\n\t\t><div class=\"dijitReset dijitSpinnerButtonContainer\"\n\t\t\t>&nbsp;<div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"UpArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div\n\t\t\t></div\n\t\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"downArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"DownArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t\t></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class='dijitReset' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onfocus:_update,onkeyup:_onkeyup,onkeypress:_onKeyPress\"\n\t\t\t\twaiRole=\"spinbutton\" autocomplete=\"off\" name=\"${name}\"\n\t\t/></div\n\t></div\n></div>\n",
+		baseClass: "dijitSpinner",
+
+		adjust: function(/* Object */ val, /*Number*/ delta){
+			// summary: user replaceable function used to adjust a primitive value(Number/Date/...) by the delta amount specified
+			// the val is adjusted in a way that makes sense to the object type
+			return val;
+		},
+
+		_arrowState: function(/*Node*/ node, /*Boolean*/ pressed){
+			this._active = pressed;
+			this.stateModifier = node.getAttribute("stateModifier") || "";
+			this._setStateClass();
+		},
+
+		_arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction){
+			if(this.disabled || this.readOnly){ return; }
+			this._arrowState(nodePressed, true);
+			this.setValue(this.adjust(this.getValue(), direction*this.smallDelta), false);
+			dijit.selectInputText(this.textbox, this.textbox.value.length);
+		},
+
+		_arrowReleased: function(/*Node*/ node){
+			this._wheelTimer = null;
+			if(this.disabled || this.readOnly){ return; }
+			this._arrowState(node, false);
+		},
+
+		_typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){
+			if(node == this.textbox){ node = (evt.keyCode == dojo.keys.UP_ARROW) ? this.upArrowNode : this.downArrowNode; }
+			if(count == -1){ this._arrowReleased(node); }
+			else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1); }
+		},
+
+		_wheelTimer: null,
+		_mouseWheeled: function(/*Event*/ evt){
+			dojo.stopEvent(evt);
+			var scrollAmount = 0;
+			if(typeof evt.wheelDelta == 'number'){ // IE
+				scrollAmount = evt.wheelDelta;
+			}else if(typeof evt.detail == 'number'){ // Mozilla+Firefox
+				scrollAmount = -evt.detail;
+			}
+			var node, dir;
+			if(scrollAmount > 0){
+				node = this.upArrowNode;
+				dir = +1;
+			}else if(scrollAmount < 0){
+				node = this.downArrowNode;
+				dir = -1;
+			}else{ return; }
+			this._arrowPressed(node, dir);
+			if(this._wheelTimer != null){
+				clearTimeout(this._wheelTimer);
+			}
+			var _this = this;
+			this._wheelTimer = setTimeout(function(){_this._arrowReleased(node);}, 50);
+		},
+
+		postCreate: function(){
+			this.inherited('postCreate', arguments);
+
+			// extra listeners
+			this.connect(this.textbox, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+			this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {keyCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+			this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {keyCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+			if(dojo.isIE){
+				// When spinner is moved from hidden to visible, call _setStateClass to remind IE to render it. (#6123)
+				var _this = this;
+				this.connect(this.domNode, "onresize", 
+					function(){ setTimeout(dojo.hitch(_this,
+						function(){
+							// cause the IE expressions to rerun
+							this.upArrowNode.style.behavior = '';
+							this.downArrowNode.style.behavior = '';
+							// cause IE to rerender
+							this._setStateClass();
+						}), 0);
+					}
+				);
+			}
+		}
+});
+
+}
+
+if(!dojo._hasResource["dijit.form.NumberSpinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.NumberSpinner"] = true;
+dojo.provide("dijit.form.NumberSpinner");
+
+
+
+
+dojo.declare(
+"dijit.form.NumberSpinner",
+[dijit.form._Spinner, dijit.form.NumberTextBoxMixin],
+{
+	// summary:
+	// extends NumberTextBox to add up/down arrows for incremental change to the value
+
+	required: true,
+
+	adjust: function(/* Object */ val, /*Number*/ delta){
+		// summary: change Number val by the given amount
+		var newval = val+delta;
+		if(isNaN(val) || isNaN(newval)){ return val; }
+		if((typeof this.constraints.max == "number") && (newval > this.constraints.max)){
+			newval = this.constraints.max;
+		}
+		if((typeof this.constraints.min == "number") && (newval < this.constraints.min)){
+			newval = this.constraints.min;
+		}
+		return newval;
+	}
+});
+
+}
+
+if(!dojo._hasResource["dojo.dnd.move"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.move"] = true;
+dojo.provide("dojo.dnd.move");
+
+
+
+
+dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
+	// object attributes (for markup)
+	constraints: function(){},
+	within: false,
+	
+	// markup methods
+	markupFactory: function(params, node){
+		return new dojo.dnd.move.constrainedMoveable(node, params);
+	},
+
+	constructor: function(node, params){
+		// summary: an object, which makes a node moveable
+		// node: Node: a node (or node's id) to be moved
+		// params: Object: an optional object with additional parameters;
+		//	following parameters are recognized:
+		//		constraints: Function: a function, which calculates a constraint box,
+		//			it is called in a context of the moveable object.
+		//		within: Boolean: restrict move within boundaries.
+		//	the rest is passed to the base class
+		if(!params){ params = {}; }
+		this.constraints = params.constraints;
+		this.within = params.within;
+	},
+	onFirstMove: function(/* dojo.dnd.Mover */ mover){
+		// summary: called during the very first move notification,
+		//	can be used to initialize coordinates, can be overwritten.
+		var c = this.constraintBox = this.constraints.call(this, mover);
+		c.r = c.l + c.w;
+		c.b = c.t + c.h;
+		if(this.within){
+			var mb = dojo.marginBox(mover.node);
+			c.r -= mb.w;
+			c.b -= mb.h;
+		}
+	},
+	onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+		// summary: called during every move notification,
+		//	should actually move the node, can be overwritten.
+		var c = this.constraintBox, s = mover.node.style;
+		s.left = (leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l) + "px";
+		s.top  = (leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t) + "px";
+	}
+});
+
+dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
+	// object attributes (for markup)
+	box: {},
+	
+	// markup methods
+	markupFactory: function(params, node){
+		return new dojo.dnd.move.boxConstrainedMoveable(node, params);
+	},
+
+	constructor: function(node, params){
+		// summary: an object, which makes a node moveable
+		// node: Node: a node (or node's id) to be moved
+		// params: Object: an optional object with additional parameters;
+		//	following parameters are recognized:
+		//		box: Object: a constraint box
+		//	the rest is passed to the base class
+		var box = params && params.box;
+		this.constraints = function(){ return box; };
+	}
+});
+
+dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
+	// object attributes (for markup)
+	area: "content",
+
+	// markup methods
+	markupFactory: function(params, node){
+		return new dojo.dnd.move.parentConstrainedMoveable(node, params);
+	},
+
+	constructor: function(node, params){
+		// summary: an object, which makes a node moveable
+		// node: Node: a node (or node's id) to be moved
+		// params: Object: an optional object with additional parameters;
+		//	following parameters are recognized:
+		//		area: String: a parent's area to restrict the move,
+		//			can be "margin", "border", "padding", or "content".
+		//	the rest is passed to the base class
+		var area = params && params.area;
+		this.constraints = function(){
+			var n = this.node.parentNode, 
+				s = dojo.getComputedStyle(n), 
+				mb = dojo._getMarginBox(n, s);
+			if(area == "margin"){
+				return mb;	// Object
+			}
+			var t = dojo._getMarginExtents(n, s);
+			mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+			if(area == "border"){
+				return mb;	// Object
+			}
+			t = dojo._getBorderExtents(n, s);
+			mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+			if(area == "padding"){
+				return mb;	// Object
+			}
+			t = dojo._getPadExtents(n, s);
+			mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+			return mb;	// Object
+		};
+	}
+});
+
+// WARNING: below are obsolete objects, instead of custom movers use custom moveables (above)
+
+dojo.dnd.move.constrainedMover = function(fun, within){
+	// summary: returns a constrained version of dojo.dnd.Mover
+	// description: this function produces n object, which will put a constraint on 
+	//	the margin box of dragged object in absolute coordinates
+	// fun: Function: called on drag, and returns a constraint box
+	// within: Boolean: if true, constraints the whole dragged object withtin the rectangle, 
+	//	otherwise the constraint is applied to the left-top corner
+	dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");
+	var mover = function(node, e, notifier){
+		dojo.dnd.Mover.call(this, node, e, notifier);
+	};
+	dojo.extend(mover, dojo.dnd.Mover.prototype);
+	dojo.extend(mover, {
+		onMouseMove: function(e){
+			// summary: event processor for onmousemove
+			// e: Event: mouse event
+			dojo.dnd.autoScroll(e);
+			var m = this.marginBox, c = this.constraintBox,
+				l = m.l + e.pageX, t = m.t + e.pageY;
+			l = l < c.l ? c.l : c.r < l ? c.r : l;
+			t = t < c.t ? c.t : c.b < t ? c.b : t;
+			this.host.onMove(this, {l: l, t: t});
+		},
+		onFirstMove: function(){
+			// summary: called once to initialize things; it is meant to be called only once
+			dojo.dnd.Mover.prototype.onFirstMove.call(this);
+			var c = this.constraintBox = fun.call(this);
+			c.r = c.l + c.w;
+			c.b = c.t + c.h;
+			if(within){
+				var mb = dojo.marginBox(this.node);
+				c.r -= mb.w;
+				c.b -= mb.h;
+			}
+		}
+	});
+	return mover;	// Object
+};
+
+dojo.dnd.move.boxConstrainedMover = function(box, within){
+	// summary: a specialization of dojo.dnd.constrainedMover, which constrains to the specified box
+	// box: Object: a constraint box (l, t, w, h)
+	// within: Boolean: if true, constraints the whole dragged object withtin the rectangle, 
+	//	otherwise the constraint is applied to the left-top corner
+	dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");
+	return dojo.dnd.move.constrainedMover(function(){ return box; }, within);	// Object
+};
+
+dojo.dnd.move.parentConstrainedMover = function(area, within){
+	// summary: a specialization of dojo.dnd.constrainedMover, which constrains to the parent node
+	// area: String: "margin" to constrain within the parent's margin box, "border" for the border box,
+	//	"padding" for the padding box, and "content" for the content box; "content" is the default value.
+	// within: Boolean: if true, constraints the whole dragged object withtin the rectangle, 
+	//	otherwise the constraint is applied to the left-top corner
+	dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");
+	var fun = function(){
+		var n = this.node.parentNode, 
+			s = dojo.getComputedStyle(n), 
+			mb = dojo._getMarginBox(n, s);
+		if(area == "margin"){
+			return mb;	// Object
+		}
+		var t = dojo._getMarginExtents(n, s);
+		mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+		if(area == "border"){
+			return mb;	// Object
+		}
+		t = dojo._getBorderExtents(n, s);
+		mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+		if(area == "padding"){
+			return mb;	// Object
+		}
+		t = dojo._getPadExtents(n, s);
+		mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+		return mb;	// Object
+	};
+	return dojo.dnd.move.constrainedMover(fun, within);	// Object
+};
+
+// patching functions one level up for compatibility
+
+dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover;
+dojo.dnd.boxConstrainedMover = dojo.dnd.move.boxConstrainedMover;
+dojo.dnd.parentConstrainedMover = dojo.dnd.move.parentConstrainedMover;
+
+}
+
+if(!dojo._hasResource["dijit.form.Slider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Slider"] = true;
+dojo.provide("dijit.form.Slider");
+
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit.form.HorizontalSlider",
+	[dijit.form._FormValueWidget, dijit._Container],
+{
+	// summary
+	//	A form widget that allows one to select a value with a horizontally draggable image
+
+	templateString:"<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"decrementButton\" dojoAttachEvent=\"onclick: decrement\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper dijitSliderLeftBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><div waiRole=\"presentation\" style=\"position:relative;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable dijitSliderMoveableH\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleH\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" dojoAttachEvent=\"onclick:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper dijitSliderRightBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\" style=\"right:0px;\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick: increment\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,bottomDecoration\" class=\"dijitReset\" style=\"text-align:center;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n",
+	value: 0,
+
+	// showButtons: boolean
+	//	Show increment/decrement buttons at the ends of the slider?
+	showButtons: true,
+
+	// minimum:: integer
+	//	The minimum value allowed.
+	minimum: 0,
+
+	// maximum: integer
+	//	The maximum allowed value.
+	maximum: 100,
+
+	// discreteValues: integer
+	//	The maximum allowed values dispersed evenly between minimum and maximum (inclusive).
+	discreteValues: Infinity,
+
+	// pageIncrement: integer
+	//	The amount of change with shift+arrow
+	pageIncrement: 2,
+
+	// clickSelect: boolean
+	//	If clicking the progress bar changes the value or not
+	clickSelect: true,
+
+	// slideDuration: Number
+	//	The time in ms to take to animate the slider handle from 0% to 100%
+	slideDuration: 1000,
+
+	widgetsInTemplate: true,
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+		{id:"", name:"valueNode"}),
+
+	baseClass: "dijitSlider",
+
+	_mousePixelCoord: "pageX",
+	_pixelCount: "w",
+	_startingPixelCoord: "x",
+	_startingPixelCount: "l",
+	_handleOffsetCoord: "left",
+	_progressPixelSize: "width",
+
+	_onKeyPress: function(/*Event*/ e){
+		if(this.disabled || this.readOnly || e.altKey || e.ctrlKey){ return; }
+		switch(e.keyCode){
+			case dojo.keys.HOME:
+				this.setValue(this.minimum, true);
+				break;
+			case dojo.keys.END:
+				this.setValue(this.maximum, true);
+				break;
+			// this._descending === false: if ascending vertical (min on top)
+			// (this._descending || this.isLeftToRight()): if left-to-right horizontal or descending vertical
+			case ((this._descending || this.isLeftToRight()) ? dojo.keys.RIGHT_ARROW : dojo.keys.LEFT_ARROW):
+			case (this._descending === false ? dojo.keys.DOWN_ARROW : dojo.keys.UP_ARROW):
+			case (this._descending === false ? dojo.keys.PAGE_DOWN : dojo.keys.PAGE_UP):
+				this.increment(e);
+				break;
+			case ((this._descending || this.isLeftToRight()) ? dojo.keys.LEFT_ARROW : dojo.keys.RIGHT_ARROW):
+			case (this._descending === false ? dojo.keys.UP_ARROW : dojo.keys.DOWN_ARROW):
+			case (this._descending === false ? dojo.keys.PAGE_UP : dojo.keys.PAGE_DOWN):
+				this.decrement(e);
+				break;
+			default:
+				this.inherited(arguments);
+				return;
+		}
+		dojo.stopEvent(e);
+	},
+
+	_onHandleClick: function(e){
+		if(this.disabled || this.readOnly){ return; }
+		if(!dojo.isIE){
+			// make sure you get focus when dragging the handle
+			// (but don't do on IE because it causes a flicker on mouse up (due to blur then focus)
+			dijit.focus(this.sliderHandle);
+		}
+		dojo.stopEvent(e);
+	},
+	
+	_isReversed: function(){
+		return !this.isLeftToRight();
+	},
+
+	_onBarClick: function(e){
+		if(this.disabled || this.readOnly || !this.clickSelect){ return; }
+		dijit.focus(this.sliderHandle);
+		dojo.stopEvent(e);
+		var abspos = dojo.coords(this.sliderBarContainer, true);
+		var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord];
+		this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true);
+	},
+
+	_setPixelValue: function(/*Number*/ pixelValue, /*Number*/ maxPixels, /*Boolean, optional*/ priorityChange){
+		if(this.disabled || this.readOnly){ return; }
+		pixelValue = pixelValue < 0 ? 0 : maxPixels < pixelValue ? maxPixels : pixelValue;
+		var count = this.discreteValues;
+		if(count <= 1 || count == Infinity){ count = maxPixels; }
+		count--;
+		var pixelsPerValue = maxPixels / count;
+		var wholeIncrements = Math.round(pixelValue / pixelsPerValue);
+		this.setValue((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, priorityChange);
+	},
+
+	setValue: function(/*Number*/ value, /*Boolean, optional*/ priorityChange){
+		this.valueNode.value = this.value = value;
+		dijit.setWaiState(this.focusNode, "valuenow", value);
+		this.inherited(arguments);
+		var percent = (value - this.minimum) / (this.maximum - this.minimum);
+		var progressBar = (this._descending === false) ? this.remainingBar : this.progressBar;
+		var remainingBar = (this._descending === false) ? this.progressBar : this.remainingBar;
+		if(priorityChange && this.slideDuration > 0 && progressBar.style[this._progressPixelSize]){
+			// animate the slider
+			var _this = this;
+			var props = {};
+			var start = parseFloat(progressBar.style[this._progressPixelSize]);
+			var duration = this.slideDuration * (percent-start/100);
+			if(duration == 0){ return; }
+			if(duration < 0){ duration = 0 - duration; }
+			props[this._progressPixelSize] = { start: start, end: percent*100, units:"%" };
+			dojo.animateProperty({ node: progressBar, duration: duration, 
+				onAnimate: function(v){ remainingBar.style[_this._progressPixelSize] = (100-parseFloat(v[_this._progressPixelSize])) + "%"; },
+			        properties: props
+			}).play();
+		}
+		else{
+			progressBar.style[this._progressPixelSize] = (percent*100) + "%";
+			remainingBar.style[this._progressPixelSize] = ((1-percent)*100) + "%";
+		}
+	},
+
+	_bumpValue: function(signedChange){
+		if(this.disabled || this.readOnly){ return; }
+		var s = dojo.getComputedStyle(this.sliderBarContainer);
+		var c = dojo._getContentBox(this.sliderBarContainer, s);
+		var count = this.discreteValues;
+		if(count <= 1 || count == Infinity){ count = c[this._pixelCount]; }
+		count--;
+		var value = (this.value - this.minimum) * count / (this.maximum - this.minimum) + signedChange;
+		if(value < 0){ value = 0; }
+		if(value > count){ value = count; }
+		value = value * (this.maximum - this.minimum) / count + this.minimum;
+		this.setValue(value, true);
+	},
+
+	_onClkIncBumper: function(){
+		this.setValue(this._descending === false ? this.minimum : this.maximum, true);
+	},
+
+	_onClkDecBumper: function(){
+		this.setValue(this._descending === false ? this.maximum : this.minimum, true);
+	},
+
+	decrement: function(e){
+		// summary
+		//	decrement slider by 1 unit
+		this._bumpValue(e.keyCode == dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);
+	},
+
+	increment: function(e){
+		// summary
+		//	increment slider by 1 unit
+		this._bumpValue(e.keyCode == dojo.keys.PAGE_UP?this.pageIncrement:1);
+	},
+
+	_mouseWheeled: function(/*Event*/ evt){
+		dojo.stopEvent(evt);
+		var scrollAmount = 0;
+		if(typeof evt.wheelDelta == 'number'){ // IE
+			scrollAmount = evt.wheelDelta;
+		}else if(typeof evt.detail == 'number'){ // Mozilla+Firefox
+			scrollAmount = -evt.detail;
+		}
+		if(scrollAmount > 0){
+			this.increment(evt);
+		}else if(scrollAmount < 0){
+			this.decrement(evt);
+		}
+	},
+
+	startup: function(){
+		dojo.forEach(this.getChildren(), function(child){
+			if(this[child.container] != this.containerNode){
+				this[child.container].appendChild(child.domNode);
+			}
+		}, this);
+	},
+
+	postCreate: function(){
+		if(this.showButtons){
+			this.incrementButton.style.display="";
+			this.decrementButton.style.display="";
+		}
+		this.connect(this.domNode, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+
+		// define a custom constructor for a SliderMover that points back to me
+		var _self = this;
+		var mover = function(){
+			dijit.form._SliderMover.apply(this, arguments);
+			this.widget = _self;
+		};
+		dojo.extend(mover, dijit.form._SliderMover.prototype);
+
+		this._movable = new dojo.dnd.Moveable(this.sliderHandle, {mover: mover});
+		dijit.setWaiState(this.focusNode, "valuemin", this.minimum);
+		dijit.setWaiState(this.focusNode, "valuemax", this.maximum);
+
+		this.inherited(arguments);
+	},
+
+	destroy: function(){
+		this._movable.destroy();
+		this.inherited(arguments);	
+	}
+});
+
+dojo.declare(
+	"dijit.form.VerticalSlider",
+	dijit.form.HorizontalSlider,
+{
+	// summary
+	//	A form widget that allows one to select a value with a vertically draggable image
+
+	templateString:"<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n><tbody class=\"dijitReset\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick:_topButtonClicked\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper dijitSliderTopBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td dojoAttachPoint=\"leftDecoration\" class=\"dijitReset\" style=\"text-align:center;height:100%;\"></td\n\t\t><td class=\"dijitReset\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><center waiRole=\"presentation\" style=\"position:relative;height:100%;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onclick:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" style=\"vertical-align:top;\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleV\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td dojoAttachPoint=\"containerNode,rightDecoration\" class=\"dijitReset\" style=\"text-align:center;height:100%;\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper dijitSliderBottomBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"decrementButton\" dojoAttachEvent=\"onclick:_bottomButtonClicked\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></tbody></table>\n",
+	_mousePixelCoord: "pageY",
+	_pixelCount: "h",
+	_startingPixelCoord: "y",
+	_startingPixelCount: "t",
+	_handleOffsetCoord: "top",
+	_progressPixelSize: "height",
+
+	// _descending: boolean
+	//      Specifies if the slider values go from high-on-top (true), or low-on-top (false)
+	//	TODO: expose this in 1.2 - the css progress/remaining bar classes need to be reversed
+	_descending: true,
+
+	startup: function(){
+		if(this._started){ return; }
+
+		if(!this.isLeftToRight() && dojo.isMoz){
+			if(this.leftDecoration){this._rtlRectify(this.leftDecoration);}
+			if(this.rightDecoration){this._rtlRectify(this.rightDecoration);}
+		}
+
+		this.inherited(arguments);
+	},
+		
+	_isReversed: function(){
+		return this._descending;
+	},
+
+	_topButtonClicked: function(e){
+		if(this._descending){
+			this.increment(e);
+		}else{
+			this.decrement(e);
+		}
+	},
+
+	_bottomButtonClicked: function(e){
+		if(this._descending){
+			this.decrement(e);
+		}else{
+			this.increment(e);
+		}
+	},
+
+	_rtlRectify: function(decorationNode/*NodeList*/){
+		// summary:
+		//      Rectify children nodes for left/right decoration in rtl case.
+		//		Simply switch the rule and label child for each decoration node.
+		var childNodes = [];
+		while(decorationNode.firstChild){
+				childNodes.push(decorationNode.firstChild);
+				decorationNode.removeChild(decorationNode.firstChild);
+		}
+		for(var i = childNodes.length-1; i >=0; i--){
+			if(childNodes[i]){
+				decorationNode.appendChild(childNodes[i]);
+			}
+		}
+	}
+});
+
+dojo.declare("dijit.form._SliderMover",
+	dojo.dnd.Mover,
+{
+	onMouseMove: function(e){
+		var widget = this.widget;
+		var abspos = widget._abspos;
+		if(!abspos){
+			abspos = widget._abspos = dojo.coords(widget.sliderBarContainer, true);
+			widget._setPixelValue_ = dojo.hitch(widget, "_setPixelValue");
+			widget._isReversed_ = widget._isReversed();
+		}
+		var pixelValue = e[widget._mousePixelCoord] - abspos[widget._startingPixelCoord];
+		widget._setPixelValue_(widget._isReversed_ ? (abspos[widget._pixelCount]-pixelValue) : pixelValue, abspos[widget._pixelCount], false);
+	},
+	
+	destroy: function(e){
+		dojo.dnd.Mover.prototype.destroy.apply(this, arguments);
+		var widget = this.widget;
+		widget.setValue(widget.value, true);
+	}
+});
+
+
+dojo.declare("dijit.form.HorizontalRule", [dijit._Widget, dijit._Templated],
+{
+	//	Summary:
+	//		Create hash marks for the Horizontal slider
+	templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+	// count: Integer
+	//		Number of hash marks to generate
+	count: 3,
+
+	// container: Node
+	//		If this is a child widget, connect it to this parent node
+	container: "containerNode",
+
+	// ruleStyle: String
+	//		CSS style to apply to individual hash marks
+	ruleStyle: "",
+
+	_positionPrefix: '<div class="dijitRuleMark dijitRuleMarkH" style="left:',
+	_positionSuffix: '%;',
+	_suffix: '"></div>',
+
+	_genHTML: function(pos, ndx){
+		return this._positionPrefix + pos + this._positionSuffix + this.ruleStyle + this._suffix;
+	},
+	
+	_isHorizontal: true,
+
+	postCreate: function(){
+		var innerHTML;
+		if(this.count==1){
+			innerHTML = this._genHTML(50, 0);
+		}else{
+			var i;
+			var interval = 100 / (this.count-1);
+			if(!this._isHorizontal || this.isLeftToRight()){
+				innerHTML = this._genHTML(0, 0);
+				for(i=1; i < this.count-1; i++){
+					innerHTML += this._genHTML(interval*i, i);
+				}
+				innerHTML += this._genHTML(100, this.count-1);
+			}else{
+				innerHTML = this._genHTML(100, 0);
+				for(i=1; i < this.count-1; i++){
+					innerHTML += this._genHTML(100-interval*i, i);
+				}
+				innerHTML += this._genHTML(0, this.count-1);
+			}
+		}
+		this.domNode.innerHTML = innerHTML;
+	}
+});
+
+dojo.declare("dijit.form.VerticalRule", dijit.form.HorizontalRule,
+{
+	//	Summary:
+	//		Create hash marks for the Vertical slider
+	templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>',
+	_positionPrefix: '<div class="dijitRuleMark dijitRuleMarkV" style="top:',
+	
+	_isHorizontal: false
+});
+
+dojo.declare("dijit.form.HorizontalRuleLabels", dijit.form.HorizontalRule,
+{
+	//	Summary:
+	//		Create labels for the Horizontal slider
+	templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+	// labelStyle: String
+	//		CSS style to apply to individual text labels
+	labelStyle: "",
+
+	// labels: Array
+	//	Array of text labels to render - evenly spaced from left-to-right or bottom-to-top
+	labels: [],
+
+	// numericMargin: Integer
+	//	Number of generated numeric labels that should be rendered as '' on the ends when labels[] are not specified
+	numericMargin: 0,
+
+	// numericMinimum: Integer
+	//	Leftmost label value for generated numeric labels when labels[] are not specified
+	minimum: 0,
+
+	// numericMaximum: Integer
+	//	Rightmost label value for generated numeric labels when labels[] are not specified
+	maximum: 1,
+
+	// constraints: object
+	//	pattern, places, lang, et al (see dojo.number) for generated numeric labels when labels[] are not specified
+	constraints: {pattern:"#%"},
+
+	_positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerH" style="left:',
+	_labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelH">',
+	_suffix: '</span></div>',
+
+	_calcPosition: function(pos){
+		return pos;
+	},
+
+	_genHTML: function(pos, ndx){
+		return this._positionPrefix + this._calcPosition(pos) + this._positionSuffix + this.labelStyle + this._labelPrefix + this.labels[ndx] + this._suffix;
+	},
+
+	getLabels: function(){
+		// summary: user replaceable function to return the labels array
+
+		// if the labels array was not specified directly, then see if <li> children were
+		var labels = this.labels;
+		if(!labels.length){
+			// for markup creation, labels are specified as child elements
+			labels = dojo.query("> li", this.srcNodeRef).map(function(node){
+				return String(node.innerHTML);
+			});
+		}
+		this.srcNodeRef.innerHTML = '';
+		// if the labels were not specified directly and not as <li> children, then calculate numeric labels
+		if(!labels.length && this.count > 1){
+			var start = this.minimum;
+			var inc = (this.maximum - start) / (this.count-1);
+			for (var i=0; i < this.count; i++){
+				labels.push((i<this.numericMargin||i>=(this.count-this.numericMargin))? '' : dojo.number.format(start, this.constraints));
+				start += inc;
+			}
+		}
+		return labels;
+	},
+
+	postMixInProperties: function(){
+		this.inherited(arguments);
+		this.labels = this.getLabels();
+		this.count = this.labels.length;
+	}
+});
+
+dojo.declare("dijit.form.VerticalRuleLabels", dijit.form.HorizontalRuleLabels,
+{
+	//	Summary:
+	//		Create labels for the Vertical slider
+	templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>',
+
+	_positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerV" style="top:',
+	_labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelV">',
+
+	_calcPosition: function(pos){
+		return 100-pos;
+	},
+	
+	_isHorizontal: false
+});
+
+}
+
+if(!dojo._hasResource["dijit.form.Textarea"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Textarea"] = true;
+dojo.provide("dijit.form.Textarea");
+
+
+
+
+
+dojo.declare(
+	"dijit.form.Textarea",
+	dijit.form._FormValueWidget,
+	{
+	// summary: A resizing textarea widget
+	//
+	// description:
+	//	A textarea that resizes vertically to contain the data.
+	//	Takes nearly all the parameters (name, value, etc.) that a vanilla textarea takes.
+	//	Cols is not supported and the width should be specified with style width.
+	//	Rows is not supported since this widget adjusts the height.
+	//
+	// example:
+	// |	<textarea dojoType="dijit.form.TextArea">...</textarea>
+	//
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+		{style:"styleNode", 'class':"styleNode"}),
+
+	templateString: (dojo.isIE || dojo.isSafari || dojo.isFF) ?
+				((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '<fieldset id="${id}" class="dijitInline dijitInputField dijitTextArea" dojoAttachPoint="styleNode" waiRole="presentation"><div dojoAttachPoint="editNode,focusNode,eventNode" dojoAttachEvent="onpaste:_changing,oncut:_changing" waiRole="textarea" style="text-decoration:none;display:block;overflow:auto;" contentEditable="true"></div>'
+					: '<span id="${id}" class="dijitReset">'+
+					'<iframe src="javascript:<html><head><title>${_iframeEditTitle}</title></head><body><script>var _postCreate=window.frameElement?window.frameElement.postCreate:null;if(_postCreate)_postCreate();</script></body></html>"'+
+							' dojoAttachPoint="iframe,styleNode" dojoAttachEvent="onblur:_onIframeBlur" class="dijitInline dijitInputField dijitTextArea"></iframe>')
+				+ '<textarea name="${name}" value="${value}" dojoAttachPoint="formValueNode" style="display:none;"></textarea>'
+				+ ((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '</fieldset>':'</span>')
+			: '<textarea id="${id}" name="${name}" value="${value}" dojoAttachPoint="formValueNode,editNode,focusNode,styleNode" class="dijitInputField dijitTextArea">'+dojo.isFF+'</textarea>',
+
+	setAttribute: function(/*String*/ attr, /*anything*/ value){
+		this.inherited(arguments);
+		switch(attr){
+			case "disabled":
+				this.formValueNode.disabled = this.disabled;
+			case "readOnly":
+				if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){
+					this.editNode.contentEditable = (!this.disabled && !this.readOnly);
+				}else if(dojo.isFF){
+					this.iframe.contentDocument.designMode = (this.disabled || this.readOnly)? "off" : "on";
+				}
+		}
+	},
+
+	focus: function(){
+		// summary: Received focus, needed for the InlineEditBox widget
+		if(!this.disabled && !this.readOnly){
+			this._changing(); // set initial height
+		}
+		dijit.focus(this.iframe || this.focusNode);
+	},
+
+	setValue: function(/*String*/ value, /*Boolean, optional*/ priorityChange){
+		var editNode = this.editNode;
+		if(typeof value == "string"){
+			editNode.innerHTML = ""; // wipe out old nodes
+			if(value.split){
+				var _this=this;
+				var isFirst = true;
+				dojo.forEach(value.split("\n"), function(line){
+					if(isFirst){ isFirst = false; }
+					else{
+						editNode.appendChild(dojo.doc.createElement("BR")); // preserve line breaks
+					}
+					if(line){
+						editNode.appendChild(dojo.doc.createTextNode(line)); // use text nodes so that imbedded tags can be edited
+					}
+				});
+			}else if(value){
+				editNode.appendChild(dojo.doc.createTextNode(value));
+			}
+			if(!dojo.isIE){
+				editNode.appendChild(dojo.doc.createElement("BR")); // so that you see a cursor
+			}
+		}else{
+			// blah<BR>blah --> blah\nblah
+			// <P>blah</P><P>blah</P> --> blah\nblah
+			// <DIV>blah</DIV><DIV>blah</DIV> --> blah\nblah
+			// &amp;&lt;&gt; -->&< >
+			value = editNode.innerHTML;
+			if(this.iframe){ // strip sizeNode
+				value = value.replace(/<div><\/div>\r?\n?$/i,"");
+			}
+			value = value.replace(/\s*\r?\n|^\s+|\s+$|&nbsp;/g,"").replace(/>\s+</g,"><").replace(/<\/(p|div)>$|^<(p|div)[^>]*>/gi,"").replace(/([^>])<div>/g,"$1\n").replace(/<\/p>\s*<p[^>]*>|<br[^>]*>|<\/div>\s*<div[^>]*>/gi,"\n").replace(/<[^>]*>/g,"").replace(/&amp;/gi,"\&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">");
+			if(!dojo.isIE){
+				value = value.replace(/\n$/,""); // remove added <br>
+			}
+		}
+		this.value = this.formValueNode.value = value;
+		if(this.iframe){
+			var sizeNode = dojo.doc.createElement('div');
+			editNode.appendChild(sizeNode);
+			var newHeight = sizeNode.offsetTop;
+			if(editNode.scrollWidth > editNode.clientWidth){ newHeight+=16; } // scrollbar space needed?
+			if(this.lastHeight != newHeight){ // cache size so that we don't get a resize event because of a resize event
+				if(newHeight == 0){ newHeight = 16; } // height = 0 causes the browser to not set scrollHeight
+				dojo.contentBox(this.iframe, {h: newHeight});
+				this.lastHeight = newHeight;
+			}
+			editNode.removeChild(sizeNode);
+		}
+		dijit.form.Textarea.superclass.setValue.call(this, this.getValue(), priorityChange);
+	},
+
+	getValue: function(){
+		return this.value.replace(/\r/g,"");
+	},
+
+	postMixInProperties: function(){
+		this.inherited(arguments);
+		// don't let the source text be converted to a DOM structure since we just want raw text
+		if(this.srcNodeRef && this.srcNodeRef.innerHTML != ""){
+			this.value = this.srcNodeRef.innerHTML;
+			this.srcNodeRef.innerHTML = "";
+		}
+		if((!this.value || this.value == "") && this.srcNodeRef && this.srcNodeRef.value){
+			this.value = this.srcNodeRef.value;
+		}
+		if(!this.value){ this.value = ""; }
+		this.value = this.value.replace(/\r\n/g,"\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&");
+		if(dojo.isFF == 2){
+			// In the case of Firefox an iframe is used and when the text gets focus,
+			// focus is fired from the document object.  There isn't a way to put a
+			// waiRole on the document object and as a result screen readers don't
+			// announce the role.  As a result screen reader users are lost.
+			//
+			// An additional problem is that the browser gives the document object a
+			// very cryptic accessible name, e.g.
+			// wysiwyg://13/http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_InlineEditBox.html
+			// When focus is fired from the document object, the screen reader speaks
+			// the accessible name.  The cyptic accessile name is confusing.
+			//
+			// A workaround for both of these problems is to give the iframe's
+			// document a title, the name of which is similar to a role name, i.e.
+			// "edit area".  This will be used as the accessible name which will replace
+			// the cryptic name and will also convey the role information to the user.
+			// Because it is read directly to the user, the string must be localized.
+			// In addition, since a <label> element can not be associated with an iframe, if 
+			// this control has a label, insert the label text into the title as well.
+			var _nlsResources = dojo.i18n.getLocalization("dijit.form", "Textarea");
+			this._iframeEditTitle = _nlsResources.iframeEditTitle;
+			this._iframeFocusTitle = _nlsResources.iframeFocusTitle;
+			var label=dojo.query('label[for="'+this.id+'"]');
+			if(label.length){
+				this._iframeEditTitle = label[0].innerHTML + " " + this._iframeEditTitle;
+			}
+			var body = this.focusNode = this.editNode = dojo.doc.createElement('BODY');
+			body.style.margin="0px";
+			body.style.padding="0px";
+			body.style.border="0px";
+		}
+	},
+
+	postCreate: function(){
+		if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){
+			this.domNode.style.overflowY = 'hidden';
+		}else if(dojo.isFF){
+			var w = this.iframe.contentWindow;
+			var title = '';
+			try { // #4715: peeking at the title can throw a security exception during iframe setup
+				title = this.iframe.contentDocument.title;
+			} catch(e) {}
+			if(!w || !title){
+				this.iframe.postCreate = dojo.hitch(this, this.postCreate);
+				return;
+			}
+			var d = w.document;
+			d.getElementsByTagName('HTML')[0].replaceChild(this.editNode, d.getElementsByTagName('BODY')[0]);
+			if(!this.isLeftToRight()){
+				d.getElementsByTagName('HTML')[0].dir = "rtl";
+			}			
+			this.iframe.style.overflowY = 'hidden';
+			this.eventNode = d;
+			// this.connect won't destroy this handler cleanly since its on the iframe's window object
+			// resize is a method of window, not document
+			w.addEventListener("resize", dojo.hitch(this, this._changed), false); // resize is only on the window object
+		}else{
+			this.focusNode = this.domNode;
+		}
+		if(this.eventNode){
+			this.connect(this.eventNode, "keypress", this._onKeyPress);
+			this.connect(this.eventNode, "mousemove", this._changed);
+			this.connect(this.eventNode, "focus", this._focused);
+			this.connect(this.eventNode, "blur", this._blurred);
+		}
+		if(this.editNode){
+			this.connect(this.editNode, "change", this._changed); // needed for mouse paste events per #3479
+		}
+		this.inherited('postCreate', arguments);
+	},
+
+	// event handlers, you can over-ride these in your own subclasses
+	_focused: function(e){
+		dojo.addClass(this.iframe||this.domNode, "dijitInputFieldFocused");
+		this._changed(e);
+	},
+
+	_blurred: function(e){
+		dojo.removeClass(this.iframe||this.domNode, "dijitInputFieldFocused");
+		this._changed(e, true);
+	},
+
+	_onIframeBlur: function(){
+		// Reset the title back to "edit area".
+		this.iframe.contentDocument.title = this._iframeEditTitle;
+	},
+
+	_onKeyPress: function(e){
+		if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
+			// Pressing the tab key in the iframe (with designMode on) will cause the
+			// entry of a tab character so we have to trap that here.  Since we don't
+			// know the next focusable object we put focus on the iframe and then the
+			// user has to press tab again (which then does the expected thing).
+			// A problem with that is that the screen reader user hears "edit area"
+			// announced twice which causes confusion.  By setting the
+			// contentDocument's title to "edit area frame" the confusion should be
+			// eliminated.
+			this.iframe.contentDocument.title = this._iframeFocusTitle;
+			// Place focus on the iframe. A subsequent tab or shift tab will put focus
+			// on the correct control.
+			// Note: Can't use this.focus() because that results in a call to
+			// dijit.focus and if that receives an iframe target it will set focus
+			// on the iframe's contentWindow.
+			this.iframe.focus();  // this.focus(); won't work
+			dojo.stopEvent(e);
+		}else if(e.keyCode == dojo.keys.ENTER){
+			e.stopPropagation();
+		}else if(this.inherited("_onKeyPress", arguments) && this.iframe){
+			// #3752:
+			// The key press will not make it past the iframe.
+			// If a widget is listening outside of the iframe, (like InlineEditBox)
+			// it will not hear anything.
+			// Create an equivalent event so everyone else knows what is going on.
+			var te = dojo.doc.createEvent("KeyEvents");
+			te.initKeyEvent("keypress", true, true, null, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.keyCode, e.charCode);
+			this.iframe.dispatchEvent(te);
+		}
+		this._changing();
+	},
+
+	_changing: function(e){
+		// summary: event handler for when a change is imminent
+		setTimeout(dojo.hitch(this, "_changed", e, false), 1);
+	},
+
+	_changed: function(e, priorityChange){
+		// summary: event handler for when a change has already happened
+		if(this.iframe && this.iframe.contentDocument.designMode != "on" && !this.disabled && !this.readOnly){
+			this.iframe.contentDocument.designMode="on"; // in case this failed on init due to being hidden
+		}
+		this.setValue(null, priorityChange || false);
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.layout.StackContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.StackContainer"] = true;
+dojo.provide("dijit.layout.StackContainer");
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit.layout.StackContainer",
+	dijit.layout._LayoutWidget,
+	{
+	// summary: 
+	//	A container that has multiple children, but shows only
+	//	one child at a time
+	//
+	// description:
+	// 	A container for widgets (ContentPanes, for example) That displays
+	//	only one Widget at a time.
+	//	
+	//	Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
+	//
+	//	Can be base class for container, Wizard, Show, etc.
+	// 
+	//
+	// doLayout: Boolean
+	//  if true, change the size of my currently displayed child to match my size
+	doLayout: true,
+
+	_started: false,
+/*=====
+	// selectedChildWidget: Widget
+	//	References the currently selected child widget, if any
+	//
+	selectedChildWidget: null,
+=====*/
+	postCreate: function(){
+		dijit.setWaiRole((this.containerNode || this.domNode), "tabpanel");
+		this.connect(this.domNode, "onkeypress", this._onKeyPress);
+	},
+	
+	startup: function(){
+		if(this._started){ return; }
+
+		var children = this.getChildren();
+
+		// Setup each page panel
+		dojo.forEach(children, this._setupChild, this);
+
+		// Figure out which child to initially display
+		dojo.some(children, function(child){
+			if(child.selected){
+				this.selectedChildWidget = child;
+			}
+			return child.selected;
+		}, this);
+
+		var selected = this.selectedChildWidget;
+
+		// Default to the first child
+		if(!selected && children[0]){
+			selected = this.selectedChildWidget = children[0];
+			selected.selected = true;
+		}
+		if(selected){
+			this._showChild(selected);
+		}
+
+		// Now publish information about myself so any StackControllers can initialize..
+		dojo.publish(this.id+"-startup", [{children: children, selected: selected}]);
+
+		this.inherited(arguments);
+	},
+
+	_setupChild: function(/*Widget*/ page){
+		// Summary: prepare the given child
+
+		page.domNode.style.display = "none";
+
+		// since we are setting the width/height of the child elements, they need
+		// to be position:relative, or IE has problems (See bug #2033)
+		page.domNode.style.position = "relative";
+
+		return page; // dijit._Widget
+	},
+
+	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		// summary: Adds a widget to the stack
+		 
+		dijit._Container.prototype.addChild.apply(this, arguments);
+		child = this._setupChild(child);
+
+		if(this._started){
+			// in case the tab titles have overflowed from one line to two lines
+			this.layout();
+
+			dojo.publish(this.id+"-addChild", [child, insertIndex]);
+
+			// if this is the first child, then select it
+			if(!this.selectedChildWidget){
+				this.selectChild(child);
+			}
+		}
+	},
+
+	removeChild: function(/*Widget*/ page){
+		// summary: Removes the pane from the stack
+
+		dijit._Container.prototype.removeChild.apply(this, arguments);
+
+		// If we are being destroyed than don't run the code below (to select another page), because we are deleting
+		// every page one by one
+		if(this._beingDestroyed){ return; }
+
+		if(this._started){
+			// this will notify any tablists to remove a button; do this first because it may affect sizing
+			dojo.publish(this.id+"-removeChild", [page]);
+
+			// in case the tab titles now take up one line instead of two lines
+			this.layout();
+		}
+
+		if(this.selectedChildWidget === page){
+			this.selectedChildWidget = undefined;
+			if(this._started){
+				var children = this.getChildren();
+				if(children.length){
+					this.selectChild(children[0]);
+				}
+			}
+		}
+	},
+
+	selectChild: function(/*Widget*/ page){
+		// summary:
+		//	Show the given widget (which must be one of my children)
+
+		page = dijit.byId(page);
+
+		if(this.selectedChildWidget != page){
+			// Deselect old page and select new one
+			this._transition(page, this.selectedChildWidget);
+			this.selectedChildWidget = page;
+			dojo.publish(this.id+"-selectChild", [page]);
+		}
+	},
+
+	_transition: function(/*Widget*/newWidget, /*Widget*/oldWidget){
+		if(oldWidget){
+			this._hideChild(oldWidget);
+		}
+		this._showChild(newWidget);
+
+		// Size the new widget, in case this is the first time it's being shown,
+		// or I have been resized since the last time it was shown.
+		// page must be visible for resizing to work
+		if(this.doLayout && newWidget.resize){
+			newWidget.resize(this._containerContentBox || this._contentBox);
+		}
+	},
+
+	_adjacent: function(/*Boolean*/ forward){
+		// summary: Gets the next/previous child widget in this container from the current selection
+		var children = this.getChildren();
+		var index = dojo.indexOf(children, this.selectedChildWidget);
+		index += forward ? 1 : children.length - 1;
+		return children[ index % children.length ]; // dijit._Widget
+	},
+
+	forward: function(){
+		// Summary: advance to next page
+		this.selectChild(this._adjacent(true));
+	},
+
+	back: function(){
+		// Summary: go back to previous page
+		this.selectChild(this._adjacent(false));
+	},
+
+	_onKeyPress: function(e){
+		dojo.publish(this.id+"-containerKeyPress", [{ e: e, page: this}]);
+	},
+
+	layout: function(){
+		if(this.doLayout && this.selectedChildWidget && this.selectedChildWidget.resize){
+			this.selectedChildWidget.resize(this._contentBox);
+		}
+	},
+
+	_showChild: function(/*Widget*/ page){
+		var children = this.getChildren();
+		page.isFirstChild = (page == children[0]);
+		page.isLastChild = (page == children[children.length-1]);
+		page.selected = true;
+
+		page.domNode.style.display="";
+		if(page._loadCheck){
+			page._loadCheck(); // trigger load in ContentPane
+		}
+		if(page.onShow){
+			page.onShow();
+		}
+	},
+
+	_hideChild: function(/*Widget*/ page){
+		page.selected=false;
+		page.domNode.style.display="none";
+		if(page.onHide){
+			page.onHide();
+		}
+	},
+
+	closeChild: function(/*Widget*/ page){
+		// summary:
+		//	callback when user clicks the [X] to remove a page
+		//	if onClose() returns true then remove and destroy the child
+		var remove = page.onClose(this, page);
+		if(remove){
+			this.removeChild(page);
+			// makes sure we can clean up executeScripts in ContentPane onUnLoad
+			page.destroyRecursive();
+		}
+	},
+
+	destroy: function(){
+		this._beingDestroyed = true;
+		this.inherited(arguments);
+	}
+});
+
+dojo.declare(
+	"dijit.layout.StackController",
+	[dijit._Widget, dijit._Templated, dijit._Container],
+	{
+	// summary:
+	//	Set of buttons to select a page in a page list.
+	//	Monitors the specified StackContainer, and whenever a page is
+	//	added, deleted, or selected, updates itself accordingly.
+
+		templateString: "<span wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",
+
+		// containerId: String
+		//	the id of the page container that I point to
+		containerId: "",
+
+		// buttonWidget: String
+		//	the name of the button widget to create to correspond to each page
+		buttonWidget: "dijit.layout._StackButton",
+
+		postCreate: function(){
+			dijit.setWaiRole(this.domNode, "tablist");
+
+			// TODO: change key from object to id, to get more separation from StackContainer
+			this.pane2button = {};		// mapping from panes to buttons
+			this.pane2menu = {};		// mapping from panes to close menu
+
+			this._subscriptions=[
+				dojo.subscribe(this.containerId+"-startup", this, "onStartup"),
+				dojo.subscribe(this.containerId+"-addChild", this, "onAddChild"),
+				dojo.subscribe(this.containerId+"-removeChild", this, "onRemoveChild"),
+				dojo.subscribe(this.containerId+"-selectChild", this, "onSelectChild"),
+				dojo.subscribe(this.containerId+"-containerKeyPress", this, "onContainerKeyPress")
+			];
+		},
+
+		onStartup: function(/*Object*/ info){
+			// summary: called after StackContainer has finished initializing
+			dojo.forEach(info.children, this.onAddChild, this);
+			this.onSelectChild(info.selected);
+		},
+
+		destroy: function(){
+			for(var pane in this.pane2button){
+				this.onRemoveChild(pane);
+			}
+			dojo.forEach(this._subscriptions, dojo.unsubscribe);
+			this.inherited(arguments);
+		},
+
+		onAddChild: function(/*Widget*/ page, /*Integer?*/ insertIndex){
+			// summary:
+			//   Called whenever a page is added to the container.
+			//   Create button corresponding to the page.
+
+			// add a node that will be promoted to the button widget
+			var refNode = dojo.doc.createElement("span");
+			this.domNode.appendChild(refNode);
+			// create an instance of the button widget
+			var cls = dojo.getObject(this.buttonWidget);
+			var button = new cls({label: page.title, closeButton: page.closable}, refNode);
+			this.addChild(button, insertIndex);
+			this.pane2button[page] = button;
+			page.controlButton = button;	// this value might be overwritten if two tabs point to same container
+			
+			dojo.connect(button, "onClick", dojo.hitch(this,"onButtonClick",page));
+			if(page.closable){
+				dojo.connect(button, "onClickCloseButton", dojo.hitch(this,"onCloseButtonClick",page));
+				// add context menu onto title button
+				var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+				var closeMenu = new dijit.Menu({targetNodeIds:[button.id], id:button.id+"_Menu"});
+				var mItem = new dijit.MenuItem({label:_nlsResources.itemClose});
+            	dojo.connect(mItem, "onClick", dojo.hitch(this, "onCloseButtonClick", page));
+           		closeMenu.addChild(mItem);
+           		this.pane2menu[page] = closeMenu;
+			}
+			if(!this._currentChild){ // put the first child into the tab order
+				button.focusNode.setAttribute("tabIndex", "0");
+				this._currentChild = page;
+			}
+			//make sure all tabs have the same length
+			if(!this.isLeftToRight() && dojo.isIE && this._rectifyRtlTabList){
+				this._rectifyRtlTabList();
+			}
+		},
+
+		onRemoveChild: function(/*Widget*/ page){
+			// summary:
+			//   Called whenever a page is removed from the container.
+			//   Remove the button corresponding to the page.
+			if(this._currentChild === page){ this._currentChild = null; }
+			var button = this.pane2button[page];
+			var menu = this.pane2menu[page];
+			if (menu){
+				menu.destroy();
+			}
+			if(button){
+				// TODO? if current child { reassign }
+				button.destroy();
+			}
+			this.pane2button[page] = null;
+		},
+
+		onSelectChild: function(/*Widget*/ page){
+			// summary:
+			//	Called when a page has been selected in the StackContainer, either by me or by another StackController
+
+			if(!page){ return; }
+
+			if(this._currentChild){
+				var oldButton=this.pane2button[this._currentChild];
+				oldButton.setAttribute('checked', false);
+				oldButton.focusNode.setAttribute("tabIndex", "-1");
+			}
+
+			var newButton=this.pane2button[page];
+			newButton.setAttribute('checked', true);
+			this._currentChild = page;
+			newButton.focusNode.setAttribute("tabIndex", "0");
+			var container = dijit.byId(this.containerId);
+			dijit.setWaiState(container.containerNode || container.domNode, "labelledby", newButton.id);
+		},
+
+		onButtonClick: function(/*Widget*/ page){
+			// summary:
+			//   Called whenever one of my child buttons is pressed in an attempt to select a page
+			var container = dijit.byId(this.containerId);	// TODO: do this via topics?
+			container.selectChild(page); 
+		},
+
+		onCloseButtonClick: function(/*Widget*/ page){
+			// summary:
+			//   Called whenever one of my child buttons [X] is pressed in an attempt to close a page
+			var container = dijit.byId(this.containerId);
+			container.closeChild(page);
+			var b = this.pane2button[this._currentChild];
+			if(b){
+				dijit.focus(b.focusNode || b.domNode);
+			}
+		},
+		
+		// TODO: this is a bit redundant with forward, back api in StackContainer
+		adjacent: function(/*Boolean*/ forward){
+			if(!this.isLeftToRight() && (!this.tabPosition || /top|bottom/.test(this.tabPosition))){ forward = !forward; }
+			// find currently focused button in children array
+			var children = this.getChildren();
+			var current = dojo.indexOf(children, this.pane2button[this._currentChild]);
+			// pick next button to focus on
+			var offset = forward ? 1 : children.length - 1;
+			return children[ (current + offset) % children.length ]; // dijit._Widget
+		},
+
+		onkeypress: function(/*Event*/ e){
+			// summary:
+			//   Handle keystrokes on the page list, for advancing to next/previous button
+			//   and closing the current page if the page is closable.
+
+			if(this.disabled || e.altKey ){ return; }
+			var forward = null;
+			if(e.ctrlKey || !e._djpage){
+				var k = dojo.keys;
+				switch(e.keyCode){
+					case k.LEFT_ARROW:
+					case k.UP_ARROW:
+						if(!e._djpage){ forward = false; }
+						break;
+					case k.PAGE_UP:
+						if(e.ctrlKey){ forward = false; }
+						break;
+					case k.RIGHT_ARROW:
+					case k.DOWN_ARROW:
+						if(!e._djpage){ forward = true; }
+						break;
+					case k.PAGE_DOWN:
+						if(e.ctrlKey){ forward = true; }
+						break;
+					case k.DELETE:
+						if(this._currentChild.closable){
+							this.onCloseButtonClick(this._currentChild);
+						}
+						dojo.stopEvent(e);
+						break;
+					default:
+						if(e.ctrlKey){
+							if(e.keyCode == k.TAB){
+								this.adjacent(!e.shiftKey).onClick();
+								dojo.stopEvent(e);
+							}else if(e.keyChar == "w"){
+								if(this._currentChild.closable){
+									this.onCloseButtonClick(this._currentChild);
+								}
+								dojo.stopEvent(e); // avoid browser tab closing.
+							}
+						}
+				}
+				// handle page navigation
+				if(forward !== null){
+					this.adjacent(forward).onClick();
+					dojo.stopEvent(e);
+				}
+			}
+		},
+
+		onContainerKeyPress: function(/*Object*/ info){
+			info.e._djpage = info.page;
+			this.onkeypress(info.e);
+		}
+});
+
+dojo.declare("dijit.layout._StackButton",
+	dijit.form.ToggleButton,
+	{
+	// summary
+	//	Internal widget used by StackContainer.
+	//	The button-like or tab-like object you click to select or delete a page
+	
+	tabIndex: "-1", // StackContainer buttons are not in the tab order by default
+	
+	postCreate: function(/*Event*/ evt){
+		dijit.setWaiRole((this.focusNode || this.domNode), "tab");
+		this.inherited(arguments);
+	},
+	
+	onClick: function(/*Event*/ evt){
+		// summary: This is for TabContainer where the tabs are <span> rather than button,
+		// 	so need to set focus explicitly (on some browsers)
+		dijit.focus(this.focusNode);
+
+		// ... now let StackController catch the event and tell me what to do
+	},
+
+	onClickCloseButton: function(/*Event*/ evt){
+		// summary
+		//	StackContainer connects to this function; if your widget contains a close button
+		//	then clicking it should call this function.
+		evt.stopPropagation();
+	}
+});
+
+// These arguments can be specified for the children of a StackContainer.
+// Since any widget can be specified as a StackContainer child, mix them
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget, {
+	// title: String
+	//		Title of this widget.  Used by TabContainer to the name the tab, etc.
+	title: "",
+
+	// selected: Boolean
+	//		Is this child currently selected?
+	selected: false,
+
+	// closable: Boolean
+	//		True if user can close (destroy) this child, such as (for example) clicking the X on the tab.
+	closable: false,	// true if user can close this tab pane
+
+	onClose: function(){
+		// summary: Callback if someone tries to close the child, child will be closed if func returns true
+		return true;
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.layout.AccordionContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.AccordionContainer"] = true;
+dojo.provide("dijit.layout.AccordionContainer");
+
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit.layout.AccordionContainer",
+	dijit.layout.StackContainer,
+	{
+		// summary:
+		//		Holds a set of panes where every pane's title is visible, but only one pane's content is visible at a time,
+		//		and switching between panes is visualized by sliding the other panes up/down.
+		// example:
+		// | 	<div dojoType="dijit.layout.AccordionContainer">
+		// |		<div dojoType="dijit.layout.AccordionPane" title="pane 1">
+		// |			<div dojoType="dijit.layout.ContentPane">...</div>
+		// | 	</div>
+		// |		<div dojoType="dijit.layout.AccordionPane" title="pane 2">
+		// |			<p>This is some text</p>
+		// ||		...
+		// |	</div>
+		//
+		// duration: Integer
+		//		Amount of time (in ms) it takes to slide panes
+		duration: 250,
+
+		_verticalSpace: 0,
+
+		postCreate: function(){
+			this.domNode.style.overflow="hidden";
+			this.inherited("postCreate",arguments); 
+			dijit.setWaiRole(this.domNode, "tablist");
+			dojo.addClass(this.domNode,"dijitAccordionContainer");
+		},
+
+		startup: function(){
+			if(this._started){ return; }
+			this.inherited("startup",arguments);	
+			if(this.selectedChildWidget){
+				var style = this.selectedChildWidget.containerNode.style;
+				style.display = "";
+				style.overflow = "auto";
+				this.selectedChildWidget._setSelectedState(true);
+			}
+		},
+
+		layout: function(){
+			// summary: 
+			//		Set the height of the open pane based on what room remains
+
+			// get cumulative height of all the title bars, and figure out which pane is open
+			var totalCollapsedHeight = 0;
+			var openPane = this.selectedChildWidget;
+			dojo.forEach(this.getChildren(), function(child){
+				totalCollapsedHeight += child.getTitleHeight();
+			});
+			var mySize = this._contentBox;
+			this._verticalSpace = (mySize.h - totalCollapsedHeight);
+			if(openPane){
+				openPane.containerNode.style.height = this._verticalSpace + "px";
+/***
+TODO: this is wrong.  probably you wanted to call resize on the SplitContainer
+inside the AccordionPane??
+				if(openPane.resize){
+					openPane.resize({h: this._verticalSpace});
+				}
+***/
+			}
+		},
+
+		_setupChild: function(/*Widget*/ page){
+			// Summary: prepare the given child
+			return page;
+		},
+
+		_transition: function(/*Widget?*/newWidget, /*Widget?*/oldWidget){
+//TODO: should be able to replace this with calls to slideIn/slideOut
+			if(this._inTransition){ return; }
+			this._inTransition = true;
+			var animations = [];
+			var paneHeight = this._verticalSpace;
+			if(newWidget){
+				newWidget.setSelected(true);
+				var newContents = newWidget.containerNode;
+				newContents.style.display = "";
+
+				animations.push(dojo.animateProperty({
+					node: newContents,
+					duration: this.duration,
+					properties: {
+						height: { start: "1", end: paneHeight }
+					},
+					onEnd: function(){
+						newContents.style.overflow = "auto";
+					}
+				}));
+			}
+			if(oldWidget){
+				oldWidget.setSelected(false);
+				var oldContents = oldWidget.containerNode;
+				oldContents.style.overflow = "hidden";
+				animations.push(dojo.animateProperty({
+					node: oldContents,
+					duration: this.duration,
+					properties: {
+						height: { start: paneHeight, end: "1" }
+					},
+					onEnd: function(){
+						oldContents.style.display = "none";
+					}
+				}));
+			}
+
+			this._inTransition = false;
+
+			dojo.fx.combine(animations).play();
+		},
+
+		// note: we are treating the container as controller here
+		_onKeyPress: function(/*Event*/ e){
+			if(this.disabled || e.altKey || !(e._dijitWidget || e.ctrlKey)){ return; }
+			var k = dojo.keys;
+			var fromTitle = e._dijitWidget;
+			switch(e.keyCode){
+				case k.LEFT_ARROW:
+				case k.UP_ARROW:
+					if (fromTitle){
+						this._adjacent(false)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+					break;
+				case k.PAGE_UP:
+					if (e.ctrlKey){
+						this._adjacent(false)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+					break;
+				case k.RIGHT_ARROW:
+				case k.DOWN_ARROW:
+					if (fromTitle){
+						this._adjacent(true)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+					break;
+				case k.PAGE_DOWN:
+					if (e.ctrlKey){
+						this._adjacent(true)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+					break;
+				default:
+					if(e.ctrlKey && e.keyCode == k.TAB){
+						this._adjacent(e._dijitWidget, !e.shiftKey)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+				
+			}
+		}
+	}
+);
+
+dojo.declare("dijit.layout.AccordionPane",
+	[dijit.layout.ContentPane, dijit._Templated, dijit._Contained],
+	{
+	// summary:
+	//		AccordionPane is a ContentPane with a title that may contain another widget.
+	//		Nested layout widgets, such as SplitContainer, are not supported at this time.
+	// example: 
+	// | see dijit.layout.AccordionContainer
+
+	templateString:"<div class='dijitAccordionPane'\n\t><div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\"\n\t\t><div class='dijitAccordionArrow' waiRole=\"presentation\"></div\n\t\t><div class='arrowTextUp' waiRole=\"presentation\">&#9650;</div\n\t\t><div class='arrowTextDown' waiRole=\"presentation\">&#9660;</div\n\t\t><div waiRole=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'>${title}</div></div\n\t><div><div dojoAttachPoint='containerNode' style='overflow: hidden; height: 1px; display: none'\n\t\tclass='dijitAccordionBody' wairole=\"tabpanel\"\n\t></div></div>\n</div>\n",
+
+	postCreate: function(){
+		this.inherited("postCreate",arguments)
+		dojo.setSelectable(this.titleNode, false);
+		this.setSelected(this.selected);
+	},
+
+	getTitleHeight: function(){
+		// summary: returns the height of the title dom node
+		return dojo.marginBox(this.titleNode).h;	// Integer
+	},
+
+	_onTitleClick: function(){
+		// summary: callback when someone clicks my title
+		var parent = this.getParent();
+		if(!parent._inTransition){
+			parent.selectChild(this);
+			dijit.focus(this.focusNode);
+		}
+	},
+
+	_onTitleKeyPress: function(/*Event*/ evt){
+		evt._dijitWidget = this;
+		return this.getParent()._onKeyPress(evt);
+	},
+
+	_setSelectedState: function(/*Boolean*/ isSelected){
+		this.selected = isSelected;
+		dojo[(isSelected ? "addClass" : "removeClass")](this.titleNode,"dijitAccordionTitle-selected");
+		this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
+	},
+
+	_handleFocus: function(/*Event*/e){
+		// summary: handle the blur and focus state of this widget
+		dojo[(e.type=="focus" ? "addClass" : "removeClass")](this.focusNode,"dijitAccordionFocused");		
+	},
+
+	setSelected: function(/*Boolean*/ isSelected){
+		// summary: change the selected state on this pane
+		this._setSelectedState(isSelected);
+		if(isSelected){
+			this.onSelected();
+			this._loadCheck(true); // if href specified, trigger load
+		}
+	},
+
+	onSelected: function(){
+		// summary: called when this pane is selected
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.layout.BorderContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.BorderContainer"] = true;
+dojo.provide("dijit.layout.BorderContainer");
+
+
+
+
+dojo.declare(
+	"dijit.layout.BorderContainer",
+//	[dijit._Widget, dijit._Container, dijit._Contained],
+	dijit.layout._LayoutWidget,
+{
+	// summary:
+	//	Provides layout in 5 regions, a center and borders along its 4 sides.
+	//
+	// description:
+	//	A BorderContainer is a box with a specified size (like style="width: 500px; height: 500px;"),
+	//	that contains a child widget marked region="center" and optionally children widgets marked
+	//	region equal to "top", "bottom", "leading", "trailing", "left" or "right".
+	//	Children along the edges will be laid out according to width or height dimensions.  The remaining
+	//	space is designated for the center region.
+	//	The outer size must be specified on the BorderContainer node.  Width must be specified for the sides
+	//  and height for the top and bottom, respectively.  No dimensions should be specified on the center;
+	//	it will fill the remaining space.  Regions named "leading" and "trailing" may be used just like
+	//	"left" and "right" except that they will be reversed in right-to-left environments.
+	//  Optional splitters may be specified on the edge widgets only to make them resizable by the user.
+	//
+	// example:
+	// |	<style>
+	// |		html, body { height: 100%; width: 100%; }
+	// |	</style>
+	// |	<div dojoType="BorderContainer" design="sidebar" style="width: 100%; height: 100%">
+	// |		<div dojoType="ContentPane" region="top">header text</div>
+	// |		<div dojoType="ContentPane" region="right" style="width: 200px;">table of contents</div>
+	// |		<div dojoType="ContentPane" region="center">client area</div>
+	// |	</div>
+	//
+	// design: String
+	//  choose which design is used for the layout: "headline" (default) where the top and bottom extend
+	//  the full width of the container, or "sidebar" where the left and right sides extend from top to bottom.
+	design: "headline",
+
+	// liveSplitters: Boolean
+	//  specifies whether splitters resize as you drag (true) or only upon mouseup (false)
+	liveSplitters: true,
+
+	// persist: Boolean
+	//		Save splitter positions in a cookie.
+	persist: false,	// Boolean
+
+	// _splitterClass: String
+	// 		Optional hook to override the default Splitter widget used by BorderContainer
+	_splitterClass: "dijit.layout._Splitter",
+
+	postCreate: function(){
+		this.inherited(arguments);
+
+		this._splitters = {};
+		this._splitterThickness = {};
+		dojo.addClass(this.domNode, "dijitBorderContainer");
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+		dojo.forEach(this.getChildren(), this._setupChild, this);
+		this.inherited(arguments);
+	},
+
+	_setupChild: function(/*Widget*/child){
+		var region = child.region;
+		if(region){
+//			dojo.addClass(child.domNode, "dijitBorderContainerPane");
+			child.domNode.style.position = "absolute"; // bill says not to set this in CSS, since we can't keep others
+				// from destroying the class list
+
+			var ltr = this.isLeftToRight();
+			if(region == "leading"){ region = ltr ? "left" : "right"; }
+			if(region == "trailing"){ region = ltr ? "right" : "left"; }
+
+			this["_"+region] = child.domNode;
+			this["_"+region+"Widget"] = child;
+
+			if(child.splitter){
+				var _Splitter = dojo.getObject(this._splitterClass);
+				var flip = {left:'right', right:'left', top:'bottom', bottom:'top', leading:'trailing', trailing:'leading'};
+				var oppNodeList = dojo.query('[region=' + flip[child.region] + ']', this.domNode);
+				var splitter = new _Splitter({ container: this, child: child, region: region,
+					oppNode: oppNodeList[0], live: this.liveSplitters });
+				this._splitters[region] = splitter.domNode;
+				dojo.place(splitter.domNode, child.domNode, "after");
+				this._computeSplitterThickness(region);
+			}
+			child.region = region;
+		}
+	},
+
+	_computeSplitterThickness: function(region){
+		var re = new RegExp("top|bottom");
+		this._splitterThickness[region] =
+			dojo.marginBox(this._splitters[region])[(re.test(region) ? 'h' : 'w')];
+	},
+
+	layout: function(){
+		this._layoutChildren();
+	},
+
+	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		this.inherited(arguments);
+		this._setupChild(child);
+		if(this._started){
+			this._layoutChildren(); //OPT
+		}
+	},
+
+	removeChild: function(/*Widget*/ child){
+		var region = child.region;
+		var splitter = this._splitters[region];
+		if(splitter){
+			dijit.byNode(splitter).destroy();
+			delete this._splitters[region];
+			delete this._splitterThickness[region];
+		}
+		this.inherited(arguments);
+		delete this["_"+region];
+		delete this["_" +region+"Widget"];
+		if(this._started){
+			this._layoutChildren(child.region);
+		}
+	},
+
+	_layoutChildren: function(/*String?*/changedRegion){
+		var sidebarLayout = (this.design == "sidebar");
+		var topHeight = 0, bottomHeight = 0, leftWidth = 0, rightWidth = 0;
+		var topStyle = {}, leftStyle = {}, rightStyle = {}, bottomStyle = {},
+			centerStyle = (this._center && this._center.style) || {};
+
+		var changedSide = /left|right/.test(changedRegion);
+
+		var layoutSides = !changedRegion || (!changedSide && !sidebarLayout);
+		var layoutTopBottom = !changedRegion || (changedSide && sidebarLayout);
+		if(this._top){
+			topStyle = layoutTopBottom && this._top.style;
+			topHeight = dojo.marginBox(this._top).h;
+		}
+		if(this._left){
+			leftStyle = layoutSides && this._left.style;
+			leftWidth = dojo.marginBox(this._left).w;
+		}
+		if(this._right){
+			rightStyle = layoutSides && this._right.style;
+			rightWidth = dojo.marginBox(this._right).w;
+		}
+		if(this._bottom){
+			bottomStyle = layoutTopBottom && this._bottom.style;
+			bottomHeight = dojo.marginBox(this._bottom).h;
+		}
+
+		var splitters = this._splitters;
+		var topSplitter = splitters.top;
+		var bottomSplitter = splitters.bottom;
+		var leftSplitter = splitters.left;
+		var rightSplitter = splitters.right;
+		var splitterThickness = this._splitterThickness;
+		var topSplitterThickness = splitterThickness.top || 0;
+		var leftSplitterThickness = splitterThickness.left || 0;
+		var rightSplitterThickness = splitterThickness.right || 0;
+		var bottomSplitterThickness = splitterThickness.bottom || 0;
+
+		// Check for race condition where CSS hasn't finished loading, so
+		// the splitter width == the viewport width (#5824)
+		if(leftSplitterThickness > 50 || rightSplitterThickness > 50){
+			setTimeout(dojo.hitch(this, function(){
+				for(var region in this._splitters){
+					this._computeSplitterThickness(region);
+				}
+				this._layoutChildren();
+			}), 50);
+			return false;
+		}
+
+		var splitterBounds = {
+			left: (sidebarLayout ? leftWidth + leftSplitterThickness: "0") + "px",
+			right: (sidebarLayout ? rightWidth + rightSplitterThickness: "0") + "px"
+		};
+
+		if(topSplitter){
+			dojo.mixin(topSplitter.style, splitterBounds);
+			topSplitter.style.top = topHeight + "px";
+		}
+
+		if(bottomSplitter){
+			dojo.mixin(bottomSplitter.style, splitterBounds);
+			bottomSplitter.style.bottom = bottomHeight + "px";
+		}
+
+		splitterBounds = {
+			top: (sidebarLayout ? "0" : topHeight + topSplitterThickness) + "px",
+			bottom: (sidebarLayout ? "0" : bottomHeight + bottomSplitterThickness) + "px"
+		};
+
+		if(leftSplitter){
+			dojo.mixin(leftSplitter.style, splitterBounds);
+			leftSplitter.style.left = leftWidth + "px";
+		}
+
+		if(rightSplitter){
+			dojo.mixin(rightSplitter.style, splitterBounds);
+			rightSplitter.style.right = rightWidth + "px";
+		}
+
+		dojo.mixin(centerStyle, {
+			top: topHeight + topSplitterThickness + "px",
+			left: leftWidth + leftSplitterThickness + "px",
+			right:  rightWidth + rightSplitterThickness + "px",
+			bottom: bottomHeight + bottomSplitterThickness + "px"
+		});
+
+		var bounds = {
+			top: sidebarLayout ? "0" : centerStyle.top,
+			bottom: sidebarLayout ? "0" : centerStyle.bottom
+		};
+		dojo.mixin(leftStyle, bounds);
+		dojo.mixin(rightStyle, bounds);
+		leftStyle.left = rightStyle.right = topStyle.top = bottomStyle.bottom = "0";
+		if(sidebarLayout){
+			topStyle.left = bottomStyle.left = leftWidth + (this.isLeftToRight() ? leftSplitterThickness : 0) + "px";
+			topStyle.right = bottomStyle.right = rightWidth + (this.isLeftToRight() ? 0 : rightSplitterThickness) + "px";
+		}else{
+			topStyle.left = topStyle.right = bottomStyle.left = bottomStyle.right = "0";
+		}
+
+		// Nodes in IE respond to t/l/b/r, and TEXTAREA doesn't respond in any browser
+		var janky = dojo.isIE || dojo.some(this.getChildren(), function(child){
+			return child.domNode.tagName == "TEXTAREA";
+		});
+		if(janky){
+			// Set the size of the children the old fashioned way, by calling
+			// childNode.resize({h: int, w: int}) for each child node)
+
+			var borderBox = function(n, b){
+				n=dojo.byId(n);
+				var s = dojo.getComputedStyle(n);
+				if(!b){ return dojo._getBorderBox(n, s); }
+				var me = dojo._getMarginExtents(n, s);
+				dojo._setMarginBox(n, b.l, b.t, b.w + me.w, b.h + me.h, s);
+				return null;
+			};
+
+			var resizeWidget = function(widget, dim){
+				if(widget){
+					widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
+				}
+			};
+
+			// TODO: use dim passed in to resize() (see _LayoutWidget.js resize())
+			// Then can make borderBox setBorderBox(), since no longer need to ever get the borderBox() size
+			var thisBorderBox = borderBox(this.domNode);
+
+			var containerHeight = thisBorderBox.h;
+			var middleHeight = containerHeight;
+			if(this._top){ middleHeight -= topHeight; }
+			if(this._bottom){ middleHeight -= bottomHeight; }
+			if(topSplitter){ middleHeight -= topSplitterThickness; }
+			if(bottomSplitter){ middleHeight -= bottomSplitterThickness; }
+			var centerDim = { h: middleHeight };
+
+			var sidebarHeight = sidebarLayout ? containerHeight : middleHeight;
+			if(leftSplitter){ leftSplitter.style.height = sidebarHeight; }
+			if(rightSplitter){ rightSplitter.style.height = sidebarHeight; }
+			resizeWidget(this._leftWidget, {h: sidebarHeight});
+			resizeWidget(this._rightWidget, {h: sidebarHeight});
+
+			var containerWidth = thisBorderBox.w;
+			var middleWidth = containerWidth;
+			if(this._left){ middleWidth -= leftWidth; }
+			if(this._right){ middleWidth -= rightWidth; }
+			if(leftSplitter){ middleWidth -= leftSplitterThickness; }
+			if(rightSplitter){ middleWidth -= rightSplitterThickness; }
+			centerDim.w = middleWidth;
+
+			var sidebarWidth = sidebarLayout ? middleWidth : containerWidth;
+			if(topSplitter){ topSplitter.style.width = sidebarWidth; }
+			if(bottomSplitter){ bottomSplitter.style.width = sidebarWidth; }
+			resizeWidget(this._topWidget, {w: sidebarWidth});
+			resizeWidget(this._bottomWidget, {w: sidebarWidth});
+
+			resizeWidget(this._centerWidget, centerDim);
+		}else{
+
+			// We've already sized the children by setting style.top/bottom/left/right...
+			// Now just need to call resize() on those children so they can re-layout themselves
+
+			// TODO: calling child.resize() without an argument is bad, because it forces
+			// the child to query it's own size (even though this function already knows
+			// the size), plus which querying the size of a node right after setting it
+			// is known to cause problems (incorrect answer or an exception).
+			// This is a setback from older layout widgets, which
+			// don't do that.  See #3399, #2678, #3624 and #2955, #1988
+
+			var resizeList = {};
+			if(changedRegion){
+				resizeList[changedRegion] = resizeList.center = true;
+				if(/top|bottom/.test(changedRegion) && this.design != "sidebar"){
+					resizeList.left = resizeList.right = true;
+				}else if(/left|right/.test(changedRegion) && this.design == "sidebar"){
+					resizeList.top = resizeList.bottom = true;
+				}
+			}
+
+			dojo.forEach(this.getChildren(), function(child){
+				if(child.resize && (!changedRegion || child.region in resizeList)){
+	//				console.log(this.id, ": resizing child id=" + child.id + " (region=" + child.region + "), style before resize is " +
+	//									 "{ t: " + child.domNode.style.top +
+	//									", b: " + child.domNode.style.bottom +
+	//									", l: " + child.domNode.style.left +
+	//									 ", r: " + child.domNode.style.right +
+	//									 ", w: " + child.domNode.style.width +
+	//									 ", h: " + child.domNode.style.height +
+	//									"}"
+	//						);
+					child.resize();
+	//				console.log(this.id, ": after resize of child id=" + child.id + " (region=" + child.region + ") " +
+	//									 "{ t: " + child.domNode.style.top +
+	//									", b: " + child.domNode.style.bottom +
+	//									", l: " + child.domNode.style.left +
+	//									 ", r: " + child.domNode.style.right +
+	//									 ", w: " + child.domNode.style.width +
+	//									 ", h: " + child.domNode.style.height +
+	//									"}"
+	//						);
+				}
+			}, this);
+		}
+	}
+});
+
+// This argument can be specified for the children of a BorderContainer.
+// Since any widget can be specified as a LayoutContainer child, mix it
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget, {
+	// region: String
+	//		"top", "bottom", "leading", "trailing", "left", "right", "center".
+	//		See the BorderContainer description for details on this parameter.
+	region: '',
+
+	// splitter: Boolean
+	splitter: false,
+
+	// minSize: Number
+	minSize: 0,
+
+	// maxSize: Number
+	maxSize: Infinity
+});
+
+
+
+dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
+{
+/*=====
+	container: null,
+	child: null,
+	region: null,
+=====*/
+
+	// live: Boolean
+	//		If true, the child's size changes and the child widget is redrawn as you drag the splitter;
+	//		otherwise, the size doesn't change until you drop the splitter (by mouse-up)
+	live: true,
+
+	// summary: A draggable spacer between two items in a BorderContainer
+	templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag" tabIndex="0" waiRole="separator"><div class="dijitSplitterThumb"></div></div>',
+
+	postCreate: function(){
+		this.inherited(arguments);
+		this.horizontal = /top|bottom/.test(this.region);
+		dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V"));
+//		dojo.addClass(this.child.domNode, "dijitSplitterPane");
+//		dojo.setSelectable(this.domNode, false); //TODO is this necessary?
+
+		this._factor = /top|left/.test(this.region) ? 1 : -1;
+		this._minSize = this.child.minSize;
+
+		this._computeMaxSize();
+		//TODO: might be more accurate to recompute constraints on resize?
+		this.connect(this.container, "layout", dojo.hitch(this, this._computeMaxSize));
+
+		this._cookieName = this.container.id + "_" + this.region;
+		if(this.container.persist){
+			// restore old size
+			var persistSize = dojo.cookie(this._cookieName);
+			if(persistSize){
+				this.child.domNode.style[this.horizontal ? "height" : "width"] = persistSize;
+			}
+		}
+	},
+
+	_computeMaxSize: function(){
+		var dim = this.horizontal ? 'h' : 'w';
+		var available = dojo.contentBox(this.container.domNode)[dim] - (this.oppNode ? dojo.marginBox(this.oppNode)[dim] : 0);
+		this._maxSize = Math.min(this.child.maxSize, available);
+	},
+
+	_startDrag: function(e){
+		if(!this.cover){
+			this.cover = dojo.doc.createElement('div');
+			dojo.addClass(this.cover, "dijitSplitterCover");
+			dojo.place(this.cover, this.child.domNode, "after");
+		}else{
+			this.cover.style.zIndex = 1;
+		}
+
+		// Safeguard in case the stop event was missed.  Shouldn't be necessary if we always get the mouse up. 
+		if(this.fake){ dojo._destroyElement(this.fake); }
+		if(!(this._resize = this.live)){ //TODO: disable live for IE6?
+			// create fake splitter to display at old position while we drag
+			(this.fake = this.domNode.cloneNode(true)).removeAttribute("id");
+			dojo.addClass(this.domNode, "dijitSplitterShadow");
+			dojo.place(this.fake, this.domNode, "after");
+		}
+		dojo.addClass(this.domNode, "dijitSplitterActive");
+
+		//Performance: load data info local vars for onmousevent function closure
+		var factor = this._factor,
+			max = this._maxSize,
+			min = this._minSize || 10;
+		var axis = this.horizontal ? "pageY" : "pageX";
+		var pageStart = e[axis];
+		var splitterStyle = this.domNode.style;
+		var dim = this.horizontal ? 'h' : 'w';
+		var childStart = dojo.marginBox(this.child.domNode)[dim];
+		var splitterStart = parseInt(this.domNode.style[this.region]);
+		var resize = this._resize;
+		var region = this.region;
+		var mb = {};
+		var childNode = this.child.domNode;
+		var layoutFunc = dojo.hitch(this.container, this.container._layoutChildren);
+
+		var de = dojo.doc.body;
+		this._handlers = (this._handlers || []).concat([
+			dojo.connect(de, "onmousemove", this._drag = function(e, forceResize){
+				var delta = e[axis] - pageStart,
+					childSize = factor * delta + childStart,
+					boundChildSize = Math.max(Math.min(childSize, max), min);
+
+				if(resize || forceResize){
+					mb[dim] = boundChildSize;
+					// TODO: inefficient; we set the marginBox here and then immediately layoutFunc() needs to query it
+					dojo.marginBox(childNode, mb);
+					layoutFunc(region);
+				}
+				splitterStyle[region] = factor * delta + splitterStart + (boundChildSize - childSize) + "px";
+			}),
+			dojo.connect(de, "onmouseup", this, "_stopDrag")
+		]);
+		dojo.stopEvent(e);
+	},
+
+	_stopDrag: function(e){
+		try{
+			if(this.cover){ this.cover.style.zIndex = -1; }
+			if(this.fake){ dojo._destroyElement(this.fake); }
+			dojo.removeClass(this.domNode, "dijitSplitterActive");
+			dojo.removeClass(this.domNode, "dijitSplitterShadow");
+			this._drag(e); //TODO: redundant with onmousemove?
+			this._drag(e, true);
+		}finally{
+			this._cleanupHandlers();
+			delete this._drag;
+		}
+
+		if(this.container.persist){
+			dojo.cookie(this._cookieName, this.child.domNode.style[this.horizontal ? "height" : "width"]);
+		}
+	},
+
+	_cleanupHandlers: function(){
+		dojo.forEach(this._handlers, dojo.disconnect);
+		delete this._handlers;
+	},
+
+	_onKeyPress: function(/*Event*/ e){
+		// should we apply typematic to this?
+		this._resize = true;
+		var horizontal = this.horizontal;
+		var tick = 1;
+		var dk = dojo.keys;
+		switch(e.keyCode){
+			case horizontal ? dk.UP_ARROW : dk.LEFT_ARROW:
+				tick *= -1;
+				break;
+			case horizontal ? dk.DOWN_ARROW : dk.RIGHT_ARROW:
+				break;
+			default:
+//				this.inherited(arguments);
+				return;
+		}
+		var childSize = dojo.marginBox(this.child.domNode)[ horizontal ? 'h' : 'w' ] + this._factor * tick;
+		var mb = {};
+		mb[ this.horizontal ? "h" : "w"] = Math.max(Math.min(childSize, this._maxSize), this._minSize);
+		dojo.marginBox(this.child.domNode, mb);
+		this.container._layoutChildren(this.region);
+		dojo.stopEvent(e);
+	},
+
+	destroy: function(){
+		this._cleanupHandlers();
+		delete this.child;
+		delete this.container;
+		delete this.fake;
+		this.inherited(arguments);
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.layout.LayoutContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.LayoutContainer"] = true;
+dojo.provide("dijit.layout.LayoutContainer");
+
+
+
+dojo.declare("dijit.layout.LayoutContainer",
+	dijit.layout._LayoutWidget,
+	{
+	// summary:
+	//	Provides Delphi-style panel layout semantics.
+	//
+	// description:
+	//	A LayoutContainer is a box with a specified size (like style="width: 500px; height: 500px;"),
+	//	that contains children widgets marked with "layoutAlign" of "left", "right", "bottom", "top", and "client".
+	//	It takes it's children marked as left/top/bottom/right, and lays them out along the edges of the box,
+	//	and then it takes the child marked "client" and puts it into the remaining space in the middle.
+	//
+	//  Left/right positioning is similar to CSS's "float: left" and "float: right",
+	//	and top/bottom positioning would be similar to "float: top" and "float: bottom", if there were such
+	//	CSS.
+	//
+	//	Note that there can only be one client element, but there can be multiple left, right, top,
+	//	or bottom elements.
+	//
+	// example:
+	// |	<style>
+	// |		html, body{ height: 100%; width: 100%; }
+	// |	</style>
+	// |	<div dojoType="dijit.layout.LayoutContainer" style="width: 100%; height: 100%">
+	// |		<div dojoType="dijit.layout.ContentPane" layoutAlign="top">header text</div>
+	// |		<div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="width: 200px;">table of contents</div>
+	// |		<div dojoType="dijit.layout.ContentPane" layoutAlign="client">client area</div>
+	// |	</div>
+	// |
+	// |	Lays out each child in the natural order the children occur in.
+	// |	Basically each child is laid out into the "remaining space", where "remaining space" is initially
+	// |	the content area of this widget, but is reduced to a smaller rectangle each time a child is added.
+	//	
+
+	constructor: function(){
+		dojo.deprecated("dijit.layout.LayoutContainer is deprecated", "use BorderContainer instead", 2.0);
+	},
+
+	layout: function(){
+		dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+	},
+
+	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		dijit._Container.prototype.addChild.apply(this, arguments);
+		if(this._started){
+			dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+		}
+	},
+
+	removeChild: function(/*Widget*/ widget){
+		dijit._Container.prototype.removeChild.apply(this, arguments);
+		if(this._started){
+			dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+		}
+	}
+});
+
+// This argument can be specified for the children of a LayoutContainer.
+// Since any widget can be specified as a LayoutContainer child, mix it
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget, {
+	// layoutAlign: String
+	//		"none", "left", "right", "bottom", "top", and "client".
+	//		See the LayoutContainer description for details on this parameter.
+	layoutAlign: 'none'
+});
+
+}
+
+if(!dojo._hasResource["dijit.layout.LinkPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.LinkPane"] = true;
+dojo.provide("dijit.layout.LinkPane");
+
+
+
+
+dojo.declare("dijit.layout.LinkPane",
+	[dijit.layout.ContentPane, dijit._Templated],
+	{
+	// summary: 
+	//	A ContentPane that loads data remotely
+	// description:
+	//	LinkPane is just a ContentPane that loads data remotely (via the href attribute),
+	//	and has markup similar to an anchor.  The anchor's body (the words between `<a>` and `</a>`)
+	//	become the title of the widget (used for TabContainer, AccordionContainer, etc.)
+	// example:
+	//	<a href="foo.html">my title</a>
+
+	// I'm using a template because the user may specify the input as
+	// <a href="foo.html">title</a>, in which case we need to get rid of the
+	// <a> because we don't want a link.
+	templateString: '<div class="dijitLinkPane"></div>',
+
+	postCreate: function(){
+
+		// If user has specified node contents, they become the title
+		// (the link must be plain text)
+		if(this.srcNodeRef){
+			this.title += this.srcNodeRef.innerHTML;
+		}
+		this.inherited("postCreate",arguments);
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.layout.SplitContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.SplitContainer"] = true;
+dojo.provide("dijit.layout.SplitContainer");
+
+//
+// FIXME: make it prettier
+// FIXME: active dragging upwards doesn't always shift other bars (direction calculation is wrong in this case)
+//
+
+
+
+
+dojo.declare("dijit.layout.SplitContainer",
+	dijit.layout._LayoutWidget,
+	{
+	// summary: 
+	//	A Container widget with sizing handles in-between each child
+	// description:
+	//		Contains multiple children widgets, all of which are displayed side by side
+	//		(either horizontally or vertically); there's a bar between each of the children,
+	//		and you can adjust the relative size of each child by dragging the bars.
+	//
+	//		You must specify a size (width and height) for the SplitContainer.
+
+	constructor: function(){
+		dojo.deprecated("dijit.layout.SplitContainer is deprecated", "use BorderContainer with splitter instead", 2.0);
+	},
+
+	// activeSizing: Boolean
+	//		If true, the children's size changes as you drag the bar;
+	//		otherwise, the sizes don't change until you drop the bar (by mouse-up)
+	activeSizing: false,
+
+	// sizerWidth: Integer
+	//		Size in pixels of the bar between each child
+	sizerWidth: 7, // FIXME: this should be a CSS attribute (at 7 because css wants it to be 7 until we fix to css)
+
+	// orientation: String
+	//		either 'horizontal' or vertical; indicates whether the children are
+	//		arranged side-by-side or up/down.
+	orientation: 'horizontal',
+
+	// persist: Boolean
+	//		Save splitter positions in a cookie
+	persist: true,
+
+	postMixInProperties: function(){
+		this.inherited("postMixInProperties",arguments);
+		this.isHorizontal = (this.orientation == 'horizontal');
+	},
+
+	postCreate: function(){
+		this.inherited("postCreate",arguments);
+		this.sizers = [];
+		dojo.addClass(this.domNode, "dijitSplitContainer");
+		// overflow has to be explicitly hidden for splitContainers using gekko (trac #1435)
+		// to keep other combined css classes from inadvertantly making the overflow visible
+		if(dojo.isMozilla){
+			this.domNode.style.overflow = '-moz-scrollbars-none'; // hidden doesn't work
+		}
+
+		// create the fake dragger
+		if(typeof this.sizerWidth == "object"){
+			try{ //FIXME: do this without a try/catch
+				this.sizerWidth = parseInt(this.sizerWidth.toString());
+			}catch(e){ this.sizerWidth = 7; }
+		}
+		var sizer = this.virtualSizer = dojo.doc.createElement('div');
+		sizer.style.position = 'relative';
+
+		// #1681: work around the dreaded 'quirky percentages in IE' layout bug
+		// If the splitcontainer's dimensions are specified in percentages, it
+		// will be resized when the virtualsizer is displayed in _showSizingLine
+		// (typically expanding its bounds unnecessarily). This happens because
+		// we use position: relative for .dijitSplitContainer.
+		// The workaround: instead of changing the display style attribute,
+		// switch to changing the zIndex (bring to front/move to back)
+
+		sizer.style.zIndex = 10;
+		sizer.className = this.isHorizontal ? 'dijitSplitContainerVirtualSizerH' : 'dijitSplitContainerVirtualSizerV';
+		this.domNode.appendChild(sizer);
+		dojo.setSelectable(sizer, false);
+	},
+
+	destroy: function(){
+		delete this.virtualSizer;
+		dojo.forEach(this._ownconnects, dojo.disconnect);
+		this.inherited(arguments);
+	},
+	startup: function(){
+		if(this._started){ return; }
+
+		dojo.forEach(this.getChildren(), function(child, i, children){
+			// attach the children and create the draggers
+			this._injectChild(child);
+
+			if(i < children.length-1){
+				this._addSizer();
+			}
+		}, this);
+
+		if(this.persist){
+			this._restoreState();
+		}
+
+		this.inherited(arguments); 
+	},
+
+	_injectChild: function(child){
+		child.domNode.style.position = "absolute";
+		dojo.addClass(child.domNode, "dijitSplitPane");
+	},
+
+	_addSizer: function(){
+		var i = this.sizers.length;
+
+		// TODO: use a template for this!!!
+		var sizer = this.sizers[i] = dojo.doc.createElement('div');
+		this.domNode.appendChild(sizer);
+
+		sizer.className = this.isHorizontal ? 'dijitSplitContainerSizerH' : 'dijitSplitContainerSizerV';
+
+		// add the thumb div
+		var thumb = dojo.doc.createElement('div');
+		thumb.className = 'thumb';
+		sizer.appendChild(thumb);
+
+		// FIXME: are you serious? why aren't we using mover start/stop combo?
+		var self = this;
+		var handler = (function(){ var sizer_i = i; return function(e){ self.beginSizing(e, sizer_i); } })();
+		this.connect(sizer, "onmousedown", handler);
+		
+		dojo.setSelectable(sizer, false);
+	},
+
+	removeChild: function(widget){
+		// summary: Remove sizer, but only if widget is really our child and
+		// we have at least one sizer to throw away
+		if(this.sizers.length){
+			var i=dojo.indexOf(this.getChildren(), widget)
+			if(i != -1){
+				if(i==this.sizers.length){
+					i--;
+				}
+				dojo._destroyElement(this.sizers[i]);
+				this.sizers.splice(i,1);
+			}
+		}
+
+		// Remove widget and repaint
+		this.inherited(arguments); 
+		if(this._started){
+			this.layout();
+		}
+	},
+
+	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		// summary: Add a child widget to the container
+		// child: a widget to add
+		// insertIndex: postion in the "stack" to add the child widget
+		
+		this.inherited("addChild",arguments); 
+
+		if(this._started){
+			// Do the stuff that startup() does for each widget
+			this._injectChild(child);
+			var children = this.getChildren();
+			if(children.length > 1){
+				this._addSizer();
+			}
+
+			// and then reposition (ie, shrink) every pane to make room for the new guy
+			this.layout();
+		}
+	},
+
+	layout: function(){
+		// summary:
+		//		Do layout of panels
+
+		// base class defines this._contentBox on initial creation and also
+		// on resize
+		this.paneWidth = this._contentBox.w;
+		this.paneHeight = this._contentBox.h;
+
+		var children = this.getChildren();
+		if(!children.length){ return; }
+
+		//
+		// calculate space
+		//
+
+		var space = this.isHorizontal ? this.paneWidth : this.paneHeight;
+		if(children.length > 1){
+			space -= this.sizerWidth * (children.length - 1);
+		}
+
+		//
+		// calculate total of SizeShare values
+		//
+		var outOf = 0;
+		dojo.forEach(children, function(child){
+			outOf += child.sizeShare;
+		});
+
+		//
+		// work out actual pixels per sizeshare unit
+		//
+		var pixPerUnit = space / outOf;
+
+		//
+		// set the SizeActual member of each pane
+		//
+		var totalSize = 0;
+		dojo.forEach(children.slice(0, children.length - 1), function(child){
+			var size = Math.round(pixPerUnit * child.sizeShare);
+			child.sizeActual = size;
+			totalSize += size;
+		});
+
+		children[children.length-1].sizeActual = space - totalSize;
+
+		//
+		// make sure the sizes are ok
+		//
+		this._checkSizes();
+
+		//
+		// now loop, positioning each pane and letting children resize themselves
+		//
+
+		var pos = 0;
+		var size = children[0].sizeActual;
+		this._movePanel(children[0], pos, size);
+		children[0].position = pos;
+		pos += size;
+
+		// if we don't have any sizers, our layout method hasn't been called yet
+		// so bail until we are called..TODO: REVISIT: need to change the startup
+		// algorithm to guaranteed the ordering of calls to layout method
+		if(!this.sizers){
+			return;
+		}
+
+		dojo.some(children.slice(1), function(child, i){
+			// error-checking
+			if(!this.sizers[i]){
+				return true;
+			}
+			// first we position the sizing handle before this pane
+			this._moveSlider(this.sizers[i], pos, this.sizerWidth);
+			this.sizers[i].position = pos;
+			pos += this.sizerWidth;
+
+			size = child.sizeActual;
+			this._movePanel(child, pos, size);
+			child.position = pos;
+			pos += size;
+		}, this);
+	},
+
+	_movePanel: function(panel, pos, size){
+		if(this.isHorizontal){
+			panel.domNode.style.left = pos + 'px';	// TODO: resize() takes l and t parameters too, don't need to set manually
+			panel.domNode.style.top = 0;
+			var box = {w: size, h: this.paneHeight};
+			if(panel.resize){
+				panel.resize(box);
+			}else{
+				dojo.marginBox(panel.domNode, box);
+			}
+		}else{
+			panel.domNode.style.left = 0;	// TODO: resize() takes l and t parameters too, don't need to set manually
+			panel.domNode.style.top = pos + 'px';
+			var box = {w: this.paneWidth, h: size};
+			if(panel.resize){
+				panel.resize(box);
+			}else{
+				dojo.marginBox(panel.domNode, box);
+			}
+		}
+	},
+
+	_moveSlider: function(slider, pos, size){
+		if(this.isHorizontal){
+			slider.style.left = pos + 'px';
+			slider.style.top = 0;
+			dojo.marginBox(slider, { w: size, h: this.paneHeight });
+		}else{
+			slider.style.left = 0;
+			slider.style.top = pos + 'px';
+			dojo.marginBox(slider, { w: this.paneWidth, h: size });
+		}
+	},
+
+	_growPane: function(growth, pane){
+		if(growth > 0){
+			if(pane.sizeActual > pane.sizeMin){
+				if((pane.sizeActual - pane.sizeMin) > growth){
+
+					// stick all the growth in this pane
+					pane.sizeActual = pane.sizeActual - growth;
+					growth = 0;
+				}else{
+					// put as much growth in here as we can
+					growth -= pane.sizeActual - pane.sizeMin;
+					pane.sizeActual = pane.sizeMin;
+				}
+			}
+		}
+		return growth;
+	},
+
+	_checkSizes: function(){
+
+		var totalMinSize = 0;
+		var totalSize = 0;
+		var children = this.getChildren();
+
+		dojo.forEach(children, function(child){
+			totalSize += child.sizeActual;
+			totalMinSize += child.sizeMin;
+		});
+
+		// only make adjustments if we have enough space for all the minimums
+
+		if(totalMinSize <= totalSize){
+
+			var growth = 0;
+
+			dojo.forEach(children, function(child){
+				if(child.sizeActual < child.sizeMin){
+					growth += child.sizeMin - child.sizeActual;
+					child.sizeActual = child.sizeMin;
+				}
+			});
+
+			if(growth > 0){
+				var list = this.isDraggingLeft ? children.reverse() : children;
+				dojo.forEach(list, function(child){
+					growth = this._growPane(growth, child);
+				}, this);
+			}
+		}else{
+			dojo.forEach(children, function(child){
+				child.sizeActual = Math.round(totalSize * (child.sizeMin / totalMinSize));
+			});
+		}
+	},
+
+	beginSizing: function(e, i){
+		var children = this.getChildren();
+		this.paneBefore = children[i];
+		this.paneAfter = children[i+1];
+
+		this.isSizing = true;
+		this.sizingSplitter = this.sizers[i];
+
+		if(!this.cover){
+			this.cover = dojo.doc.createElement('div');
+			this.domNode.appendChild(this.cover);
+			var s = this.cover.style;
+			s.position = 'absolute';
+			s.zIndex = 1;
+			s.top = 0;
+			s.left = 0;
+			s.width = "100%";
+			s.height = "100%";
+		}else{
+			this.cover.style.zIndex = 1;
+		}
+		this.sizingSplitter.style.zIndex = 2;
+
+		// TODO: REVISIT - we want MARGIN_BOX and core hasn't exposed that yet (but can't we use it anyway if we pay attention? we do elsewhere.)
+		this.originPos = dojo.coords(children[0].domNode, true);
+		if(this.isHorizontal){
+			var client = (e.layerX ? e.layerX : e.offsetX);
+			var screen = e.pageX;
+			this.originPos = this.originPos.x;
+		}else{
+			var client = (e.layerY ? e.layerY : e.offsetY);
+			var screen = e.pageY;
+			this.originPos = this.originPos.y;
+		}
+		this.startPoint = this.lastPoint = screen;
+		this.screenToClientOffset = screen - client;
+		this.dragOffset = this.lastPoint - this.paneBefore.sizeActual - this.originPos - this.paneBefore.position;
+
+		if(!this.activeSizing){
+			this._showSizingLine();
+		}
+
+		//					
+		// attach mouse events
+		//
+		this._ownconnects = [];
+		this._ownconnects.push(dojo.connect(dojo.doc.documentElement, "onmousemove", this, "changeSizing"));
+		this._ownconnects.push(dojo.connect(dojo.doc.documentElement, "onmouseup", this, "endSizing"));
+
+		dojo.stopEvent(e);
+	},
+
+	changeSizing: function(e){
+		if(!this.isSizing){ return; }
+		this.lastPoint = this.isHorizontal ? e.pageX : e.pageY;
+		this.movePoint();
+		if(this.activeSizing){
+			this._updateSize();
+		}else{
+			this._moveSizingLine();
+		}
+		dojo.stopEvent(e);
+	},
+
+	endSizing: function(e){
+		if(!this.isSizing){ return; }
+		if(this.cover){
+			this.cover.style.zIndex = -1;
+		}
+		if(!this.activeSizing){
+			this._hideSizingLine();
+		}
+
+		this._updateSize();
+
+		this.isSizing = false;
+
+		if(this.persist){
+			this._saveState(this);
+		}
+
+		dojo.forEach(this._ownconnects,dojo.disconnect); 
+	},
+
+	movePoint: function(){
+
+		// make sure lastPoint is a legal point to drag to
+		var p = this.lastPoint - this.screenToClientOffset;
+
+		var a = p - this.dragOffset;
+		a = this.legaliseSplitPoint(a);
+		p = a + this.dragOffset;
+
+		this.lastPoint = p + this.screenToClientOffset;
+	},
+
+	legaliseSplitPoint: function(a){
+
+		a += this.sizingSplitter.position;
+
+		this.isDraggingLeft = !!(a > 0);
+
+		if(!this.activeSizing){
+			var min = this.paneBefore.position + this.paneBefore.sizeMin;
+			if(a < min){
+				a = min;
+			}
+
+			var max = this.paneAfter.position + (this.paneAfter.sizeActual - (this.sizerWidth + this.paneAfter.sizeMin));
+			if(a > max){
+				a = max;
+			}
+		}
+
+		a -= this.sizingSplitter.position;
+
+		this._checkSizes();
+
+		return a;
+	},
+
+	_updateSize: function(){
+	//FIXME: sometimes this.lastPoint is NaN
+		var pos = this.lastPoint - this.dragOffset - this.originPos;
+
+		var start_region = this.paneBefore.position;
+		var end_region   = this.paneAfter.position + this.paneAfter.sizeActual;
+
+		this.paneBefore.sizeActual = pos - start_region;
+		this.paneAfter.position	= pos + this.sizerWidth;
+		this.paneAfter.sizeActual  = end_region - this.paneAfter.position;
+
+		dojo.forEach(this.getChildren(), function(child){
+			child.sizeShare = child.sizeActual;
+		});
+
+		if(this._started){
+			this.layout();
+		}
+	},
+
+	_showSizingLine: function(){
+
+		this._moveSizingLine();
+
+		dojo.marginBox(this.virtualSizer,
+			this.isHorizontal ? { w: this.sizerWidth, h: this.paneHeight } : { w: this.paneWidth, h: this.sizerWidth });
+
+		this.virtualSizer.style.display = 'block';
+	},
+
+	_hideSizingLine: function(){
+		this.virtualSizer.style.display = 'none';
+	},
+
+	_moveSizingLine: function(){
+		var pos = (this.lastPoint - this.startPoint) + this.sizingSplitter.position;
+		dojo.style(this.virtualSizer,(this.isHorizontal ? "left" : "top"),pos+"px");
+		// this.virtualSizer.style[ this.isHorizontal ? "left" : "top" ] = pos + 'px'; // FIXME: remove this line if the previous is better
+	},
+
+	_getCookieName: function(i){
+		return this.id + "_" + i;
+	},
+
+	_restoreState: function(){
+		dojo.forEach(this.getChildren(), function(child, i){
+			var cookieName = this._getCookieName(i);
+			var cookieValue = dojo.cookie(cookieName);
+			if(cookieValue){
+				var pos = parseInt(cookieValue);
+				if(typeof pos == "number"){
+					child.sizeShare = pos;
+				}
+			}
+		}, this);
+	},
+
+	_saveState: function(){
+		dojo.forEach(this.getChildren(), function(child, i){
+			dojo.cookie(this._getCookieName(i), child.sizeShare);
+		}, this);
+	}
+});
+
+// These arguments can be specified for the children of a SplitContainer.
+// Since any widget can be specified as a SplitContainer child, mix them
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget, {
+	// sizeMin: Integer
+	//	Minimum size (width or height) of a child of a SplitContainer.
+	//	The value is relative to other children's sizeShare properties.
+	sizeMin: 10,
+
+	// sizeShare: Integer
+	//	Size (width or height) of a child of a SplitContainer.
+	//	The value is relative to other children's sizeShare properties.
+	//	For example, if there are two children and each has sizeShare=10, then
+	//	each takes up 50% of the available space.
+	sizeShare: 10
+});
+
+}
+
+if(!dojo._hasResource["dijit.layout.TabContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.TabContainer"] = true;
+dojo.provide("dijit.layout.TabContainer");
+
+
+
+
+dojo.declare("dijit.layout.TabContainer",
+	[dijit.layout.StackContainer, dijit._Templated],
+	{	
+	// summary: 
+	//	A Container with Title Tabs, each one pointing at a pane in the container.
+	// description:
+	//	A TabContainer is a container that has multiple panes, but shows only
+	//	one pane at a time.  There are a set of tabs corresponding to each pane,
+	//	where each tab has the title (aka title) of the pane, and optionally a close button.
+	//
+	//	Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
+	//	(where [widgetId] is the id of the TabContainer itself.
+	//
+	// tabPosition: String
+	//   Defines where tabs go relative to tab content.
+	//   "top", "bottom", "left-h", "right-h"
+	tabPosition: "top",
+
+	templateString: null,	// override setting in StackContainer
+	templateString:"<div class=\"dijitTabContainer\">\n\t<div dojoAttachPoint=\"tablistNode\"></div>\n\t<div class=\"dijitTabPaneWrapper\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n",
+
+	// _controllerWidget: String
+	//		An optional parameter to overrider the default TabContainer controller used.
+	_controllerWidget: "dijit.layout.TabController",
+
+	postCreate: function(){	
+		this.inherited(arguments);
+		// create the tab list that will have a tab (a.k.a. tab button) for each tab panel
+		var TabController = dojo.getObject(this._controllerWidget);
+		this.tablist = new TabController({
+			id: this.id + "_tablist",
+			tabPosition: this.tabPosition,
+			doLayout: this.doLayout,
+			containerId: this.id
+		}, this.tablistNode);		
+	},
+
+	_setupChild: function(/* Widget */tab){
+		dojo.addClass(tab.domNode, "dijitTabPane");
+		this.inherited(arguments);
+		return tab; // Widget
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		// wire up the tablist and its tabs
+		this.tablist.startup();
+		this.inherited(arguments);
+
+		if(dojo.isSafari){
+			// sometimes safari 3.0.3 miscalculates the height of the tab labels, see #4058
+			setTimeout(dojo.hitch(this, "layout"), 0);
+		}
+
+		if(dojo.isIE && !this.isLeftToRight() && this.tabPosition == "right-h" &&
+		   this.tablist && this.tablist.pane2button){
+			//need rectify non-closable tab in IE, only for "right-h" mode
+			for(var pane in this.tablist.pane2button){
+				var tabButton = this.tablist.pane2button[pane];
+				if(!tabButton.closeButton){ continue; }
+				tabButtonStyle = tabButton.closeButtonNode.style;
+				tabButtonStyle.position ="absolute";
+				if(dojo.isIE < 7){
+					tabButtonStyle.left = tabButton.domNode.offsetWidth + "px";
+				}else{
+					tabButtonStyle.padding = "0px";
+				}
+			}
+		}
+	},
+
+	layout: function(){
+		// Summary: Configure the content pane to take up all the space except for where the tabs are
+		if(!this.doLayout){ return; }
+
+		// position and size the titles and the container node
+		var titleAlign = this.tabPosition.replace(/-h/,"");
+		var children = [
+			{ domNode: this.tablist.domNode, layoutAlign: titleAlign },
+			{ domNode: this.containerNode, layoutAlign: "client" }
+		];
+		dijit.layout.layoutChildren(this.domNode, this._contentBox, children);
+
+		// Compute size to make each of my children.
+		// children[1] is the margin-box size of this.containerNode, set by layoutChildren() call above
+		this._containerContentBox = dijit.layout.marginBox2contentBox(this.containerNode, children[1]);
+
+		if(this.selectedChildWidget){
+			this._showChild(this.selectedChildWidget);
+			if(this.doLayout && this.selectedChildWidget.resize){
+				this.selectedChildWidget.resize(this._containerContentBox);
+			}
+		}
+	},
+
+	destroy: function(){
+		if(this.tablist){
+			this.tablist.destroy();
+		}
+		this.inherited(arguments);
+	}
+});
+
+//TODO: make private?
+dojo.declare("dijit.layout.TabController",
+	dijit.layout.StackController,
+	{
+	// summary:
+	// 	Set of tabs (the things with titles and a close button, that you click to show a tab panel).
+	// description:
+	//	Lets the user select the currently shown pane in a TabContainer or StackContainer.
+	//	TabController also monitors the TabContainer, and whenever a pane is
+	//	added or deleted updates itself accordingly.
+
+	templateString: "<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",
+
+	// tabPosition: String
+	//   Defines where tabs go relative to the content.
+	//   "top", "bottom", "left-h", "right-h"
+	tabPosition: "top",
+
+	// doLayout: Boolean
+	// 	TODOC: deprecate doLayout? not sure.
+	doLayout: true,
+
+	// buttonWidget: String
+	//	The name of the tab widget to create to correspond to each page
+	buttonWidget: "dijit.layout._TabButton",
+
+	postMixInProperties: function(){
+		this["class"] = "dijitTabLabels-" + this.tabPosition + (this.doLayout ? "" : " dijitTabNoLayout");
+		this.inherited(arguments);
+	},
+
+//TODO: can this be accomplished in CSS?
+	_rectifyRtlTabList: function(){
+		//Summary: Rectify the length of all tabs in rtl, otherwise the tab lengths are different in IE
+		if(0 >= this.tabPosition.indexOf('-h')){ return; }
+		if(!this.pane2button){ return; }
+
+		var maxLen = 0;
+		for(var pane in this.pane2button){
+			maxLen = Math.max(maxLen, dojo.marginBox(this.pane2button[pane].innerDiv).w);
+		}
+		//unify the length of all the tabs
+		for(pane in this.pane2button){
+			this.pane2button[pane].innerDiv.style.width = maxLen + 'px';
+		}	
+	}
+});
+
+dojo.declare("dijit.layout._TabButton",
+	dijit.layout._StackButton,
+	{
+	// summary:
+	//	A tab (the thing you click to select a pane).
+	// description:
+	//	Contains the title of the pane, and optionally a close-button to destroy the pane.
+	//	This is an internal widget and should not be instantiated directly.
+
+	baseClass: "dijitTab",
+
+	templateString:"<div waiRole=\"presentation\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n    <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n        <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n\t        <span dojoAttachPoint='containerNode,focusNode' class='tabLabel'>${!label}</span>\n\t        <span dojoAttachPoint='closeButtonNode' class='closeImage' dojoAttachEvent='onmouseenter:_onMouse, onmouseleave:_onMouse, onclick:onClickCloseButton' stateModifier='CloseButton'>\n\t            <span dojoAttachPoint='closeText' class='closeText'>x</span>\n\t        </span>\n        </div>\n    </div>\n</div>\n",
+
+	postCreate: function(){
+		if(this.closeButton){
+			dojo.addClass(this.innerDiv, "dijitClosable");
+		}else{
+			this.closeButtonNode.style.display="none";
+		}
+		this.inherited(arguments); 
+		dojo.setSelectable(this.containerNode, false);
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.dijit-all"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.dijit-all"] = true;
+console.warn("dijit-all may include much more code than your application actually requires. We strongly recommend that you investigate a custom build or the web build tool");
+dojo.provide("dijit.dijit-all");
+
+/*=====
+dijit["dijit-all"] = { 
+	// summary: A rollup that includes every dijit. You probably don't need this.
+};
+=====*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ //deprecated
+
+ //deprecated
+
+
+
+
+}
+
+
+dojo.i18n._preloadLocalizations("dijit.nls.dijit-all", ["he","nl","tr","no","ko","el","en","en-gb","ROOT","zh-cn","hu","es","fi-fi","pt-br","fi","he-il","xx","ru","it","fr","cs","de-de","fr-fr","it-it","es-es","ja","da","pl","de","sv","pt","zh-tw","pt-pt","nl-nl","ko-kr","ar","en-us","zh","ja-jp"]);

Added: branches/vhffs-design/vhffs-panel/js/dijit/dijit.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/dijit.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/dijit.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,20 @@
+/*
+	Copyright (c) 2004-2008, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing
+*/
+
+/*
+	This is a compiled version of Dojo, built for deployment and not for
+	development. To get an editable version, please visit:
+
+		http://dojotoolkit.org
+
+	for documentation and information on getting the source.
+*/
+
+if(!dojo._hasResource["dijit._base.focus"]){dojo._hasResource["dijit._base.focus"]=true;dojo.provide("dijit._base.focus");dojo.mixin(dijit,{_curFocus:null,_prevFocus:null,isCollapsed:function(){var _1=dojo.global;var _2=dojo.doc;if(_2.selection){return !_2.selection.createRange().text;}else{var _3=_1.getSelection();if(dojo.isString(_3)){return !_3;}else{return _3.isCollapsed||!_3.toString();}}},getBookmark:function(){var _4,_5=dojo.doc.selection;if(_5){var _6=_5.createRange();if(_5.type.toUpperCase()=="CONTROL"){if(_6.length){_4=[];var i=0,_8=_6.length;while(i<_8){_4.push(_6.item(i++));}}else{_4=null;}}else{_4=_6.getBookmark();}}else{if(window.getSelection){_5=dojo.global.getSelection();if(_5){_6=_5.getRangeAt(0);_4=_6.cloneRange();}}else{console.warn("No idea how to store the current selection for this browser!");}}return _4;},moveToBookmark:function(_9){var _a=dojo.doc;if(_a.selection){var _b;if(dojo.isArray(_9)){_b=_a.body.createControlRange();dojo.forEach(_9,"range.addElement(item)");}else{_b=_a.selection.createRange();_b.moveToBookmark(_9);}_b.select();}else{var _c=dojo.global.getSelection&&dojo.global.getSelection();if(_c&&_c.removeAllRanges){_c.removeAllRanges();_c.addRange(_9);}else{console.warn("No idea how to restore selection for this browser!");}}},getFocus:function(_d,_e){return {node:_d&&dojo.isDescendant(dijit._curFocus,_d.domNode)?dijit._prevFocus:dijit._curFocus,bookmark:!dojo.withGlobal(_e||dojo.global,dijit.isCollapsed)?dojo.withGlobal(_e||dojo.global,dijit.getBookmark):null,openedForWindow:_e};},focus:function(_f){if(!_f){return;}var _10="node" in _f?_f.node:_f,_11=_f.bookmark,_12=_f.openedForWindow;if(_10){var _13=(_10.tagName.toLowerCase()=="iframe")?_10.contentWindow:_10;if(_13&&_13.focus){try{_13.focus();}catch(e){}}dijit._onFocusNode(_10);}if(_11&&dojo.withGlobal(_12||dojo.global,dijit.isCollapsed)){if(_12){_12.focus();}try{dojo.withGlobal(_12||dojo.global,dijit.moveToBookmark,null,[_11]);}catch(e){}}},_activeStack:[],registerWin:function(_14){if(!_14){_14=window;}dojo.connect(_14.document,"onmousedown",function(evt){dijit._justMouseDowned=true;setTimeout(function(){dijit._justMouseDowned=false;},0);dijit._onTouchNode(evt.target||evt.srcElement);});var _16=_14.document.body||_14.document.getElementsByTagName("body")[0];if(_16){if(dojo.isIE){_16.attachEvent("onactivate",function(evt){if(evt.srcElement.tagName.toLowerCase()!="body"){dijit._onFocusNode(evt.srcElement);}});_16.attachEvent("ondeactivate",function(evt){dijit._onBlurNode(evt.srcElement);});}else{_16.addEventListener("focus",function(evt){dijit._onFocusNode(evt.target);},true);_16.addEventListener("blur",function(evt){dijit._onBlurNode(evt.target);},true);}}_16=null;},_onBlurNode:function(_1b){dijit._prevFocus=dijit._curFocus;dijit._curFocus=null;if(dijit._justMouseDowned){return;}if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);}dijit._clearActiveWidgetsTimer=setTimeout(function(){delete dijit._clearActiveWidgetsTimer;dijit._setStack([]);dijit._prevFocus=null;},100);},_onTouchNode:function(_1c){if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);delete dijit._clearActiveWidgetsTimer;}var _1d=[];try{while(_1c){if(_1c.dijitPopupParent){_1c=dijit.byId(_1c.dijitPopupParent).domNode;}else{if(_1c.tagName&&_1c.tagName.toLowerCase()=="body"){if(_1c===dojo.body()){break;}_1c=dijit.getDocumentWindow(_1c.ownerDocument).frameElement;}else{var id=_1c.getAttribute&&_1c.getAttribute("widgetId");if(id){_1d.unshift(id);}_1c=_1c.parentNode;}}}}catch(e){}dijit._setStack(_1d);},_onFocusNode:function(_1f){if(_1f&&_1f.tagName&&_1f.tagName.toLowerCase()=="body"){return;}dijit._onTouchNode(_1f);if(_1f==dijit._curFocus){return;}if(dijit._curFocus){dijit._prevFocus=dijit._curFocus;}dijit._curFocus=_1f;dojo.publish("focusNode",[_1f]);},_setStack:function(_20){var _21=dijit._activeStack;dijit._activeStack=_20;for(var _22=0;_22<Math.min(_21.length,_20.length);_22++){if(_21[_22]!=_20[_22]){break;}}for(var i=_21.length-1;i>=_22;i--){var _24=dijit.byId(_21[i]);if(_24){_24._focused=false;_24._hasBeenBlurred=true;if(_24._onBlur){_24._onBlur();}if(_24._setStateClass){_24._setStateClass();}dojo.publish("widgetBlur",[_24]);}}for(i=_22;i<_20.length;i++){_24=dijit.byId(_20[i]);if(_24){_24._focused=true;if(_24._onFocus){_24._onFocus();}if(_24._setStateClass){_24._setStateClass();}dojo.publish("widgetFocus",[_24]);}}}});dojo.addOnLoad(dijit.registerWin);}if(!dojo._hasResource["dijit._base.manager"]){dojo._hasResource["dijit._base.manager"]=true;dojo.provide("dijit._base.manager");dojo.declare("dijit.WidgetSet",null,{constructor:function(){this._hash={};},add:function(_25){if(this._hash[_25.id]){throw new Error("Tried to register widget with id=="+_25.id+" but that id is already registered");}this._hash[_25.id]=_25;},remove:function(id){delete this._hash[id];},forEach:function(_27){for(var id in this._hash){_27(this._hash[id]);}},filter:function(_29){var res=new dijit.WidgetSet();this.forEach(function(_2b){if(_29(_2b)){res.add(_2b);}});return res;},byId:function(id){return this._hash[id];},byClass:function(cls){return this.filter(function(_2e){return _2e.declaredClass==cls;});}});dijit.registry=new dijit.WidgetSet();dijit._widgetTypeCtr={};dijit.getUniqueId=function(_2f){var id;do{id=_2f+"_"+(_2f in dijit._widgetTypeCtr?++dijit._widgetTypeCtr[_2f]:dijit._widgetTypeCtr[_2f]=0);}while(dijit.byId(id));return id;};if(dojo.isIE){dojo.addOnUnload(function(){dijit.registry.forEach(function(_31){_31.destroy();});});}dijit.byId=function(id){return (dojo.isString(id))?dijit.registry.byId(id):id;};dijit.byNode=function(_33){return dijit.registry.byId(_33.getAttribute("widgetId"));};dijit.getEnclosingWidget=function(_34){while(_34){if(_34.getAttribute&&_34.getAttribute("widgetId")){return dijit.registry.byId(_34.getAttribute("widgetId"));}_34=_34.parentNode;}return null;};dijit._tabElements={area:true,button:true,input:true,object:true,select:true,textarea:true};dijit._isElementShown=function(_35){var _36=dojo.style(_35);return (_36.visibility!="hidden")&&(_36.visibility!="collapsed")&&(_36.display!="none");};dijit.isTabNavigable=function(_37){if(dojo.hasAttr(_37,"disabled")){return false;}var _38=dojo.hasAttr(_37,"tabindex");var _39=dojo.attr(_37,"tabindex");if(_38&&_39>=0){return true;}var _3a=_37.nodeName.toLowerCase();if(((_3a=="a"&&dojo.hasAttr(_37,"href"))||dijit._tabElements[_3a])&&(!_38||_39>=0)){return true;}return false;};dijit._getTabNavigable=function(_3b){var _3c,_3d,_3e,_3f,_40,_41;var _42=function(_43){dojo.query("> *",_43).forEach(function(_44){var _45=dijit._isElementShown(_44);if(_45&&dijit.isTabNavigable(_44)){var _46=dojo.attr(_44,"tabindex");if(!dojo.hasAttr(_44,"tabindex")||_46==0){if(!_3c){_3c=_44;}_3d=_44;}else{if(_46>0){if(!_3e||_46<_3f){_3f=_46;_3e=_44;}if(!_40||_46>=_41){_41=_46;_40=_44;}}}}if(_45){_42(_44);}});};if(dijit._isElementShown(_3b)){_42(_3b);}return {first:_3c,last:_3d,lowest:_3e,highest:_40};};dijit.getFirstInTabbingOrder=function(_47){var _48=dijit._getTabNavigable(dojo.byId(_47));return _48.lowest?_48.lowest:_48.first;};dijit.getLastInTabbingOrder=function(_49){var _4a=dijit._getTabNavigable(dojo.byId(_49));return _4a.last?_4a.last:_4a.highest;};}if(!dojo._hasResource["dijit._base.place"]){dojo._hasResource["dijit._base.place"]=true;dojo.provide("dijit._base.place");dijit.getViewport=function(){var _4b=dojo.global;var _4c=dojo.doc;var w=0,h=0;var de=_4c.documentElement;var dew=de.clientWidth,deh=de.clientHeight;if(dojo.isMozilla){var _52,_53,_54,_55;var dbw=_4c.body.clientWidth;if(dbw>dew){_52=dew;_54=dbw;}else{_54=dew;_52=dbw;}var dbh=_4c.body.clientHeight;if(dbh>deh){_53=deh;_55=dbh;}else{_55=deh;_53=dbh;}w=(_54>_4b.innerWidth)?_52:_54;h=(_55>_4b.innerHeight)?_53:_55;}else{if(!dojo.isOpera&&_4b.innerWidth){w=_4b.innerWidth;h=_4b.innerHeight;}else{if(dojo.isIE&&de&&deh){w=dew;h=deh;}else{if(dojo.body().clientWidth){w=dojo.body().clientWidth;h=dojo.body().clientHeight;}}}}var _58=dojo._docScroll();return {w:w,h:h,l:_58.x,t:_58.y};};dijit.placeOnScreen=function(_59,pos,_5b,_5c){var _5d=dojo.map(_5b,function(_5e){return {corner:_5e,pos:pos};});return dijit._place(_59,_5d);};dijit._place=function(_5f,_60,_61){var _62=dijit.getViewport();if(!_5f.parentNode||String(_5f.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(_5f);}var _63=null;dojo.some(_60,function(_64){var _65=_64.corner;var pos=_64.pos;if(_61){_61(_5f,_64.aroundCorner,_65);}var _67=_5f.style;var _68=_67.display;var _69=_67.visibility;_67.visibility="hidden";_67.display="";var mb=dojo.marginBox(_5f);_67.display=_68;_67.visibility=_69;var _6b=(_65.charAt(1)=="L"?pos.x:Math.max(_62.l,pos.x-mb.w)),_6c=(_65.charAt(0)=="T"?pos.y:Math.max(_62.t,pos.y-mb.h)),_6d=(_65.charAt(1)=="L"?Math.min(_62.l+_62.w,_6b+mb.w):pos.x),_6e=(_65.charAt(0)=="T"?Math.min(_62.t+_62.h,_6c+mb.h):pos.y),_6f=_6d-_6b,_70=_6e-_6c,_71=(mb.w-_6f)+(mb.h-_70);if(_63==null||_71<_63.overflow){_63={corner:_65,aroundCorner:_64.aroundCorner,x:_6b,y:_6c,w:_6f,h:_70,overflow:_71};}return !_71;});_5f.style.left=_63.x+"px";_5f.style.top=_63.y+"px";if(_63.overflow&&_61){_61(_5f,_63.aroundCorner,_63.corner);}return _63;};dijit.placeOnScreenAroundElement=function(_72,_73,_74,_75){_73=dojo.byId(_73);var _76=_73.style.display;_73.style.display="";var _77=_73.offsetWidth;var _78=_73.offsetHeight;var _79=dojo.coords(_73,true);_73.style.display=_76;var _7a=[];for(var _7b in _74){_7a.push({aroundCorner:_7b,corner:_74[_7b],pos:{x:_79.x+(_7b.charAt(1)=="L"?0:_77),y:_79.y+(_7b.charAt(0)=="T"?0:_78)}});}return dijit._place(_72,_7a,_75);};}if(!dojo._hasResource["dijit._base.window"]){dojo._hasResource["dijit._base.window"]=true;dojo.provide("dijit._base.window");dijit.getDocumentWindow=function(doc){if(dojo.isSafari&&!doc._parentWindow){var fix=function(win){win.document._parentWindow=win;for(var i=0;i<win.frames.length;i++){fix(win.frames[i]);}};fix(window.top);}if(dojo.isIE&&window!==document.parentWindow&&!doc._parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc._parentWindow||doc.parentWindow||doc.defaultView;};}if(!dojo._hasResource["dijit._base.popup"]){dojo._hasResource["dijit._base.popup"]=true;dojo.provide("dijit._base.popup");dijit.popup=new function(){var _81=[],_82=1000,_83=1;this.prepare=function(_84){dojo.body().appendChild(_84);var s=_84.style;if(s.display=="none"){s.display="";}s.visibility="hidden";s.position="absolute";s.top="-9999px";};this.open=function(_86){var _87=_86.popup,_88=_86.orient||{"BL":"TL","TL":"BL"},_89=_86.around,id=(_86.around&&_86.around.id)?(_86.around.id+"_dropdown"):("popup_"+_83++);var _8b=dojo.doc.createElement("div");dijit.setWaiRole(_8b,"presentation");_8b.id=id;_8b.className="dijitPopup";_8b.style.zIndex=_82+_81.length;_8b.style.visibility="hidden";if(_86.parent){_8b.dijitPopupParent=_86.parent.id;}dojo.body().appendChild(_8b);var s=_87.domNode.style;s.display="";s.visibility="";s.position="";_8b.appendChild(_87.domNode);var _8d=new dijit.BackgroundIframe(_8b);var _8e=_89?dijit.placeOnScreenAroundElement(_8b,_89,_88,_87.orient?dojo.hitch(_87,"orient"):null):dijit.placeOnScreen(_8b,_86,_88=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"]);_8b.style.visibility="visible";var _8f=[];var _90=function(){for(var pi=_81.length-1;pi>0&&_81[pi].parent===_81[pi-1].widget;pi--){}return _81[pi];};_8f.push(dojo.connect(_8b,"onkeypress",this,function(evt){if(evt.keyCode==dojo.keys.ESCAPE&&_86.onCancel){dojo.stopEvent(evt);_86.onCancel();}else{if(evt.keyCode==dojo.keys.TAB){dojo.stopEvent(evt);var _93=_90();if(_93&&_93.onCancel){_93.onCancel();}}}}));if(_87.onCancel){_8f.push(dojo.connect(_87,"onCancel",null,_86.onCancel));}_8f.push(dojo.connect(_87,_87.onExecute?"onExecute":"onChange",null,function(){var _94=_90();if(_94&&_94.onExecute){_94.onExecute();}}));_81.push({wrapper:_8b,iframe:_8d,widget:_87,parent:_86.parent,onExecute:_86.onExecute,onCancel:_86.onCancel,onClose:_86.onClose,handlers:_8f});if(_87.onOpen){_87.onOpen(_8e);}return _8e;};this.close=function(_95){while(dojo.some(_81,function(_96){return _96.widget==_95;})){var top=_81.pop(),_98=top.wrapper,_99=top.iframe,_9a=top.widget,_9b=top.onClose;if(_9a.onClose){_9a.onClose();}dojo.forEach(top.handlers,dojo.disconnect);if(!_9a||!_9a.domNode){return;}this.prepare(_9a.domNode);_99.destroy();dojo._destroyElement(_98);if(_9b){_9b();}}};}();dijit._frames=new function(){var _9c=[];this.pop=function(){var _9d;if(_9c.length){_9d=_9c.pop();_9d.style.display="";}else{if(dojo.isIE){var _9e="<iframe src='javascript:\"\"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";_9d=dojo.doc.createElement(_9e);}else{_9d=dojo.doc.createElement("iframe");_9d.src="javascript:\"\"";_9d.className="dijitBackgroundIframe";}_9d.tabIndex=-1;dojo.body().appendChild(_9d);}return _9d;};this.push=function(_9f){_9f.style.display="";if(dojo.isIE){_9f.style.removeExpression("width");_9f.style.removeExpression("height");}_9c.push(_9f);};}();if(dojo.isIE&&dojo.isIE<7){dojo.addOnLoad(function(){var f=dijit._frames;dojo.forEach([f.pop()],f.push);});}dijit.BackgroundIframe=function(_a1){if(!_a1.id){throw new Error("no id");}if((dojo.isIE&&dojo.isIE<7)||(dojo.isFF&&dojo.isFF<3&&dojo.hasClass(dojo.body(),"dijit_a11y"))){var _a2=dijit._frames.pop();_a1.appendChild(_a2);if(dojo.isIE){_a2.style.setExpression("width",dojo._scopeName+".doc.getElementById('"+_a1.id+"').offsetWidth");_a2.style.setExpression("height",dojo._scopeName+".doc.getElementById('"+_a1.id+"').offsetHeight");}this.iframe=_a2;}};dojo.extend(dijit.BackgroundIframe,{destroy:function(){if(this.iframe){dijit._frames.push(this.iframe);delete this.iframe;}}});}if(!dojo._hasResource["dijit._base.scroll"]){dojo._hasResource["dijit._base.scroll"]=true;dojo.provide("dijit._base.scroll");dijit.scrollIntoView=function(_a3){var _a4=_a3.parentNode;var _a5=_a4.scrollTop+dojo.marginBox(_a4).h;var _a6=_a3.offsetTop+dojo.marginBox(_a3).h;if(_a5<_a6){_a4.scrollTop+=(_a6-_a5);}else{if(_a4.scrollTop>_a3.offsetTop){_a4.scrollTop-=(_a4.scrollTop-_a3.offsetTop);}}};}if(!dojo._hasResource["dijit._base.sniff"]){dojo._hasResource["dijit._base.sniff"]=true;dojo.provide("dijit._base.sniff");(function(){var d=dojo;var ie=d.isIE;var _a9=d.isOpera;var maj=Math.floor;var ff=d.isFF;var _ac={dj_ie:ie,dj_ie6:maj(ie)==6,dj_ie7:maj(ie)==7,dj_iequirks:ie&&d.isQuirks,dj_opera:_a9,dj_opera8:maj(_a9)==8,dj_opera9:maj(_a9)==9,dj_khtml:d.isKhtml,dj_safari:d.isSafari,dj_gecko:d.isMozilla,dj_ff2:maj(ff)==2};for(var p in _ac){if(_ac[p]){var _ae=dojo.doc.documentElement;if(_ae.className){_ae.className+=" "+p;}else{_ae.className=p;}}}})();}if(!dojo._hasResource["dijit._base.bidi"]){dojo._hasResource["dijit._base.bidi"]=true;dojo.provide("dijit._base.bidi");dojo.addOnLoad(function(){if(!dojo._isBodyLtr()){dojo.addClass(dojo.body(),"dijitRtl");}});}if(!dojo._hasResource["dijit._base.typematic"]){dojo._hasResource["dijit._base.typematic"]=true;dojo.provide("dijit._base.typematic");dijit.typematic={_fireEventAndReload:function(){this._timer=null;this._callback(++this._count,this._node,this._evt);this._currentTimeout=(this._currentTimeout<0)?this._initialDelay:((this._subsequentDelay>1)?this._subsequentDelay:Math.round(this._currentTimeout*this._subsequentDelay));this._timer=setTimeout(dojo.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(evt,_b0,_b1,_b2,obj,_b4,_b5){if(obj!=this._obj){this.stop();this._initialDelay=_b5||500;this._subsequentDelay=_b4||0.9;this._obj=obj;this._evt=evt;this._node=_b1;this._currentTimeout=-1;this._count=-1;this._callback=dojo.hitch(_b0,_b2);this._fireEventAndReload();}},stop:function(){if(this._timer){clearTimeout(this._timer);this._timer=null;}if(this._obj){this._callback(-1,this._node,this._evt);this._obj=null;}},addKeyListener:function(_b6,_b7,_b8,_b9,_ba,_bb){return [dojo.connect(_b6,"onkeypress",this,function(evt){if(evt.keyCode==_b7.keyCode&&(!_b7.charCode||_b7.charCode==evt.charCode)&&(_b7.ctrlKey===undefined||_b7.ctrlKey==evt.ctrlKey)&&(_b7.altKey===undefined||_b7.altKey==evt.ctrlKey)&&(_b7.shiftKey===undefined||_b7.shiftKey==evt.ctrlKey)){dojo.stopEvent(evt);dijit.typematic.trigger(_b7,_b8,_b6,_b9,_b7,_ba,_bb);}else{if(dijit.typematic._obj==_b7){dijit.typematic.stop();}}}),dojo.connect(_b6,"onkeyup",this,function(evt){if(dijit.typematic._obj==_b7){dijit.typematic.stop();}})];},addMouseListener:function(_be,_bf,_c0,_c1,_c2){var dc=dojo.connect;return [dc(_be,"mousedown",this,function(evt){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_bf,_be,_c0,_be,_c1,_c2);}),dc(_be,"mouseup",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_be,"mouseout",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_be,"mousemove",this,function(evt){dojo.stopEvent(evt);}),dc(_be,"dblclick",this,function(evt){dojo.stopEvent(evt);if(dojo.isIE){dijit.typematic.trigger(evt,_bf,_be,_c0,_be,_c1,_c2);setTimeout(dojo.hitch(this,dijit.typematic.stop),50);}})];},addListener:function(_c9,_ca,_cb,_cc,_cd,_ce,_cf){return this.addKeyListener(_ca,_cb,_cc,_cd,_ce,_cf).concat(this.addMouseListener(_c9,_cc,_cd,_ce,_cf));}};}if(!dojo._hasResource["dijit._base.wai"]){dojo._hasResource["dijit._base.wai"]=true;dojo.provide("dijit._base.wai");dijit.wai={onload:function(){var div=dojo.doc.createElement("div");div.id="a11yTestNode";div.style.cssText="border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+dojo.moduleUrl("dojo","resources/blank.gif")+"\");";dojo.body().appendChild(div);var cs=dojo.getComputedStyle(div);if(cs){var _d2=cs.backgroundImage;var _d3=(cs.borderTopColor==cs.borderRightColor)||(_d2!=null&&(_d2=="none"||_d2=="url(invalid-url:)"));dojo[_d3?"addClass":"removeClass"](dojo.body(),"dijit_a11y");dojo.body().removeChild(div);}}};if(dojo.isIE||dojo.isMoz){dojo._loaders.unshift(dijit.wai.onload);}dojo.mixin(dijit,{hasWaiRole:function(_d4){return _d4.hasAttribute?_d4.hasAttribute("role"):!!_d4.getAttribute("role");},getWaiRole:function(_d5){var _d6=_d5.getAttribute("role");if(_d6){var _d7=_d6.indexOf(":");return _d7==-1?_d6:_d6.substring(_d7+1);}else{return "";}},setWaiRole:function(_d8,_d9){_d8.setAttribute("role",(dojo.isFF&&dojo.isFF<3)?"wairole:"+_d9:_d9);},removeWaiRole:function(_da){_da.removeAttribute("role");},hasWaiState:function(_db,_dc){if(dojo.isFF&&dojo.isFF<3){return _db.hasAttributeNS("http://www.w3.org/2005/07/aaa",_dc);}else{return _db.hasAttribute?_db.hasAttribute("aria-"+_dc):!!_db.getAttribute("aria-"+_dc);}},getWaiState:function(_dd,_de){if(dojo.isFF&&dojo.isFF<3){return _dd.getAttributeNS("http://www.w3.org/2005/07/aaa",_de);}else{var _df=_dd.getAttribute("aria-"+_de);return _df?_df:"";}},setWaiState:function(_e0,_e1,_e2){if(dojo.isFF&&dojo.isFF<3){_e0.setAttributeNS("http://www.w3.org/2005/07/aaa","aaa:"+_e1,_e2);}else{_e0.setAttribute("aria-"+_e1,_e2);}},removeWaiState:function(_e3,_e4){if(dojo.isFF&&dojo.isFF<3){_e3.removeAttributeNS("http://www.w3.org/2005/07/aaa",_e4);}else{_e3.removeAttribute("aria-"+_e4);}}});}if(!dojo._hasResource["dijit._base"]){dojo._hasResource["dijit._base"]=true;dojo.provide("dijit._base");if(dojo.isSafari){dojo.connect(window,"load",function(){window.resizeBy(1,0);setTimeout(function(){window.resizeBy(-1,0);},10);});}}if(!dojo._hasResource["dojo.date.stamp"]){dojo._hasResource["dojo.date.stamp"]=true;dojo.provide("dojo.date.stamp");dojo.date.stamp.fromISOString=function(_e5,_e6){if(!dojo.date.stamp._isoRegExp){dojo.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;}var _e7=dojo.date.stamp._isoRegExp.exec(_e5);var _e8=null;if(_e7){_e7.shift();if(_e7[1]){_e7[1]--;}if(_e7[6]){_e7[6]*=1000;}if(_e6){_e6=new Date(_e6);dojo.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(_e9){return _e6["get"+_e9]();}).forEach(function(_ea,_eb){if(_e7[_eb]===undefined){_e7[_eb]=_ea;}});}_e8=new Date(_e7[0]||1970,_e7[1]||0,_e7[2]||1,_e7[3]||0,_e7[4]||0,_e7[5]||0,_e7[6]||0);var _ec=0;var _ed=_e7[7]&&_e7[7].charAt(0);if(_ed!="Z"){_ec=((_e7[8]||0)*60)+(Number(_e7[9])||0);if(_ed!="-"){_ec*=-1;}}if(_ed){_ec-=_e8.getTimezoneOffset();}if(_ec){_e8.setTime(_e8.getTime()+_ec*60000);}}return _e8;};dojo.date.stamp.toISOString=function(_ee,_ef){var _=function(n){return (n<10)?"0"+n:n;};_ef=_ef||{};var _f2=[];var _f3=_ef.zulu?"getUTC":"get";var _f4="";if(_ef.selector!="time"){var _f5=_ee[_f3+"FullYear"]();_f4=["0000".substr((_f5+"").length)+_f5,_(_ee[_f3+"Month"]()+1),_(_ee[_f3+"Date"]())].join("-");}_f2.push(_f4);if(_ef.selector!="date"){var _f6=[_(_ee[_f3+"Hours"]()),_(_ee[_f3+"Minutes"]()),_(_ee[_f3+"Seconds"]())].join(":");var _f7=_ee[_f3+"Milliseconds"]();if(_ef.milliseconds){_f6+="."+(_f7<100?"0":"")+_(_f7);}if(_ef.zulu){_f6+="Z";}else{if(_ef.selector!="time"){var _f8=_ee.getTimezoneOffset();var _f9=Math.abs(_f8);_f6+=(_f8>0?"-":"+")+_(Math.floor(_f9/60))+":"+_(_f9%60);}}_f2.push(_f6);}return _f2.join("T");};}if(!dojo._hasResource["dojo.parser"]){dojo._hasResource["dojo.parser"]=true;dojo.provide("dojo.parser");dojo.parser=new function(){var d=dojo;var _fb=d._scopeName+"Type";var qry="["+_fb+"]";function val2type(_fd){if(d.isString(_fd)){return "string";}if(typeof _fd=="number"){return "number";}if(typeof _fd=="boolean"){return "boolean";}if(d.isFunction(_fd)){return "function";}if(d.isArray(_fd)){return "array";}if(_fd instanceof Date){return "date";}if(_fd instanceof d._Url){return "url";}return "object";};function str2obj(_fe,_ff){switch(_ff){case "string":return _fe;case "number":return _fe.length?Number(_fe):NaN;case "boolean":return typeof _fe=="boolean"?_fe:!(_fe.toLowerCase()=="false");case "function":if(d.isFunction(_fe)){_fe=_fe.toString();_fe=d.trim(_fe.substring(_fe.indexOf("{")+1,_fe.length-1));}try{if(_fe.search(/[^\w\.]+/i)!=-1){_fe=d.parser._nameAnonFunc(new Function(_fe),this);}return d.getObject(_fe,false);}catch(e){return new Function();}case "array":return _fe.split(/\s*,\s*/);case "date":switch(_fe){case "":return new Date("");case "now":return new Date();default:return d.date.stamp.fromISOString(_fe);}case "url":return d.baseUrl+_fe;default:return d.fromJson(_fe);}};var _100={};function getClassInfo(_101){if(!_100[_101]){var cls=d.getObject(_101);if(!d.isFunction(cls)){throw new Error("Could not load class '"+_101+"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");}var _103=cls.prototype;var _104={};for(var name in _103){if(name.charAt(0)=="_"){continue;}var _106=_103[name];_104[name]=val2type(_106);}_100[_101]={cls:cls,params:_104};}return _100[_101];};this._functionFromScript=function(_107){var _108="";var _109="";var _10a=_107.getAttribute("args");if(_10a){d.forEach(_10a.split(/\s*,\s*/),function(part,idx){_108+="var "+part+" = arguments["+idx+"]; ";});}var _10d=_107.getAttribute("with");if(_10d&&_10d.length){d.forEach(_10d.split(/\s*,\s*/),function(part){_108+="with("+part+"){";_109+="}";});}return new Function(_108+_107.innerHTML+_109);};this.instantiate=function(_10f){var _110=[];d.forEach(_10f,function(node){if(!node){return;}var type=node.getAttribute(_fb);if((!type)||(!type.length)){return;}var _113=getClassInfo(type);var _114=_113.cls;var ps=_114._noScript||_114.prototype._noScript;var _116={};var _117=node.attributes;for(var name in _113.params){var item=_117.getNamedItem(name);if(!item||(!item.specified&&(!dojo.isIE||name.toLowerCase()!="value"))){continue;}var _11a=item.value;switch(name){case "class":_11a=node.className;break;case "style":_11a=node.style&&node.style.cssText;}var _11b=_113.params[name];_116[name]=str2obj(_11a,_11b);}if(!ps){var _11c=[],_11d=[];d.query("> script[type^='dojo/']",node).orphan().forEach(function(_11e){var _11f=_11e.getAttribute("event"),type=_11e.getAttribute("type"),nf=d.parser._functionFromScript(_11e);if(_11f){if(type=="dojo/connect"){_11c.push({event:_11f,func:nf});}else{_116[_11f]=nf;}}else{_11d.push(nf);}});}var _121=_114["markupFactory"];if(!_121&&_114["prototype"]){_121=_114.prototype["markupFactory"];}var _122=_121?_121(_116,node,_114):new _114(_116,node);_110.push(_122);var _123=node.getAttribute("jsId");if(_123){d.setObject(_123,_122);}if(!ps){d.forEach(_11c,function(_124){d.connect(_122,_124.event,null,_124.func);});d.forEach(_11d,function(func){func.call(_122);});}});d.forEach(_110,function(_126){if(_126&&_126.startup&&!_126._started&&(!_126.getParent||!_126.getParent())){_126.startup();}});return _110;};this.parse=function(_127){var list=d.query(qry,_127);var _129=this.instantiate(list);return _129;};}();(function(){var _12a=function(){if(dojo.config["parseOnLoad"]==true){dojo.parser.parse();}};if(dojo.exists("dijit.wai.onload")&&(dijit.wai.onload===dojo._loaders[0])){dojo._loaders.splice(1,0,_12a);}else{dojo._loaders.unshift(_12a);}})();dojo.parser._anonCtr=0;dojo.parser._anon={};dojo.parser._nameAnonFunc=function(_12b,_12c){var jpn="$joinpoint";var nso=(_12c||dojo.parser._anon);if(dojo.isIE){var cn=_12b["__dojoNameCache"];if(cn&&nso[cn]===_12b){return _12b["__dojoNameCache"];}}var ret="__"+dojo.parser._anonCtr++;while(typeof nso[ret]!="undefined"){ret="__"+dojo.parser._anonCtr++;}nso[ret]=_12b;return ret;};}if(!dojo._hasResource["dijit._Widget"]){dojo._hasResource["dijit._Widget"]=true;dojo.provide("dijit._Widget");dojo.require("dijit._base");dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",srcNodeRef:null,domNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},postscript:function(_131,_132){this.create(_131,_132);},create:function(_133,_134){this.srcNodeRef=dojo.byId(_134);this._connects=[];this._attaches=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_133){this.params=_133;dojo.mixin(this,_133);}this.postMixInProperties();if(!this.id){this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));}dijit.registry.add(this);this.buildRendering();if(this.domNode){for(var attr in this.attributeMap){var _136=this[attr];if(typeof _136!="object"&&((_136!==""&&_136!==false)||(_133&&_133[attr]))){this.setAttribute(attr,_136);}}}if(this.domNode){this.domNode.setAttribute("widgetId",this.id);}this.postCreate();if(this.srcNodeRef&&!this.srcNodeRef.parentNode){delete this.srcNodeRef;}},postMixInProperties:function(){},buildRendering:function(){this.domNode=this.srcNodeRef||dojo.doc.createElement("div");},postCreate:function(){},startup:function(){this._started=true;},destroyRecursive:function(_137){this.destroyDescendants();this.destroy();},destroy:function(_138){this.uninitialize();dojo.forEach(this._connects,function(_139){dojo.forEach(_139,dojo.disconnect);});dojo.forEach(this._supportingWidgets||[],function(w){w.destroy();});this.destroyRendering(_138);dijit.registry.remove(this.id);},destroyRendering:function(_13b){if(this.bgIframe){this.bgIframe.destroy();delete this.bgIframe;}if(this.domNode){dojo._destroyElement(this.domNode);delete this.domNode;}if(this.srcNodeRef){dojo._destroyElement(this.srcNodeRef);delete this.srcNodeRef;}},destroyDescendants:function(){dojo.forEach(this.getDescendants(),function(_13c){_13c.destroy();});},uninitialize:function(){return false;},onFocus:function(){},onBlur:function(){},_onFocus:function(e){this.onFocus();},_onBlur:function(){this.onBlur();},setAttribute:function(attr,_13f){var _140=this[this.attributeMap[attr]||"domNode"];this[attr]=_13f;switch(attr){case "class":dojo.addClass(_140,_13f);break;case "style":if(_140.style.cssText){_140.style.cssText+="; "+_13f;}else{_140.style.cssText=_13f;}break;default:if(/^on[A-Z]/.test(attr)){attr=attr.toLowerCase();}if(typeof _13f=="function"){_13f=dojo.hitch(this,_13f);}dojo.attr(_140,attr,_13f);}},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getDescendants:function(){if(this.containerNode){var list=dojo.query("[widgetId]",this.containerNode);return list.map(dijit.byNode);}else{return [];}},nodesWithKeyClick:["input","button"],connect:function(obj,_143,_144){var _145=[];if(_143=="ondijitclick"){if(!this.nodesWithKeyClick[obj.nodeName]){_145.push(dojo.connect(obj,"onkeydown",this,function(e){if(e.keyCode==dojo.keys.ENTER){return (dojo.isString(_144))?this[_144](e):_144.call(this,e);}else{if(e.keyCode==dojo.keys.SPACE){dojo.stopEvent(e);}}}));_145.push(dojo.connect(obj,"onkeyup",this,function(e){if(e.keyCode==dojo.keys.SPACE){return dojo.isString(_144)?this[_144](e):_144.call(this,e);}}));}_143="onclick";}_145.push(dojo.connect(obj,_143,this,_144));this._connects.push(_145);return _145;},disconnect:function(_148){for(var i=0;i<this._connects.length;i++){if(this._connects[i]==_148){dojo.forEach(_148,dojo.disconnect);this._connects.splice(i,1);return;}}},isLeftToRight:function(){if(!("_ltr" in this)){this._ltr=dojo.getComputedStyle(this.domNode).direction!="rtl";}return this._ltr;},isFocusable:function(){return this.focus&&(dojo.style(this.domNode,"display")!="none");}});}if(!dojo._hasResource["dojo.string"]){dojo._hasResource["dojo.string"]=true;dojo.provide("dojo.string");dojo.string.pad=function(text,size,ch,end){var out=String(text);if(!ch){ch="0";}while(out.length<size){if(end){out+=ch;}else{out=ch+out;}}return out;};dojo.string.substitute=function(_14f,map,_151,_152){return _14f.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_153,key,_155){var _156=dojo.getObject(key,false,map);if(_155){_156=dojo.getObject(_155,false,_152)(_156);}if(_151){_156=_151(_156,key);}return _156.toString();});};dojo.string.trim=function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};}if(!dojo._hasResource["dijit._Templated"]){dojo._hasResource["dijit._Templated"]=true;dojo.provide("dijit._Templated");dojo.declare("dijit._Templated",null,{templateNode:null,templateString:null,templatePath:null,widgetsInTemplate:false,containerNode:null,_skipNodeCache:false,_stringRepl:function(tmpl){var _15a=this.declaredClass,_15b=this;return dojo.string.substitute(tmpl,this,function(_15c,key){if(key.charAt(0)=="!"){_15c=_15b[key.substr(1)];}if(typeof _15c=="undefined"){throw new Error(_15a+" template:"+key);}if(!_15c){return "";}return key.charAt(0)=="!"?_15c:_15c.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){var _15e=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);var node;if(dojo.isString(_15e)){node=dijit._Templated._createNodesFromText(this._stringRepl(_15e))[0];}else{node=_15e.cloneNode(true);}this._attachTemplateNodes(node);var _160=this.srcNodeRef;if(_160&&_160.parentNode){_160.parentNode.replaceChild(node,_160);}this.domNode=node;if(this.widgetsInTemplate){var cw=this._supportingWidgets=dojo.parser.parse(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}this._fillContent(_160);},_fillContent:function(_164){var dest=this.containerNode;if(_164&&dest){while(_164.hasChildNodes()){dest.appendChild(_164.firstChild);}}},_attachTemplateNodes:function(_166,_167){_167=_167||function(n,p){return n.getAttribute(p);};var _16a=dojo.isArray(_166)?_166:(_166.all||_166.getElementsByTagName("*"));var x=dojo.isArray(_166)?0:-1;for(;x<_16a.length;x++){var _16c=(x==-1)?_166:_16a[x];if(this.widgetsInTemplate&&_167(_16c,"dojoType")){continue;}var _16d=_167(_16c,"dojoAttachPoint");if(_16d){var _16e,_16f=_16d.split(/\s*,\s*/);while((_16e=_16f.shift())){if(dojo.isArray(this[_16e])){this[_16e].push(_16c);}else{this[_16e]=_16c;}}}var _170=_167(_16c,"dojoAttachEvent");if(_170){var _171,_172=_170.split(/\s*,\s*/);var trim=dojo.trim;while((_171=_172.shift())){if(_171){var _174=null;if(_171.indexOf(":")!=-1){var _175=_171.split(":");_171=trim(_175[0]);_174=trim(_175[1]);}else{_171=trim(_171);}if(!_174){_174=_171;}this.connect(_16c,_171,_174);}}}var role=_167(_16c,"waiRole");if(role){dijit.setWaiRole(_16c,role);}var _177=_167(_16c,"waiState");if(_177){dojo.forEach(_177.split(/\s*,\s*/),function(_178){if(_178.indexOf("-")!=-1){var pair=_178.split("-");dijit.setWaiState(_16c,pair[0],pair[1]);}});}}}});dijit._Templated._templateCache={};dijit._Templated.getCachedTemplate=function(_17a,_17b,_17c){var _17d=dijit._Templated._templateCache;var key=_17b||_17a;var _17f=_17d[key];if(_17f){return _17f;}if(!_17b){_17b=dijit._Templated._sanitizeTemplateString(dojo._getText(_17a));}_17b=dojo.string.trim(_17b);if(_17c||_17b.match(/\$\{([^\}]+)\}/g)){return (_17d[key]=_17b);}else{return (_17d[key]=dijit._Templated._createNodesFromText(_17b)[0]);}};dijit._Templated._sanitizeTemplateString=function(_180){if(_180){_180=_180.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _181=_180.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_181){_180=_181[1];}}else{_180="";}return _180;};if(dojo.isIE){dojo.addOnUnload(function(){var _182=dijit._Templated._templateCache;for(var key in _182){var _184=_182[key];if(!isNaN(_184.nodeType)){dojo._destroyElement(_184);}delete _182[key];}});}(function(){var _185={cell:{re:/^<t[dh][\s\r\n>]/i,pre:"<table><tbody><tr>",post:"</tr></tbody></table>"},row:{re:/^<tr[\s\r\n>]/i,pre:"<table><tbody>",post:"</tbody></table>"},section:{re:/^<(thead|tbody|tfoot)[\s\r\n>]/i,pre:"<table>",post:"</table>"}};var tn;dijit._Templated._createNodesFromText=function(text){if(!tn){tn=dojo.doc.createElement("div");tn.style.display="none";dojo.body().appendChild(tn);}var _188="none";var _189=text.replace(/^\s+/,"");for(var type in _185){var map=_185[type];if(map.re.test(_189)){_188=type;text=map.pre+text+map.post;break;}}tn.innerHTML=text;if(tn.normalize){tn.normalize();}var tag={cell:"tr",row:"tbody",section:"table"}[_188];var _18d=(typeof tag!="undefined")?tn.getElementsByTagName(tag)[0]:tn;var _18e=[];while(_18d.firstChild){_18e.push(_18d.removeChild(_18d.firstChild));}tn.innerHTML="";return _18e;};})();dojo.extend(dijit._Widget,{dojoAttachEvent:"",dojoAttachPoint:"",waiRole:"",waiState:""});}if(!dojo._hasResource["dijit._Container"]){dojo._hasResource["dijit._Container"]=true;dojo.provide("dijit._Container");dojo.declare("dijit._Contained",null,{getParent:function(){for(var p=this.domNode.parentNode;p;p=p.parentNode){var id=p.getAttribute&&p.getAttribute("widgetId");if(id){var _191=dijit.byId(id);return _191.isContainer?_191:null;}}return null;},_getSibling:function(_192){var node=this.domNode;do{node=node[_192+"Sibling"];}while(node&&node.nodeType!=1);if(!node){return null;}var id=node.getAttribute("widgetId");return dijit.byId(id);},getPreviousSibling:function(){return this._getSibling("previous");},getNextSibling:function(){return this._getSibling("next");}});dojo.declare("dijit._Container",null,{isContainer:true,addChild:function(_195,_196){if(_196===undefined){_196="last";}var _197=this.containerNode||this.domNode;if(_196&&typeof _196=="number"){var _198=dojo.query("> [widgetid]",_197);if(_198&&_198.length>=_196){_197=_198[_196-1];_196="after";}}dojo.place(_195.domNode,_197,_196);if(this._started&&!_195._started){_195.startup();}},removeChild:function(_199){var node=_199.domNode;node.parentNode.removeChild(node);},_nextElement:function(node){do{node=node.nextSibling;}while(node&&node.nodeType!=1);return node;},_firstElement:function(node){node=node.firstChild;if(node&&node.nodeType!=1){node=this._nextElement(node);}return node;},getChildren:function(){return dojo.query("> [widgetId]",this.containerNode||this.domNode).map(dijit.byNode);},hasChildren:function(){var cn=this.containerNode||this.domNode;return !!this._firstElement(cn);},_getSiblingOfChild:function(_19e,dir){var node=_19e.domNode;var _1a1=(dir>0?"nextSibling":"previousSibling");do{node=node[_1a1];}while(node&&(node.nodeType!=1||!dijit.byNode(node)));return node?dijit.byNode(node):null;}});dojo.declare("dijit._KeyNavContainer",[dijit._Container],{_keyNavCodes:{},connectKeyNavHandlers:function(_1a2,_1a3){var _1a4=this._keyNavCodes={};var prev=dojo.hitch(this,this.focusPrev);var next=dojo.hitch(this,this.focusNext);dojo.forEach(_1a2,function(code){_1a4[code]=prev;});dojo.forEach(_1a3,function(code){_1a4[code]=next;});this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){dojo.forEach(this.getChildren(),dojo.hitch(this,"_startupChild"));},addChild:function(_1a9,_1aa){dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);this._startupChild(_1a9);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){this.focusChild(this._getFirstFocusableChild());},focusNext:function(){if(this.focusedChild&&this.focusedChild.hasNextFocalNode&&this.focusedChild.hasNextFocalNode()){this.focusedChild.focusNext();return;}var _1ab=this._getNextFocusableChild(this.focusedChild,1);if(_1ab.getFocalNodes){this.focusChild(_1ab,_1ab.getFocalNodes()[0]);}else{this.focusChild(_1ab);}},focusPrev:function(){if(this.focusedChild&&this.focusedChild.hasPrevFocalNode&&this.focusedChild.hasPrevFocalNode()){this.focusedChild.focusPrev();return;}var _1ac=this._getNextFocusableChild(this.focusedChild,-1);if(_1ac.getFocalNodes){var _1ad=_1ac.getFocalNodes();this.focusChild(_1ac,_1ad[_1ad.length-1]);}else{this.focusChild(_1ac);}},focusChild:function(_1ae,node){if(_1ae){if(this.focusedChild&&_1ae!==this.focusedChild){this._onChildBlur(this.focusedChild);}this.focusedChild=_1ae;if(node&&_1ae.focusFocalNode){_1ae.focusFocalNode(node);}else{_1ae.focus();}}},_startupChild:function(_1b0){if(_1b0.getFocalNodes){dojo.forEach(_1b0.getFocalNodes(),function(node){dojo.attr(node,"tabindex",-1);this._connectNode(node);},this);}else{var node=_1b0.focusNode||_1b0.domNode;if(_1b0.isFocusable()){dojo.attr(node,"tabindex",-1);}this._connectNode(node);}},_connectNode:function(node){this.connect(node,"onfocus","_onNodeFocus");this.connect(node,"onblur","_onNodeBlur");},_onContainerFocus:function(evt){if(evt.target===this.domNode){this.focusFirstChild();}},_onContainerKeypress:function(evt){if(evt.ctrlKey||evt.altKey){return;}var func=this._keyNavCodes[evt.keyCode];if(func){func();dojo.stopEvent(evt);}},_onNodeFocus:function(evt){dojo.attr(this.domNode,"tabindex",-1);var _1b8=dijit.getEnclosingWidget(evt.target);if(_1b8&&_1b8.isFocusable()){this.focusedChild=_1b8;}dojo.stopEvent(evt);},_onNodeBlur:function(evt){if(this.tabIndex){dojo.attr(this.domNode,"tabindex",this.tabIndex);}dojo.stopEvent(evt);},_onChildBlur:function(_1ba){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getNextFocusableChild:function(_1bb,dir){if(_1bb){_1bb=this._getSiblingOfChild(_1bb,dir);}var _1bd=this.getChildren();for(var i=0;i<_1bd.length;i++){if(!_1bb){_1bb=_1bd[(dir>0)?0:(_1bd.length-1)];}if(_1bb.isFocusable()){return _1bb;}_1bb=this._getSiblingOfChild(_1bb,dir);}return null;}});}if(!dojo._hasResource["dijit.layout._LayoutWidget"]){dojo._hasResource["dijit.layout._LayoutWidget"]=true;dojo.provide("dijit.layout._LayoutWidget");dojo.declare("dijit.layout._LayoutWidget",[dijit._Widget,dijit._Container,dijit._Contained],{isLayoutContainer:true,postCreate:function(){dojo.addClass(this.domNode,"dijitContainer");},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_1bf){_1bf.startup();});if(!this.getParent||!this.getParent()){this.resize();this.connect(window,"onresize",function(){this.resize();});}this.inherited(arguments);},resize:function(args){var node=this.domNode;if(args){dojo.marginBox(node,args);if(args.t){node.style.top=args.t+"px";}if(args.l){node.style.left=args.l+"px";}}var mb=dojo.mixin(dojo.marginBox(node),args||{});this._contentBox=dijit.layout.marginBox2contentBox(node,mb);this.layout();},layout:function(){}});dijit.layout.marginBox2contentBox=function(node,mb){var cs=dojo.getComputedStyle(node);var me=dojo._getMarginExtents(node,cs);var pb=dojo._getPadBorderExtents(node,cs);return {l:dojo._toPixelValue(node,cs.paddingLeft),t:dojo._toPixelValue(node,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};};(function(){var _1c8=function(word){return word.substring(0,1).toUpperCase()+word.substring(1);};var size=function(_1cb,dim){_1cb.resize?_1cb.resize(dim):dojo.marginBox(_1cb.domNode,dim);dojo.mixin(_1cb,dojo.marginBox(_1cb.domNode));dojo.mixin(_1cb,dim);};dijit.layout.layoutChildren=function(_1cd,dim,_1cf){dim=dojo.mixin({},dim);dojo.addClass(_1cd,"dijitLayoutContainer");_1cf=dojo.filter(_1cf,function(item){return item.layoutAlign!="client";}).concat(dojo.filter(_1cf,function(item){return item.layoutAlign=="client";}));dojo.forEach(_1cf,function(_1d2){var elm=_1d2.domNode,pos=_1d2.layoutAlign;var _1d5=elm.style;_1d5.left=dim.l+"px";_1d5.top=dim.t+"px";_1d5.bottom=_1d5.right="auto";dojo.addClass(elm,"dijitAlign"+_1c8(pos));if(pos=="top"||pos=="bottom"){size(_1d2,{w:dim.w});dim.h-=_1d2.h;if(pos=="top"){dim.t+=_1d2.h;}else{_1d5.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){size(_1d2,{h:dim.h});dim.w-=_1d2.w;if(pos=="left"){dim.l+=_1d2.w;}else{_1d5.left=dim.l+dim.w+"px";}}else{if(pos=="client"){size(_1d2,dim);}}}});};})();}if(!dojo._hasResource["dijit.form._FormWidget"]){dojo._hasResource["dijit.form._FormWidget"]=true;dojo.provide("dijit.form._FormWidget");dojo.declare("dijit.form._FormWidget",[dijit._Widget,dijit._Templated],{baseClass:"",name:"",alt:"",value:"",type:"text",tabIndex:"0",disabled:false,readOnly:false,intermediateChanges:false,attributeMap:dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),{value:"focusNode",disabled:"focusNode",readOnly:"focusNode",id:"focusNode",tabIndex:"focusNode",alt:"focusNode"}),setAttribute:function(attr,_1d7){this.inherited(arguments);switch(attr){case "disabled":var _1d8=this[this.attributeMap["tabIndex"]||"domNode"];if(_1d7){this._hovering=false;this._active=false;_1d8.removeAttribute("tabIndex");}else{_1d8.setAttribute("tabIndex",this.tabIndex);}dijit.setWaiState(this[this.attributeMap["disabled"]||"domNode"],"disabled",_1d7);this._setStateClass();}},setDisabled:function(_1d9){dojo.deprecated("setDisabled("+_1d9+") is deprecated. Use setAttribute('disabled',"+_1d9+") instead.","","2.0");this.setAttribute("disabled",_1d9);},_onMouse:function(_1da){var _1db=_1da.currentTarget;if(_1db&&_1db.getAttribute){this.stateModifier=_1db.getAttribute("stateModifier")||"";}if(!this.disabled){switch(_1da.type){case "mouseenter":case "mouseover":this._hovering=true;this._active=this._mouseDown;break;case "mouseout":case "mouseleave":this._hovering=false;this._active=false;break;case "mousedown":this._active=true;this._mouseDown=true;var _1dc=this.connect(dojo.body(),"onmouseup",function(){this._active=false;this._mouseDown=false;this._setStateClass();this.disconnect(_1dc);});if(this.isFocusable()){this.focus();}break;}this._setStateClass();}},isFocusable:function(){return !this.disabled&&!this.readOnly&&this.focusNode&&(dojo.style(this.domNode,"display")!="none");},focus:function(){setTimeout(dojo.hitch(this,dijit.focus,this.focusNode),0);},_setStateClass:function(){if(!("staticClass" in this)){this.staticClass=(this.stateNode||this.domNode).className;}var _1dd=[this.baseClass];function multiply(_1de){_1dd=_1dd.concat(dojo.map(_1dd,function(c){return c+_1de;}),"dijit"+_1de);};if(this.checked){multiply("Checked");}if(this.state){multiply(this.state);}if(this.selected){multiply("Selected");}if(this.disabled){multiply("Disabled");}else{if(this.readOnly){multiply("ReadOnly");}else{if(this._active){multiply(this.stateModifier+"Active");}else{if(this._focused){multiply("Focused");}if(this._hovering){multiply(this.stateModifier+"Hover");}}}}(this.stateNode||this.domNode).className=this.staticClass+" "+_1dd.join(" ");},onChange:function(_1e0){},_onChangeMonitor:"value",_onChangeActive:false,_handleOnChange:function(_1e1,_1e2){this._lastValue=_1e1;if(this._lastValueReported==undefined&&(_1e2===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_1e1;}if((this.intermediateChanges||_1e2||_1e2===undefined)&&((_1e1&&_1e1.toString)?_1e1.toString():_1e1)!==((this._lastValueReported&&this._lastValueReported.toString)?this._lastValueReported.toString():this._lastValueReported)){this._lastValueReported=_1e1;if(this._onChangeActive){this.onChange(_1e1);}}},reset:function(){this._hasBeenBlurred=false;if(this.setValue&&!this._getValueDeprecated){this.setValue(this._resetValue,true);}else{if(this._onChangeMonitor){this.setAttribute(this._onChangeMonitor,(this._resetValue!==undefined&&this._resetValue!==null)?this._resetValue:"");}}},create:function(){this.inherited(arguments);this._onChangeActive=true;this._setStateClass();},destroy:function(){if(this._layoutHackHandle){clearTimeout(this._layoutHackHandle);}this.inherited(arguments);},setValue:function(_1e3){dojo.deprecated("dijit.form._FormWidget:setValue("+_1e3+") is deprecated.  Use setAttribute('value',"+_1e3+") instead.","","2.0");this.setAttribute("value",_1e3);},_getValueDeprecated:true,getValue:function(){dojo.deprecated("dijit.form._FormWidget:getValue() is deprecated.  Use widget.value instead.","","2.0");return this.value;},_layoutHack:function(){if(dojo.isFF==2){var node=this.domNode;var old=node.style.opacity;node.style.opacity="0.999";this._layoutHackHandle=setTimeout(dojo.hitch(this,function(){this._layoutHackHandle=null;node.style.opacity=old;}),0);}}});dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{attributeMap:dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),{value:""}),postCreate:function(){this.setValue(this.value,null);},setValue:function(_1e6,_1e7){this.value=_1e6;this._handleOnChange(_1e6,_1e7);},_getValueDeprecated:false,getValue:function(){return this._lastValue;},undo:function(){this.setValue(this._lastValueReported,false);},_valueChanged:function(){var v=this.getValue();var lv=this._lastValueReported;return ((v!==null&&(v!==undefined)&&v.toString)?v.toString():"")!==((lv!==null&&(lv!==undefined)&&lv.toString)?lv.toString():"");},_onKeyPress:function(e){if(e.keyCode==dojo.keys.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){if(this._valueChanged()){this.undo();dojo.stopEvent(e);return false;}}return true;}});}if(!dojo._hasResource["dijit.dijit"]){dojo._hasResource["dijit.dijit"]=true;dojo.provide("dijit.dijit");}

Added: branches/vhffs-design/vhffs-panel/js/dijit/dijit.js.uncompressed.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/dijit.js.uncompressed.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/dijit.js.uncompressed.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3641 @@
+/*
+	Copyright (c) 2004-2008, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing
+*/
+
+/*
+	This is a compiled version of Dojo, built for deployment and not for
+	development. To get an editable version, please visit:
+
+		http://dojotoolkit.org
+
+	for documentation and information on getting the source.
+*/
+
+if(!dojo._hasResource["dijit._base.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.focus"] = true;
+dojo.provide("dijit._base.focus");
+
+// summary:
+//		These functions are used to query or set the focus and selection.
+//
+//		Also, they trace when widgets become actived/deactivated,
+//		so that the widget can fire _onFocus/_onBlur events.
+//		"Active" here means something similar to "focused", but
+//		"focus" isn't quite the right word because we keep track of
+//		a whole stack of "active" widgets.  Example:  Combobutton --> Menu -->
+//		MenuItem.   The onBlur event for Combobutton doesn't fire due to focusing
+//		on the Menu or a MenuItem, since they are considered part of the
+//		Combobutton widget.  It only happens when focus is shifted
+//		somewhere completely different.
+
+dojo.mixin(dijit,
+{
+	// _curFocus: DomNode
+	//		Currently focused item on screen
+	_curFocus: null,
+
+	// _prevFocus: DomNode
+	//		Previously focused item on screen
+	_prevFocus: null,
+
+	isCollapsed: function(){
+		// summary: tests whether the current selection is empty
+		var _window = dojo.global;
+		var _document = dojo.doc;
+		if(_document.selection){ // IE
+			return !_document.selection.createRange().text; // Boolean
+		}else{
+			var selection = _window.getSelection();
+			if(dojo.isString(selection)){ // Safari
+				return !selection; // Boolean
+			}else{ // Mozilla/W3
+				return selection.isCollapsed || !selection.toString(); // Boolean
+			}
+		}
+	},
+
+	getBookmark: function(){
+		// summary: Retrieves a bookmark that can be used with moveToBookmark to return to the same range
+		var bookmark, selection = dojo.doc.selection;
+		if(selection){ // IE
+			var range = selection.createRange();
+			if(selection.type.toUpperCase()=='CONTROL'){
+				if(range.length){
+					bookmark=[];
+					var i=0,len=range.length;
+					while(i<len){
+						bookmark.push(range.item(i++));
+					}
+				}else{
+					bookmark=null;
+				}
+			}else{
+				bookmark = range.getBookmark();
+			}
+		}else{
+			if(window.getSelection){
+				selection = dojo.global.getSelection();
+				if(selection){
+					range = selection.getRangeAt(0);
+					bookmark = range.cloneRange();
+				}
+			}else{
+				console.warn("No idea how to store the current selection for this browser!");
+			}
+		}
+		return bookmark; // Array
+	},
+
+	moveToBookmark: function(/*Object*/bookmark){
+		// summary: Moves current selection to a bookmark
+		// bookmark: This should be a returned object from dojo.html.selection.getBookmark()
+		var _document = dojo.doc;
+		if(_document.selection){ // IE
+			var range;
+			if(dojo.isArray(bookmark)){
+				range = _document.body.createControlRange();
+				dojo.forEach(bookmark, "range.addElement(item)"); //range.addElement does not have call/apply method, so can not call it directly
+			}else{
+				range = _document.selection.createRange();
+				range.moveToBookmark(bookmark);
+			}
+			range.select();
+		}else{ //Moz/W3C
+			var selection = dojo.global.getSelection && dojo.global.getSelection();
+			if(selection && selection.removeAllRanges){
+				selection.removeAllRanges();
+				selection.addRange(bookmark);
+			}else{
+				console.warn("No idea how to restore selection for this browser!");
+			}
+		}
+	},
+
+	getFocus: function(/*Widget?*/menu, /*Window?*/openedForWindow){
+		// summary:
+		//	Returns the current focus and selection.
+		//	Called when a popup appears (either a top level menu or a dialog),
+		//	or when a toolbar/menubar receives focus
+		//
+		// menu:
+		//	The menu that's being opened
+		//
+		// openedForWindow:
+		//	iframe in which menu was opened
+		//
+		// returns:
+		//	A handle to restore focus/selection
+
+		return {
+			// Node to return focus to
+			node: menu && dojo.isDescendant(dijit._curFocus, menu.domNode) ? dijit._prevFocus : dijit._curFocus,
+
+			// Previously selected text
+			bookmark:
+				!dojo.withGlobal(openedForWindow||dojo.global, dijit.isCollapsed) ?
+				dojo.withGlobal(openedForWindow||dojo.global, dijit.getBookmark) :
+				null,
+
+			openedForWindow: openedForWindow
+		}; // Object
+	},
+
+	focus: function(/*Object || DomNode */ handle){
+		// summary:
+		//		Sets the focused node and the selection according to argument.
+		//		To set focus to an iframe's content, pass in the iframe itself.
+		// handle:
+		//		object returned by get(), or a DomNode
+
+		if(!handle){ return; }
+
+		var node = "node" in handle ? handle.node : handle,		// because handle is either DomNode or a composite object
+			bookmark = handle.bookmark,
+			openedForWindow = handle.openedForWindow;
+
+		// Set the focus
+		// Note that for iframe's we need to use the <iframe> to follow the parentNode chain,
+		// but we need to set focus to iframe.contentWindow
+		if(node){
+			var focusNode = (node.tagName.toLowerCase()=="iframe") ? node.contentWindow : node;
+			if(focusNode && focusNode.focus){
+				try{
+					// Gecko throws sometimes if setting focus is impossible,
+					// node not displayed or something like that
+					focusNode.focus();
+				}catch(e){/*quiet*/}
+			}			
+			dijit._onFocusNode(node);
+		}
+
+		// set the selection
+		// do not need to restore if current selection is not empty
+		// (use keyboard to select a menu item)
+		if(bookmark && dojo.withGlobal(openedForWindow||dojo.global, dijit.isCollapsed)){
+			if(openedForWindow){
+				openedForWindow.focus();
+			}
+			try{
+				dojo.withGlobal(openedForWindow||dojo.global, dijit.moveToBookmark, null, [bookmark]);
+			}catch(e){
+				/*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
+			}
+		}
+	},
+
+	// _activeStack: Array
+	//		List of currently active widgets (focused widget and it's ancestors)
+	_activeStack: [],
+
+	registerWin: function(/*Window?*/targetWindow){
+		// summary:
+		//		Registers listeners on the specified window (either the main
+		//		window or an iframe) to detect when the user has clicked somewhere.
+		//		Anyone that creates an iframe should call this function.
+
+		if(!targetWindow){
+			targetWindow = window;
+		}
+
+		dojo.connect(targetWindow.document, "onmousedown", function(evt){
+			dijit._justMouseDowned = true;
+			setTimeout(function(){ dijit._justMouseDowned = false; }, 0);
+			dijit._onTouchNode(evt.target||evt.srcElement);
+		});
+		//dojo.connect(targetWindow, "onscroll", ???);
+
+		// Listen for blur and focus events on targetWindow's body
+		var body = targetWindow.document.body || targetWindow.document.getElementsByTagName("body")[0];
+		if(body){
+			if(dojo.isIE){
+				body.attachEvent('onactivate', function(evt){
+					if(evt.srcElement.tagName.toLowerCase() != "body"){
+						dijit._onFocusNode(evt.srcElement);
+					}
+				});
+				body.attachEvent('ondeactivate', function(evt){ dijit._onBlurNode(evt.srcElement); });
+			}else{
+				body.addEventListener('focus', function(evt){ dijit._onFocusNode(evt.target); }, true);
+				body.addEventListener('blur', function(evt){ dijit._onBlurNode(evt.target); }, true);
+			}
+		}
+		body = null;	// prevent memory leak (apparent circular reference via closure)
+	},
+
+	_onBlurNode: function(/*DomNode*/ node){
+		// summary:
+		// 		Called when focus leaves a node.
+		//		Usually ignored, _unless_ it *isn't* follwed by touching another node,
+		//		which indicates that we tabbed off the last field on the page,
+		//		in which case every widget is marked inactive
+		dijit._prevFocus = dijit._curFocus;
+		dijit._curFocus = null;
+
+		if(dijit._justMouseDowned){
+			// the mouse down caused a new widget to be marked as active; this blur event
+			// is coming late, so ignore it.
+			return;
+		}
+
+		// if the blur event isn't followed by a focus event then mark all widgets as inactive.
+		if(dijit._clearActiveWidgetsTimer){
+			clearTimeout(dijit._clearActiveWidgetsTimer);
+		}
+		dijit._clearActiveWidgetsTimer = setTimeout(function(){
+			delete dijit._clearActiveWidgetsTimer;
+			dijit._setStack([]);
+			dijit._prevFocus = null;
+		}, 100);
+	},
+
+	_onTouchNode: function(/*DomNode*/ node){
+		// summary:
+		//		Callback when node is focused or mouse-downed
+
+		// ignore the recent blurNode event
+		if(dijit._clearActiveWidgetsTimer){
+			clearTimeout(dijit._clearActiveWidgetsTimer);
+			delete dijit._clearActiveWidgetsTimer;
+		}
+
+		// compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem)
+		var newStack=[];
+		try{
+			while(node){
+				if(node.dijitPopupParent){
+					node=dijit.byId(node.dijitPopupParent).domNode;
+				}else if(node.tagName && node.tagName.toLowerCase()=="body"){
+					// is this the root of the document or just the root of an iframe?
+					if(node===dojo.body()){
+						// node is the root of the main document
+						break;
+					}
+					// otherwise, find the iframe this node refers to (can't access it via parentNode,
+					// need to do this trick instead). window.frameElement is supported in IE/FF/Webkit
+					node=dijit.getDocumentWindow(node.ownerDocument).frameElement;
+				}else{
+					var id = node.getAttribute && node.getAttribute("widgetId");
+					if(id){
+						newStack.unshift(id);
+					}
+					node=node.parentNode;
+				}
+			}
+		}catch(e){ /* squelch */ }
+
+		dijit._setStack(newStack);
+	},
+
+	_onFocusNode: function(/*DomNode*/ node){
+		// summary
+		//		Callback when node is focused
+		if(node && node.tagName && node.tagName.toLowerCase() == "body"){
+			return;
+		}
+		dijit._onTouchNode(node);
+
+		if(node==dijit._curFocus){ return; }
+		if(dijit._curFocus){
+			dijit._prevFocus = dijit._curFocus;
+		}
+		dijit._curFocus = node;
+		dojo.publish("focusNode", [node]);
+	},
+
+	_setStack: function(newStack){
+		// summary
+		//	The stack of active widgets has changed.  Send out appropriate events and record new stack
+
+		var oldStack = dijit._activeStack;		
+		dijit._activeStack = newStack;
+
+		// compare old stack to new stack to see how many elements they have in common
+		for(var nCommon=0; nCommon<Math.min(oldStack.length, newStack.length); nCommon++){
+			if(oldStack[nCommon] != newStack[nCommon]){
+				break;
+			}
+		}
+
+		// for all elements that have gone out of focus, send blur event
+		for(var i=oldStack.length-1; i>=nCommon; i--){
+			var widget = dijit.byId(oldStack[i]);
+			if(widget){
+				widget._focused = false;
+				widget._hasBeenBlurred = true;
+				if(widget._onBlur){
+					widget._onBlur();
+				}
+				if (widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetBlur", [widget]);
+			}
+		}
+
+		// for all element that have come into focus, send focus event
+		for(i=nCommon; i<newStack.length; i++){
+			widget = dijit.byId(newStack[i]);
+			if(widget){
+				widget._focused = true;
+				if(widget._onFocus){
+					widget._onFocus();
+				}
+				if (widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetFocus", [widget]);
+			}
+		}
+	}
+});
+
+// register top window and all the iframes it contains
+dojo.addOnLoad(dijit.registerWin);
+
+}
+
+if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.manager"] = true;
+dojo.provide("dijit._base.manager");
+
+dojo.declare("dijit.WidgetSet", null, {
+	// summary:
+	//	A set of widgets indexed by id
+
+	constructor: function(){
+		this._hash={};
+	},
+
+	add: function(/*Widget*/ widget){
+		if(this._hash[widget.id]){
+			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
+		}
+		this._hash[widget.id]=widget;
+	},
+
+	remove: function(/*String*/ id){
+		delete this._hash[id];
+	},
+
+	forEach: function(/*Function*/ func){
+		for(var id in this._hash){
+			func(this._hash[id]);
+		}
+	},
+
+	filter: function(/*Function*/ filter){
+		var res = new dijit.WidgetSet();
+		this.forEach(function(widget){
+			if(filter(widget)){ res.add(widget); }
+		});
+		return res;		// dijit.WidgetSet
+	},
+
+	byId: function(/*String*/ id){
+		return this._hash[id];
+	},
+
+	byClass: function(/*String*/ cls){
+		return this.filter(function(widget){ return widget.declaredClass==cls; });	// dijit.WidgetSet
+	}
+	});
+
+/*=====
+dijit.registry = {
+	// summary: A list of widgets on a page.
+	// description: Is an instance of dijit.WidgetSet
+};
+=====*/
+dijit.registry = new dijit.WidgetSet();
+
+dijit._widgetTypeCtr = {};
+
+dijit.getUniqueId = function(/*String*/widgetType){
+	// summary
+	//	Generates a unique id for a given widgetType
+
+	var id;
+	do{
+		id = widgetType + "_" +
+			(widgetType in dijit._widgetTypeCtr ?
+				++dijit._widgetTypeCtr[widgetType] : dijit._widgetTypeCtr[widgetType] = 0);
+	}while(dijit.byId(id));
+	return id; // String
+};
+
+
+if(dojo.isIE){
+	// Only run this for IE because we think it's only necessary in that case,
+	// and because it causes problems on FF.  See bug #3531 for details.
+	dojo.addOnUnload(function(){
+		dijit.registry.forEach(function(widget){ widget.destroy(); });
+	});
+}
+
+dijit.byId = function(/*String|Widget*/id){
+	// summary:
+	//		Returns a widget by its id, or if passed a widget, no-op (like dojo.byId())
+	return (dojo.isString(id)) ? dijit.registry.byId(id) : id; // Widget
+};
+
+dijit.byNode = function(/* DOMNode */ node){
+	// summary:
+	//		Returns the widget as referenced by node
+	return dijit.registry.byId(node.getAttribute("widgetId")); // Widget
+};
+
+dijit.getEnclosingWidget = function(/* DOMNode */ node){
+	// summary:
+	//		Returns the widget whose dom tree contains node or null if
+	//		the node is not contained within the dom tree of any widget
+	while(node){
+		if(node.getAttribute && node.getAttribute("widgetId")){
+			return dijit.registry.byId(node.getAttribute("widgetId"));
+		}
+		node = node.parentNode;
+	}
+	return null;
+};
+
+// elements that are tab-navigable if they have no tabindex value set
+// (except for "a", which must have an href attribute)
+dijit._tabElements = {
+	area: true,
+	button: true,
+	input: true,
+	object: true,
+	select: true,
+	textarea: true
+};
+
+dijit._isElementShown = function(/*Element*/elem){
+	var style = dojo.style(elem);
+	return (style.visibility != "hidden")
+		&& (style.visibility != "collapsed")
+		&& (style.display != "none");
+}
+
+dijit.isTabNavigable = function(/*Element*/elem){
+	// summary:
+	//		Tests if an element is tab-navigable
+	if(dojo.hasAttr(elem, "disabled")){ return false; }
+	var hasTabindex = dojo.hasAttr(elem, "tabindex");
+	var tabindex = dojo.attr(elem, "tabindex");
+	if(hasTabindex && tabindex >= 0) {
+		return true; // boolean
+	}
+	var name = elem.nodeName.toLowerCase();
+	if(((name == "a" && dojo.hasAttr(elem, "href"))
+			|| dijit._tabElements[name])
+		&& (!hasTabindex || tabindex >= 0)){
+		return true; // boolean
+	}
+	return false; // boolean
+};
+
+dijit._getTabNavigable = function(/*DOMNode*/root){
+	// summary:
+	//		Finds the following descendants of the specified root node:
+	//		* the first tab-navigable element in document order
+	//		  without a tabindex or with tabindex="0"
+	//		* the last tab-navigable element in document order
+	//		  without a tabindex or with tabindex="0"
+	//		* the first element in document order with the lowest
+	//		  positive tabindex value
+	//		* the last element in document order with the highest
+	//		  positive tabindex value
+	var first, last, lowest, lowestTabindex, highest, highestTabindex;
+	var walkTree = function(/*DOMNode*/parent){
+		dojo.query("> *", parent).forEach(function(child){
+			var isShown = dijit._isElementShown(child);
+			if(isShown && dijit.isTabNavigable(child)){
+				var tabindex = dojo.attr(child, "tabindex");
+				if(!dojo.hasAttr(child, "tabindex") || tabindex == 0){
+					if(!first){ first = child; }
+					last = child;
+				}else if(tabindex > 0){
+					if(!lowest || tabindex < lowestTabindex){
+						lowestTabindex = tabindex;
+						lowest = child;
+					}
+					if(!highest || tabindex >= highestTabindex){
+						highestTabindex = tabindex;
+						highest = child;
+					}
+				}
+			}
+			if(isShown){ walkTree(child) }
+		});
+	};
+	if(dijit._isElementShown(root)){ walkTree(root) }
+	return { first: first, last: last, lowest: lowest, highest: highest };
+}
+
+dijit.getFirstInTabbingOrder = function(/*String|DOMNode*/root){
+	// summary:
+	//		Finds the descendant of the specified root node
+	//		that is first in the tabbing order
+	var elems = dijit._getTabNavigable(dojo.byId(root));
+	return elems.lowest ? elems.lowest : elems.first; // Element
+};
+
+dijit.getLastInTabbingOrder = function(/*String|DOMNode*/root){
+	// summary:
+	//		Finds the descendant of the specified root node
+	//		that is last in the tabbing order
+	var elems = dijit._getTabNavigable(dojo.byId(root));
+	return elems.last ? elems.last : elems.highest; // Element
+};
+
+}
+
+if(!dojo._hasResource["dijit._base.place"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.place"] = true;
+dojo.provide("dijit._base.place");
+
+// ported from dojo.html.util
+
+dijit.getViewport = function(){
+	//	summary
+	//	Returns the dimensions and scroll position of the viewable area of a browser window
+
+	var _window = dojo.global;
+	var _document = dojo.doc;
+
+	// get viewport size
+	var w = 0, h = 0;
+	var de = _document.documentElement;
+	var dew = de.clientWidth, deh = de.clientHeight;
+	if(dojo.isMozilla){
+		// mozilla
+		// _window.innerHeight includes the height taken by the scroll bar
+		// clientHeight is ideal but has DTD issues:
+		// #4539: FF reverses the roles of body.clientHeight/Width and documentElement.clientHeight/Width based on the DTD!
+		// check DTD to see whether body or documentElement returns the viewport dimensions using this algorithm:
+		var minw, minh, maxw, maxh;
+		var dbw = _document.body.clientWidth;
+		if(dbw > dew){
+			minw = dew;
+			maxw = dbw;
+		}else{
+			maxw = dew;
+			minw = dbw;
+		}
+		var dbh = _document.body.clientHeight;
+		if(dbh > deh){
+			minh = deh;
+			maxh = dbh;
+		}else{
+			maxh = deh;
+			minh = dbh;
+		}
+		w = (maxw > _window.innerWidth) ? minw : maxw;
+		h = (maxh > _window.innerHeight) ? minh : maxh;
+	}else if(!dojo.isOpera && _window.innerWidth){
+		//in opera9, dojo.body().clientWidth should be used, instead
+		//of window.innerWidth/document.documentElement.clientWidth
+		//so we have to check whether it is opera
+		w = _window.innerWidth;
+		h = _window.innerHeight;
+	}else if(dojo.isIE && de && deh){
+		w = dew;
+		h = deh;
+	}else if(dojo.body().clientWidth){
+		// IE5, Opera
+		w = dojo.body().clientWidth;
+		h = dojo.body().clientHeight;
+	}
+
+	// get scroll position
+	var scroll = dojo._docScroll();
+
+	return { w: w, h: h, l: scroll.x, t: scroll.y };	//	object
+};
+
+dijit.placeOnScreen = function(
+	/* DomNode */	node,
+	/* Object */		pos,
+	/* Object */		corners,
+	/* boolean? */		tryOnly){
+	//	summary:
+	//		Keeps 'node' in the visible area of the screen while trying to
+	//		place closest to pos.x, pos.y. The input coordinates are
+	//		expected to be the desired document position.
+	//
+	//		Set which corner(s) you want to bind to, such as
+	//		
+	//			placeOnScreen(node, {x: 10, y: 20}, ["TR", "BL"])
+	//		
+	//		The desired x/y will be treated as the topleft(TL)/topright(TR) or
+	//		BottomLeft(BL)/BottomRight(BR) corner of the node. Each corner is tested
+	//		and if a perfect match is found, it will be used. Otherwise, it goes through
+	//		all of the specified corners, and choose the most appropriate one.
+	//		
+	//		NOTE: node is assumed to be absolutely or relatively positioned.
+
+	var choices = dojo.map(corners, function(corner){ return { corner: corner, pos: pos }; });
+
+	return dijit._place(node, choices);
+}
+
+dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ layoutNode){
+	// summary:
+	//		Given a list of spots to put node, put it at the first spot where it fits,
+	//		of if it doesn't fit anywhere then the place with the least overflow
+	// choices: Array
+	//		Array of elements like: {corner: 'TL', pos: {x: 10, y: 20} }
+	//		Above example says to put the top-left corner of the node at (10,20)
+	//	layoutNode: Function(node, aroundNodeCorner, nodeCorner)
+	//		for things like tooltip, they are displayed differently (and have different dimensions)
+	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
+
+	// get {x: 10, y: 10, w: 100, h:100} type obj representing position of
+	// viewport over document
+	var view = dijit.getViewport();
+
+	// This won't work if the node is inside a <div style="position: relative">,
+	// so reattach it to dojo.doc.body.   (Otherwise, the positioning will be wrong
+	// and also it might get cutoff)
+	if(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != "body"){
+		dojo.body().appendChild(node);
+	}
+
+	var best = null;
+	dojo.some(choices, function(choice){
+		var corner = choice.corner;
+		var pos = choice.pos;
+
+		// configure node to be displayed in given position relative to button
+		// (need to do this in order to get an accurate size for the node, because
+		// a tooltips size changes based on position, due to triangle)
+		if(layoutNode){
+			layoutNode(node, choice.aroundCorner, corner);
+		}
+
+		// get node's size
+		var style = node.style;
+		var oldDisplay = style.display;
+		var oldVis = style.visibility;
+		style.visibility = "hidden";
+		style.display = "";
+		var mb = dojo.marginBox(node);
+		style.display = oldDisplay;
+		style.visibility = oldVis;
+
+		// coordinates and size of node with specified corner placed at pos,
+		// and clipped by viewport
+		var startX = (corner.charAt(1) == 'L' ? pos.x : Math.max(view.l, pos.x - mb.w)),
+			startY = (corner.charAt(0) == 'T' ? pos.y : Math.max(view.t, pos.y -  mb.h)),
+			endX = (corner.charAt(1) == 'L' ? Math.min(view.l + view.w, startX + mb.w) : pos.x),
+			endY = (corner.charAt(0) == 'T' ? Math.min(view.t + view.h, startY + mb.h) : pos.y),
+			width = endX - startX,
+			height = endY - startY,
+			overflow = (mb.w - width) + (mb.h - height);
+
+		if(best == null || overflow < best.overflow){
+			best = {
+				corner: corner,
+				aroundCorner: choice.aroundCorner,
+				x: startX,
+				y: startY,
+				w: width,
+				h: height,
+				overflow: overflow
+			};
+		}
+		return !overflow;
+	});
+
+	node.style.left = best.x + "px";
+	node.style.top = best.y + "px";
+	if(best.overflow && layoutNode){
+		layoutNode(node, best.aroundCorner, best.corner);
+	}
+	return best;
+}
+
+dijit.placeOnScreenAroundElement = function(
+	/* DomNode */		node,
+	/* DomNode */		aroundNode,
+	/* Object */		aroundCorners,
+	/* Function */		layoutNode){
+
+	//	summary
+	//	Like placeOnScreen, except it accepts aroundNode instead of x,y
+	//	and attempts to place node around it.  Uses margin box dimensions.
+	//
+	//	aroundCorners
+	//		specify Which corner of aroundNode should be
+	//		used to place the node => which corner(s) of node to use (see the
+	//		corners parameter in dijit.placeOnScreen)
+	//		e.g. {'TL': 'BL', 'BL': 'TL'}
+	//
+	//	layoutNode: Function(node, aroundNodeCorner, nodeCorner)
+	//		for things like tooltip, they are displayed differently (and have different dimensions)
+	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
+
+
+	// get coordinates of aroundNode
+	aroundNode = dojo.byId(aroundNode);
+	var oldDisplay = aroundNode.style.display;
+	aroundNode.style.display="";
+	// #3172: use the slightly tighter border box instead of marginBox
+	var aroundNodeW = aroundNode.offsetWidth; //mb.w;
+	var aroundNodeH = aroundNode.offsetHeight; //mb.h;
+	var aroundNodePos = dojo.coords(aroundNode, true);
+	aroundNode.style.display=oldDisplay;
+
+	// Generate list of possible positions for node
+	var choices = [];
+	for(var nodeCorner in aroundCorners){
+		choices.push( {
+			aroundCorner: nodeCorner,
+			corner: aroundCorners[nodeCorner],
+			pos: {
+				x: aroundNodePos.x + (nodeCorner.charAt(1) == 'L' ? 0 : aroundNodeW),
+				y: aroundNodePos.y + (nodeCorner.charAt(0) == 'T' ? 0 : aroundNodeH)
+			}
+		});
+	}
+
+	return dijit._place(node, choices, layoutNode);
+}
+
+}
+
+if(!dojo._hasResource["dijit._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.window"] = true;
+dojo.provide("dijit._base.window");
+
+dijit.getDocumentWindow = function(doc){
+	//	summary
+	// 	Get window object associated with document doc
+
+	// With Safari, there is not way to retrieve the window from the document, so we must fix it.
+	if(dojo.isSafari && !doc._parentWindow){
+		/*
+			This is a Safari specific function that fix the reference to the parent
+			window from the document object.
+			TODO: #5711: should the use of document below reference dojo.doc instead
+			in case they're not the same?
+		*/
+		var fix=function(win){
+			win.document._parentWindow=win;
+			for(var i=0; i<win.frames.length; i++){
+				fix(win.frames[i]);
+			}
+		}
+		fix(window.top);
+	}
+
+	//In some IE versions (at least 6.0), document.parentWindow does not return a
+	//reference to the real window object (maybe a copy), so we must fix it as well
+	//We use IE specific execScript to attach the real window reference to
+	//document._parentWindow for later use
+	//TODO: #5711: should the use of document below reference dojo.doc instead in case they're not the same?
+	if(dojo.isIE && window !== document.parentWindow && !doc._parentWindow){
+		/*
+		In IE 6, only the variable "window" can be used to connect events (others
+		may be only copies).
+		*/
+		doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
+		//to prevent memory leak, unset it after use
+		//another possibility is to add an onUnload handler which seems overkill to me (liucougar)
+		var win = doc._parentWindow;
+		doc._parentWindow = null;
+		return win;	//	Window
+	}
+
+	return doc._parentWindow || doc.parentWindow || doc.defaultView;	//	Window
+}
+
+}
+
+if(!dojo._hasResource["dijit._base.popup"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.popup"] = true;
+dojo.provide("dijit._base.popup");
+
+
+
+
+
+dijit.popup = new function(){
+	// summary:
+	//		This class is used to show/hide widgets as popups.
+	//
+
+	var stack = [],
+		beginZIndex=1000,
+		idGen = 1;
+
+	this.prepare = function(/*DomNode*/ node){
+		// summary:
+		//		Prepares a node to be used as a popup
+		//
+		// description:
+		//		Attaches node to dojo.doc.body, and
+		//		positions it off screen, but not display:none, so that
+		//		the widget doesn't appear in the page flow and/or cause a blank
+		//		area at the bottom of the viewport (making scrollbar longer), but
+		//		initialization of contained widgets works correctly
+	
+		dojo.body().appendChild(node);
+		var s = node.style;
+		if(s.display == "none"){
+			s.display="";
+		}
+		s.visibility = "hidden";	// not needed for hiding, but used as flag that node is off-screen
+		s.position = "absolute";
+		s.top = "-9999px";
+	};
+
+	this.open = function(/*Object*/ args){
+		// summary:
+		//		Popup the widget at the specified position
+		//
+		// args: Object
+		//		popup: Widget
+		//			widget to display,
+		//		parent: Widget
+		//			the button etc. that is displaying this popup
+		//		around: DomNode
+		//			DOM node (typically a button); place popup relative to this node
+		//		orient: Object
+		//			structure specifying possible positions of popup relative to "around" node
+		//		onCancel: Function
+		//			callback when user has canceled the popup by
+		//				1. hitting ESC or
+		//				2. by using the popup widget's proprietary cancel mechanism (like a cancel button in a dialog);
+		//				   ie: whenever popupWidget.onCancel() is called, args.onCancel is called
+		//		onClose: Function
+		//			callback whenever this popup is closed
+		//		onExecute: Function
+		//			callback when user "executed" on the popup/sub-popup by selecting a menu choice, etc. (top menu only)
+		//
+		// examples:
+		//		1. opening at the mouse position
+		//			dijit.popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY});
+		//		2. opening the widget as a dropdown
+		//			dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}  });
+		//
+		//	Note that whatever widget called dijit.popup.open() should also listen to it's own _onBlur callback
+		//	(fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed.
+
+		var widget = args.popup,
+			orient = args.orient || {'BL':'TL', 'TL':'BL'},
+			around = args.around,
+			id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+idGen++);
+
+		// make wrapper div to hold widget and possibly hold iframe behind it.
+		// we can't attach the iframe as a child of the widget.domNode because
+		// widget.domNode might be a <table>, <ul>, etc.
+		var wrapper = dojo.doc.createElement("div");
+		dijit.setWaiRole(wrapper, "presentation");
+		wrapper.id = id;
+		wrapper.className="dijitPopup";
+		wrapper.style.zIndex = beginZIndex + stack.length;
+		wrapper.style.visibility = "hidden";
+		if(args.parent){
+			wrapper.dijitPopupParent=args.parent.id;
+		}
+		dojo.body().appendChild(wrapper);
+
+		var s = widget.domNode.style;
+		s.display = "";
+		s.visibility = "";
+		s.position = "";
+		wrapper.appendChild(widget.domNode);
+
+		var iframe = new dijit.BackgroundIframe(wrapper);
+
+		// position the wrapper node
+		var best = around ?
+			dijit.placeOnScreenAroundElement(wrapper, around, orient, widget.orient ? dojo.hitch(widget, "orient") : null) :
+			dijit.placeOnScreen(wrapper, args, orient == 'R' ? ['TR','BR','TL','BL'] : ['TL','BL','TR','BR']);
+
+		wrapper.style.visibility = "visible";
+		// TODO: use effects to fade in wrapper
+
+		var handlers = [];
+
+		// Compute the closest ancestor popup that's *not* a child of another popup.
+		// Ex: For a TooltipDialog with a button that spawns a tree of menus, find the popup of the button.
+		var getTopPopup = function(){
+			for(var pi=stack.length-1; pi > 0 && stack[pi].parent === stack[pi-1].widget; pi--){
+				/* do nothing, just trying to get right value for pi */
+			}
+			return stack[pi];
+		}
+
+		// provide default escape and tab key handling
+		// (this will work for any widget, not just menu)
+		handlers.push(dojo.connect(wrapper, "onkeypress", this, function(evt){
+			if(evt.keyCode == dojo.keys.ESCAPE && args.onCancel){
+				dojo.stopEvent(evt);
+				args.onCancel();
+			}else if(evt.keyCode == dojo.keys.TAB){
+				dojo.stopEvent(evt);
+				var topPopup = getTopPopup();
+				if(topPopup && topPopup.onCancel){
+					topPopup.onCancel();
+				}
+			}
+		}));
+
+		// watch for cancel/execute events on the popup and notify the caller
+		// (for a menu, "execute" means clicking an item)
+		if(widget.onCancel){
+			handlers.push(dojo.connect(widget, "onCancel", null, args.onCancel));
+		}
+
+		handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", null, function(){
+			var topPopup = getTopPopup();
+			if(topPopup && topPopup.onExecute){
+				topPopup.onExecute();
+			}
+		}));
+
+		stack.push({
+			wrapper: wrapper,
+			iframe: iframe,
+			widget: widget,
+			parent: args.parent,
+			onExecute: args.onExecute,
+			onCancel: args.onCancel,
+ 			onClose: args.onClose,
+			handlers: handlers
+		});
+
+		if(widget.onOpen){
+			widget.onOpen(best);
+		}
+
+		return best;
+	};
+
+	this.close = function(/*Widget*/ popup){
+		// summary:
+		//		Close specified popup and any popups that it parented
+		while(dojo.some(stack, function(elem){return elem.widget == popup;})){
+			var top = stack.pop(),
+				wrapper = top.wrapper,
+				iframe = top.iframe,
+				widget = top.widget,
+				onClose = top.onClose;
+	
+			if(widget.onClose){
+				widget.onClose();
+			}
+			dojo.forEach(top.handlers, dojo.disconnect);
+	
+			// #2685: check if the widget still has a domNode so ContentPane can change its URL without getting an error
+			if(!widget||!widget.domNode){ return; }
+			
+			this.prepare(widget.domNode);
+
+			iframe.destroy();
+			dojo._destroyElement(wrapper);
+	
+			if(onClose){
+				onClose();
+			}
+		}
+	};
+}();
+
+dijit._frames = new function(){
+	// summary: cache of iframes
+	var queue = [];
+
+	this.pop = function(){
+		var iframe;
+		if(queue.length){
+			iframe = queue.pop();
+			iframe.style.display="";
+		}else{
+			if(dojo.isIE){
+				var html="<iframe src='javascript:\"\"'"
+					+ " style='position: absolute; left: 0px; top: 0px;"
+					+ "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
+				iframe = dojo.doc.createElement(html);
+			}else{
+			 	iframe = dojo.doc.createElement("iframe");
+				iframe.src = 'javascript:""';
+				iframe.className = "dijitBackgroundIframe";
+			}
+			iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didnt work.
+			dojo.body().appendChild(iframe);
+		}
+		return iframe;
+	};
+
+	this.push = function(iframe){
+		iframe.style.display="";
+		if(dojo.isIE){
+			iframe.style.removeExpression("width");
+			iframe.style.removeExpression("height");
+		}
+		queue.push(iframe);
+	}
+}();
+
+// fill the queue
+if(dojo.isIE && dojo.isIE < 7){
+	dojo.addOnLoad(function(){
+		var f = dijit._frames;
+		dojo.forEach([f.pop()], f.push);
+	});
+}
+
+
+dijit.BackgroundIframe = function(/* DomNode */node){
+	//	summary:
+	//		For IE z-index schenanigans. id attribute is required.
+	//
+	//	description:
+	//		new dijit.BackgroundIframe(node)
+	//			Makes a background iframe as a child of node, that fills
+	//			area (and position) of node
+
+	if(!node.id){ throw new Error("no id"); }
+	if((dojo.isIE && dojo.isIE < 7) || (dojo.isFF && dojo.isFF < 3 && dojo.hasClass(dojo.body(), "dijit_a11y"))){
+		var iframe = dijit._frames.pop();
+		node.appendChild(iframe);
+		if(dojo.isIE){
+			iframe.style.setExpression("width", dojo._scopeName + ".doc.getElementById('" + node.id + "').offsetWidth");
+			iframe.style.setExpression("height", dojo._scopeName + ".doc.getElementById('" + node.id + "').offsetHeight");
+		}
+		this.iframe = iframe;
+	}
+};
+
+dojo.extend(dijit.BackgroundIframe, {
+	destroy: function(){
+		//	summary: destroy the iframe
+		if(this.iframe){
+			dijit._frames.push(this.iframe);
+			delete this.iframe;
+		}
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit._base.scroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.scroll"] = true;
+dojo.provide("dijit._base.scroll");
+
+dijit.scrollIntoView = function(/* DomNode */node){
+	//	summary
+	//	Scroll the passed node into view, if it is not.
+
+	// don't rely on that node.scrollIntoView works just because the function is there
+	// it doesnt work in Konqueror or Opera even though the function is there and probably
+	//	not safari either
+	// native scrollIntoView() causes FF3's whole window to scroll if there is no scroll bar 
+	//	on the immediate parent
+	// dont like browser sniffs implementations but sometimes you have to use it
+	// #6146: IE scrollIntoView is broken
+	// It's not enough just to scroll the menu node into view if
+	// node.scrollIntoView hides part of the parent's scrollbar,
+	// so just manage the parent scrollbar ourselves
+	var parent = node.parentNode;
+	var parentBottom = parent.scrollTop + dojo.marginBox(parent).h; //PORT was getBorderBox
+	var nodeBottom = node.offsetTop + dojo.marginBox(node).h;
+	if(parentBottom < nodeBottom){
+		parent.scrollTop += (nodeBottom - parentBottom);
+	}else if(parent.scrollTop > node.offsetTop){
+		parent.scrollTop -= (parent.scrollTop - node.offsetTop);
+	}
+};
+
+}
+
+if(!dojo._hasResource["dijit._base.sniff"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.sniff"] = true;
+dojo.provide("dijit._base.sniff");
+
+// ported from dojo.html.applyBrowserClass (style.js)
+
+//	summary:
+//		Applies pre-set class names based on browser & version to the
+//		top-level HTML node.  Simply doing a require on this module will
+//		establish this CSS.  Modified version of Morris' CSS hack.
+(function(){
+	var d = dojo;
+	var ie = d.isIE;
+	var opera = d.isOpera;
+	var maj = Math.floor;
+	var ff = d.isFF;
+	var classes = {
+		dj_ie: ie,
+//		dj_ie55: ie == 5.5,
+		dj_ie6: maj(ie) == 6,
+		dj_ie7: maj(ie) == 7,
+		dj_iequirks: ie && d.isQuirks,
+// NOTE: Opera not supported by dijit
+		dj_opera: opera,
+		dj_opera8: maj(opera) == 8,
+		dj_opera9: maj(opera) == 9,
+		dj_khtml: d.isKhtml,
+		dj_safari: d.isSafari,
+		dj_gecko: d.isMozilla,
+		dj_ff2: maj(ff) == 2
+	}; // no dojo unsupported browsers
+
+	for(var p in classes){
+		if(classes[p]){
+			var html = dojo.doc.documentElement; //TODO browser-specific DOM magic needed?
+			if(html.className){
+				html.className += " " + p;
+			}else{
+				html.className = p;
+			}
+		}
+	}
+})();
+
+}
+
+if(!dojo._hasResource["dijit._base.bidi"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.bidi"] = true;
+dojo.provide("dijit._base.bidi");
+
+// summary: applies a class to the top of the document for right-to-left stylesheet rules
+
+dojo.addOnLoad(function(){
+	if(!dojo._isBodyLtr()){
+		dojo.addClass(dojo.body(), "dijitRtl");
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit._base.typematic"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.typematic"] = true;
+dojo.provide("dijit._base.typematic");
+
+dijit.typematic = {
+	// summary:
+	//	These functions are used to repetitively call a user specified callback
+	//	method when a specific key or mouse click over a specific DOM node is
+	//	held down for a specific amount of time.
+	//	Only 1 such event is allowed to occur on the browser page at 1 time.
+
+	_fireEventAndReload: function(){
+		this._timer = null;
+		this._callback(++this._count, this._node, this._evt);
+		this._currentTimeout = (this._currentTimeout < 0) ? this._initialDelay : ((this._subsequentDelay > 1) ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay));
+		this._timer = setTimeout(dojo.hitch(this, "_fireEventAndReload"), this._currentTimeout);
+	},
+
+	trigger: function(/*Event*/ evt, /* Object */ _this, /*DOMNode*/ node, /* Function */ callback, /* Object */ obj, /* Number */ subsequentDelay, /* Number */ initialDelay){
+		// summary:
+		//      Start a timed, repeating callback sequence.
+		//      If already started, the function call is ignored.
+		//      This method is not normally called by the user but can be
+		//      when the normal listener code is insufficient.
+		//	Parameters:
+		//	evt: key or mouse event object to pass to the user callback
+		//	_this: pointer to the user's widget space.
+		//	node: the DOM node object to pass the the callback function
+		//	callback: function to call until the sequence is stopped called with 3 parameters:
+		//		count: integer representing number of repeated calls (0..n) with -1 indicating the iteration has stopped
+		//		node: the DOM node object passed in
+		//		evt: key or mouse event object
+		//	obj: user space object used to uniquely identify each typematic sequence
+		//	subsequentDelay: if > 1, the number of milliseconds until the 3->n events occur
+		//		or else the fractional time multiplier for the next event's delay, default=0.9
+		//	initialDelay: the number of milliseconds until the 2nd event occurs, default=500ms
+		if(obj != this._obj){
+			this.stop();
+			this._initialDelay = initialDelay || 500;
+			this._subsequentDelay = subsequentDelay || 0.90;
+			this._obj = obj;
+			this._evt = evt;
+			this._node = node;
+			this._currentTimeout = -1;
+			this._count = -1;
+			this._callback = dojo.hitch(_this, callback);
+			this._fireEventAndReload();
+		}
+	},
+
+	stop: function(){
+		// summary:
+		//	  Stop an ongoing timed, repeating callback sequence.
+		if(this._timer){
+			clearTimeout(this._timer);
+			this._timer = null;
+		}
+		if(this._obj){
+			this._callback(-1, this._node, this._evt);
+			this._obj = null;
+		}
+	},
+
+	addKeyListener: function(/*DOMNode*/ node, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+		// summary: Start listening for a specific typematic key.
+		//	keyObject: an object defining the key to listen for.
+		//		key: (mandatory) the keyCode (number) or character (string) to listen for.
+		//		ctrlKey: desired ctrl key state to initiate the calback sequence:
+		//			pressed (true)
+		//			released (false)
+		//			either (unspecified)
+		//		altKey: same as ctrlKey but for the alt key
+		//		shiftKey: same as ctrlKey but for the shift key
+		//	See the trigger method for other parameters.
+		//	Returns an array of dojo.connect handles
+		return [
+			dojo.connect(node, "onkeypress", this, function(evt){
+				if(evt.keyCode == keyObject.keyCode && (!keyObject.charCode || keyObject.charCode == evt.charCode) &&
+				(keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) &&
+				(keyObject.altKey === undefined || keyObject.altKey == evt.ctrlKey) &&
+				(keyObject.shiftKey === undefined || keyObject.shiftKey == evt.ctrlKey)){
+					dojo.stopEvent(evt);
+					dijit.typematic.trigger(keyObject, _this, node, callback, keyObject, subsequentDelay, initialDelay);
+				}else if(dijit.typematic._obj == keyObject){
+					dijit.typematic.stop();
+				}
+			}),
+			dojo.connect(node, "onkeyup", this, function(evt){
+				if(dijit.typematic._obj == keyObject){
+					dijit.typematic.stop();
+				}
+			})
+		];
+	},
+
+	addMouseListener: function(/*DOMNode*/ node, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+		// summary: Start listening for a typematic mouse click.
+		//	See the trigger method for other parameters.
+		//	Returns an array of dojo.connect handles
+		var dc = dojo.connect;
+		return [
+			dc(node, "mousedown", this, function(evt){
+				dojo.stopEvent(evt);
+				dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay);
+			}),
+			dc(node, "mouseup", this, function(evt){
+				dojo.stopEvent(evt);
+				dijit.typematic.stop();
+			}),
+			dc(node, "mouseout", this, function(evt){
+				dojo.stopEvent(evt);
+				dijit.typematic.stop();
+			}),
+			dc(node, "mousemove", this, function(evt){
+				dojo.stopEvent(evt);
+			}),
+			dc(node, "dblclick", this, function(evt){
+				dojo.stopEvent(evt);
+				if(dojo.isIE){
+					dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay);
+					setTimeout(dojo.hitch(this, dijit.typematic.stop), 50);
+				}
+			})
+		];
+	},
+
+	addListener: function(/*Node*/ mouseNode, /*Node*/ keyNode, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+		// summary: Start listening for a specific typematic key and mouseclick.
+		//	This is a thin wrapper to addKeyListener and addMouseListener.
+		//	mouseNode: the DOM node object to listen on for mouse events.
+		//	keyNode: the DOM node object to listen on for key events.
+		//	See the addMouseListener and addKeyListener methods for other parameters.
+		//	Returns an array of dojo.connect handles
+		return this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay).concat(
+			this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay));
+	}
+};
+
+}
+
+if(!dojo._hasResource["dijit._base.wai"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.wai"] = true;
+dojo.provide("dijit._base.wai");
+
+dijit.wai = {
+	onload: function(){
+		// summary:
+		//		Detects if we are in high-contrast mode or not
+
+		// This must be a named function and not an anonymous
+		// function, so that the widget parsing code can make sure it
+		// registers its onload function after this function.
+		// DO NOT USE "this" within this function.
+
+		// create div for testing if high contrast mode is on or images are turned off
+		var div = dojo.doc.createElement("div");
+		div.id = "a11yTestNode";
+		div.style.cssText = 'border: 1px solid;'
+			+ 'border-color:red green;'
+			+ 'position: absolute;'
+			+ 'height: 5px;'
+			+ 'top: -999px;'
+			+ 'background-image: url("' + dojo.moduleUrl("dojo", "resources/blank.gif") + '");';
+		dojo.body().appendChild(div);
+
+		// test it
+		var cs = dojo.getComputedStyle(div);
+		if(cs){
+			var bkImg = cs.backgroundImage;
+			var needsA11y = (cs.borderTopColor==cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" ));
+			dojo[needsA11y ? "addClass" : "removeClass"](dojo.body(), "dijit_a11y");
+			dojo.body().removeChild(div);
+		}
+	}
+};
+
+// Test if computer is in high contrast mode.
+// Make sure the a11y test runs first, before widgets are instantiated.
+if(dojo.isIE || dojo.isMoz){	// NOTE: checking in Safari messes things up
+	dojo._loaders.unshift(dijit.wai.onload);
+}
+
+dojo.mixin(dijit,
+{
+	hasWaiRole: function(/*Element*/ elem){
+		// summary: Determines if an element has a role.
+		// returns: true if elem has a role attribute and false if not.
+		return elem.hasAttribute ? elem.hasAttribute("role") : !!elem.getAttribute("role");
+	},
+
+	getWaiRole: function(/*Element*/ elem){
+		// summary: Gets the role for an element.
+		// returns:
+		//		The role of elem or an empty string if elem
+		//		does not have a role.
+		var value = elem.getAttribute("role");
+		if(value){
+			var prefixEnd = value.indexOf(":");
+			return prefixEnd == -1 ? value : value.substring(prefixEnd+1);
+		}else{
+			return "";
+		}
+	},
+
+	setWaiRole: function(/*Element*/ elem, /*String*/ role){
+		// summary: Sets the role on an element.
+		// description:
+		//		On Firefox 2 and below, "wairole:" is
+		//		prepended to the provided role value.
+		elem.setAttribute("role", (dojo.isFF && dojo.isFF < 3) ? "wairole:" + role : role);
+	},
+
+	removeWaiRole: function(/*Element*/ elem){
+		// summary: Removes the role from an element.
+		elem.removeAttribute("role");
+	},
+
+	hasWaiState: function(/*Element*/ elem, /*String*/ state){
+		// summary: Determines if an element has a given state.
+		// description:
+		//		On Firefox 2 and below, we check for an attribute in namespace
+		//		"http://www.w3.org/2005/07/aaa"; with a name of the given state.
+		//		On all other browsers, we check for an attribute
+		//		called "aria-"+state.
+		// returns:
+		//		true if elem has a value for the given state and
+		//		false if it does not.
+		if(dojo.isFF && dojo.isFF < 3){
+			return elem.hasAttributeNS("http://www.w3.org/2005/07/aaa";, state);
+		}else{
+			return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state);
+		}
+	},
+
+	getWaiState: function(/*Element*/ elem, /*String*/ state){
+		// summary: Gets the value of a state on an element.
+		// description:
+		//		On Firefox 2 and below, we check for an attribute in namespace
+		//		"http://www.w3.org/2005/07/aaa"; with a name of the given state.
+		//		On all other browsers, we check for an attribute called
+		//		"aria-"+state.
+		// returns:
+		//		The value of the requested state on elem
+		//		or an empty string if elem has no value for state.
+		if(dojo.isFF && dojo.isFF < 3){
+			return elem.getAttributeNS("http://www.w3.org/2005/07/aaa";, state);
+		}else{
+			var value = elem.getAttribute("aria-"+state);
+			return value ? value : "";
+		}
+	},
+
+	setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){
+		// summary: Sets a state on an element.
+		// description:
+		//		On Firefox 2 and below, we set an attribute in namespace
+		//		"http://www.w3.org/2005/07/aaa"; with a name of the given state.
+		//		On all other browsers, we set an attribute called
+		//		"aria-"+state.
+		if(dojo.isFF && dojo.isFF < 3){
+			elem.setAttributeNS("http://www.w3.org/2005/07/aaa";,
+				"aaa:"+state, value);
+		}else{
+			elem.setAttribute("aria-"+state, value);
+		}
+	},
+
+	removeWaiState: function(/*Element*/ elem, /*String*/ state){
+		// summary: Removes a state from an element.
+		// description:
+		//		On Firefox 2 and below, we remove the attribute in namespace
+		//		"http://www.w3.org/2005/07/aaa"; with a name of the given state.
+		//		On all other browsers, we remove the attribute called
+		//		"aria-"+state.
+		if(dojo.isFF && dojo.isFF < 3){
+			elem.removeAttributeNS("http://www.w3.org/2005/07/aaa";, state);
+		}else{
+			elem.removeAttribute("aria-"+state);
+		}
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base"] = true;
+dojo.provide("dijit._base");
+
+
+
+
+
+
+
+
+
+
+
+
+//	FIXME: Find a better way of solving this bug!
+if(dojo.isSafari){
+	//	Ugly-ass hack to solve bug #5626 for 1.1; basically force Safari to re-layout.
+	//	Note that we can't reliably use dojo.addOnLoad here because this bug is basically
+	//		a timing / race condition; so instead we use window.onload.
+	dojo.connect(window, "load", function(){
+		window.resizeBy(1,0);
+		setTimeout(function(){ window.resizeBy(-1,0); }, 10);
+	});
+}
+
+}
+
+if(!dojo._hasResource["dojo.date.stamp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.date.stamp"] = true;
+dojo.provide("dojo.date.stamp");
+
+// Methods to convert dates to or from a wire (string) format using well-known conventions
+
+dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/defaultTime){
+	//	summary:
+	//		Returns a Date object given a string formatted according to a subset of the ISO-8601 standard.
+	//
+	//	description:
+	//		Accepts a string formatted according to a profile of ISO8601 as defined by
+	//		[RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed.
+	//		Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime)
+	//		The following combinations are valid:
+	//
+	//			* dates only
+	//			|	* yyyy
+	//			|	* yyyy-MM
+	//			|	* yyyy-MM-dd
+	// 			* times only, with an optional time zone appended
+	//			|	* THH:mm
+	//			|	* THH:mm:ss
+	//			|	* THH:mm:ss.SSS
+	// 			* and "datetimes" which could be any combination of the above
+	//
+	//		timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm
+	//		Assumes the local time zone if not specified.  Does not validate.  Improperly formatted
+	//		input may return null.  Arguments which are out of bounds will be handled
+	// 		by the Date constructor (e.g. January 32nd typically gets resolved to February 1st)
+	//		Only years between 100 and 9999 are supported.
+	//
+  	//	formattedString:
+	//		A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00
+	//
+	//	defaultTime:
+	//		Used for defaults for fields omitted in the formattedString.
+	//		Uses 1970-01-01T00:00:00.0Z by default.
+
+	if(!dojo.date.stamp._isoRegExp){
+		dojo.date.stamp._isoRegExp =
+//TODO: could be more restrictive and check for 00-59, etc.
+			/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;
+	}
+
+	var match = dojo.date.stamp._isoRegExp.exec(formattedString);
+	var result = null;
+
+	if(match){
+		match.shift();
+		if(match[1]){match[1]--;} // Javascript Date months are 0-based
+		if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds
+
+		if(defaultTime){
+			// mix in defaultTime.  Relatively expensive, so use || operators for the fast path of defaultTime === 0
+			defaultTime = new Date(defaultTime);
+			dojo.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){
+				return defaultTime["get" + prop]();
+			}).forEach(function(value, index){
+				if(match[index] === undefined){
+					match[index] = value;
+				}
+			});
+		}
+		result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0);
+//		result.setFullYear(match[0]||1970); // for year < 100
+
+		var offset = 0;
+		var zoneSign = match[7] && match[7].charAt(0);
+		if(zoneSign != 'Z'){
+			offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
+			if(zoneSign != '-'){ offset *= -1; }
+		}
+		if(zoneSign){
+			offset -= result.getTimezoneOffset();
+		}
+		if(offset){
+			result.setTime(result.getTime() + offset * 60000);
+		}
+	}
+
+	return result; // Date or null
+}
+
+/*=====
+	dojo.date.stamp.__Options = function(){
+		//	selector: String
+		//		"date" or "time" for partial formatting of the Date object.
+		//		Both date and time will be formatted by default.
+		//	zulu: Boolean
+		//		if true, UTC/GMT is used for a timezone
+		//	milliseconds: Boolean
+		//		if true, output milliseconds
+		this.selector = selector;
+		this.zulu = zulu;
+		this.milliseconds = milliseconds;
+	}
+=====*/
+
+dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__Options?*/options){
+	//	summary:
+	//		Format a Date object as a string according a subset of the ISO-8601 standard
+	//
+	//	description:
+	//		When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt)
+	//		The local time zone is included as an offset from GMT, except when selector=='time' (time without a date)
+	//		Does not check bounds.  Only years between 100 and 9999 are supported.
+	//
+	//	dateObject:
+	//		A Date object
+
+	var _ = function(n){ return (n < 10) ? "0" + n : n; };
+	options = options || {};
+	var formattedDate = [];
+	var getter = options.zulu ? "getUTC" : "get";
+	var date = "";
+	if(options.selector != "time"){
+		var year = dateObject[getter+"FullYear"]();
+		date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
+	}
+	formattedDate.push(date);
+	if(options.selector != "date"){
+		var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':');
+		var millis = dateObject[getter+"Milliseconds"]();
+		if(options.milliseconds){
+			time += "."+ (millis < 100 ? "0" : "") + _(millis);
+		}
+		if(options.zulu){
+			time += "Z";
+		}else if(options.selector != "time"){
+			var timezoneOffset = dateObject.getTimezoneOffset();
+			var absOffset = Math.abs(timezoneOffset);
+			time += (timezoneOffset > 0 ? "-" : "+") + 
+				_(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
+		}
+		formattedDate.push(time);
+	}
+	return formattedDate.join('T'); // String
+}
+
+}
+
+if(!dojo._hasResource["dojo.parser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.parser"] = true;
+dojo.provide("dojo.parser");
+
+
+dojo.parser = new function(){
+	// summary: The Dom/Widget parsing package
+
+	var d = dojo;
+	var dtName = d._scopeName + "Type";
+	var qry = "[" + dtName + "]";
+
+	function val2type(/*Object*/ value){
+		// summary:
+		//		Returns name of type of given value.
+
+		if(d.isString(value)){ return "string"; }
+		if(typeof value == "number"){ return "number"; }
+		if(typeof value == "boolean"){ return "boolean"; }
+		if(d.isFunction(value)){ return "function"; }
+		if(d.isArray(value)){ return "array"; } // typeof [] == "object"
+		if(value instanceof Date) { return "date"; } // assume timestamp
+		if(value instanceof d._Url){ return "url"; }
+		return "object";
+	}
+
+	function str2obj(/*String*/ value, /*String*/ type){
+		// summary:
+		//		Convert given string value to given type
+		switch(type){
+			case "string":
+				return value;
+			case "number":
+				return value.length ? Number(value) : NaN;
+			case "boolean":
+				// for checked/disabled value might be "" or "checked".  interpret as true.
+				return typeof value == "boolean" ? value : !(value.toLowerCase()=="false");
+			case "function":
+				if(d.isFunction(value)){
+					// IE gives us a function, even when we say something like onClick="foo"
+					// (in which case it gives us an invalid function "function(){ foo }"). 
+					//  Therefore, convert to string
+					value=value.toString();
+					value=d.trim(value.substring(value.indexOf('{')+1, value.length-1));
+				}
+				try{
+					if(value.search(/[^\w\.]+/i) != -1){
+						// TODO: "this" here won't work
+						value = d.parser._nameAnonFunc(new Function(value), this);
+					}
+					return d.getObject(value, false);
+				}catch(e){ return new Function(); }
+			case "array":
+				return value.split(/\s*,\s*/);
+			case "date":
+				switch(value){
+					case "": return new Date("");	// the NaN of dates
+					case "now": return new Date();	// current date
+					default: return d.date.stamp.fromISOString(value);
+				}
+			case "url":
+				return d.baseUrl + value;
+			default:
+				return d.fromJson(value);
+		}
+	}
+
+	var instanceClasses = {
+		// map from fully qualified name (like "dijit.Button") to structure like
+		// { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
+	};
+	
+	function getClassInfo(/*String*/ className){
+		// className:
+		//		fully qualified name (like "dijit.Button")
+		// returns:
+		//		structure like
+		//			{ 
+		//				cls: dijit.Button, 
+		//				params: { label: "string", disabled: "boolean"}
+		//			}
+
+		if(!instanceClasses[className]){
+			// get pointer to widget class
+			var cls = d.getObject(className);
+			if(!d.isFunction(cls)){
+				throw new Error("Could not load class '" + className +
+					"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");
+			}
+			var proto = cls.prototype;
+	
+			// get table of parameter names & types
+			var params={};
+			for(var name in proto){
+				if(name.charAt(0)=="_"){ continue; } 	// skip internal properties
+				var defVal = proto[name];
+				params[name]=val2type(defVal);
+			}
+
+			instanceClasses[className] = { cls: cls, params: params };
+		}
+		return instanceClasses[className];
+	}
+
+	this._functionFromScript = function(script){
+		var preamble = "";
+		var suffix = "";
+		var argsStr = script.getAttribute("args");
+		if(argsStr){
+			d.forEach(argsStr.split(/\s*,\s*/), function(part, idx){
+				preamble += "var "+part+" = arguments["+idx+"]; ";
+			});
+		}
+		var withStr = script.getAttribute("with");
+		if(withStr && withStr.length){
+			d.forEach(withStr.split(/\s*,\s*/), function(part){
+				preamble += "with("+part+"){";
+				suffix += "}";
+			});
+		}
+		return new Function(preamble+script.innerHTML+suffix);
+	}
+
+	this.instantiate = function(/* Array */nodes){
+		// summary:
+		//		Takes array of nodes, and turns them into class instances and
+		//		potentially calls a layout method to allow them to connect with
+		//		any children		
+		var thelist = [];
+		d.forEach(nodes, function(node){
+			if(!node){ return; }
+			var type = node.getAttribute(dtName);
+			if((!type)||(!type.length)){ return; }
+			var clsInfo = getClassInfo(type);
+			var clazz = clsInfo.cls;
+			var ps = clazz._noScript||clazz.prototype._noScript;
+
+			// read parameters (ie, attributes).
+			// clsInfo.params lists expected params like {"checked": "boolean", "n": "number"}
+			var params = {};
+			var attributes = node.attributes;
+			for(var name in clsInfo.params){
+				var item = attributes.getNamedItem(name);
+				if(!item || (!item.specified && (!dojo.isIE || name.toLowerCase()!="value"))){ continue; }
+				var value = item.value;
+				// Deal with IE quirks for 'class' and 'style'
+				switch(name){
+				case "class":
+					value = node.className;
+					break;
+				case "style":
+					value = node.style && node.style.cssText; // FIXME: Opera?
+				}
+				var _type = clsInfo.params[name];
+				params[name] = str2obj(value, _type);
+			}
+
+			// Process <script type="dojo/*"> script tags
+			// <script type="dojo/method" event="foo"> tags are added to params, and passed to
+			// the widget on instantiation.
+			// <script type="dojo/method"> tags (with no event) are executed after instantiation
+			// <script type="dojo/connect" event="foo"> tags are dojo.connected after instantiation
+			// note: dojo/* script tags cannot exist in self closing widgets, like <input />
+			if(!ps){
+				var connects = [],	// functions to connect after instantiation
+					calls = [];		// functions to call after instantiation
+
+				d.query("> script[type^='dojo/']", node).orphan().forEach(function(script){
+					var event = script.getAttribute("event"),
+						type = script.getAttribute("type"),
+						nf = d.parser._functionFromScript(script);
+					if(event){
+						if(type == "dojo/connect"){
+							connects.push({event: event, func: nf});
+						}else{
+							params[event] = nf;
+						}
+					}else{
+						calls.push(nf);
+					}
+				});
+			}
+
+			var markupFactory = clazz["markupFactory"];
+			if(!markupFactory && clazz["prototype"]){
+				markupFactory = clazz.prototype["markupFactory"];
+			}
+			// create the instance
+			var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node);
+			thelist.push(instance);
+
+			// map it to the JS namespace if that makes sense
+			var jsname = node.getAttribute("jsId");
+			if(jsname){
+				d.setObject(jsname, instance);
+			}
+
+			// process connections and startup functions
+			if(!ps){
+				d.forEach(connects, function(connect){
+					d.connect(instance, connect.event, null, connect.func);
+				});
+				d.forEach(calls, function(func){
+					func.call(instance);
+				});
+			}
+		});
+
+		// Call startup on each top level instance if it makes sense (as for
+		// widgets).  Parent widgets will recursively call startup on their
+		// (non-top level) children
+		d.forEach(thelist, function(instance){
+			if(	instance  && 
+				instance.startup &&
+				!instance._started && 
+				(!instance.getParent || !instance.getParent())
+			){
+				instance.startup();
+			}
+		});
+		return thelist;
+	};
+
+	this.parse = function(/*DomNode?*/ rootNode){
+		// summary:
+		//		Search specified node (or root node) recursively for class instances,
+		//		and instantiate them Searches for
+		//		dojoType="qualified.class.name"
+		var list = d.query(qry, rootNode);
+		// go build the object instances
+		var instances = this.instantiate(list);
+		return instances;
+	};
+}();
+
+//Register the parser callback. It should be the first callback
+//after the a11y test.
+
+(function(){
+	var parseRunner = function(){ 
+		if(dojo.config["parseOnLoad"] == true){
+			dojo.parser.parse(); 
+		}
+	};
+
+	// FIXME: need to clobber cross-dependency!!
+	if(dojo.exists("dijit.wai.onload") && (dijit.wai.onload === dojo._loaders[0])){
+		dojo._loaders.splice(1, 0, parseRunner);
+	}else{
+		dojo._loaders.unshift(parseRunner);
+	}
+})();
+
+//TODO: ported from 0.4.x Dojo.  Can we reduce this?
+dojo.parser._anonCtr = 0;
+dojo.parser._anon = {}; // why is this property required?
+dojo.parser._nameAnonFunc = function(/*Function*/anonFuncPtr, /*Object*/thisObj){
+	// summary:
+	//		Creates a reference to anonFuncPtr in thisObj with a completely
+	//		unique name. The new name is returned as a String. 
+	var jpn = "$joinpoint";
+	var nso = (thisObj|| dojo.parser._anon);
+	if(dojo.isIE){
+		var cn = anonFuncPtr["__dojoNameCache"];
+		if(cn && nso[cn] === anonFuncPtr){
+			return anonFuncPtr["__dojoNameCache"];
+		}
+	}
+	var ret = "__"+dojo.parser._anonCtr++;
+	while(typeof nso[ret] != "undefined"){
+		ret = "__"+dojo.parser._anonCtr++;
+	}
+	nso[ret] = anonFuncPtr;
+	return ret; // String
+}
+
+}
+
+if(!dojo._hasResource["dijit._Widget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Widget"] = true;
+dojo.provide("dijit._Widget");
+
+dojo.require( "dijit._base" );
+
+dojo.declare("dijit._Widget", null, {
+	//	summary:
+	//		The foundation of dijit widgets. 	
+	//
+	//	id: String
+	//		a unique, opaque ID string that can be assigned by users or by the
+	//		system. If the developer passes an ID which is known not to be
+	//		unique, the specified ID is ignored and the system-generated ID is
+	//		used instead.
+	id: "",
+
+	//	lang: String
+	//		Rarely used.  Overrides the default Dojo locale used to render this widget,
+	//		as defined by the [HTML LANG](http://www.w3.org/TR/html401/struct/dirlang.html#adef-lang) attribute.
+	//		Value must be among the list of locales specified during by the Dojo bootstrap,
+	//		formatted according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt) (like en-us).
+	lang: "",
+
+	//	dir: String
+	//		Unsupported by Dijit, but here for completeness.  Dijit only supports setting text direction on the
+	//		entire document.
+	//		Bi-directional support, as defined by the [HTML DIR](http://www.w3.org/TR/html401/struct/dirlang.html#adef-dir)
+	//		attribute. Either left-to-right "ltr" or right-to-left "rtl".
+	dir: "",
+
+	// class: String
+	//		HTML class attribute
+	"class": "",
+
+	// style: String
+	//		HTML style attribute
+	style: "",
+
+	// title: String
+	//		HTML title attribute
+	title: "",
+
+	// srcNodeRef: DomNode
+	//		pointer to original dom node
+	srcNodeRef: null,
+
+	// domNode: DomNode
+	//		this is our visible representation of the widget! Other DOM
+	//		Nodes may by assigned to other properties, usually through the
+	//		template system's dojoAttachPonit syntax, but the domNode
+	//		property is the canonical "top level" node in widget UI.
+	domNode: null,
+
+	// attributeMap: Object
+	//		A map of attributes and attachpoints -- typically standard HTML attributes -- to set
+	//		on the widget's dom, at the "domNode" attach point, by default.
+	//		Other node references can be specified as properties of 'this'
+	attributeMap: {id:"", dir:"", lang:"", "class":"", style:"", title:""},  // TODO: add on* handlers?
+
+	//////////// INITIALIZATION METHODS ///////////////////////////////////////
+//TODOC: params and srcNodeRef need docs.  Is srcNodeRef optional?
+//TODOC: summary needed for postscript
+	postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+		this.create(params, srcNodeRef);
+	},
+
+	create: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+		//	summary:
+		//		Kick off the life-cycle of a widget
+		//	description:
+		//		To understand the process by which widgets are instantiated, it
+		//		is critical to understand what other methods create calls and
+		//		which of them you'll want to override. Of course, adventurous
+		//		developers could override create entirely, but this should
+		//		only be done as a last resort.
+		//
+		//		Below is a list of the methods that are called, in the order
+		//		they are fired, along with notes about what they do and if/when
+		//		you should over-ride them in your widget:
+		//
+		// * postMixInProperties:
+		//	|	* a stub function that you can over-ride to modify
+		//		variables that may have been naively assigned by
+		//		mixInProperties
+		// * widget is added to manager object here
+		// * buildRendering:
+		//	|	* Subclasses use this method to handle all UI initialization
+		//		Sets this.domNode.  Templated widgets do this automatically
+		//		and otherwise it just uses the source dom node.
+		// * postCreate:
+		//	|	* a stub function that you can over-ride to modify take
+		//		actions once the widget has been placed in the UI
+
+		// store pointer to original dom tree
+		this.srcNodeRef = dojo.byId(srcNodeRef);
+
+		// For garbage collection.  An array of handles returned by Widget.connect()
+		// Each handle returned from Widget.connect() is an array of handles from dojo.connect()
+		this._connects=[];
+
+		// _attaches: String[]
+		// 		names of all our dojoAttachPoint variables
+		this._attaches=[];
+
+		//mixin our passed parameters
+		if(this.srcNodeRef && (typeof this.srcNodeRef.id == "string")){ this.id = this.srcNodeRef.id; }
+		if(params){
+			this.params = params;
+			dojo.mixin(this,params);
+		}
+		this.postMixInProperties();
+
+		// generate an id for the widget if one wasn't specified
+		// (be sure to do this before buildRendering() because that function might
+		// expect the id to be there.
+		if(!this.id){
+			this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+		}
+		dijit.registry.add(this);
+
+		this.buildRendering();
+
+		// Copy attributes listed in attributeMap into the [newly created] DOM for the widget.
+		// The placement of these attributes is according to the property mapping in attributeMap.
+		// Note special handling for 'style' and 'class' attributes which are lists and can
+		// have elements from both old and new structures, and some attributes like "type"
+		// cannot be processed this way as they are not mutable.
+		if(this.domNode){
+			for(var attr in this.attributeMap){
+				var value = this[attr];
+				if(typeof value != "object" && ((value !== "" && value !== false) || (params && params[attr]))){
+					this.setAttribute(attr, value);
+				}
+			}
+		}
+
+		if(this.domNode){
+			this.domNode.setAttribute("widgetId", this.id);
+		}
+		this.postCreate();
+
+		// If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC.
+		if(this.srcNodeRef && !this.srcNodeRef.parentNode){
+			delete this.srcNodeRef;
+		}	
+	},
+
+	postMixInProperties: function(){
+		// summary
+		//	Called after the parameters to the widget have been read-in,
+		//	but before the widget template is instantiated.
+		//	Especially useful to set properties that are referenced in the widget template.
+	},
+
+	buildRendering: function(){
+		// summary:
+		//		Construct the UI for this widget, setting this.domNode.
+		//		Most widgets will mixin TemplatedWidget, which overrides this method.
+		this.domNode = this.srcNodeRef || dojo.doc.createElement('div');
+	},
+
+	postCreate: function(){
+		// summary:
+		//		Called after a widget's dom has been setup
+	},
+
+	startup: function(){
+		// summary:
+		//		Called after a widget's children, and other widgets on the page, have been created.
+		//		Provides an opportunity to manipulate any children before they are displayed.
+		//		This is useful for composite widgets that need to control or layout sub-widgets.
+		//		Many layout widgets can use this as a wiring phase.
+		this._started = true;
+	},
+
+	//////////// DESTROY FUNCTIONS ////////////////////////////////
+
+	destroyRecursive: function(/*Boolean*/ finalize){
+		// summary:
+		// 		Destroy this widget and it's descendants. This is the generic
+		// 		"destructor" function that all widget users should call to
+		// 		cleanly discard with a widget. Once a widget is destroyed, it's
+		// 		removed from the manager object.
+		// finalize: Boolean
+		//		is this function being called part of global environment
+		//		tear-down?
+
+		this.destroyDescendants();
+		this.destroy();
+	},
+
+	destroy: function(/*Boolean*/ finalize){
+		// summary:
+		// 		Destroy this widget, but not its descendants
+		// finalize: Boolean
+		//		is this function being called part of global environment
+		//		tear-down?
+
+		this.uninitialize();
+		dojo.forEach(this._connects, function(array){
+			dojo.forEach(array, dojo.disconnect);
+		});
+
+		// destroy widgets created as part of template, etc.
+		dojo.forEach(this._supportingWidgets || [], function(w){ w.destroy(); });
+		
+		this.destroyRendering(finalize);
+		dijit.registry.remove(this.id);
+	},
+
+	destroyRendering: function(/*Boolean*/ finalize){
+		// summary:
+		//		Destroys the DOM nodes associated with this widget
+		// finalize: Boolean
+		//		is this function being called part of global environment
+		//		tear-down?
+
+		if(this.bgIframe){
+			this.bgIframe.destroy();
+			delete this.bgIframe;
+		}
+
+		if(this.domNode){
+			dojo._destroyElement(this.domNode);
+			delete this.domNode;
+		}
+
+		if(this.srcNodeRef){
+			dojo._destroyElement(this.srcNodeRef);
+			delete this.srcNodeRef;
+		}
+	},
+
+	destroyDescendants: function(){
+		// summary:
+		//		Recursively destroy the children of this widget and their
+		//		descendants.
+
+		// TODO: should I destroy in the reverse order, to go bottom up?
+		dojo.forEach(this.getDescendants(), function(widget){ widget.destroy(); });
+	},
+
+	uninitialize: function(){
+		// summary:
+		//		stub function. Override to implement custom widget tear-down
+		//		behavior.
+		return false;
+	},
+
+	////////////////// MISCELLANEOUS METHODS ///////////////////
+
+	onFocus: function(){
+		// summary:
+		//		stub function. Override or connect to this method to receive
+		//		notifications for when the widget moves into focus.
+	},
+
+	onBlur: function(){
+		// summary:
+		//		stub function. Override or connect to this method to receive
+		//		notifications for when the widget moves out of focus.
+	},
+
+	_onFocus: function(e){
+		this.onFocus();
+	},
+
+	_onBlur: function(){
+		this.onBlur();
+	},
+
+	setAttribute: function(/*String*/ attr, /*anything*/ value){
+		// summary
+		//		Set native HTML attributes reflected in the widget,
+		//		such as readOnly, disabled, and maxLength in TextBox widgets.
+		// description
+		//		In general, a widget's "value" is controlled via setValue()/getValue(), 
+		//		rather than this method.  The exception is for widgets where the
+		//		end user can't adjust the value, such as Button and CheckBox;
+		//		in the unusual case that you want to change the value attribute of
+		//		those widgets, use setAttribute().
+		var mapNode = this[this.attributeMap[attr]||'domNode'];
+		this[attr] = value;
+		switch(attr){
+			case "class":
+				dojo.addClass(mapNode, value);
+				break;
+			case "style":
+				if(mapNode.style.cssText){
+					mapNode.style.cssText += "; " + value;// FIXME: Opera
+				}else{
+					mapNode.style.cssText = value;
+				}
+				break;
+			default:
+				if(/^on[A-Z]/.test(attr)){ // eg. onSubmit needs to be onsubmit
+					attr = attr.toLowerCase();
+				}
+				if(typeof value == "function"){ // functions execute in the context of the widget
+					value = dojo.hitch(this, value);
+				}
+				dojo.attr(mapNode, attr, value);
+		}
+	},
+
+	toString: function(){
+		// summary:
+		//		returns a string that represents the widget. When a widget is
+		//		cast to a string, this method will be used to generate the
+		//		output. Currently, it does not implement any sort of reversable
+		//		serialization.
+		return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String
+	},
+
+	getDescendants: function(){
+		// summary:
+		//	Returns all the widgets that contained by this, i.e., all widgets underneath this.containerNode.
+		if(this.containerNode){
+			var list= dojo.query('[widgetId]', this.containerNode);
+			return list.map(dijit.byNode);		// Array
+		}else{
+			return [];
+		}
+	},
+
+//TODOC
+	nodesWithKeyClick: ["input", "button"],
+
+	connect: function(
+			/*Object|null*/ obj,
+			/*String*/ event,
+			/*String|Function*/ method){
+		//	summary:
+		//		Connects specified obj/event to specified method of this object
+		//		and registers for disconnect() on widget destroy.
+		//		Special event: "ondijitclick" triggers on a click or enter-down or space-up
+		//		Similar to dojo.connect() but takes three arguments rather than four.
+		var handles =[];
+		if(event == "ondijitclick"){
+			// add key based click activation for unsupported nodes.
+			if(!this.nodesWithKeyClick[obj.nodeName]){
+				handles.push(dojo.connect(obj, "onkeydown", this,
+					function(e){
+						if(e.keyCode == dojo.keys.ENTER){
+							return (dojo.isString(method))?
+								this[method](e) : method.call(this, e);
+						}else if(e.keyCode == dojo.keys.SPACE){
+							// stop space down as it causes IE to scroll
+							// the browser window
+							dojo.stopEvent(e);
+						}
+			 		}));
+				handles.push(dojo.connect(obj, "onkeyup", this,
+					function(e){
+						if(e.keyCode == dojo.keys.SPACE){
+							return dojo.isString(method) ?
+								this[method](e) : method.call(this, e);
+						}
+			 		}));
+			}
+			event = "onclick";
+		}
+		handles.push(dojo.connect(obj, event, this, method));
+
+		// return handles for FormElement and ComboBox
+		this._connects.push(handles);
+		return handles;
+	},
+
+	disconnect: function(/*Object*/ handles){
+		// summary:
+		//		Disconnects handle created by this.connect.
+		//		Also removes handle from this widget's list of connects
+		for(var i=0; i<this._connects.length; i++){
+			if(this._connects[i]==handles){
+				dojo.forEach(handles, dojo.disconnect);
+				this._connects.splice(i, 1);
+				return;
+			}
+		}
+	},
+
+	isLeftToRight: function(){
+		// summary:
+		//		Checks the DOM to for the text direction for bi-directional support
+		// description:
+		//		This method cannot be used during widget construction because the widget
+		//		must first be connected to the DOM tree.  Parent nodes are searched for the
+		//		'dir' attribute until one is found, otherwise left to right mode is assumed.
+		//		See HTML spec, DIR attribute for more information.
+
+		if(!("_ltr" in this)){
+			this._ltr = dojo.getComputedStyle(this.domNode).direction != "rtl";
+		}
+		return this._ltr; //Boolean
+	},
+
+	isFocusable: function(){
+		// summary:
+		//		Return true if this widget can currently be focused
+		//		and false if not
+		return this.focus && (dojo.style(this.domNode, "display") != "none");
+	}
+});
+
+}
+
+if(!dojo._hasResource["dojo.string"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.string"] = true;
+dojo.provide("dojo.string");
+
+/*=====
+dojo.string = { 
+	// summary: String utilities for Dojo
+};
+=====*/
+
+dojo.string.pad = function(/*String*/text, /*int*/size, /*String?*/ch, /*boolean?*/end){
+	// summary:
+	//		Pad a string to guarantee that it is at least `size` length by
+	//		filling with the character `ch` at either the start or end of the
+	//		string. Pads at the start, by default.
+	// text: the string to pad
+	// size: length to provide padding
+	// ch: character to pad, defaults to '0'
+	// end: adds padding at the end if true, otherwise pads at start
+
+	var out = String(text);
+	if(!ch){
+		ch = '0';
+	}
+	while(out.length < size){
+		if(end){
+			out += ch;
+		}else{
+			out = ch + out;
+		}
+	}
+	return out;	// String
+};
+
+dojo.string.substitute = function(	/*String*/template, 
+									/*Object|Array*/map, 
+									/*Function?*/transform, 
+									/*Object?*/thisObject){
+	// summary:
+	//		Performs parameterized substitutions on a string. Throws an
+	//		exception if any parameter is unmatched.
+	// description:
+	//		For example,
+	//		|	dojo.string.substitute("File '${0}' is not found in directory '${1}'.",["foo.html","/temp"]);
+	//		|	dojo.string.substitute("File '${name}' is not found in directory '${info.dir}'.",
+	//		|		{name: "foo.html", info: {dir: "/temp"}});
+	//		both return
+	//		|	"File 'foo.html' is not found in directory '/temp'."
+	// template: 
+	//		a string with expressions in the form `${key}` to be replaced or
+	//		`${key:format}` which specifies a format function.
+	// map: hash to search for substitutions
+	// transform: 
+	//		a function to process all parameters before substitution takes
+	//		place, e.g. dojo.string.encodeXML
+	// thisObject: 
+	//		where to look for optional format function; default to the global
+	//		namespace
+
+	return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, function(match, key, format){
+		var value = dojo.getObject(key,false,map);
+		if(format){ value = dojo.getObject(format,false,thisObject)(value);}
+		if(transform){ value = transform(value, key); }
+		return value.toString();
+	}); // string
+};
+
+dojo.string.trim = function(/*String*/ str){
+	// summary: trims whitespaces from both sides of the string
+	// description:
+	//	This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript).
+	//	The short yet performant version of this function is 
+	//	dojo.trim(), which is part of Dojo base.
+	str = str.replace(/^\s+/, '');
+	for(var i = str.length - 1; i > 0; i--){
+		if(/\S/.test(str.charAt(i))){
+			str = str.substring(0, i + 1);
+			break;
+		}
+	}
+	return str;	// String
+};
+
+}
+
+if(!dojo._hasResource["dijit._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Templated"] = true;
+dojo.provide("dijit._Templated");
+
+
+
+
+
+dojo.declare("dijit._Templated",
+	null,
+	{
+		//	summary:
+		//		Mixin for widgets that are instantiated from a template
+		// 
+		// templateNode: DomNode
+		//		a node that represents the widget template. Pre-empts both templateString and templatePath.
+		templateNode: null,
+
+		// templateString: String
+		//		a string that represents the widget template. Pre-empts the
+		//		templatePath. In builds that have their strings "interned", the
+		//		templatePath is converted to an inline templateString, thereby
+		//		preventing a synchronous network call.
+		templateString: null,
+
+		// templatePath: String
+		//	Path to template (HTML file) for this widget relative to dojo.baseUrl
+		templatePath: null,
+
+		// widgetsInTemplate: Boolean
+		//		should we parse the template to find widgets that might be
+		//		declared in markup inside it? false by default.
+		widgetsInTemplate: false,
+
+		// containerNode: DomNode
+		//		holds child elements. "containerNode" is generally set via a
+		//		dojoAttachPoint assignment and it designates where children of
+		//		the src dom node will be placed
+		containerNode: null,
+
+		// skipNodeCache: Boolean
+		//		if using a cached widget template node poses issues for a
+		//		particular widget class, it can set this property to ensure
+		//		that its template is always re-built from a string
+		_skipNodeCache: false,
+
+		_stringRepl: function(tmpl){
+			var className = this.declaredClass, _this = this;
+			// Cache contains a string because we need to do property replacement
+			// do the property replacement
+			return dojo.string.substitute(tmpl, this, function(value, key){
+				if(key.charAt(0) == '!'){ value = _this[key.substr(1)]; }
+				if(typeof value == "undefined"){ throw new Error(className+" template:"+key); } // a debugging aide
+				if(!value){ return ""; }
+
+				// Substitution keys beginning with ! will skip the transform step,
+				// in case a user wishes to insert unescaped markup, e.g. ${!foo}
+				return key.charAt(0) == "!" ? value :
+					// Safer substitution, see heading "Attribute values" in
+					// http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2
+					value.toString().replace(/"/g,"&quot;"); //TODO: add &amp? use encodeXML method?
+			}, this);
+		},
+
+		// method over-ride
+		buildRendering: function(){
+			// summary:
+			//		Construct the UI for this widget from a template, setting this.domNode.
+
+			// Lookup cached version of template, and download to cache if it
+			// isn't there already.  Returns either a DomNode or a string, depending on
+			// whether or not the template contains ${foo} replacement parameters.
+			var cached = dijit._Templated.getCachedTemplate(this.templatePath, this.templateString, this._skipNodeCache);
+
+			var node;
+			if(dojo.isString(cached)){
+				node = dijit._Templated._createNodesFromText(this._stringRepl(cached))[0];
+			}else{
+				// if it's a node, all we have to do is clone it
+				node = cached.cloneNode(true);
+			}
+
+			// recurse through the node, looking for, and attaching to, our
+			// attachment points which should be defined on the template node.
+			this._attachTemplateNodes(node);
+
+			var source = this.srcNodeRef;
+			if(source && source.parentNode){
+				source.parentNode.replaceChild(node, source);
+			}
+
+			this.domNode = node;
+			if(this.widgetsInTemplate){
+				var cw = this._supportingWidgets  = dojo.parser.parse(node);
+				this._attachTemplateNodes(cw, function(n,p){
+					return n[p];
+				});
+			}
+
+			this._fillContent(source);
+		},
+
+		_fillContent: function(/*DomNode*/ source){
+			// summary:
+			//		relocate source contents to templated container node
+			//		this.containerNode must be able to receive children, or exceptions will be thrown
+			var dest = this.containerNode;
+			if(source && dest){
+				while(source.hasChildNodes()){
+					dest.appendChild(source.firstChild);
+				}
+			}
+		},
+
+		_attachTemplateNodes: function(rootNode, getAttrFunc){
+			// summary: Iterate through the template and attach functions and nodes accordingly.	
+			// description:		
+			//		Map widget properties and functions to the handlers specified in
+			//		the dom node and it's descendants. This function iterates over all
+			//		nodes and looks for these properties:
+			//			* dojoAttachPoint
+			//			* dojoAttachEvent	
+			//			* waiRole
+			//			* waiState
+			// rootNode: DomNode|Array[Widgets]
+			//		the node to search for properties. All children will be searched.
+			// getAttrFunc: function?
+			//		a function which will be used to obtain property for a given
+			//		DomNode/Widget
+
+			getAttrFunc = getAttrFunc || function(n,p){ return n.getAttribute(p); };
+
+			var nodes = dojo.isArray(rootNode) ? rootNode : (rootNode.all || rootNode.getElementsByTagName("*"));
+			var x=dojo.isArray(rootNode)?0:-1;
+			for(; x<nodes.length; x++){
+				var baseNode = (x == -1) ? rootNode : nodes[x];
+				if(this.widgetsInTemplate && getAttrFunc(baseNode,'dojoType')){
+					continue;
+				}
+				// Process dojoAttachPoint
+				var attachPoint = getAttrFunc(baseNode, "dojoAttachPoint");
+				if(attachPoint){
+					var point, points = attachPoint.split(/\s*,\s*/);
+					while((point = points.shift())){
+						if(dojo.isArray(this[point])){
+							this[point].push(baseNode);
+						}else{
+							this[point]=baseNode;
+						}
+					}
+				}
+
+				// Process dojoAttachEvent
+				var attachEvent = getAttrFunc(baseNode, "dojoAttachEvent");
+				if(attachEvent){
+					// NOTE: we want to support attributes that have the form
+					// "domEvent: nativeEvent; ..."
+					var event, events = attachEvent.split(/\s*,\s*/);
+					var trim = dojo.trim;
+					while((event = events.shift())){
+						if(event){
+							var thisFunc = null;
+							if(event.indexOf(":") != -1){
+								// oh, if only JS had tuple assignment
+								var funcNameArr = event.split(":");
+								event = trim(funcNameArr[0]);
+								thisFunc = trim(funcNameArr[1]);
+							}else{
+								event = trim(event);
+							}
+							if(!thisFunc){
+								thisFunc = event;
+							}
+							this.connect(baseNode, event, thisFunc);
+						}
+					}
+				}
+
+				// waiRole, waiState
+				var role = getAttrFunc(baseNode, "waiRole");
+				if(role){
+					dijit.setWaiRole(baseNode, role);
+				}
+				var values = getAttrFunc(baseNode, "waiState");
+				if(values){
+					dojo.forEach(values.split(/\s*,\s*/), function(stateValue){
+						if(stateValue.indexOf('-') != -1){
+							var pair = stateValue.split('-');
+							dijit.setWaiState(baseNode, pair[0], pair[1]);
+						}
+					});
+				}
+
+			}
+		}
+	}
+);
+
+// key is either templatePath or templateString; object is either string or DOM tree
+dijit._Templated._templateCache = {};
+
+dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwaysUseString){
+	// summary:
+	//		Static method to get a template based on the templatePath or
+	//		templateString key
+	// templatePath: String
+	//		The URL to get the template from. dojo.uri.Uri is often passed as well.
+	// templateString: String?
+	//		a string to use in lieu of fetching the template from a URL. Takes precedence
+	//		over templatePath
+	// Returns: Mixed
+	//	Either string (if there are ${} variables that need to be replaced) or just
+	//	a DOM tree (if the node can be cloned directly)
+
+	// is it already cached?
+	var tmplts = dijit._Templated._templateCache;
+	var key = templateString || templatePath;
+	var cached = tmplts[key];
+	if(cached){
+		return cached;
+	}
+
+	// If necessary, load template string from template path
+	if(!templateString){
+		templateString = dijit._Templated._sanitizeTemplateString(dojo._getText(templatePath));
+	}
+
+	templateString = dojo.string.trim(templateString);
+
+	if(alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g)){
+		// there are variables in the template so all we can do is cache the string
+		return (tmplts[key] = templateString); //String
+	}else{
+		// there are no variables in the template so we can cache the DOM tree
+		return (tmplts[key] = dijit._Templated._createNodesFromText(templateString)[0]); //Node
+	}
+};
+
+dijit._Templated._sanitizeTemplateString = function(/*String*/tString){
+	// summary: 
+	//		Strips <?xml ...?> declarations so that external SVG and XML
+	// 		documents can be added to a document without worry. Also, if the string
+	//		is an HTML document, only the part inside the body tag is returned.
+	if(tString){
+		tString = tString.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+		var matches = tString.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+		if(matches){
+			tString = matches[1];
+		}
+	}else{
+		tString = "";
+	}
+	return tString; //String
+};
+
+
+if(dojo.isIE){
+	dojo.addOnUnload(function(){
+		var cache = dijit._Templated._templateCache;
+		for(var key in cache){
+			var value = cache[key];
+			if(!isNaN(value.nodeType)){ // isNode equivalent
+				dojo._destroyElement(value);
+			}
+			delete cache[key];
+		}
+	});
+}
+
+(function(){
+	var tagMap = {
+		cell: {re: /^<t[dh][\s\r\n>]/i, pre: "<table><tbody><tr>", post: "</tr></tbody></table>"},
+		row: {re: /^<tr[\s\r\n>]/i, pre: "<table><tbody>", post: "</tbody></table>"},
+		section: {re: /^<(thead|tbody|tfoot)[\s\r\n>]/i, pre: "<table>", post: "</table>"}
+	};
+
+	// dummy container node used temporarily to hold nodes being created
+	var tn;
+
+	dijit._Templated._createNodesFromText = function(/*String*/text){
+		// summary:
+		//	Attempts to create a set of nodes based on the structure of the passed text.
+
+		if(!tn){
+			tn = dojo.doc.createElement("div");
+			tn.style.display="none";
+			dojo.body().appendChild(tn);
+		}
+		var tableType = "none";
+		var rtext = text.replace(/^\s+/, "");
+		for(var type in tagMap){
+			var map = tagMap[type];
+			if(map.re.test(rtext)){
+				tableType = type;
+				text = map.pre + text + map.post;
+				break;
+			}
+		}
+
+		tn.innerHTML = text;
+		if(tn.normalize){
+			tn.normalize();
+		}
+
+		var tag = { cell: "tr", row: "tbody", section: "table" }[tableType];
+		var _parent = (typeof tag != "undefined") ?
+						tn.getElementsByTagName(tag)[0] :
+						tn;
+
+		var nodes = [];
+		while(_parent.firstChild){
+			nodes.push(_parent.removeChild(_parent.firstChild));
+		}
+		tn.innerHTML="";
+		return nodes;	//	Array
+	}
+})();
+
+// These arguments can be specified for widgets which are used in templates.
+// Since any widget can be specified as sub widgets in template, mix it
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget,{
+	dojoAttachEvent: "",
+	dojoAttachPoint: "",
+	waiRole: "",
+	waiState:""
+})
+
+}
+
+if(!dojo._hasResource["dijit._Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Container"] = true;
+dojo.provide("dijit._Container");
+
+dojo.declare("dijit._Contained",
+	null,
+	{
+		// summary
+		//		Mixin for widgets that are children of a container widget
+		//
+		// example:
+		// | 	// make a basic custom widget that knows about it's parents
+		// |	dojo.declare("my.customClass",[dijit._Widget,dijit._Contained],{});
+		// 
+		getParent: function(){
+			// summary:
+			//		Returns the parent widget of this widget, assuming the parent
+			//		implements dijit._Container
+			for(var p=this.domNode.parentNode; p; p=p.parentNode){
+				var id = p.getAttribute && p.getAttribute("widgetId");
+				if(id){
+					var parent = dijit.byId(id);
+					return parent.isContainer ? parent : null;
+				}
+			}
+			return null;
+		},
+
+		_getSibling: function(which){
+			var node = this.domNode;
+			do{
+				node = node[which+"Sibling"];
+			}while(node && node.nodeType != 1);
+			if(!node){ return null; } // null
+			var id = node.getAttribute("widgetId");
+			return dijit.byId(id);
+		},
+
+		getPreviousSibling: function(){
+			// summary:
+			//		Returns null if this is the first child of the parent,
+			//		otherwise returns the next element sibling to the "left".
+
+			return this._getSibling("previous"); // Mixed
+		},
+
+		getNextSibling: function(){
+			// summary:
+			//		Returns null if this is the last child of the parent,
+			//		otherwise returns the next element sibling to the "right".
+
+			return this._getSibling("next"); // Mixed
+		}
+	}
+);
+
+dojo.declare("dijit._Container",
+	null,
+	{
+		// summary:
+		//		Mixin for widgets that contain a list of children.
+		// description:
+		//		Use this mixin when the widget needs to know about and
+		//		keep track of it's widget children. Widgets like SplitContainer
+		//		and TabContainer.  
+
+		isContainer: true,
+
+		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+			// summary:
+			//		Process the given child widget, inserting it's dom node as
+			//		a child of our dom node
+
+			if(insertIndex === undefined){
+				insertIndex = "last";
+			}
+			var refNode = this.containerNode || this.domNode;
+			if(insertIndex && typeof insertIndex == "number"){
+				var children = dojo.query("> [widgetid]", refNode);
+				if(children && children.length >= insertIndex){
+					refNode = children[insertIndex-1]; insertIndex = "after";
+				}
+			}
+			dojo.place(widget.domNode, refNode, insertIndex);
+
+			// If I've been started but the child widget hasn't been started,
+			// start it now.  Make sure to do this after widget has been
+			// inserted into the DOM tree, so it can see that it's being controlled by me,
+			// so it doesn't try to size itself.
+			if(this._started && !widget._started){
+				widget.startup();
+			}
+		},
+
+		removeChild: function(/*Widget*/ widget){
+			// summary:
+			//		Removes the passed widget instance from this widget but does
+			//		not destroy it
+			var node = widget.domNode;
+			node.parentNode.removeChild(node);	// detach but don't destroy
+		},
+
+		_nextElement: function(node){
+			do{
+				node = node.nextSibling;
+			}while(node && node.nodeType != 1);
+			return node;
+		},
+
+		_firstElement: function(node){
+			node = node.firstChild;
+			if(node && node.nodeType != 1){
+				node = this._nextElement(node);
+			}
+			return node;
+		},
+
+		getChildren: function(){
+			// summary:
+			//		Returns array of children widgets
+			return dojo.query("> [widgetId]", this.containerNode || this.domNode).map(dijit.byNode); // Array
+		},
+
+		hasChildren: function(){
+			// summary:
+			//		Returns true if widget has children
+			var cn = this.containerNode || this.domNode;
+			return !!this._firstElement(cn); // Boolean
+		},
+
+		_getSiblingOfChild: function(/*Widget*/ child, /*int*/ dir){
+			// summary:
+			//		Get the next or previous widget sibling of child
+			// dir:
+			//		if 1, get the next sibling
+			//		if -1, get the previous sibling
+			var node = child.domNode;
+			var which = (dir>0 ? "nextSibling" : "previousSibling");
+			do{
+				node = node[which];
+			}while(node && (node.nodeType != 1 || !dijit.byNode(node)));
+			return node ? dijit.byNode(node) : null;
+		}
+	}
+);
+
+dojo.declare("dijit._KeyNavContainer",
+	[dijit._Container],
+	{
+
+		// summary: A _Container with keyboard navigation of its children.
+		// decscription:
+		//		To use this mixin, call connectKeyNavHandlers() in
+		//		postCreate() and call startupKeyNavChildren() in startup().
+		//		It provides normalized keyboard and focusing code for Container
+		//		widgets.
+/*=====
+		// focusedChild: Widget
+		//		The currently focused child widget, or null if there isn't one
+		focusedChild: null,
+=====*/
+
+		_keyNavCodes: {},
+
+		connectKeyNavHandlers: function(/*Array*/ prevKeyCodes, /*Array*/ nextKeyCodes){
+			// summary:
+			//		Call in postCreate() to attach the keyboard handlers
+			//		to the container.
+			// preKeyCodes: Array
+			//		Key codes for navigating to the previous child.
+			// nextKeyCodes: Array
+			//		Key codes for navigating to the next child.
+
+			var keyCodes = this._keyNavCodes = {};
+			var prev = dojo.hitch(this, this.focusPrev);
+			var next = dojo.hitch(this, this.focusNext);
+			dojo.forEach(prevKeyCodes, function(code){ keyCodes[code] = prev });
+			dojo.forEach(nextKeyCodes, function(code){ keyCodes[code] = next });
+			this.connect(this.domNode, "onkeypress", "_onContainerKeypress");
+			this.connect(this.domNode, "onfocus", "_onContainerFocus");
+		},
+
+		startupKeyNavChildren: function(){
+			// summary:
+			//		Call in startup() to set child tabindexes to -1
+			dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
+		},
+
+		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+			// summary: Add a child to our _Container
+			dijit._KeyNavContainer.superclass.addChild.apply(this, arguments);
+			this._startupChild(widget);
+		},
+
+		focus: function(){
+			// summary: Default focus() implementation: focus the first child.
+			this.focusFirstChild();
+		},
+
+		focusFirstChild: function(){
+			// summary: Focus the first focusable child in the container.
+			this.focusChild(this._getFirstFocusableChild());
+		},
+
+		focusNext: function(){
+			// summary: Focus the next widget or focal node (for widgets
+			//		with multiple focal nodes) within this container.
+			if(this.focusedChild && this.focusedChild.hasNextFocalNode
+					&& this.focusedChild.hasNextFocalNode()){
+				this.focusedChild.focusNext();
+				return;
+			}
+			var child = this._getNextFocusableChild(this.focusedChild, 1);
+			if(child.getFocalNodes){
+				this.focusChild(child, child.getFocalNodes()[0]);
+			}else{
+				this.focusChild(child);
+			}
+		},
+
+		focusPrev: function(){
+			// summary: Focus the previous widget or focal node (for widgets
+			//		with multiple focal nodes) within this container.
+			if(this.focusedChild && this.focusedChild.hasPrevFocalNode
+					&& this.focusedChild.hasPrevFocalNode()){
+				this.focusedChild.focusPrev();
+				return;
+			}
+			var child = this._getNextFocusableChild(this.focusedChild, -1);
+			if(child.getFocalNodes){
+				var nodes = child.getFocalNodes();
+				this.focusChild(child, nodes[nodes.length-1]);
+			}else{
+				this.focusChild(child);
+			}
+		},
+
+		focusChild: function(/*Widget*/ widget, /*Node?*/ node){
+			// summary: Focus widget. Optionally focus 'node' within widget.
+			if(widget){
+				if(this.focusedChild && widget !== this.focusedChild){
+					this._onChildBlur(this.focusedChild);
+				}
+				this.focusedChild = widget;
+				if(node && widget.focusFocalNode){
+					widget.focusFocalNode(node);
+				}else{
+					widget.focus();
+				}
+			}
+		},
+
+		_startupChild: function(/*Widget*/ widget){
+			// summary:
+			//		Set tabindex="-1" on focusable widgets so that we
+			// 		can focus them programmatically and by clicking.
+			//		Connect focus and blur handlers.
+			if(widget.getFocalNodes){
+				dojo.forEach(widget.getFocalNodes(), function(node){
+					dojo.attr(node, "tabindex", -1);
+					this._connectNode(node);
+				}, this);
+			}else{
+				var node = widget.focusNode || widget.domNode;
+				if(widget.isFocusable()){
+					dojo.attr(node, "tabindex", -1);
+				}
+				this._connectNode(node);
+			}
+		},
+
+		_connectNode: function(/*Element*/ node){
+			this.connect(node, "onfocus", "_onNodeFocus");
+			this.connect(node, "onblur", "_onNodeBlur");
+		},
+
+		_onContainerFocus: function(evt){
+			// focus bubbles on Firefox,
+			// so just make sure that focus has really gone to the container
+			if(evt.target === this.domNode){
+				this.focusFirstChild();
+			}
+		},
+
+		_onContainerKeypress: function(evt){
+			if(evt.ctrlKey || evt.altKey){ return; }
+			var func = this._keyNavCodes[evt.keyCode];
+			if(func){
+				func();
+				dojo.stopEvent(evt);
+			}
+		},
+
+		_onNodeFocus: function(evt){
+			// while focus is on a child,
+			// take the container out of the tab order so that
+			// we can shift-tab to the element before the container
+			dojo.attr(this.domNode, "tabindex", -1);
+			// record the child that has been focused
+			var widget = dijit.getEnclosingWidget(evt.target);
+			if(widget && widget.isFocusable()){
+				this.focusedChild = widget;
+			}
+			dojo.stopEvent(evt);
+		},
+
+		_onNodeBlur: function(evt){
+			// when focus leaves a child,
+			// reinstate the container's tabindex
+			if(this.tabIndex){
+				dojo.attr(this.domNode, "tabindex", this.tabIndex);
+			}
+			dojo.stopEvent(evt);
+		},
+
+		_onChildBlur: function(/*Widget*/ widget){
+			// summary:
+			//		Called when focus leaves a child widget to go
+			//		to a sibling widget.
+		},
+
+		_getFirstFocusableChild: function(){
+			return this._getNextFocusableChild(null, 1);
+		},
+
+		_getNextFocusableChild: function(child, dir){
+			if(child){
+				child = this._getSiblingOfChild(child, dir);
+			}
+			var children = this.getChildren();
+			for(var i=0; i < children.length; i++){
+				if(!child){
+					child = children[(dir>0) ? 0 : (children.length-1)];
+				}
+				if(child.isFocusable()){
+					return child;
+				}
+				child = this._getSiblingOfChild(child, dir);
+			}
+			// no focusable child found
+			return null;
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.layout._LayoutWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout._LayoutWidget"] = true;
+dojo.provide("dijit.layout._LayoutWidget");
+
+
+
+
+dojo.declare("dijit.layout._LayoutWidget",
+	[dijit._Widget, dijit._Container, dijit._Contained],
+	{
+		// summary
+		//		Mixin for widgets that contain a list of children like SplitContainer.
+		//		Widgets which mixin this code must define layout() to lay out the children
+
+		isLayoutContainer: true,
+
+		postCreate: function(){
+			dojo.addClass(this.domNode, "dijitContainer");
+		},
+
+		startup: function(){
+			// summary:
+			//		Called after all the widgets have been instantiated and their
+			//		dom nodes have been inserted somewhere under dojo.doc.body.
+			//
+			//		Widgets should override this method to do any initialization
+			//		dependent on other widgets existing, and then call
+			//		this superclass method to finish things off.
+			//
+			//		startup() in subclasses shouldn't do anything
+			//		size related because the size of the widget hasn't been set yet.
+
+			if(this._started){ return; }
+
+			dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+
+			// If I am a top level widget
+			if(!this.getParent || !this.getParent()){
+				// Do recursive sizing and layout of all my descendants
+				// (passing in no argument to resize means that it has to glean the size itself)
+				this.resize();
+
+				// since my parent isn't a layout container, and my style is width=height=100% (or something similar),
+				// then I need to watch when the window resizes, and size myself accordingly
+				// (passing in no argument to resize means that it has to glean the size itself)
+				this.connect(window, 'onresize', function(){this.resize();});
+			}
+			
+			this.inherited(arguments);
+		},
+
+		resize: function(args){
+			// summary:
+			//		Explicitly set this widget's size (in pixels),
+			//		and then call layout() to resize contents (and maybe adjust child widgets)
+			//	
+			// args: Object?
+			//		{w: int, h: int, l: int, t: int}
+
+			var node = this.domNode;
+
+			// set margin box size, unless it wasn't specified, in which case use current size
+			if(args){
+				dojo.marginBox(node, args);
+
+				// set offset of the node
+				if(args.t){ node.style.top = args.t + "px"; }
+				if(args.l){ node.style.left = args.l + "px"; }
+			}
+			// If either height or width wasn't specified by the user, then query node for it.
+			// But note that setting the margin box and then immediately querying dimensions may return
+			// inaccurate results, so try not to depend on it.
+			var mb = dojo.mixin(dojo.marginBox(node), args||{});
+
+//			console.log(this, ": setting size to ", mb);
+
+			// Save the size of my content box.
+			this._contentBox = dijit.layout.marginBox2contentBox(node, mb);
+
+			// Callback for widget to adjust size of it's children
+			this.layout();
+		},
+
+		layout: function(){
+			//	summary
+			//		Widgets override this method to size & position their contents/children.
+			//		When this is called this._contentBox is guaranteed to be set (see resize()).
+			//
+			//		This is called after startup(), and also when the widget's size has been
+			//		changed.
+		}
+	}
+);
+
+dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
+	// summary:
+	//		Given the margin-box size of a node, return it's content box size.
+	//		Functions like dojo.contentBox() but is more reliable since it doesn't have
+	//		to wait for the browser to compute sizes.
+	var cs = dojo.getComputedStyle(node);
+	var me=dojo._getMarginExtents(node, cs);
+	var pb=dojo._getPadBorderExtents(node, cs);
+	return {
+		l: dojo._toPixelValue(node, cs.paddingLeft),
+		t: dojo._toPixelValue(node, cs.paddingTop),
+		w: mb.w - (me.w + pb.w),
+		h: mb.h - (me.h + pb.h)
+	};
+};
+
+(function(){
+	var capitalize = function(word){
+		return word.substring(0,1).toUpperCase() + word.substring(1);
+	};
+
+	var size = function(widget, dim){
+		// size the child
+		widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
+
+		// record child's size, but favor our own numbers when we have them.
+		// the browser lies sometimes
+		dojo.mixin(widget, dojo.marginBox(widget.domNode));
+		dojo.mixin(widget, dim);
+	};
+
+	dijit.layout.layoutChildren = function(/*DomNode*/ container, /*Object*/ dim, /*Object[]*/ children){
+		/**
+		 * summary
+		 *		Layout a bunch of child dom nodes within a parent dom node
+		 * container:
+		 *		parent node
+		 * dim:
+		 *		{l, t, w, h} object specifying dimensions of container into which to place children
+		 * children:
+		 *		an array like [ {domNode: foo, layoutAlign: "bottom" }, {domNode: bar, layoutAlign: "client"} ]
+		 */
+
+		// copy dim because we are going to modify it
+		dim = dojo.mixin({}, dim);
+
+		dojo.addClass(container, "dijitLayoutContainer");
+
+		// Move "client" elements to the end of the array for layout.  a11y dictates that the author
+		// needs to be able to put them in the document in tab-order, but this algorithm requires that
+		// client be last.
+		children = dojo.filter(children, function(item){ return item.layoutAlign != "client"; })
+			.concat(dojo.filter(children, function(item){ return item.layoutAlign == "client"; }));
+
+		// set positions/sizes
+		dojo.forEach(children, function(child){
+			var elm = child.domNode,
+				pos = child.layoutAlign;
+
+			// set elem to upper left corner of unused space; may move it later
+			var elmStyle = elm.style;
+			elmStyle.left = dim.l+"px";
+			elmStyle.top = dim.t+"px";
+			elmStyle.bottom = elmStyle.right = "auto";
+
+			dojo.addClass(elm, "dijitAlign" + capitalize(pos));
+
+			// set size && adjust record of remaining space.
+			// note that setting the width of a <div> may affect it's height.
+			if(pos=="top" || pos=="bottom"){
+				size(child, { w: dim.w });
+				dim.h -= child.h;
+				if(pos=="top"){
+					dim.t += child.h;
+				}else{
+					elmStyle.top = dim.t + dim.h + "px";
+				}
+			}else if(pos=="left" || pos=="right"){
+				size(child, { h: dim.h });
+				dim.w -= child.w;
+				if(pos=="left"){
+					dim.l += child.w;
+				}else{
+					elmStyle.left = dim.l + dim.w + "px";
+				}
+			}else if(pos=="client"){
+				size(child, dim);
+			}
+		});
+	};
+
+})();
+
+}
+
+if(!dojo._hasResource["dijit.form._FormWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form._FormWidget"] = true;
+dojo.provide("dijit.form._FormWidget");
+
+
+
+
+dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
+{
+	/*
+	Summary:
+		_FormWidget's correspond to native HTML elements such as <checkbox> or <button>.
+		Each _FormWidget represents a single HTML element.
+
+		All these widgets should have these attributes just like native HTML input elements.
+		You can set them during widget construction.
+
+		They also share some common methods.
+	*/
+
+	// baseClass: String
+	//		Root CSS class of the widget (ex: dijitTextBox), used to add CSS classes of widget
+	//		(ex: "dijitTextBox dijitTextBoxInvalid dijitTextBoxFocused dijitTextBoxInvalidFocused")
+	//		See _setStateClass().
+	baseClass: "",
+
+	// name: String
+	//		Name used when submitting form; same as "name" attribute or plain HTML elements
+	name: "",
+
+	// alt: String
+	//		Corresponds to the native HTML <input> element's attribute.
+	alt: "",
+
+	// value: String
+	//		Corresponds to the native HTML <input> element's attribute.
+	value: "",
+
+	// type: String
+	//		Corresponds to the native HTML <input> element's attribute.
+	type: "text",
+
+	// tabIndex: Integer
+	//		Order fields are traversed when user hits the tab key
+	tabIndex: "0",
+
+	// disabled: Boolean
+	//		Should this widget respond to user input?
+	//		In markup, this is specified as "disabled='disabled'", or just "disabled".
+	disabled: false,
+
+	// readOnly: Boolean
+	//		Should this widget respond to user input?
+	//		In markup, this is specified as "readOnly".
+	//		Similar to disabled except readOnly form values are submitted
+	readOnly: false,
+
+	// intermediateChanges: Boolean
+	//		Fires onChange for each value change or only on demand
+	intermediateChanges: false,
+
+	// These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are.
+	// Don't attempt to mixin the 'type', 'name' attributes here programatically -- they must be declared
+	// directly in the template as read by the parser in order to function. IE is known to specifically 
+	// require the 'name' attribute at element creation time.
+	attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+		{value:"focusNode", disabled:"focusNode", readOnly:"focusNode", id:"focusNode", tabIndex:"focusNode", alt:"focusNode"}),
+
+	setAttribute: function(/*String*/ attr, /*anything*/ value){
+		this.inherited(arguments);
+		switch(attr){
+			case "disabled":
+				var tabIndexNode = this[this.attributeMap['tabIndex']||'domNode'];
+				if(value){
+					//reset those, because after the domNode is disabled, we can no longer receive
+					//mouse related events, see #4200
+					this._hovering = false;
+					this._active = false;
+					// remove the tabIndex, especially for FF
+					tabIndexNode.removeAttribute('tabIndex');
+				}else{
+					tabIndexNode.setAttribute('tabIndex', this.tabIndex);
+				}
+				dijit.setWaiState(this[this.attributeMap['disabled']||'domNode'], "disabled", value);
+				this._setStateClass();
+		}
+	},
+
+	setDisabled: function(/*Boolean*/ disabled){
+		// summary:
+		//		Set disabled state of widget (Deprecated).
+		dojo.deprecated("setDisabled("+disabled+") is deprecated. Use setAttribute('disabled',"+disabled+") instead.", "", "2.0");
+		this.setAttribute('disabled', disabled);
+	},
+
+
+	_onMouse : function(/*Event*/ event){
+		// summary:
+		//	Sets _hovering, _active, and stateModifier properties depending on mouse state,
+		//	then calls setStateClass() to set appropriate CSS classes for this.domNode.
+		//
+		//	To get a different CSS class for hover, send onmouseover and onmouseout events to this method.
+		//	To get a different CSS class while mouse button is depressed, send onmousedown to this method.
+
+		var mouseNode = event.currentTarget;
+		if(mouseNode && mouseNode.getAttribute){
+			this.stateModifier = mouseNode.getAttribute("stateModifier") || "";
+		}
+
+		if(!this.disabled){
+			switch(event.type){
+				case "mouseenter":	
+				case "mouseover":
+					this._hovering = true;
+					this._active = this._mouseDown;
+					break;
+
+				case "mouseout":
+				case "mouseleave":
+					this._hovering = false;
+					this._active = false;
+					break;
+
+				case "mousedown" :
+					this._active = true;
+					this._mouseDown = true;
+					// set a global event to handle mouseup, so it fires properly
+					//	even if the cursor leaves the button
+					var mouseUpConnector = this.connect(dojo.body(), "onmouseup", function(){
+						this._active = false;
+						this._mouseDown = false;
+						this._setStateClass();
+						this.disconnect(mouseUpConnector);
+					});
+					if(this.isFocusable()){ this.focus(); }
+					break;
+			}
+			this._setStateClass();
+		}
+	},
+
+	isFocusable: function(){
+		return !this.disabled && !this.readOnly && this.focusNode && (dojo.style(this.domNode, "display") != "none");
+	},
+
+	focus: function(){
+		setTimeout(dojo.hitch(this, dijit.focus, this.focusNode), 0); // cannot call focus() from an event handler directly
+	},
+
+	_setStateClass: function(){
+		// summary
+		//	Update the visual state of the widget by setting the css classes on this.domNode
+		//  (or this.stateNode if defined) by combining this.baseClass with
+		//	various suffixes that represent the current widget state(s).
+		//
+		//	In the case where a widget has multiple
+		//	states, it sets the class based on all possible
+		//  combinations.  For example, an invalid form widget that is being hovered
+		//	will be "dijitInput dijitInputInvalid dijitInputHover dijitInputInvalidHover".
+		//
+		//	For complex widgets with multiple regions, there can be various hover/active states,
+		//	such as "Hover" or "CloseButtonHover" (for tab buttons).
+		//	This is controlled by a stateModifier="CloseButton" attribute on the close button node.
+		//
+		//	The widget may have one or more of the following states, determined
+		//	by this.state, this.checked, this.valid, and this.selected:
+		//		Error - ValidationTextBox sets this.state to "Error" if the current input value is invalid
+		//		Checked - ex: a checkmark or a ToggleButton in a checked state, will have this.checked==true
+		//		Selected - ex: currently selected tab will have this.selected==true
+		//
+		//	In addition, it may have one or more of the following states,
+		//	based on this.disabled and flags set in _onMouse (this._active, this._hovering, this._focused):
+		//		Disabled	- if the widget is disabled
+		//		Active		- if the mouse (or space/enter key?) is being pressed down
+		//		Focused		- if the widget has focus
+		//		Hover		- if the mouse is over the widget
+
+		// Get original (non state related, non baseClass related) class specified in template
+		if(!("staticClass" in this)){
+			this.staticClass = (this.stateNode||this.domNode).className;
+		}
+
+		// Compute new set of classes
+		var classes = [ this.baseClass ];
+
+		function multiply(modifier){
+			classes=classes.concat(dojo.map(classes, function(c){ return c+modifier; }), "dijit"+modifier);
+		}
+
+		if(this.checked){
+			multiply("Checked");
+		}
+		if(this.state){
+			multiply(this.state);
+		}
+		if(this.selected){
+			multiply("Selected");
+		}
+
+		if(this.disabled){
+			multiply("Disabled");
+		}else if(this.readOnly){
+			multiply("ReadOnly");
+		}else if(this._active){
+			multiply(this.stateModifier+"Active");
+		}else{
+			if(this._focused){
+				multiply("Focused");
+			}
+			if(this._hovering){
+				multiply(this.stateModifier+"Hover");
+			}
+		}
+
+		(this.stateNode || this.domNode).className = this.staticClass + " " + classes.join(" ");
+	},
+
+	onChange: function(newValue){
+		// summary: callback when value is changed
+	},
+
+	_onChangeMonitor: 'value',
+	_onChangeActive: false,
+
+	_handleOnChange: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+		// summary: set the value of the widget.
+		this._lastValue = newValue;
+		if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){
+			this._resetValue = this._lastValueReported = newValue;
+		}
+		if((this.intermediateChanges || priorityChange || priorityChange === undefined) && 
+			((newValue && newValue.toString)?newValue.toString():newValue) !== ((this._lastValueReported && this._lastValueReported.toString)?this._lastValueReported.toString():this._lastValueReported)){
+			this._lastValueReported = newValue;
+			if(this._onChangeActive){ this.onChange(newValue); }
+		}
+	},
+
+	reset: function(){
+		this._hasBeenBlurred = false;
+		if(this.setValue && !this._getValueDeprecated){
+			this.setValue(this._resetValue, true);
+		}else if(this._onChangeMonitor){
+			this.setAttribute(this._onChangeMonitor, (this._resetValue !== undefined && this._resetValue !== null)? this._resetValue : '');
+		}
+	},
+
+	create: function(){
+		this.inherited(arguments);
+		this._onChangeActive = true;
+		this._setStateClass();
+	},
+	
+	destroy: function(){
+		if(this._layoutHackHandle){
+			clearTimeout(this._layoutHackHandle);
+		}
+		this.inherited(arguments);
+	},
+
+	setValue: function(/*String*/ value){
+		dojo.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated.  Use setAttribute('value',"+value+") instead.", "", "2.0");
+		this.setAttribute('value', value);
+	},
+
+	_getValueDeprecated: true, // Form uses this, remove when getValue is removed
+	getValue: function(){
+		dojo.deprecated("dijit.form._FormWidget:getValue() is deprecated.  Use widget.value instead.", "", "2.0");
+		return this.value;
+	},
+
+	_layoutHack: function(){
+		// summary: work around table sizing bugs on FF2 by forcing redraw
+		if(dojo.isFF == 2){
+			var node=this.domNode;
+			var old = node.style.opacity;
+			node.style.opacity = "0.999";
+			this._layoutHackHandle = setTimeout(dojo.hitch(this, function(){
+				this._layoutHackHandle = null;
+				node.style.opacity = old;
+			}), 0);
+		}
+	}
+});
+
+dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
+{
+	/*
+	Summary:
+		_FormValueWidget's correspond to native HTML elements such as <input> or <select> that have user changeable values.
+		Each _ValueWidget represents a single input value, and has a (possibly hidden) <input> element,
+		to which it serializes its input value, so that form submission (either normal submission or via FormBind?)
+		works as expected.
+	*/
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+		{value:""}),
+
+	postCreate: function(){
+		this.setValue(this.value, null);
+	},
+
+	setValue: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+		// summary: set the value of the widget.
+		this.value = newValue;
+		this._handleOnChange(newValue, priorityChange);
+	},
+
+	_getValueDeprecated: false, // remove when _FormWidget:getValue is removed
+	getValue: function(){
+		// summary: get the value of the widget.
+		return this._lastValue;
+	},
+
+	undo: function(){
+		// summary: restore the value to the last value passed to onChange
+		this.setValue(this._lastValueReported, false);
+	},
+
+	_valueChanged: function(){
+		var v = this.getValue();
+		var lv = this._lastValueReported;
+		// Equality comparison of objects such as dates are done by reference so
+		// two distinct objects are != even if they have the same data. So use
+		// toStrings in case the values are objects.
+		return ((v !== null && (v !== undefined) && v.toString)?v.toString():'') !== ((lv !== null && (lv !== undefined) && lv.toString)?lv.toString():'');
+	},
+
+	_onKeyPress: function(e){
+		if(e.keyCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+			if(this._valueChanged()){
+				this.undo();
+				dojo.stopEvent(e);
+				return false;
+			}
+		}
+		return true;
+	}
+});
+
+}
+
+if(!dojo._hasResource["dijit.dijit"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.dijit"] = true;
+dojo.provide("dijit.dijit");
+
+/*=====
+dijit.dijit = {
+	// summary: A roll-up for common dijit methods
+	// description:
+	//	A rollup file for the build system including the core and common
+	//	dijit files.
+	//	
+	// example:
+	// | <script type="text/javascript" src="js/dojo/dijit/dijit.js"></script>
+	//
+};
+=====*/
+
+// All the stuff in _base (these are the function that are guaranteed available without an explicit dojo.require)
+
+
+// And some other stuff that we tend to pull in all the time anyway
+
+
+
+
+
+
+
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/Button.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/Button.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/Button.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,425 @@
+if(!dojo._hasResource["dijit.form.Button"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Button"] = true;
+dojo.provide("dijit.form.Button");
+
+dojo.require("dijit.form._FormWidget");
+dojo.require("dijit._Container");
+
+dojo.declare("dijit.form.Button",
+	dijit.form._FormWidget,
+	{
+	// summary:
+	//	Basically the same thing as a normal HTML button, but with special styling.
+	//
+	// example:
+	// |	<button dojoType="dijit.form.Button" onClick="...">Hello world</button>
+	// 
+	// example:
+	// |	var button1 = new dijit.form.Button({label: "hello world", onClick: foo});
+	// |	dojo.body().appendChild(button1.domNode);
+	//
+	// label: String
+	//	text to display in button
+	label: "",
+
+	// showLabel: Boolean
+	//	whether or not to display the text label in button
+	showLabel: true,
+
+	// iconClass: String
+	//	class to apply to div in button to make it display an icon
+	iconClass: "",
+
+	type: "button",
+	baseClass: "dijitButton",
+	templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\twaiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" dojoAttachPoint=\"focusNode,titleNode\"\n\t\ttype=\"${type}\" waiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t><span class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" \n \t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#10003;</span \n\t\t></span\n\t\t><div class=\"dijitReset dijitInline\"><center class=\"dijitReset dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\">${label}</center></div\n\t></button\n></div>\n",
+
+	_onChangeMonitor: '',
+	// TODO: set button's title to this.containerNode.innerText
+
+	_onClick: function(/*Event*/ e){
+		// summary: internal function to handle click actions
+		if(this.disabled || this.readOnly){
+			dojo.stopEvent(e); // needed for checkbox
+			return false;
+		}
+		this._clicked(); // widget click actions
+		return this.onClick(e); // user click actions
+	},
+
+	_onButtonClick: function(/*Event*/ e){
+		// summary: callback when the user mouse clicks the button portion
+		if(this._onClick(e) === false){ // returning nothing is same as true
+			dojo.stopEvent(e);
+		}else if(this.type=="submit" && !this.focusNode.form){ // see if a nonform widget needs to be signalled
+			for(var node=this.domNode; node.parentNode/*#5935*/; node=node.parentNode){
+				var widget=dijit.byNode(node);
+				if(widget && typeof widget._onSubmit == "function"){
+					widget._onSubmit(e);
+					break;
+				}
+			}
+		}
+	},
+
+	postCreate: function(){
+		// summary:
+		//	get label and set as title on button icon if necessary
+		if (this.showLabel == false){
+			var labelText = "";
+			this.label = this.containerNode.innerHTML;
+			labelText = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+			// set title attrib on iconNode
+			this.titleNode.title=labelText;
+			dojo.addClass(this.containerNode,"dijitDisplayNone");
+		}
+		dojo.setSelectable(this.focusNode, false);
+		this.inherited(arguments);
+	},
+
+	onClick: function(/*Event*/ e){
+		// summary: user callback for when button is clicked
+		//      if type="submit", return true to perform submit
+		return true;
+	},
+
+	_clicked: function(/*Event*/ e){
+		// summary: internal replaceable function for when the button is clicked
+	},
+
+	setLabel: function(/*String*/ content){
+		// summary: reset the label (text) of the button; takes an HTML string
+		this.containerNode.innerHTML = this.label = content;
+		this._layoutHack();
+		if (this.showLabel == false){
+			this.titleNode.title=dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+		}
+	}		
+});
+
+
+dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container], {
+	// summary: A button with a popup
+	//
+	// example:
+	// |	<button dojoType="dijit.form.DropDownButton" label="Hello world">
+	// |		<div dojotype="dijit.Menu">...</div>
+	// |	</button>
+	//
+	// example:
+	// |	var button1 = new dijit.form.DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) });
+	// |	dojo.body().appendChild(button1);
+	// 	
+	
+	baseClass : "dijitDropDownButton",
+
+	templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey\"\n\twaiRole=\"presentation\"\n\t><div class='dijitReset dijitRight' waiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" type=\"${type}\"\n\t\tdojoAttachPoint=\"focusNode,titleNode\" waiRole=\"button\" waiState=\"haspopup-true,labelledby-${id}_label\"\n\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t><div class=\"dijitReset dijitInline dijitButtonText\"  dojoAttachPoint=\"containerNode,popupStateNode\" waiRole=\"presentation\"\n\t\t\tid=\"${id}_label\">${label}</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t></button\n></div></div>\n",
+
+	_fillContent: function(){
+		// my inner HTML contains both the button contents and a drop down widget, like
+		// <DropDownButton>  <span>push me</span>  <Menu> ... </Menu> </DropDownButton>
+		// The first node is assumed to be the button content. The widget is the popup.
+		if(this.srcNodeRef){ // programatically created buttons might not define srcNodeRef
+			//FIXME: figure out how to filter out the widget and use all remaining nodes as button
+			//	content, not just nodes[0]
+			var nodes = dojo.query("*", this.srcNodeRef);
+			dijit.form.DropDownButton.superclass._fillContent.call(this, nodes[0]);
+
+			// save pointer to srcNode so we can grab the drop down widget after it's instantiated
+			this.dropDownContainer = this.srcNodeRef;
+		}
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		// the child widget from srcNodeRef is the dropdown widget.  Insert it in the page DOM,
+		// make it invisible, and store a reference to pass to the popup code.
+		if(!this.dropDown){
+			var dropDownNode = dojo.query("[widgetId]", this.dropDownContainer)[0];
+			this.dropDown = dijit.byNode(dropDownNode);
+			delete this.dropDownContainer;
+		}
+		dijit.popup.prepare(this.dropDown.domNode);
+
+		this.inherited(arguments);
+	},
+
+	destroyDescendants: function(){
+		if(this.dropDown){
+			this.dropDown.destroyRecursive();
+			delete this.dropDown;
+		}
+		this.inherited(arguments);
+	},
+
+	_onArrowClick: function(/*Event*/ e){
+		// summary: callback when the user mouse clicks on menu popup node
+		if(this.disabled || this.readOnly){ return; }
+		this._toggleDropDown();
+	},
+
+	_onDropDownClick: function(/*Event*/ e){
+		// on Firefox 2 on the Mac it is possible to fire onclick
+		// by pressing enter down on a second element and transferring
+		// focus to the DropDownButton;
+		// we want to prevent opening our menu in this situation
+		// and only do so if we have seen a keydown on this button;
+		// e.detail != 0 means that we were fired by mouse
+		var isMacFFlessThan3 = dojo.isFF && dojo.isFF < 3
+			&& navigator.appVersion.indexOf("Macintosh") != -1;
+		if(!isMacFFlessThan3 || e.detail != 0 || this._seenKeydown){
+			this._onArrowClick(e);
+		}
+		this._seenKeydown = false;
+	},
+
+	_onDropDownKeydown: function(/*Event*/ e){
+		this._seenKeydown = true;
+	},
+
+	_onDropDownBlur: function(/*Event*/ e){
+		this._seenKeydown = false;
+	},
+
+	_onKey: function(/*Event*/ e){
+		// summary: callback when the user presses a key on menu popup node
+		if(this.disabled || this.readOnly){ return; }
+		if(e.keyCode == dojo.keys.DOWN_ARROW){
+			if(!this.dropDown || this.dropDown.domNode.style.visibility=="hidden"){
+				dojo.stopEvent(e);
+				this._toggleDropDown();
+			}
+		}
+	},
+
+	_onBlur: function(){
+		// summary: called magically when focus has shifted away from this widget and it's dropdown
+		this._closeDropDown();
+		// don't focus on button.  the user has explicitly focused on something else.
+		this.inherited(arguments);
+	},
+
+	_toggleDropDown: function(){
+		// summary: toggle the drop-down widget; if it is up, close it, if not, open it
+		if(this.disabled || this.readOnly){ return; }
+		dijit.focus(this.popupStateNode);
+		var dropDown = this.dropDown;
+		if(!dropDown){ return; }
+		if(!this._opened){
+			// If there's an href, then load that first, so we don't get a flicker
+			if(dropDown.href && !dropDown.isLoaded){
+				var self = this;
+				var handler = dojo.connect(dropDown, "onLoad", function(){
+					dojo.disconnect(handler);
+					self._openDropDown();
+				});
+				dropDown._loadCheck(true);
+				return;
+			}else{
+				this._openDropDown();
+			}
+		}else{
+			this._closeDropDown();
+		}
+	},
+
+	_openDropDown: function(){
+		var dropDown = this.dropDown;
+		var oldWidth=dropDown.domNode.style.width;
+		var self = this;
+
+		dijit.popup.open({
+			parent: this,
+			popup: dropDown,
+			around: this.domNode,
+			orient:
+				// TODO: add user-defined positioning option, like in Tooltip.js
+				this.isLeftToRight() ? {'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'}
+				: {'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'},
+			onExecute: function(){
+				self._closeDropDown(true);
+			},
+			onCancel: function(){
+				self._closeDropDown(true);
+			},
+			onClose: function(){
+				dropDown.domNode.style.width = oldWidth;
+				self.popupStateNode.removeAttribute("popupActive");
+				this._opened = false;
+			}
+		});
+		if(this.domNode.offsetWidth > dropDown.domNode.offsetWidth){
+			var adjustNode = null;
+			if(!this.isLeftToRight()){
+				adjustNode = dropDown.domNode.parentNode;
+				var oldRight = adjustNode.offsetLeft + adjustNode.offsetWidth;
+			}
+			// make menu at least as wide as the button
+			dojo.marginBox(dropDown.domNode, {w: this.domNode.offsetWidth});
+			if(adjustNode){
+				adjustNode.style.left = oldRight - this.domNode.offsetWidth + "px";
+			}
+		}
+		this.popupStateNode.setAttribute("popupActive", "true");
+		this._opened=true;
+		if(dropDown.focus){
+			dropDown.focus();
+		}
+		// TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown
+	},
+	
+	_closeDropDown: function(/*Boolean*/ focus){
+		if(this._opened){
+			dijit.popup.close(this.dropDown);
+			if(focus){ this.focus(); }
+			this._opened = false;			
+		}
+	}
+});
+
+dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
+	// summary: A Normal Button with a DropDown
+	//
+	// example:
+	// |	<button dojoType="dijit.form.ComboButton" onClick="...">
+	// |		<span>Hello world</span>
+	// |		<div dojoType="dijit.Menu">...</div>
+	// |	</button>
+	//
+	// example:
+	// |	var button1 = new dijit.form.ComboButton({label: "hello world", onClick: foo, dropDown: "myMenu"});
+	// |	dojo.body().appendChild(button1.domNode);
+	// 
+
+	templateString:"<table class='dijit dijitReset dijitInline dijitLeft'\n\tcellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td\tclass=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\"\n\t\t\ttabIndex=\"${tabIndex}\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"  dojoAttachPoint=\"titleNode\"\n\t\t\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"presentation\">${label}</div\n\t\t></td\n\t\t><td class='dijitReset dijitStretch dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"popupStateNode,focusNode\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onArrowClick, onkeypress:_onKey,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\tstateModifier=\"DownArrow\"\n\t\t\ttitle=\"${optionsTitle}\" name=\"${name}\"\n\t\t\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t\t></td\n\t></tr></tbody\n></table>\n",
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+		{id:"", name:""}),
+
+	// optionsTitle: String
+	//  text that describes the options menu (accessibility)
+	optionsTitle: "",
+
+	baseClass: "dijitComboButton",
+
+	_focusedNode: null,
+
+	postCreate: function(){
+		this.inherited(arguments);
+		this._focalNodes = [this.titleNode, this.popupStateNode];
+		dojo.forEach(this._focalNodes, dojo.hitch(this, function(node){
+			if(dojo.isIE){
+				this.connect(node, "onactivate", this._onNodeFocus);
+				this.connect(node, "ondeactivate", this._onNodeBlur);
+			}else{
+				this.connect(node, "onfocus", this._onNodeFocus);
+				this.connect(node, "onblur", this._onNodeBlur);
+			}
+		}));
+	},
+
+	focusFocalNode: function(node){
+		// summary: Focus the focal node node.
+		this._focusedNode = node;
+		dijit.focus(node);
+	},
+
+	hasNextFocalNode: function(){
+		// summary: Returns true if this widget has no node currently
+		//		focused or if there is a node following the focused one.
+		//		False is returned if the last node has focus.
+		return this._focusedNode !== this.getFocalNodes()[1];
+	},
+
+	focusNext: function(){
+		// summary: Focus the focal node following the current node with focus
+		//		or the first one if no node currently has focus.
+		this._focusedNode = this.getFocalNodes()[this._focusedNode ? 1 : 0];
+		dijit.focus(this._focusedNode);
+	},
+
+	hasPrevFocalNode: function(){
+		// summary: Returns true if this widget has no node currently
+		//		focused or if there is a node before the focused one.
+		//		False is returned if the first node has focus.
+		return this._focusedNode !== this.getFocalNodes()[0];
+	},
+
+	focusPrev: function(){
+		// summary: Focus the focal node before the current node with focus
+		//		or the last one if no node currently has focus.
+		this._focusedNode = this.getFocalNodes()[this._focusedNode ? 0 : 1];
+		dijit.focus(this._focusedNode);
+	},
+
+	getFocalNodes: function(){
+		// summary: Returns an array of focal nodes for this widget.
+		return this._focalNodes;
+	},
+
+	_onNodeFocus: function(evt){
+		this._focusedNode = evt.currentTarget;
+		var fnc = this._focusedNode == this.focusNode ? "dijitDownArrowButtonFocused" : "dijitButtonContentsFocused";
+		dojo.addClass(this._focusedNode, fnc);
+	},
+
+	_onNodeBlur: function(evt){
+		var fnc = evt.currentTarget == this.focusNode ? "dijitDownArrowButtonFocused" : "dijitButtonContentsFocused";
+		dojo.removeClass(evt.currentTarget, fnc);
+	},
+
+	_onBlur: function(){
+		this.inherited(arguments);
+		this._focusedNode = null;
+	}
+});
+
+dojo.declare("dijit.form.ToggleButton", dijit.form.Button, {
+	// summary:
+	//	A button that can be in two states (checked or not).
+	//	Can be base class for things like tabs or checkbox or radio buttons
+
+	baseClass: "dijitToggleButton",
+
+	// checked: Boolean
+	//		Corresponds to the native HTML <input> element's attribute.
+	//		In markup, specified as "checked='checked'" or just "checked".
+	//		True if the button is depressed, or the checkbox is checked,
+	//		or the radio button is selected, etc.
+	checked: false,
+
+	_onChangeMonitor: 'checked',
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),
+		{checked:"focusNode"}),
+
+	_clicked: function(/*Event*/ evt){
+		this.setAttribute('checked', !this.checked);
+	},
+
+	setAttribute: function(/*String*/ attr, /*anything*/ value){
+		this.inherited(arguments);
+		switch(attr){
+			case "checked":
+				dijit.setWaiState(this.focusNode || this.domNode, "pressed", this.checked);
+				this._setStateClass();		
+				this._handleOnChange(this.checked, true);
+		}
+	},
+
+
+	setChecked: function(/*Boolean*/ checked){
+		// summary:
+		//	Programatically deselect the button
+		dojo.deprecated("setChecked("+checked+") is deprecated. Use setAttribute('checked',"+checked+") instead.", "", "2.0");
+		this.setAttribute('checked', checked);
+	},
+	
+	postCreate: function(){
+		this.inherited(arguments);
+		this.setAttribute('checked', this.checked); //to initially set wai pressed state 
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/CheckBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/CheckBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/CheckBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,133 @@
+if(!dojo._hasResource["dijit.form.CheckBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.CheckBox"] = true;
+dojo.provide("dijit.form.CheckBox");
+
+dojo.require("dijit.form.Button");
+
+dojo.declare(
+	"dijit.form.CheckBox",
+	dijit.form.ToggleButton,
+	{
+		// summary:
+		// 		Same as an HTML checkbox, but with fancy styling.
+		//
+		// description:
+		// User interacts with real html inputs.
+		// On onclick (which occurs by mouse click, space-bar, or
+		// using the arrow keys to switch the selected radio button),
+		// we update the state of the checkbox/radio.
+		//
+		// There are two modes:
+		//   1. High contrast mode
+		//   2. Normal mode
+		// In case 1, the regular html inputs are shown and used by the user.
+		// In case 2, the regular html inputs are invisible but still used by
+		// the user. They are turned quasi-invisible and overlay the background-image.
+
+		templateString:"<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \ttype=\"${type}\" name=\"${name}\"\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n",
+
+		baseClass: "dijitCheckBox",
+
+		//	Value of "type" attribute for <input>
+		type: "checkbox",
+
+		// value: Value
+		//	equivalent to value field on normal checkbox (if checked, the value is passed as
+		//	the value when form is submitted)
+		value: "on",
+
+		setValue: function(/*String or Boolean*/ newValue){
+			// summary:
+			//		When passed a boolean, controls whether or not the CheckBox is checked.
+			//		If passed a string, changes the value attribute of the CheckBox (the one
+			//		specified as "value" when the CheckBox was constructed (ex: <input
+			//		dojoType="dijit.CheckBox" value="chicken">)
+			if(typeof newValue == "string"){
+				this.setAttribute('value', newValue);
+				newValue = true;
+			}
+			this.setAttribute('checked', newValue);
+		},
+
+		_getValueDeprecated: false, // remove when _FormWidget:_getValueDeprecated is removed
+		getValue: function(){
+			// summary:
+			//		If the CheckBox is checked, returns the value attribute.
+			//		Otherwise returns false.
+			return (this.checked ? this.value : false);
+		},
+
+		reset: function(){
+			this.inherited(arguments);
+			this.setAttribute('value', this._resetValueAttr);
+		},
+
+		postCreate: function(){
+			this.inherited(arguments);
+			this._resetValueAttr = this.value;
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.form.RadioButton",
+	dijit.form.CheckBox,
+	{
+		// summary:
+		// 		Same as an HTML radio, but with fancy styling.
+		//
+		// description:
+		// Implementation details
+		//
+		// Specialization:
+		// We keep track of dijit radio groups so that we can update the state
+		// of all the siblings (the "context") in a group based on input
+		// events. We don't rely on browser radio grouping.
+
+		type: "radio",
+		baseClass: "dijitRadio",
+
+		// This shared object keeps track of all widgets, grouped by name
+		_groups: {},
+
+		postCreate: function(){
+			// add this widget to _groups
+			(this._groups[this.name] = this._groups[this.name] || []).push(this);
+
+			this.inherited(arguments);
+		},
+
+		uninitialize: function(){
+			// remove this widget from _groups
+			dojo.forEach(this._groups[this.name], function(widget, i, arr){
+				if(widget === this){
+					arr.splice(i, 1);
+					return;
+				}
+			}, this);
+		},
+
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			// If I am being checked then have to deselect currently checked radio button
+			this.inherited(arguments);
+			switch(attr){
+				case "checked":
+					if(this.checked){
+						dojo.forEach(this._groups[this.name], function(widget){
+							if(widget != this && widget.checked){
+								widget.setAttribute('checked', false);
+							}
+						}, this);
+					}
+			}
+		},
+
+		_clicked: function(/*Event*/ e){
+			if(!this.checked){
+				this.setAttribute('checked', true);
+			}
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,1060 @@
+if(!dojo._hasResource["dijit.form.ComboBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.ComboBox"] = true;
+dojo.provide("dijit.form.ComboBox");
+
+dojo.require("dijit.form.ValidationTextBox");
+dojo.requireLocalization("dijit.form", "ComboBox", null, "zh,ROOT,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+	"dijit.form.ComboBoxMixin",
+	null,
+	{
+		// item: Object
+		//		This is the item returned by the dojo.data.store implementation that
+		//		provides the data for this cobobox, it's the currently selected item.
+		item: null,
+
+		// pageSize: Integer
+		//		Argument to data provider.
+		//		Specifies number of search results per page (before hitting "next" button)
+		pageSize: Infinity,
+
+		// store: Object
+		//		Reference to data provider object used by this ComboBox
+		store: null,
+
+		// query: Object
+		//		A query that can be passed to 'store' to initially filter the items,
+		//		before doing further filtering based on `searchAttr` and the key.
+		//		Any reference to the `searchAttr` is ignored.
+		query: {},
+
+		// autoComplete: Boolean
+		//		If you type in a partial string, and then tab out of the `<input>` box,
+		//		automatically copy the first entry displayed in the drop down list to
+		//		the `<input>` field
+		autoComplete: true,
+
+		// searchDelay: Integer
+		//		Delay in milliseconds between when user types something and we start
+		//		searching based on that value
+		searchDelay: 100,
+
+		// searchAttr: String
+		//		Searches pattern match against this field
+		searchAttr: "name",
+
+		// queryExpr: String
+		//		dojo.data query expression pattern.
+		//		`${0}` will be substituted for the user text.
+		//		`*` is used for wildcards.
+		//		`${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is"
+		queryExpr: "${0}*",
+
+		// ignoreCase: Boolean
+		//		Set true if the ComboBox should ignore case when matching possible items
+		ignoreCase: true,
+
+		// hasDownArrow: Boolean
+		//		Set this textbox to have a down arrow button.
+		//		Defaults to true.
+		hasDownArrow:true,
+
+		templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"comboNode\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input type=\"text\" autocomplete=\"off\" name=\"${name}\" class='dijitReset'\n\t\t\tdojoAttachEvent=\"onkeypress:_onKeyPress, onfocus:_update, compositionend,onkeyup\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t\t/></div\n\t></div\n></div>\n",
+
+		baseClass:"dijitComboBox",
+
+		_getCaretPos: function(/*DomNode*/ element){
+			// khtml 3.5.2 has selection* methods as does webkit nightlies from 2005-06-22
+			var pos = 0;
+			if(typeof(element.selectionStart)=="number"){
+				// FIXME: this is totally borked on Moz < 1.3. Any recourse?
+				pos = element.selectionStart;
+			}else if(dojo.isIE){
+				// in the case of a mouse click in a popup being handled,
+				// then the dojo.doc.selection is not the textarea, but the popup
+				// var r = dojo.doc.selection.createRange();
+				// hack to get IE 6 to play nice. What a POS browser.
+				var tr = dojo.doc.selection.createRange().duplicate();
+				var ntr = element.createTextRange();
+				tr.move("character",0);
+				ntr.move("character",0);
+				try{
+					// If control doesnt have focus, you get an exception.
+					// Seems to happen on reverse-tab, but can also happen on tab (seems to be a race condition - only happens sometimes).
+					// There appears to be no workaround for this - googled for quite a while.
+					ntr.setEndPoint("EndToEnd", tr);
+					pos = String(ntr.text).replace(/\r/g,"").length;
+				}catch(e){
+					// If focus has shifted, 0 is fine for caret pos.
+				}
+			}
+			return pos;
+		},
+
+		_setCaretPos: function(/*DomNode*/ element, /*Number*/ location){
+			location = parseInt(location);
+			dijit.selectInputText(element, location, location);
+		},
+
+		_setAttribute: function(/*String*/ attr, /*anything*/ value){
+			// summary: additional code to set disablbed state of combobox node
+			if (attr == "disabled"){
+				dijit.setWaiState(this.comboNode, "disabled", value);
+			}
+		},	
+		
+		_onKeyPress: function(/*Event*/ evt){
+			// summary: handles keyboard events
+
+			//except for pasting case - ctrl + v(118)
+			if(evt.altKey || (evt.ctrlKey && evt.charCode != 118)){
+				return;
+			}
+			var doSearch = false;
+			var pw = this._popupWidget;
+			var dk = dojo.keys;
+			if(this._isShowingNow){
+				pw.handleKey(evt);
+			}
+			switch(evt.keyCode){
+				case dk.PAGE_DOWN:
+				case dk.DOWN_ARROW:
+					if(!this._isShowingNow||this._prev_key_esc){
+						this._arrowPressed();
+						doSearch=true;
+					}else{
+						this._announceOption(pw.getHighlightedOption());
+					}
+					dojo.stopEvent(evt);
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					break;
+
+				case dk.PAGE_UP:
+				case dk.UP_ARROW:
+					if(this._isShowingNow){
+						this._announceOption(pw.getHighlightedOption());
+					}
+					dojo.stopEvent(evt);
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					break;
+
+				case dk.ENTER:
+					// prevent submitting form if user presses enter. Also
+					// prevent accepting the value if either Next or Previous
+					// are selected
+					var highlighted;
+					if(	this._isShowingNow && 
+						(highlighted = pw.getHighlightedOption())
+					){
+						// only stop event on prev/next
+						if(highlighted == pw.nextButton){
+							this._nextSearch(1);
+							dojo.stopEvent(evt);
+							break;
+						}else if(highlighted == pw.previousButton){
+							this._nextSearch(-1);
+							dojo.stopEvent(evt);
+							break;
+						}
+					}else{
+						this.setDisplayedValue(this.getDisplayedValue());
+					}
+					// default case:
+					// prevent submit, but allow event to bubble
+					evt.preventDefault();
+					// fall through
+
+				case dk.TAB:
+					var newvalue = this.getDisplayedValue();
+					// #4617: 
+					//		if the user had More Choices selected fall into the
+					//		_onBlur handler
+					if(pw && (
+						newvalue == pw._messages["previousMessage"] ||
+						newvalue == pw._messages["nextMessage"])
+					){
+						break;
+					}
+					if(this._isShowingNow){
+						this._prev_key_backspace = false;
+						this._prev_key_esc = false;
+						if(pw.getHighlightedOption()){
+							pw.setValue({ target: pw.getHighlightedOption() }, true);
+						}
+						this._hideResultList();
+					}
+					break;
+
+				case dk.SPACE:
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					if(this._isShowingNow && pw.getHighlightedOption()){
+						dojo.stopEvent(evt);
+						this._selectOption();
+						this._hideResultList();
+					}else{
+						doSearch = true;
+					}
+					break;
+
+				case dk.ESCAPE:
+					this._prev_key_backspace = false;
+					this._prev_key_esc = true;
+					if(this._isShowingNow){
+						dojo.stopEvent(evt);
+						this._hideResultList();
+					}
+					this.inherited(arguments);
+					break;
+
+				case dk.DELETE:
+				case dk.BACKSPACE:
+					this._prev_key_esc = false;
+					this._prev_key_backspace = true;
+					doSearch = true;
+					break;
+
+				case dk.RIGHT_ARROW: // fall through
+				case dk.LEFT_ARROW: 
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					break;
+
+				default: // non char keys (F1-F12 etc..)  shouldn't open list
+					this._prev_key_backspace = false;
+					this._prev_key_esc = false;
+					if(dojo.isIE || evt.charCode != 0){
+						doSearch = true;
+					}
+			}
+			if(this.searchTimer){
+				clearTimeout(this.searchTimer);
+			}
+			if(doSearch){
+				// need to wait a tad before start search so that the event
+				// bubbles through DOM and we have value visible
+				setTimeout(dojo.hitch(this, "_startSearchFromInput"),1);
+			}
+		},
+
+		_autoCompleteText: function(/*String*/ text){
+			// summary:
+			// 		Fill in the textbox with the first item from the drop down
+			// 		list, and highlight the characters that were
+			// 		auto-completed. For example, if user typed "CA" and the
+			// 		drop down list appeared, the textbox would be changed to
+			// 		"California" and "ifornia" would be highlighted.
+
+			var fn = this.focusNode;
+
+			// IE7: clear selection so next highlight works all the time
+			dijit.selectInputText(fn, fn.value.length);
+			// does text autoComplete the value in the textbox?
+			var caseFilter = this.ignoreCase? 'toLowerCase' : 'substr';
+			if(text[caseFilter](0).indexOf(this.focusNode.value[caseFilter](0)) == 0){
+				var cpos = this._getCaretPos(fn);
+				// only try to extend if we added the last character at the end of the input
+				if((cpos+1) > fn.value.length){
+					// only add to input node as we would overwrite Capitalisation of chars
+					// actually, that is ok
+					fn.value = text;//.substr(cpos);
+					// visually highlight the autocompleted characters
+					dijit.selectInputText(fn, cpos);
+				}
+			}else{
+				// text does not autoComplete; replace the whole value and highlight
+				fn.value = text;
+				dijit.selectInputText(fn);
+			}
+		},
+
+		_openResultList: function(/*Object*/ results, /*Object*/ dataObject){
+			if(	this.disabled || 
+				this.readOnly || 
+				(dataObject.query[this.searchAttr] != this._lastQuery)
+			){
+				return;
+			}
+			this._popupWidget.clearResultList();
+			if(!results.length){
+				this._hideResultList();
+				return;
+			}
+
+			// Fill in the textbox with the first item from the drop down list,
+			// and highlight the characters that were auto-completed. For
+			// example, if user typed "CA" and the drop down list appeared, the
+			// textbox would be changed to "California" and "ifornia" would be
+			// highlighted.
+
+			var zerothvalue = new String(this.store.getValue(results[0], this.searchAttr));
+			if(zerothvalue && this.autoComplete && !this._prev_key_backspace &&
+				(dataObject.query[this.searchAttr] != "*")){
+				// when the user clicks the arrow button to show the full list,
+				// startSearch looks for "*".
+				// it does not make sense to autocomplete
+				// if they are just previewing the options available.
+				this._autoCompleteText(zerothvalue);
+			}
+			this._popupWidget.createOptions(
+				results, 
+				dataObject, 
+				dojo.hitch(this, "_getMenuLabelFromItem")
+			);
+
+			// show our list (only if we have content, else nothing)
+			this._showResultList();
+
+			// #4091:
+			//		tell the screen reader that the paging callback finished by
+			//		shouting the next choice
+			if(dataObject.direction){
+				if(1 == dataObject.direction){
+					this._popupWidget.highlightFirstOption();
+				}else if(-1 == dataObject.direction){
+					this._popupWidget.highlightLastOption();
+				}
+				this._announceOption(this._popupWidget.getHighlightedOption());
+			}
+		},
+
+		_showResultList: function(){
+			this._hideResultList();
+			var items = this._popupWidget.getItems(),
+				visibleCount = Math.min(items.length,this.maxListLength);
+			this._arrowPressed();
+			// hide the tooltip
+			this.displayMessage("");
+			
+			// Position the list and if it's too big to fit on the screen then
+			// size it to the maximum possible height
+			// Our dear friend IE doesnt take max-height so we need to
+			// calculate that on our own every time
+
+			// TODO: want to redo this, see 
+			//		http://trac.dojotoolkit.org/ticket/3272
+			//	and
+			//		http://trac.dojotoolkit.org/ticket/4108
+
+			with(this._popupWidget.domNode.style){
+				// natural size of the list has changed, so erase old
+				// width/height settings, which were hardcoded in a previous
+				// call to this function (via dojo.marginBox() call) 
+				width = "";
+				height = "";
+			}
+			var best = this.open();
+			// #3212:
+			//		only set auto scroll bars if necessary prevents issues with
+			//		scroll bars appearing when they shouldn't when node is made
+			//		wider (fractional pixels cause this)
+			var popupbox = dojo.marginBox(this._popupWidget.domNode);
+			this._popupWidget.domNode.style.overflow = 
+				((best.h==popupbox.h)&&(best.w==popupbox.w)) ? "hidden" : "auto";
+			// #4134:
+			//		borrow TextArea scrollbar test so content isn't covered by
+			//		scrollbar and horizontal scrollbar doesn't appear
+			var newwidth = best.w;
+			if(best.h < this._popupWidget.domNode.scrollHeight){
+				newwidth += 16;
+			}
+			dojo.marginBox(this._popupWidget.domNode, {
+				h: best.h,
+				w: Math.max(newwidth, this.domNode.offsetWidth)
+			});
+			dijit.setWaiState(this.comboNode, "expanded", "true");
+		},
+
+		_hideResultList: function(){
+			if(this._isShowingNow){
+				dijit.popup.close(this._popupWidget);
+				this._arrowIdle();
+				this._isShowingNow=false;
+				dijit.setWaiState(this.comboNode, "expanded", "false");
+				dijit.removeWaiState(this.focusNode,"activedescendant");
+			}
+		},
+
+		_setBlurValue: function(){
+			// if the user clicks away from the textbox OR tabs away, set the
+			// value to the textbox value
+			// #4617: 
+			//		if value is now more choices or previous choices, revert
+			//		the value
+			var newvalue=this.getDisplayedValue();
+			var pw = this._popupWidget;
+			if(pw && (
+				newvalue == pw._messages["previousMessage"] ||
+				newvalue == pw._messages["nextMessage"]
+				)
+			){
+				this.setValue(this._lastValueReported, true);
+			}else{
+				this.setDisplayedValue(newvalue);
+			}
+		},
+
+		_onBlur: function(){
+			// summary: called magically when focus has shifted away from this widget and it's dropdown
+			this._hideResultList();
+			this._arrowIdle();
+			this.inherited(arguments);
+		},
+
+		_announceOption: function(/*Node*/ node){
+			// summary:
+			//		a11y code that puts the highlighted option in the textbox
+			//		This way screen readers will know what is happening in the
+			//		menu
+
+			if(node == null){
+				return;
+			}
+			// pull the text value from the item attached to the DOM node
+			var newValue;
+			if( node == this._popupWidget.nextButton ||
+				node == this._popupWidget.previousButton){
+				newValue = node.innerHTML;
+			}else{
+				newValue = this.store.getValue(node.item, this.searchAttr);
+			}
+			// get the text that the user manually entered (cut off autocompleted text)
+			this.focusNode.value = this.focusNode.value.substring(0, this._getCaretPos(this.focusNode));
+			//set up ARIA activedescendant
+			dijit.setWaiState(this.focusNode, "activedescendant", dojo.attr(node, "id")); 
+			// autocomplete the rest of the option to announce change
+			this._autoCompleteText(newValue);
+		},
+
+		_selectOption: function(/*Event*/ evt){
+			var tgt = null;
+			if(!evt){
+				evt ={ target: this._popupWidget.getHighlightedOption()};
+			}
+				// what if nothing is highlighted yet?
+			if(!evt.target){
+				// handle autocompletion where the the user has hit ENTER or TAB
+				this.setDisplayedValue(this.getDisplayedValue());
+				return;
+			// otherwise the user has accepted the autocompleted value
+			}else{
+				tgt = evt.target;
+			}
+			if(!evt.noHide){
+				this._hideResultList();
+				this._setCaretPos(this.focusNode, this.store.getValue(tgt.item, this.searchAttr).length);
+			}
+			this._doSelect(tgt);
+		},
+
+		_doSelect: function(tgt){
+			this.item = tgt.item;
+			this.setValue(this.store.getValue(tgt.item, this.searchAttr), true);
+		},
+
+		_onArrowMouseDown: function(evt){
+			// summary: callback when arrow is clicked
+			if(this.disabled || this.readOnly){
+				return;
+			}
+			dojo.stopEvent(evt);
+			this.focus();
+			if(this._isShowingNow){
+				this._hideResultList();
+			}else{
+				// forces full population of results, if they click
+				// on the arrow it means they want to see more options
+				this._startSearch("");
+			}
+		},
+
+		_startSearchFromInput: function(){
+			this._startSearch(this.focusNode.value);
+		},
+
+		_getQueryString: function(/*String*/ text){
+			return dojo.string.substitute(this.queryExpr, [text]);
+		},
+
+		_startSearch: function(/*String*/ key){
+			if(!this._popupWidget){
+				var popupId = this.id + "_popup";
+				this._popupWidget = new dijit.form._ComboBoxMenu({
+					onChange: dojo.hitch(this, this._selectOption),
+					id:popupId
+				});
+				dijit.removeWaiState(this.focusNode,"activedescendant");
+				dijit.setWaiState(this.textbox,"owns",popupId); // associate popup with textbox
+			}
+			// create a new query to prevent accidentally querying for a hidden
+			// value from FilteringSelect's keyField
+			this.item = null; // #4872
+			var query = dojo.clone(this.query); // #5970
+			this._lastQuery = query[this.searchAttr] = this._getQueryString(key);
+			// #5970: set _lastQuery, *then* start the timeout
+			// otherwise, if the user types and the last query returns before the timeout,
+			// _lastQuery won't be set and their input gets rewritten
+			this.searchTimer=setTimeout(dojo.hitch(this, function(query, _this){
+				var dataObject = this.store.fetch({
+					queryOptions: {
+						ignoreCase: this.ignoreCase, 
+						deep: true
+					},
+					query: query,
+					onComplete: dojo.hitch(this, "_openResultList"), 
+					onError: function(errText){
+						console.error('dijit.form.ComboBox: ' + errText);
+						dojo.hitch(_this, "_hideResultList")();
+					},
+					start:0,
+					count:this.pageSize
+				});
+
+				var nextSearch = function(dataObject, direction){
+					dataObject.start += dataObject.count*direction;
+					// #4091:
+					//		tell callback the direction of the paging so the screen
+					//		reader knows which menu option to shout
+					dataObject.direction = direction;
+					this.store.fetch(dataObject);
+				}
+				this._nextSearch = this._popupWidget.onPage = dojo.hitch(this, nextSearch, dataObject);
+			}, query, this), this.searchDelay);
+		},
+
+		_getValueField:function(){
+			return this.searchAttr;
+		},
+
+		/////////////// Event handlers /////////////////////
+
+		_arrowPressed: function(){
+			if(!this.disabled && !this.readOnly && this.hasDownArrow){
+				dojo.addClass(this.downArrowNode, "dijitArrowButtonActive");
+			}
+		},
+
+		_arrowIdle: function(){
+			if(!this.disabled && !this.readOnly && this.hasDownArrow){
+				dojo.removeClass(this.downArrowNode, "dojoArrowButtonPushed");
+			}
+		},
+
+		// FIXME: 
+		//		this is public so we can't remove until 2.0, but the name
+		//		SHOULD be "compositionEnd"
+
+		compositionend: function(/*Event*/ evt){
+			//	summary:
+			//		When inputting characters using an input method, such as
+			//		Asian languages, it will generate this event instead of
+			//		onKeyDown event Note: this event is only triggered in FF
+			//		(not in IE)
+			this.onkeypress({charCode:-1});
+		},
+
+		//////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+		constructor: function(){
+			this.query={};
+		},
+
+		postMixInProperties: function(){
+			if(!this.hasDownArrow){
+				this.baseClass = "dijitTextBox";
+			}
+			if(!this.store){
+				var srcNodeRef = this.srcNodeRef;
+
+				// if user didn't specify store, then assume there are option tags
+				this.store = new dijit.form._ComboBoxDataStore(srcNodeRef);
+
+				// if there is no value set and there is an option list, set
+				// the value to the first value to be consistent with native
+				// Select
+
+				// Firefox and Safari set value
+				// IE6 and Opera set selectedIndex, which is automatically set
+				// by the selected attribute of an option tag
+				// IE6 does not set value, Opera sets value = selectedIndex
+				if(	!this.value || (
+						(typeof srcNodeRef.selectedIndex == "number") && 
+						srcNodeRef.selectedIndex.toString() === this.value)
+				){
+					var item = this.store.fetchSelectedItem();
+					if(item){
+						this.value = this.store.getValue(item, this._getValueField());
+					}
+				}
+			}
+		},
+		
+		_postCreate:function(){
+			//find any associated label element and add to combobox node.
+			var label=dojo.query('label[for="'+this.id+'"]');
+			if(label.length){
+				label[0].id = (this.id+"_label");
+				var cn=this.comboNode;
+				dijit.setWaiState(cn, "labelledby", label[0].id);
+				dijit.setWaiState(cn, "disabled", this.disabled);
+				
+			}
+		},
+
+		uninitialize:function(){
+			if(this._popupWidget){
+				this._hideResultList();
+				this._popupWidget.destroy()
+			}
+		},
+
+		_getMenuLabelFromItem:function(/*Item*/ item){
+			return {
+				html: false, 
+				label: this.store.getValue(item, this.searchAttr)
+			};
+		},
+
+		open:function(){
+			this._isShowingNow=true;
+			return dijit.popup.open({
+				popup: this._popupWidget,
+				around: this.domNode,
+				parent: this
+			});
+		},
+		
+		reset:function(){
+			//	summary:
+			//		Additionally reset the .item (to clean up).
+			this.item = null;
+			this.inherited(arguments);
+		}
+		
+	}
+);
+
+dojo.declare(
+	"dijit.form._ComboBoxMenu",
+	[dijit._Widget, dijit._Templated],
+
+	{
+		//	summary:
+		//		Focus-less div based menu for internal use in ComboBox
+
+		templateString: "<ul class='dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow:\"auto\";'>"
+				+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton'></li>"
+				+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton'></li>"
+			+"</ul>",
+		_messages: null,
+
+		postMixInProperties: function(){
+			this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang);
+			this.inherited("postMixInProperties", arguments);
+		},
+
+		setValue: function(/*Object*/ value){
+			this.value = value;
+			this.onChange(value);
+		},
+
+		// stubs
+		onChange: function(/*Object*/ value){},
+		onPage: function(/*Number*/ direction){},
+
+		postCreate:function(){
+			// fill in template with i18n messages
+			this.previousButton.innerHTML = this._messages["previousMessage"];
+			this.nextButton.innerHTML = this._messages["nextMessage"];
+			this.inherited("postCreate", arguments);
+		},
+
+		onClose:function(){
+			this._blurOptionNode();
+		},
+
+		_createOption:function(/*Object*/ item, labelFunc){
+			//	summary: 
+			//		creates an option to appear on the popup menu subclassed by
+			//		FilteringSelect
+
+			var labelObject = labelFunc(item);
+			var menuitem = dojo.doc.createElement("li");
+			dijit.setWaiRole(menuitem, "option");
+			if(labelObject.html){
+				menuitem.innerHTML = labelObject.label;
+			}else{
+				menuitem.appendChild(
+					dojo.doc.createTextNode(labelObject.label)
+				);
+			}
+			// #3250: in blank options, assign a normal height
+			if(menuitem.innerHTML == ""){
+				menuitem.innerHTML = "&nbsp;";
+			}
+			menuitem.item=item;
+			return menuitem;
+		},
+
+		createOptions: function(results, dataObject, labelFunc){
+			//this._dataObject=dataObject;
+			//this._dataObject.onComplete=dojo.hitch(comboBox, comboBox._openResultList);
+			// display "Previous . . ." button
+			this.previousButton.style.display = (dataObject.start == 0) ? "none" : "";
+			dojo.attr(this.previousButton, "id", this.id + "_prev");
+			// create options using _createOption function defined by parent
+			// ComboBox (or FilteringSelect) class
+			// #2309:
+			//		iterate over cache nondestructively
+			dojo.forEach(results, function(item, i){
+				var menuitem = this._createOption(item, labelFunc);
+				menuitem.className = "dijitMenuItem";
+				dojo.attr(menuitem, "id", this.id + i);
+				this.domNode.insertBefore(menuitem, this.nextButton);
+			}, this);
+			// display "Next . . ." button
+			this.nextButton.style.display = (dataObject.count == results.length) ? "" : "none";
+			dojo.attr(this.nextButton,"id", this.id + "_next")
+		},
+
+		clearResultList: function(){
+			// keep the previous and next buttons of course
+			while(this.domNode.childNodes.length>2){
+				this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
+			}
+		},
+
+		// these functions are called in showResultList
+		getItems: function(){
+			return this.domNode.childNodes;
+		},
+
+		getListLength: function(){
+			return this.domNode.childNodes.length-2;
+		},
+
+		_onMouseDown: function(/*Event*/ evt){
+			dojo.stopEvent(evt);
+		},
+
+		_onMouseUp: function(/*Event*/ evt){
+			if(evt.target === this.domNode){
+				return;
+			}else if(evt.target==this.previousButton){
+				this.onPage(-1);
+			}else if(evt.target==this.nextButton){
+				this.onPage(1);
+			}else{
+				var tgt = evt.target;
+				// while the clicked node is inside the div
+				while(!tgt.item){
+					// recurse to the top
+					tgt = tgt.parentNode;
+				}
+				this.setValue({ target: tgt }, true);
+			}
+		},
+
+		_onMouseOver: function(/*Event*/ evt){
+			if(evt.target === this.domNode){ return; }
+			var tgt = evt.target;
+			if(!(tgt == this.previousButton || tgt == this.nextButton)){
+				// while the clicked node is inside the div
+				while(!tgt.item){
+					// recurse to the top
+					tgt = tgt.parentNode;
+				}
+			}
+			this._focusOptionNode(tgt);
+		},
+
+		_onMouseOut:function(/*Event*/ evt){
+			if(evt.target === this.domNode){ return; }
+			this._blurOptionNode();
+		},
+
+		_focusOptionNode:function(/*DomNode*/ node){
+			// summary:
+			//	does the actual highlight
+			if(this._highlighted_option != node){
+				this._blurOptionNode();
+				this._highlighted_option = node;
+				dojo.addClass(this._highlighted_option, "dijitMenuItemHover");
+			}
+		},
+
+		_blurOptionNode:function(){
+			// summary:
+			//	removes highlight on highlighted option
+			if(this._highlighted_option){
+				dojo.removeClass(this._highlighted_option, "dijitMenuItemHover");
+				this._highlighted_option = null;
+			}
+		},
+
+		_highlightNextOption:function(){
+			//	summary:
+			// 		Highlight the item just below the current selection.
+			// 		If nothing selected, highlight first option
+
+			// because each press of a button clears the menu,
+			// the highlighted option sometimes becomes detached from the menu!
+			// test to see if the option has a parent to see if this is the case.
+			var fc = this.domNode.firstChild;
+			if(!this.getHighlightedOption()){
+				this._focusOptionNode(fc.style.display=="none" ? fc.nextSibling : fc);
+			}else{
+				var ns = this._highlighted_option.nextSibling;
+				if(ns && ns.style.display!="none"){
+					this._focusOptionNode(ns);
+				}
+			}
+			// scrollIntoView is called outside of _focusOptionNode because in IE putting it inside causes the menu to scroll up on mouseover
+			dijit.scrollIntoView(this._highlighted_option);
+		},
+
+		highlightFirstOption:function(){
+			//	summary:
+			// 		Highlight the first real item in the list (not Previous Choices).
+			this._focusOptionNode(this.domNode.firstChild.nextSibling);
+			dijit.scrollIntoView(this._highlighted_option);
+		},
+
+		highlightLastOption:function(){
+			//	summary:
+			// 		Highlight the last real item in the list (not More Choices).
+			this._focusOptionNode(this.domNode.lastChild.previousSibling);
+			dijit.scrollIntoView(this._highlighted_option);
+		},
+
+		_highlightPrevOption:function(){
+			//	summary:
+			// 		Highlight the item just above the current selection.
+			// 		If nothing selected, highlight last option (if
+			// 		you select Previous and try to keep scrolling up the list)
+			var lc = this.domNode.lastChild;
+			if(!this.getHighlightedOption()){
+				this._focusOptionNode(lc.style.display == "none" ? lc.previousSibling : lc);
+			}else{
+				var ps = this._highlighted_option.previousSibling;
+				if(ps && ps.style.display != "none"){
+					this._focusOptionNode(ps);
+				}
+			}
+			dijit.scrollIntoView(this._highlighted_option);
+		},
+
+		_page:function(/*Boolean*/ up){
+			var scrollamount = 0;
+			var oldscroll = this.domNode.scrollTop;
+			var height = dojo.style(this.domNode, "height");
+			// if no item is highlighted, highlight the first option
+			if(!this.getHighlightedOption()){
+				this._highlightNextOption();
+			}
+			while(scrollamount<height){
+				if(up){
+					// stop at option 1
+					if(!this.getHighlightedOption().previousSibling ||
+						this._highlighted_option.previousSibling.style.display == "none"){
+						break;
+					}
+					this._highlightPrevOption();
+				}else{
+					// stop at last option
+					if(!this.getHighlightedOption().nextSibling ||
+						this._highlighted_option.nextSibling.style.display == "none"){
+						break;
+					}
+					this._highlightNextOption();
+				}
+				// going backwards
+				var newscroll=this.domNode.scrollTop;
+				scrollamount+=(newscroll-oldscroll)*(up ? -1:1);
+				oldscroll=newscroll;
+			}
+		},
+
+		pageUp: function(){ this._page(true); },
+
+		pageDown: function(){ this._page(false); },
+
+		getHighlightedOption: function(){
+			//	summary:
+			//		Returns the highlighted option.
+			var ho = this._highlighted_option;
+			return (ho && ho.parentNode) ? ho : null;
+		},
+
+		handleKey: function(evt){
+			switch(evt.keyCode){
+				case dojo.keys.DOWN_ARROW:
+					this._highlightNextOption();
+					break;
+				case dojo.keys.PAGE_DOWN:
+					this.pageDown();
+					break;	
+				case dojo.keys.UP_ARROW:
+					this._highlightPrevOption();
+					break;
+				case dojo.keys.PAGE_UP:
+					this.pageUp();
+					break;	
+			}
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.form.ComboBox",
+	[dijit.form.ValidationTextBox, dijit.form.ComboBoxMixin],
+	{
+		//	summary:
+		//		Auto-completing text box, and base class for dijit.form.FilteringSelect.
+		// 
+		//	description:
+		//		The drop down box's values are populated from an class called
+		//		a data provider, which returns a list of values based on the characters
+		//		that the user has typed into the input box.
+		// 
+		//		Some of the options to the ComboBox are actually arguments to the data
+		//		provider.
+		// 
+		//		You can assume that all the form widgets (and thus anything that mixes
+		//		in dijit.formComboBoxMixin) will inherit from dijit.form._FormWidget and thus the `this`
+		//		reference will also "be a" _FormWidget.
+
+		postMixInProperties: function(){
+			// this.inherited(arguments); // ??
+			dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this, arguments);
+			dijit.form.ValidationTextBox.prototype.postMixInProperties.apply(this, arguments);
+		},
+
+		postCreate: function(){
+			dijit.form.ComboBoxMixin.prototype._postCreate.apply(this, arguments);
+			dijit.form.ValidationTextBox.prototype.postCreate.apply(this, arguments);
+		},
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			dijit.form.ValidationTextBox.prototype.setAttribute.apply(this, arguments);
+			dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this, arguments);
+		}
+		
+	}
+);
+
+dojo.declare("dijit.form._ComboBoxDataStore", null, {
+	//	summary:
+	//		Inefficient but small data store specialized for inlined ComboBox data
+	//
+	//	description:
+	//		Provides a store for inlined data like:
+	//
+	//	|	<select>
+	//	|		<option value="AL">Alabama</option>
+	//	|		...
+	//
+	//		Actually. just implements the subset of dojo.data.Read/Notification
+	//		needed for ComboBox and FilteringSelect to work.
+	//
+	//		Note that an item is just a pointer to the <option> DomNode.
+
+	constructor: function( /*DomNode*/ root){
+		this.root = root;
+/*
+		//	TODO: this was added in #3858 but unclear why/if it's needed;  doesn't seem to be.
+		//	If it is needed then can we just hide the select itself instead?
+		dojo.query("> option", root).forEach(function(node){
+			node.style.display="none";
+		});
+*/
+	},
+
+	getValue: function(	/* item */ item, 
+						/* attribute-name-string */ attribute, 
+						/* value? */ defaultValue){
+		return (attribute == "value") ? item.value : (item.innerText || item.textContent || '');
+	},
+
+	isItemLoaded: function(/* anything */ something) {
+		return true;
+	},
+
+	fetch: function(/* Object */ args){
+		//	summary:
+		//		Given a query and set of defined options, such as a start and count of items to return,
+		//		this method executes the query and makes the results available as data items.
+		//		Refer to dojo.data.api.Read.fetch() more details.
+		//
+		//	description:
+		//		Given a query like
+		//
+		//	|	{
+		// 	|		query: {name: "Cal*"},
+		//	|		start: 30,
+		//	|		count: 20,
+		//	|		ignoreCase: true,
+		//	|		onComplete: function(/* item[] */ items, /* Object */ args){...}
+		// 	|	}
+		//
+		//		will call `onComplete()` with the results of the query (and the argument to this method)
+
+		// convert query to regex (ex: convert "first\last*" to /^first\\last.*$/i) and get matching vals
+		var query = "^" + args.query.name
+				.replace(/([\\\|\(\)\[\{\^\$\+\?\.\<\>])/g, "\\$1")
+				.replace("*", ".*") + "$",
+			matcher = new RegExp(query, args.queryOptions.ignoreCase ? "i" : ""),
+			items = dojo.query("> option", this.root).filter(function(option){
+				return (option.innerText || option.textContent || '').match(matcher);
+			} );
+
+		var start = args.start || 0,
+			end = ("count" in args && args.count != Infinity) ? (start + args.count) : items.length ;
+		args.onComplete(items.slice(start, end), args);
+		return args; // Object
+		// TODO: I don't need to return the length?
+	},
+
+	close: function(/*dojo.data.api.Request || args || null */ request){
+		return;
+	},
+
+	getLabel: function(/* item */ item){
+		return item.innerHTML;
+	},
+
+	getIdentity: function(/* item */ item){
+		return dojo.attr(item, "value");
+	},
+
+	fetchItemByIdentity: function(/* Object */ args){
+		//	summary:
+		//		Given the identity of an item, this method returns the item that has
+		//		that identity through the onItem callback.
+		//		Refer to dojo.data.api.Identity.fetchItemByIdentity() for more details.
+		//
+		//	description:
+		//		Given arguments like:
+		//
+		//	|		{identity: "CA", onItem: function(item){...}
+		//
+		//		Call `onItem()` with the DOM node `<option value="CA">California</option>`
+		var item = dojo.query("option[value='" + args.identity + "']", this.root)[0];
+		args.onItem(item);
+	},
+	
+	fetchSelectedItem: function(){
+		//	summary:
+		//		Get the option marked as selected, like `<option selected>`.
+		//		Not part of dojo.data API.
+		var root = this.root,
+			si = root.selectedIndex;
+		return dojo.query("> option:nth-child(" +
+			(si != -1 ? si+1 : 1) + ")",
+			root)[0];	// dojo.data.Item
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/CurrencyTextBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/CurrencyTextBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/CurrencyTextBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,51 @@
+if(!dojo._hasResource["dijit.form.CurrencyTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.CurrencyTextBox"] = true;
+dojo.provide("dijit.form.CurrencyTextBox");
+
+//FIXME: dojo.experimental throws an unreadable exception?
+//dojo.experimental("dijit.form.CurrencyTextBox");
+
+dojo.require("dojo.currency");
+dojo.require("dijit.form.NumberTextBox");
+
+dojo.declare(
+	"dijit.form.CurrencyTextBox",
+	dijit.form.NumberTextBox,
+	{
+		// summary:
+		//		A validating currency textbox
+		//
+		// constraints: dijit.form._DateTimeTextBox.__Constraints 
+		//
+		// currency: String
+		//		the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+		currency: "",
+
+		/*=====
+		constraints: {},
+		======*/
+
+		regExpGen: dojo.currency.regexp,
+		_formatter: dojo.currency.format,
+/*=====
+		parse: function(value, constraints){
+			//	summary: parses the value as a Currency, according to constraints
+			//	value: String
+			//
+			//	constraints: dojo.currency.__ParseOptions
+		},
+=====*/
+		parse: dojo.currency.parse,
+
+		postMixInProperties: function(){
+			if(this.constraints === dijit.form.ValidationTextBox.prototype.constraints){
+				// declare a constraints property on 'this' so we don't overwrite the shared default object in 'prototype'
+				this.constraints = {};
+			}
+			this.constraints.currency = this.currency;
+			dijit.form.CurrencyTextBox.superclass.postMixInProperties.apply(this, arguments);
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/DateTextBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/DateTextBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/DateTextBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,20 @@
+if(!dojo._hasResource["dijit.form.DateTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.DateTextBox"] = true;
+dojo.provide("dijit.form.DateTextBox");
+
+dojo.require("dijit._Calendar");
+dojo.require("dijit.form._DateTimeTextBox");
+
+dojo.declare(
+	"dijit.form.DateTextBox",
+	dijit.form._DateTimeTextBox,
+	{
+		// summary:
+		//		A validating, serializable, range-bound date text box with a popup calendar
+
+		popupClass: "dijit._Calendar",
+		_selector: "date"
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/FilteringSelect.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/FilteringSelect.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/FilteringSelect.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,241 @@
+if(!dojo._hasResource["dijit.form.FilteringSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.FilteringSelect"] = true;
+dojo.provide("dijit.form.FilteringSelect");
+
+dojo.require("dijit.form.ComboBox");
+
+dojo.declare(
+	"dijit.form.FilteringSelect",
+	[dijit.form.MappedTextBox, dijit.form.ComboBoxMixin],
+	{
+		// summary
+		// An enhanced version of the HTML SELECT tag, populated dynamically
+		//
+		// description
+		// An enhanced version of the HTML SELECT tag, populated dynamically. It works
+		// very nicely with very large data sets because it can load and page data as needed.
+		// It also resembles ComboBox, but does not allow values outside of the provided ones.
+		//  
+		// Similar features:
+		//  - There is a drop down list of possible values.
+		//	- You can only enter a value from the drop down list.  (You can't
+		//	  enter an arbitrary value.)
+		//	- The value submitted with the form is the hidden value (ex: CA),
+		//	  not the displayed value a.k.a. label (ex: California)
+		// 
+		//	Enhancements over plain HTML version:
+		//	- If you type in some text then it will filter down the list of
+		//	  possible values in the drop down list.
+		//	- List can be specified either as a static list or via a javascript
+		//	  function (that can get the list from a server)
+		//
+		// searchAttr: String
+		//		Searches pattern match against this field
+		//
+		// labelAttr: String
+		//		Optional.  The text that actually appears in the drop down.
+		//		If not specified, the searchAttr text is used instead.
+		labelAttr: "",
+
+		// labelType: String
+		//		"html" or "text"
+		labelType: "text",
+
+		_isvalid:true,
+
+		_lastDisplayedValue: "",
+
+		isValid:function(){
+			return this._isvalid;
+		},
+
+		_callbackSetLabel: function(	/*Array*/ result, 
+						/*Object*/ dataObject, 
+						/*Boolean?*/ priorityChange){
+			// summary:
+			//		Callback function that dynamically sets the label of the
+			//		ComboBox
+
+			// setValue does a synchronous lookup,
+			// so it calls _callbackSetLabel directly,
+			// and so does not pass dataObject
+			// dataObject==null means do not test the lastQuery, just continue
+			if(dataObject && dataObject.query[this.searchAttr] != this._lastQuery){
+				return;
+			}
+			if(!result.length){
+				//#3268: do nothing on bad input
+				//this._setValue("", "");
+				//#3285: change CSS to indicate error
+				if(!this._focused){ this.valueNode.value=""; }
+				dijit.form.TextBox.superclass.setValue.call(this, undefined, !this._focused);
+				this._isvalid=false;
+				this.validate(this._focused);
+			}else{
+				this._setValueFromItem(result[0], priorityChange);
+			}
+		},
+
+		_openResultList: function(/*Object*/ results, /*Object*/ dataObject){
+			// #3285: tap into search callback to see if user's query resembles a match
+			if(dataObject.query[this.searchAttr] != this._lastQuery){
+				return;
+			}
+			this._isvalid = results.length != 0; // FIXME: should this be greater-than?
+			this.validate(true);
+			dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments);
+		},
+
+		getValue:function(){
+			// don't get the textbox value but rather the previously set hidden value
+			return this.valueNode.value;
+		},
+
+		_getValueField:function(){
+			// used for option tag selects
+			return "value";
+		},
+
+		_setValue:function(	/*String*/ value, 
+					/*String*/ displayedValue, 
+					/*Boolean?*/ priorityChange){
+			this.valueNode.value = value;
+			dijit.form.FilteringSelect.superclass.setValue.call(this, value, priorityChange, displayedValue);
+			this._lastDisplayedValue = displayedValue;
+		},
+
+		setValue: function(/*String*/ value, /*Boolean?*/ priorityChange){
+			// summary
+			//	Sets the value of the select.
+			//	Also sets the label to the corresponding value by reverse lookup.
+
+			//#3347: fetchItemByIdentity if no keyAttr specified
+			var self=this;
+			var handleFetchByIdentity = function(item, priorityChange){
+				if(item){
+					if(self.store.isItemLoaded(item)){
+						self._callbackSetLabel([item], undefined, priorityChange);
+					}else{
+						self.store.loadItem({
+							item: item, 
+							onItem: function(result, dataObject){
+								self._callbackSetLabel(result, dataObject, priorityChange);
+							}
+						});
+					}
+				}else{
+					self._isvalid=false;
+					// prevent errors from Tooltip not being created yet
+					self.validate(false);
+				}
+			}
+			this.store.fetchItemByIdentity({
+				identity: value, 
+				onItem: function(item){
+					handleFetchByIdentity(item, priorityChange);
+				}
+			});
+		},
+
+		_setValueFromItem: function(/*item*/ item, /*Boolean?*/ priorityChange){
+			//	summary:
+			//		Set the displayed valued in the input box, based on a
+			//		selected item.
+			//	description:
+			//		Users shouldn't call this function; they should be calling
+			//		setDisplayedValue() instead
+			this._isvalid=true;
+			this._setValue(	this.store.getIdentity(item), 
+							this.labelFunc(item, this.store), 
+							priorityChange);
+		},
+
+		labelFunc: function(/*item*/ item, /*dojo.data.store*/ store){
+			// summary: Event handler called when the label changes
+			// return: the label that the ComboBox should display
+			return store.getValue(item, this.searchAttr);
+		},
+
+		_doSelect: function(/*Event*/ tgt){
+			// summary:
+			//		ComboBox's menu callback function
+			//	description:
+			//		FilteringSelect overrides this to set both the visible and
+			//		hidden value from the information stored in the menu
+			this.item = tgt.item;
+			this._setValueFromItem(tgt.item, true);
+		},
+
+		setDisplayedValue:function(/*String*/ label, /*Boolean?*/ priorityChange){
+			// summary:
+			//		Set textbox to display label. Also performs reverse lookup
+			//		to set the hidden value. Used in InlineEditBox
+
+			if(this.store){
+				var query = dojo.clone(this.query); // #6196: populate query with user-specifics
+				this._lastQuery = query[this.searchAttr] = label;
+				// if the label is not valid, the callback will never set it,
+				// so the last valid value will get the warning textbox set the
+				// textbox value now so that the impending warning will make
+				// sense to the user
+				this.textbox.value = label;
+				this._lastDisplayedValue = label;
+				var _this = this;
+				this.store.fetch({
+					query: query, 
+					queryOptions: {
+						ignoreCase: this.ignoreCase, 
+						deep: true
+					}, 
+					onComplete: function(result, dataObject){
+						        dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange);
+					},
+					onError: function(errText){
+						console.error('dijit.form.FilteringSelect: ' + errText);
+						dojo.hitch(_this, "_setValue")(undefined, label, false);
+					}
+				});
+			}
+		},
+
+		_getMenuLabelFromItem:function(/*Item*/ item){
+			// internal function to help ComboBoxMenu figure out what to display
+			if(this.labelAttr){
+				return {
+					html: this.labelType=="html", 
+					label: this.store.getValue(item, this.labelAttr)
+				};
+			}else{
+				// because this function is called by ComboBoxMenu,
+				// this.inherited tries to find the superclass of ComboBoxMenu
+				return dijit.form.ComboBoxMixin.prototype._getMenuLabelFromItem.apply(this, arguments);
+			}
+		},
+
+		postMixInProperties: function(){
+			// FIXME: shouldn't this just be a call to inherited?
+			dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this, arguments);
+			dijit.form.MappedTextBox.prototype.postMixInProperties.apply(this, arguments);
+		},
+
+		postCreate: function(){
+			dijit.form.ComboBoxMixin.prototype._postCreate.apply(this, arguments);
+			dijit.form.MappedTextBox.prototype.postCreate.apply(this, arguments);
+		},
+		
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			dijit.form.MappedTextBox.prototype.setAttribute.apply(this, arguments);
+			dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this, arguments);
+		},
+
+		undo: function(){
+			this.setDisplayedValue(this._lastDisplayedValue);
+		},
+
+		_valueChanged: function(){
+			return this.getDisplayedValue()!=this._lastDisplayedValue;
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/Form.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/Form.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/Form.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,384 @@
+if(!dojo._hasResource["dijit.form.Form"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Form"] = true;
+dojo.provide("dijit.form.Form");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.form._FormMixin", null,
+	{
+	//
+	//	summary:
+	//		Widget corresponding to HTML form tag, for validation and serialization
+	//
+	//	example:
+	//	|	<form dojoType="dijit.form.Form" id="myForm">
+	//	|		Name: <input type="text" name="name" />
+	//	|	</form>
+	//	|	myObj = {name: "John Doe"};
+	//	|	dijit.byId('myForm').setValues(myObj);
+	//	|
+	//	|	myObj=dijit.byId('myForm').getValues();
+
+	//	TODO:
+	//	* Repeater
+	//	* better handling for arrays.  Often form elements have names with [] like
+	//	* people[3].sex (for a list of people [{name: Bill, sex: M}, ...])
+	//
+	//	
+
+		reset: function(){
+			dojo.forEach(this.getDescendants(), function(widget){
+				if(widget.reset){
+					widget.reset();
+				}
+			});
+		},
+
+		validate: function(){
+			// summary: returns if the form is valid - same as isValid - but
+			//			provides a few additional (ui-specific) features.
+			//			1 - it will highlight any sub-widgets that are not
+			//				valid
+			//			2 - it will call focus() on the first invalid 
+			//				sub-widget
+			var didFocus = false;
+			return dojo.every(dojo.map(this.getDescendants(), function(widget){
+				// Need to set this so that "required" widgets get their 
+				// state set.
+				widget._hasBeenBlurred = true;
+				var valid = !widget.validate || widget.validate();
+				if (!valid && !didFocus) {
+					// Set focus of the first non-valid widget
+					dijit.scrollIntoView(widget.containerNode||widget.domNode);
+					widget.focus();
+					didFocus = true;
+				}
+	 			return valid;
+	 		}), "return item;");
+		},
+		
+		setValues: function(/*object*/obj){
+			// summary: fill in form values from a JSON structure
+
+			// generate map from name --> [list of widgets with that name]
+			var map = { };
+			dojo.forEach(this.getDescendants(), function(widget){
+				if(!widget.name){ return; }
+				var entry = map[widget.name] || (map[widget.name] = [] );
+				entry.push(widget);
+			});
+
+			// call setValue() or setAttribute('checked') for each widget, according to obj
+			for(var name in map){
+				var widgets = map[name],						// array of widgets w/this name
+					values = dojo.getObject(name, false, obj);	// list of values for those widgets
+				if(!dojo.isArray(values)){
+					values = [ values ];
+				}
+				if(typeof widgets[0].checked == 'boolean'){
+					// for checkbox/radio, values is a list of which widgets should be checked
+					dojo.forEach(widgets, function(w, i){
+						w.setValue(dojo.indexOf(values, w.value) != -1);
+					});
+				}else if(widgets[0]._multiValue){
+					// it takes an array (e.g. multi-select)
+					widgets[0].setValue(values);
+				}else{
+					// otherwise, values is a list of values to be assigned sequentially to each widget
+					dojo.forEach(widgets, function(w, i){
+						w.setValue(values[i]);
+					});					
+				}
+			}
+
+			/***
+			 * 	TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets)
+
+			dojo.forEach(this.containerNode.elements, function(element){
+				if (element.name == ''){return};	// like "continue"	
+				var namePath = element.name.split(".");
+				var myObj=obj;
+				var name=namePath[namePath.length-1];
+				for(var j=1,len2=namePath.length;j<len2;++j){
+					var p=namePath[j - 1];
+					// repeater support block
+					var nameA=p.split("[");
+					if (nameA.length > 1){
+						if(typeof(myObj[nameA[0]]) == "undefined"){
+							myObj[nameA[0]]=[ ];
+						} // if
+
+						nameIndex=parseInt(nameA[1]);
+						if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){
+							myObj[nameA[0]][nameIndex] = { };
+						}
+						myObj=myObj[nameA[0]][nameIndex];
+						continue;
+					} // repeater support ends
+
+					if(typeof(myObj[p]) == "undefined"){
+						myObj=undefined;
+						break;
+					};
+					myObj=myObj[p];
+				}
+
+				if (typeof(myObj) == "undefined"){
+					return;		// like "continue"
+				}
+				if (typeof(myObj[name]) == "undefined" && this.ignoreNullValues){
+					return;		// like "continue"
+				}
+
+				// TODO: widget values (just call setValue() on the widget)
+
+				switch(element.type){
+					case "checkbox":
+						element.checked = (name in myObj) &&
+							dojo.some(myObj[name], function(val){ return val==element.value; });
+						break;
+					case "radio":
+						element.checked = (name in myObj) && myObj[name]==element.value;
+						break;
+					case "select-multiple":
+						element.selectedIndex=-1;
+						dojo.forEach(element.options, function(option){
+							option.selected = dojo.some(myObj[name], function(val){ return option.value == val; });
+						});
+						break;
+					case "select-one":
+						element.selectedIndex="0";
+						dojo.forEach(element.options, function(option){
+							option.selected = option.value == myObj[name];
+						});
+						break;
+					case "hidden":
+					case "text":
+					case "textarea":
+					case "password":
+						element.value = myObj[name] || "";
+						break;
+				}
+	  		});
+	  		*/
+		},
+
+		getValues: function(){
+			// summary: generate JSON structure from form values
+
+			// get widget values
+			var obj = { };
+			dojo.forEach(this.getDescendants(), function(widget){
+				var name = widget.name;
+				if(!name){ return; }
+
+				// Single value widget (checkbox, radio, or plain <input> type widget
+				var value = (widget.getValue && !widget._getValueDeprecated) ? widget.getValue() : widget.value;
+
+				// Store widget's value(s) as a scalar, except for checkboxes which are automatically arrays
+				if(typeof widget.checked == 'boolean'){
+					if(/Radio/.test(widget.declaredClass)){
+						// radio button
+						if(value !== false){
+							dojo.setObject(name, value, obj);
+						}
+					}else{
+						// checkbox/toggle button
+						var ary=dojo.getObject(name, false, obj);
+						if(!ary){
+							ary=[];
+							dojo.setObject(name, ary, obj);
+						}
+						if(value !== false){
+							ary.push(value);
+						}
+					}
+				}else{
+					// plain input
+					dojo.setObject(name, value, obj);
+				}
+			});
+
+			/***
+			 * code for plain input boxes (see also dojo.formToObject, can we use that instead of this code?
+			 * but it doesn't understand [] notation, presumably)
+			var obj = { };
+			dojo.forEach(this.containerNode.elements, function(elm){
+				if (!elm.name)	{
+					return;		// like "continue"
+				}
+				var namePath = elm.name.split(".");
+				var myObj=obj;
+				var name=namePath[namePath.length-1];
+				for(var j=1,len2=namePath.length;j<len2;++j){
+					var nameIndex = null;
+					var p=namePath[j - 1];
+					var nameA=p.split("[");
+					if (nameA.length > 1){
+						if(typeof(myObj[nameA[0]]) == "undefined"){
+							myObj[nameA[0]]=[ ];
+						} // if
+						nameIndex=parseInt(nameA[1]);
+						if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){
+							myObj[nameA[0]][nameIndex] = { };
+						}
+					} else if(typeof(myObj[nameA[0]]) == "undefined"){
+						myObj[nameA[0]] = { }
+					} // if
+
+					if (nameA.length == 1){
+						myObj=myObj[nameA[0]];
+					} else{
+						myObj=myObj[nameA[0]][nameIndex];
+					} // if
+				} // for
+
+				if ((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type=="radio" && elm.checked)){
+					if(name == name.split("[")[0]){
+						myObj[name]=elm.value;
+					} else{
+						// can not set value when there is no name
+					}
+				} else if (elm.type == "checkbox" && elm.checked){
+					if(typeof(myObj[name]) == 'undefined'){
+						myObj[name]=[ ];
+					}
+					myObj[name].push(elm.value);
+				} else if (elm.type == "select-multiple"){
+					if(typeof(myObj[name]) == 'undefined'){
+						myObj[name]=[ ];
+					}
+					for (var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){
+						if (elm.options[jdx].selected){
+							myObj[name].push(elm.options[jdx].value);
+						}
+					}
+				} // if
+				name=undefined;
+			}); // forEach
+			***/
+			return obj;
+		},
+
+		// TODO: ComboBox might need time to process a recently input value.  This should be async?
+	 	isValid: function(){
+	 		// summary: make sure that every widget that has a validator function returns true
+	 		return dojo.every(this.getDescendants(), function(widget){
+	 			return !widget.isValid || widget.isValid();
+	 		});
+		}
+	});
+
+dojo.declare(
+	"dijit.form.Form",
+	[dijit._Widget, dijit._Templated, dijit.form._FormMixin],
+	{
+		// summary:
+		// Adds conveniences to regular HTML form
+
+		// HTML <FORM> attributes
+		name: "",
+		action: "",
+		method: "",
+		encType: "",
+		"accept-charset": "",
+		accept: "",
+		target: "",
+
+		templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' name='${name}'></form>",
+
+		attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+			{action: "", method: "", encType: "", "accept-charset": "", accept: "", target: ""}),
+
+		execute: function(/*Object*/ formContents){
+			//	summary:
+			//		Deprecated: use submit()
+		},
+
+		onExecute: function(){
+			// summary:
+			//		Deprecated: use onSubmit()
+		},
+
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			this.inherited(arguments);
+			switch(attr){
+				case "encType":
+					if(dojo.isIE){ this.domNode.encoding = value; }
+			}
+		},
+
+		postCreate: function(){
+			// IE tries to hide encType
+			if(dojo.isIE && this.srcNodeRef && this.srcNodeRef.attributes){
+				var item = this.srcNodeRef.attributes.getNamedItem('encType');
+				if(item && !item.specified && (typeof item.value == "string")){
+					this.setAttribute('encType', item.value);
+				}
+			}
+			this.inherited(arguments);
+		},
+
+		onReset: function(/*Event?*/e){ 
+			//	summary:
+			//		Callback when user resets the form. This method is intended
+			//		to be over-ridden. When the `reset` method is called
+			//		programmatically, the return value from `onReset` is used
+			//		to compute whether or not resetting should proceed
+			return true; // Boolean
+		},
+
+		_onReset: function(e){
+			// create fake event so we can know if preventDefault() is called
+			var faux = {
+				returnValue: true, // the IE way
+				preventDefault: function(){  // not IE
+							this.returnValue = false;
+						},
+				stopPropagation: function(){}, currentTarget: e.currentTarget, target: e.target
+			};
+			// if return value is not exactly false, and haven't called preventDefault(), then reset
+			if(!(this.onReset(faux) === false) && faux.returnValue){
+				this.reset();
+			}
+			dojo.stopEvent(e);
+			return false;
+		},
+
+		_onSubmit: function(e){
+			var fp = dijit.form.Form.prototype;
+			// TODO: remove ths if statement beginning with 2.0
+			if(this.execute != fp.execute || this.onExecute != fp.onExecute){
+				dojo.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.", "", "2.0");
+				this.onExecute();
+				this.execute(this.getValues());
+			}
+			if(this.onSubmit(e) === false){ // only exactly false stops submit
+				dojo.stopEvent(e);
+			}
+		},
+		
+		onSubmit: function(/*Event?*/e){ 
+			//	summary:
+			//		Callback when user submits the form. This method is
+			//		intended to be over-ridden, but by default it checks and
+			//		returns the validity of form elements. When the `submit`
+			//		method is called programmatically, the return value from
+			//		`onSubmit` is used to compute whether or not submission
+			//		should proceed
+
+			return this.isValid(); // Boolean
+		},
+
+		submit: function(){
+			// summary:
+			//		programmatically submit form if and only if the `onSubmit` returns true
+			if(!(this.onSubmit() === false)){
+				this.containerNode.submit();
+			}
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/MultiSelect.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/MultiSelect.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/MultiSelect.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,84 @@
+if(!dojo._hasResource["dijit.form.MultiSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.MultiSelect"] = true;
+dojo.provide("dijit.form.MultiSelect");
+
+dojo.require("dijit.form._FormWidget");
+
+dojo.declare("dijit.form.MultiSelect",dijit.form._FormWidget,{
+	// summary: Wrapper for a native select multiple="true" element to
+	//		interact with dijit.form.Form
+
+	// size: Number
+	//		Number of elements to display on a page
+	//		NOTE: may be removed in version 2.0, since elements may have variable height;
+	//		set the size via style="..." or CSS class names instead.
+	size: 7,
+	
+	templateString: "<select multiple='true' dojoAttachPoint='containerNode,focusNode' dojoAttachEvent='onchange: _onChange'></select>",
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+		{size:"focusNode"}),
+
+	addSelected: function(/* dijit.form.MultiSelect */select){
+		// summary: Move the selected nodes af an passed Select widget
+		//			instance to this Select widget.
+		//
+		// example:
+		// |	// move all the selected values from "bar" to "foo"
+		// | 	dijit.byId("foo").addSelected(dijit.byId("bar"));
+		
+		select.getSelected().forEach(function(n){
+			this.containerNode.appendChild(n);
+		},this);
+	},
+					
+	getSelected: function(){
+		// summary: Access the NodeList of the selected options directly
+		return dojo.query("option",this.containerNode).filter(function(n){
+			return n.selected; // Boolean
+		});
+	},
+	
+	_getValueDeprecated: false, // remove when _FormWidget:_getValueDeprecated is removed in 2.0
+	getValue: function(){
+		// summary: Returns an array of the selected options' values
+		return this.getSelected().map(function(n){
+			return n.value;
+		});
+	},
+	
+	_multiValue: true, // for Form
+	setValue: function(/* Array */values){
+		// summary: Set the value(s) of this Select based on passed values
+		dojo.query("option",this.containerNode).forEach(function(n){
+			n.selected = (dojo.indexOf(values,n.value) != -1);
+		});
+	},
+		
+	invertSelection: function(onChange){
+		// summary: Invert the selection
+		// onChange: Boolean
+		//		If null, onChange is not fired.
+		dojo.query("option",this.containerNode).forEach(function(n){
+			n.selected = !n.selected;
+		});
+		this._handleOnChange(this.getValue(), onChange==true);
+	},
+
+	_onChange: function(/*Event*/ e){
+		this._handleOnChange(this.getValue(), true);
+	},
+	
+	// for layout widgets:
+	resize: function(/* Object */size){
+		if(size){
+			dojo.marginBox(this.domNode, size);
+		}
+	},
+	
+	postCreate: function(){
+		this._onChange();
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/NumberSpinner.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/NumberSpinner.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/NumberSpinner.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,31 @@
+if(!dojo._hasResource["dijit.form.NumberSpinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.NumberSpinner"] = true;
+dojo.provide("dijit.form.NumberSpinner");
+
+dojo.require("dijit.form._Spinner");
+dojo.require("dijit.form.NumberTextBox");
+
+dojo.declare(
+"dijit.form.NumberSpinner",
+[dijit.form._Spinner, dijit.form.NumberTextBoxMixin],
+{
+	// summary:
+	// extends NumberTextBox to add up/down arrows for incremental change to the value
+
+	required: true,
+
+	adjust: function(/* Object */ val, /*Number*/ delta){
+		// summary: change Number val by the given amount
+		var newval = val+delta;
+		if(isNaN(val) || isNaN(newval)){ return val; }
+		if((typeof this.constraints.max == "number") && (newval > this.constraints.max)){
+			newval = this.constraints.max;
+		}
+		if((typeof this.constraints.min == "number") && (newval < this.constraints.min)){
+			newval = this.constraints.min;
+		}
+		return newval;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/NumberTextBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/NumberTextBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/NumberTextBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,79 @@
+if(!dojo._hasResource["dijit.form.NumberTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.NumberTextBox"] = true;
+dojo.provide("dijit.form.NumberTextBox");
+
+dojo.require("dijit.form.ValidationTextBox");
+dojo.require("dojo.number");
+
+/*=====
+dojo.declare(
+	"dijit.form.NumberTextBox.__Constraints",
+	[dijit.form.RangeBoundTextBox.__Constraints, dojo.number.__FormatOptions, dojo.number.__ParseOptions]
+);
+=====*/
+
+dojo.declare(
+	"dijit.form.NumberTextBoxMixin",
+	null,
+	{
+		// summary:
+		//		A mixin for all number textboxes
+
+		regExpGen: dojo.number.regexp,
+
+		/*=====
+		// constraints: dijit.form.NumberTextBox.__Constraints 
+		constraints: {},
+		======*/
+
+		// editOptions: Object
+		//		properties to mix into constraints when the value is being edited
+		editOptions: { pattern: '#.######' },
+
+		_onFocus: function(){
+			this.setValue(this.getValue(), false);	
+			this.inherited(arguments);
+		},
+
+		_formatter: dojo.number.format,
+
+		format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){
+			//	summary: formats the value as a Number, according to constraints
+
+			if(typeof value == "string") { return value; }
+			if(isNaN(value)){ return ""; }
+			if(this.editOptions && this._focused){
+				constraints = dojo.mixin(dojo.mixin({}, this.editOptions), this.constraints);
+			}
+			return this._formatter(value, constraints);
+		},
+
+		parse: dojo.number.parse,
+		/*=====
+		parse: function(value, constraints){
+			//	summary: parses the value as a Number, according to constraints
+			//	value: String
+			//
+			//	constraints: dojo.number.__ParseOptions
+		},
+		=====*/
+
+		filter: function(/*Number*/ value){
+			if(typeof value == "string"){ return this.inherited('filter', arguments); }
+			return isNaN(value) ? '' : value;
+		},
+
+		value: NaN
+	}
+);
+
+dojo.declare(
+	"dijit.form.NumberTextBox",
+	[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],
+	{
+		// summary:
+		//		A validating, serializable, range-bound text box.
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/SimpleTextarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/SimpleTextarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/SimpleTextarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,50 @@
+if(!dojo._hasResource["dijit.form.SimpleTextarea"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.SimpleTextarea"] = true;
+dojo.provide("dijit.form.SimpleTextarea");
+
+dojo.require("dijit.form._FormWidget");
+
+dojo.declare("dijit.form.SimpleTextarea",
+	dijit.form._FormValueWidget,
+{
+	// summary:
+	//		A simple textarea that degrades, and responds to
+	// 		minimal LayoutContainer usage, and works with dijit.form.Form.
+	//		Doesn't automatically size according to input, like Textarea.
+	//
+	// example:
+	//	|	<textarea dojoType="dijit.form.SimpleTextarea" name="foo" value="bar" rows=30 cols=40/>
+	//
+
+	baseClass: "dijitTextArea",
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+		{rows:"focusNode", cols: "focusNode"}),
+
+	// rows: Number
+	//		The number of rows of text.
+	rows: "",
+
+	// rows: Number
+	//		The number of characters per line.
+	cols: "",
+
+	templateString: "<textarea name='${name}' dojoAttachPoint='focusNode,containerNode'>",
+
+	postMixInProperties: function(){
+		if(this.srcNodeRef){
+			this.value = this.srcNodeRef.value;
+		}
+	},
+
+	setValue: function(/*String*/ val){
+		this.domNode.value = val;
+		this.inherited(arguments);
+	},
+
+	getValue: function(){
+		return this.domNode.value.replace(/\r/g,"");
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/Slider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/Slider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/Slider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,481 @@
+if(!dojo._hasResource["dijit.form.Slider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Slider"] = true;
+dojo.provide("dijit.form.Slider");
+
+dojo.require("dijit.form._FormWidget");
+dojo.require("dijit._Container");
+dojo.require("dojo.dnd.move");
+dojo.require("dijit.form.Button");
+dojo.require("dojo.number");
+dojo.require("dojo._base.fx");
+
+dojo.declare(
+	"dijit.form.HorizontalSlider",
+	[dijit.form._FormValueWidget, dijit._Container],
+{
+	// summary
+	//	A form widget that allows one to select a value with a horizontally draggable image
+
+	templateString:"<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"decrementButton\" dojoAttachEvent=\"onclick: decrement\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper dijitSliderLeftBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><div waiRole=\"presentation\" style=\"position:relative;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable dijitSliderMoveableH\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleH\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" dojoAttachEvent=\"onclick:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper dijitSliderRightBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\" style=\"right:0px;\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick: increment\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,bottomDecoration\" class=\"dijitReset\" style=\"text-align:center;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n",
+	value: 0,
+
+	// showButtons: boolean
+	//	Show increment/decrement buttons at the ends of the slider?
+	showButtons: true,
+
+	// minimum:: integer
+	//	The minimum value allowed.
+	minimum: 0,
+
+	// maximum: integer
+	//	The maximum allowed value.
+	maximum: 100,
+
+	// discreteValues: integer
+	//	The maximum allowed values dispersed evenly between minimum and maximum (inclusive).
+	discreteValues: Infinity,
+
+	// pageIncrement: integer
+	//	The amount of change with shift+arrow
+	pageIncrement: 2,
+
+	// clickSelect: boolean
+	//	If clicking the progress bar changes the value or not
+	clickSelect: true,
+
+	// slideDuration: Number
+	//	The time in ms to take to animate the slider handle from 0% to 100%
+	slideDuration: 1000,
+
+	widgetsInTemplate: true,
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+		{id:"", name:"valueNode"}),
+
+	baseClass: "dijitSlider",
+
+	_mousePixelCoord: "pageX",
+	_pixelCount: "w",
+	_startingPixelCoord: "x",
+	_startingPixelCount: "l",
+	_handleOffsetCoord: "left",
+	_progressPixelSize: "width",
+
+	_onKeyPress: function(/*Event*/ e){
+		if(this.disabled || this.readOnly || e.altKey || e.ctrlKey){ return; }
+		switch(e.keyCode){
+			case dojo.keys.HOME:
+				this.setValue(this.minimum, true);
+				break;
+			case dojo.keys.END:
+				this.setValue(this.maximum, true);
+				break;
+			// this._descending === false: if ascending vertical (min on top)
+			// (this._descending || this.isLeftToRight()): if left-to-right horizontal or descending vertical
+			case ((this._descending || this.isLeftToRight()) ? dojo.keys.RIGHT_ARROW : dojo.keys.LEFT_ARROW):
+			case (this._descending === false ? dojo.keys.DOWN_ARROW : dojo.keys.UP_ARROW):
+			case (this._descending === false ? dojo.keys.PAGE_DOWN : dojo.keys.PAGE_UP):
+				this.increment(e);
+				break;
+			case ((this._descending || this.isLeftToRight()) ? dojo.keys.LEFT_ARROW : dojo.keys.RIGHT_ARROW):
+			case (this._descending === false ? dojo.keys.UP_ARROW : dojo.keys.DOWN_ARROW):
+			case (this._descending === false ? dojo.keys.PAGE_UP : dojo.keys.PAGE_DOWN):
+				this.decrement(e);
+				break;
+			default:
+				this.inherited(arguments);
+				return;
+		}
+		dojo.stopEvent(e);
+	},
+
+	_onHandleClick: function(e){
+		if(this.disabled || this.readOnly){ return; }
+		if(!dojo.isIE){
+			// make sure you get focus when dragging the handle
+			// (but don't do on IE because it causes a flicker on mouse up (due to blur then focus)
+			dijit.focus(this.sliderHandle);
+		}
+		dojo.stopEvent(e);
+	},
+	
+	_isReversed: function(){
+		return !this.isLeftToRight();
+	},
+
+	_onBarClick: function(e){
+		if(this.disabled || this.readOnly || !this.clickSelect){ return; }
+		dijit.focus(this.sliderHandle);
+		dojo.stopEvent(e);
+		var abspos = dojo.coords(this.sliderBarContainer, true);
+		var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord];
+		this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true);
+	},
+
+	_setPixelValue: function(/*Number*/ pixelValue, /*Number*/ maxPixels, /*Boolean, optional*/ priorityChange){
+		if(this.disabled || this.readOnly){ return; }
+		pixelValue = pixelValue < 0 ? 0 : maxPixels < pixelValue ? maxPixels : pixelValue;
+		var count = this.discreteValues;
+		if(count <= 1 || count == Infinity){ count = maxPixels; }
+		count--;
+		var pixelsPerValue = maxPixels / count;
+		var wholeIncrements = Math.round(pixelValue / pixelsPerValue);
+		this.setValue((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, priorityChange);
+	},
+
+	setValue: function(/*Number*/ value, /*Boolean, optional*/ priorityChange){
+		this.valueNode.value = this.value = value;
+		dijit.setWaiState(this.focusNode, "valuenow", value);
+		this.inherited(arguments);
+		var percent = (value - this.minimum) / (this.maximum - this.minimum);
+		var progressBar = (this._descending === false) ? this.remainingBar : this.progressBar;
+		var remainingBar = (this._descending === false) ? this.progressBar : this.remainingBar;
+		if(priorityChange && this.slideDuration > 0 && progressBar.style[this._progressPixelSize]){
+			// animate the slider
+			var _this = this;
+			var props = {};
+			var start = parseFloat(progressBar.style[this._progressPixelSize]);
+			var duration = this.slideDuration * (percent-start/100);
+			if(duration == 0){ return; }
+			if(duration < 0){ duration = 0 - duration; }
+			props[this._progressPixelSize] = { start: start, end: percent*100, units:"%" };
+			dojo.animateProperty({ node: progressBar, duration: duration, 
+				onAnimate: function(v){ remainingBar.style[_this._progressPixelSize] = (100-parseFloat(v[_this._progressPixelSize])) + "%"; },
+			        properties: props
+			}).play();
+		}
+		else{
+			progressBar.style[this._progressPixelSize] = (percent*100) + "%";
+			remainingBar.style[this._progressPixelSize] = ((1-percent)*100) + "%";
+		}
+	},
+
+	_bumpValue: function(signedChange){
+		if(this.disabled || this.readOnly){ return; }
+		var s = dojo.getComputedStyle(this.sliderBarContainer);
+		var c = dojo._getContentBox(this.sliderBarContainer, s);
+		var count = this.discreteValues;
+		if(count <= 1 || count == Infinity){ count = c[this._pixelCount]; }
+		count--;
+		var value = (this.value - this.minimum) * count / (this.maximum - this.minimum) + signedChange;
+		if(value < 0){ value = 0; }
+		if(value > count){ value = count; }
+		value = value * (this.maximum - this.minimum) / count + this.minimum;
+		this.setValue(value, true);
+	},
+
+	_onClkIncBumper: function(){
+		this.setValue(this._descending === false ? this.minimum : this.maximum, true);
+	},
+
+	_onClkDecBumper: function(){
+		this.setValue(this._descending === false ? this.maximum : this.minimum, true);
+	},
+
+	decrement: function(e){
+		// summary
+		//	decrement slider by 1 unit
+		this._bumpValue(e.keyCode == dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);
+	},
+
+	increment: function(e){
+		// summary
+		//	increment slider by 1 unit
+		this._bumpValue(e.keyCode == dojo.keys.PAGE_UP?this.pageIncrement:1);
+	},
+
+	_mouseWheeled: function(/*Event*/ evt){
+		dojo.stopEvent(evt);
+		var scrollAmount = 0;
+		if(typeof evt.wheelDelta == 'number'){ // IE
+			scrollAmount = evt.wheelDelta;
+		}else if(typeof evt.detail == 'number'){ // Mozilla+Firefox
+			scrollAmount = -evt.detail;
+		}
+		if(scrollAmount > 0){
+			this.increment(evt);
+		}else if(scrollAmount < 0){
+			this.decrement(evt);
+		}
+	},
+
+	startup: function(){
+		dojo.forEach(this.getChildren(), function(child){
+			if(this[child.container] != this.containerNode){
+				this[child.container].appendChild(child.domNode);
+			}
+		}, this);
+	},
+
+	postCreate: function(){
+		if(this.showButtons){
+			this.incrementButton.style.display="";
+			this.decrementButton.style.display="";
+		}
+		this.connect(this.domNode, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+
+		// define a custom constructor for a SliderMover that points back to me
+		var _self = this;
+		var mover = function(){
+			dijit.form._SliderMover.apply(this, arguments);
+			this.widget = _self;
+		};
+		dojo.extend(mover, dijit.form._SliderMover.prototype);
+
+		this._movable = new dojo.dnd.Moveable(this.sliderHandle, {mover: mover});
+		dijit.setWaiState(this.focusNode, "valuemin", this.minimum);
+		dijit.setWaiState(this.focusNode, "valuemax", this.maximum);
+
+		this.inherited(arguments);
+	},
+
+	destroy: function(){
+		this._movable.destroy();
+		this.inherited(arguments);	
+	}
+});
+
+dojo.declare(
+	"dijit.form.VerticalSlider",
+	dijit.form.HorizontalSlider,
+{
+	// summary
+	//	A form widget that allows one to select a value with a vertically draggable image
+
+	templateString:"<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n><tbody class=\"dijitReset\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick:_topButtonClicked\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper dijitSliderTopBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td dojoAttachPoint=\"leftDecoration\" class=\"dijitReset\" style=\"text-align:center;height:100%;\"></td\n\t\t><td class=\"dijitReset\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><center waiRole=\"presentation\" style=\"position:relative;height:100%;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onclick:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" style=\"vertical-align:top;\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleV\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td dojoAttachPoint=\"containerNode,rightDecoration\" class=\"dijitReset\" style=\"text-align:center;height:100%;\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper dijitSliderBottomBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"decrementButton\" dojoAttachEvent=\"onclick:_bottomButtonClicked\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></tbody></table>\n",
+	_mousePixelCoord: "pageY",
+	_pixelCount: "h",
+	_startingPixelCoord: "y",
+	_startingPixelCount: "t",
+	_handleOffsetCoord: "top",
+	_progressPixelSize: "height",
+
+	// _descending: boolean
+	//      Specifies if the slider values go from high-on-top (true), or low-on-top (false)
+	//	TODO: expose this in 1.2 - the css progress/remaining bar classes need to be reversed
+	_descending: true,
+
+	startup: function(){
+		if(this._started){ return; }
+
+		if(!this.isLeftToRight() && dojo.isMoz){
+			if(this.leftDecoration){this._rtlRectify(this.leftDecoration);}
+			if(this.rightDecoration){this._rtlRectify(this.rightDecoration);}
+		}
+
+		this.inherited(arguments);
+	},
+		
+	_isReversed: function(){
+		return this._descending;
+	},
+
+	_topButtonClicked: function(e){
+		if(this._descending){
+			this.increment(e);
+		}else{
+			this.decrement(e);
+		}
+	},
+
+	_bottomButtonClicked: function(e){
+		if(this._descending){
+			this.decrement(e);
+		}else{
+			this.increment(e);
+		}
+	},
+
+	_rtlRectify: function(decorationNode/*NodeList*/){
+		// summary:
+		//      Rectify children nodes for left/right decoration in rtl case.
+		//		Simply switch the rule and label child for each decoration node.
+		var childNodes = [];
+		while(decorationNode.firstChild){
+				childNodes.push(decorationNode.firstChild);
+				decorationNode.removeChild(decorationNode.firstChild);
+		}
+		for(var i = childNodes.length-1; i >=0; i--){
+			if(childNodes[i]){
+				decorationNode.appendChild(childNodes[i]);
+			}
+		}
+	}
+});
+
+dojo.declare("dijit.form._SliderMover",
+	dojo.dnd.Mover,
+{
+	onMouseMove: function(e){
+		var widget = this.widget;
+		var abspos = widget._abspos;
+		if(!abspos){
+			abspos = widget._abspos = dojo.coords(widget.sliderBarContainer, true);
+			widget._setPixelValue_ = dojo.hitch(widget, "_setPixelValue");
+			widget._isReversed_ = widget._isReversed();
+		}
+		var pixelValue = e[widget._mousePixelCoord] - abspos[widget._startingPixelCoord];
+		widget._setPixelValue_(widget._isReversed_ ? (abspos[widget._pixelCount]-pixelValue) : pixelValue, abspos[widget._pixelCount], false);
+	},
+	
+	destroy: function(e){
+		dojo.dnd.Mover.prototype.destroy.apply(this, arguments);
+		var widget = this.widget;
+		widget.setValue(widget.value, true);
+	}
+});
+
+
+dojo.declare("dijit.form.HorizontalRule", [dijit._Widget, dijit._Templated],
+{
+	//	Summary:
+	//		Create hash marks for the Horizontal slider
+	templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+	// count: Integer
+	//		Number of hash marks to generate
+	count: 3,
+
+	// container: Node
+	//		If this is a child widget, connect it to this parent node
+	container: "containerNode",
+
+	// ruleStyle: String
+	//		CSS style to apply to individual hash marks
+	ruleStyle: "",
+
+	_positionPrefix: '<div class="dijitRuleMark dijitRuleMarkH" style="left:',
+	_positionSuffix: '%;',
+	_suffix: '"></div>',
+
+	_genHTML: function(pos, ndx){
+		return this._positionPrefix + pos + this._positionSuffix + this.ruleStyle + this._suffix;
+	},
+	
+	_isHorizontal: true,
+
+	postCreate: function(){
+		var innerHTML;
+		if(this.count==1){
+			innerHTML = this._genHTML(50, 0);
+		}else{
+			var i;
+			var interval = 100 / (this.count-1);
+			if(!this._isHorizontal || this.isLeftToRight()){
+				innerHTML = this._genHTML(0, 0);
+				for(i=1; i < this.count-1; i++){
+					innerHTML += this._genHTML(interval*i, i);
+				}
+				innerHTML += this._genHTML(100, this.count-1);
+			}else{
+				innerHTML = this._genHTML(100, 0);
+				for(i=1; i < this.count-1; i++){
+					innerHTML += this._genHTML(100-interval*i, i);
+				}
+				innerHTML += this._genHTML(0, this.count-1);
+			}
+		}
+		this.domNode.innerHTML = innerHTML;
+	}
+});
+
+dojo.declare("dijit.form.VerticalRule", dijit.form.HorizontalRule,
+{
+	//	Summary:
+	//		Create hash marks for the Vertical slider
+	templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>',
+	_positionPrefix: '<div class="dijitRuleMark dijitRuleMarkV" style="top:',
+	
+	_isHorizontal: false
+});
+
+dojo.declare("dijit.form.HorizontalRuleLabels", dijit.form.HorizontalRule,
+{
+	//	Summary:
+	//		Create labels for the Horizontal slider
+	templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+	// labelStyle: String
+	//		CSS style to apply to individual text labels
+	labelStyle: "",
+
+	// labels: Array
+	//	Array of text labels to render - evenly spaced from left-to-right or bottom-to-top
+	labels: [],
+
+	// numericMargin: Integer
+	//	Number of generated numeric labels that should be rendered as '' on the ends when labels[] are not specified
+	numericMargin: 0,
+
+	// numericMinimum: Integer
+	//	Leftmost label value for generated numeric labels when labels[] are not specified
+	minimum: 0,
+
+	// numericMaximum: Integer
+	//	Rightmost label value for generated numeric labels when labels[] are not specified
+	maximum: 1,
+
+	// constraints: object
+	//	pattern, places, lang, et al (see dojo.number) for generated numeric labels when labels[] are not specified
+	constraints: {pattern:"#%"},
+
+	_positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerH" style="left:',
+	_labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelH">',
+	_suffix: '</span></div>',
+
+	_calcPosition: function(pos){
+		return pos;
+	},
+
+	_genHTML: function(pos, ndx){
+		return this._positionPrefix + this._calcPosition(pos) + this._positionSuffix + this.labelStyle + this._labelPrefix + this.labels[ndx] + this._suffix;
+	},
+
+	getLabels: function(){
+		// summary: user replaceable function to return the labels array
+
+		// if the labels array was not specified directly, then see if <li> children were
+		var labels = this.labels;
+		if(!labels.length){
+			// for markup creation, labels are specified as child elements
+			labels = dojo.query("> li", this.srcNodeRef).map(function(node){
+				return String(node.innerHTML);
+			});
+		}
+		this.srcNodeRef.innerHTML = '';
+		// if the labels were not specified directly and not as <li> children, then calculate numeric labels
+		if(!labels.length && this.count > 1){
+			var start = this.minimum;
+			var inc = (this.maximum - start) / (this.count-1);
+			for (var i=0; i < this.count; i++){
+				labels.push((i<this.numericMargin||i>=(this.count-this.numericMargin))? '' : dojo.number.format(start, this.constraints));
+				start += inc;
+			}
+		}
+		return labels;
+	},
+
+	postMixInProperties: function(){
+		this.inherited(arguments);
+		this.labels = this.getLabels();
+		this.count = this.labels.length;
+	}
+});
+
+dojo.declare("dijit.form.VerticalRuleLabels", dijit.form.HorizontalRuleLabels,
+{
+	//	Summary:
+	//		Create labels for the Vertical slider
+	templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>',
+
+	_positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerV" style="top:',
+	_labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelV">',
+
+	_calcPosition: function(pos){
+		return 100-pos;
+	},
+	
+	_isHorizontal: false
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/TextBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/TextBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/TextBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,185 @@
+if(!dojo._hasResource["dijit.form.TextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.TextBox"] = true;
+dojo.provide("dijit.form.TextBox");
+
+dojo.require("dijit.form._FormWidget");
+
+dojo.declare(
+	"dijit.form.TextBox",
+	dijit.form._FormValueWidget,
+	{
+		//	summary:
+		//		A base class for textbox form inputs
+		//
+		//	trim: Boolean
+		//		Removes leading and trailing whitespace if true.  Default is false.
+		trim: false,
+
+		//	uppercase: Boolean
+		//		Converts all characters to uppercase if true.  Default is false.
+		uppercase: false,
+
+		//	lowercase: Boolean
+		//		Converts all characters to lowercase if true.  Default is false.
+		lowercase: false,
+
+		//	propercase: Boolean
+		//		Converts the first character of each word to uppercase if true.
+		propercase: false,
+
+		//	maxLength: String
+		//		HTML INPUT tag maxLength declaration.
+		maxLength: "",
+
+		templateString:"<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode' name=\"${name}\"\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse,onfocus:_onMouse,onblur:_onMouse,onkeypress:_onKeyPress,onkeyup'\n\tautocomplete=\"off\" type=\"${type}\"\n\t/>\n",
+		baseClass: "dijitTextBox",
+
+		attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+			{maxLength:"focusNode"}),
+
+		getDisplayedValue: function(){
+			//	summary:
+			//		Returns the formatted value that the user sees in the textbox, which may be different
+			//		from the serialized value that's actually sent to the server (see dijit.form.ValidationTextBox.serialize)
+			return this.filter(this.textbox.value);
+		},
+
+		getValue: function(){
+			return this.parse(this.getDisplayedValue(), this.constraints);
+		},
+
+		setValue: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+			//	summary: 
+			//		Sets the value of the widget to "value" which can be of
+			//		any type as determined by the widget.
+			//
+			//	value:
+			//		The visual element value is also set to a corresponding,
+			//		but not necessarily the same, value.
+			//
+			//	formattedValue:
+			//		If specified, used to set the visual element value,
+			//		otherwise a computed visual value is used.
+			//
+			//	priorityChange:
+			//		If true, an onChange event is fired immediately instead of 
+			//		waiting for the next blur event.
+
+			var filteredValue = this.filter(value);
+			if((((typeof filteredValue == typeof value) && (value !== undefined/*#5317*/)) || (value === null/*#5329*/)) && (formattedValue == null || formattedValue == undefined)){
+				formattedValue = this.format(filteredValue, this.constraints);
+			}
+			if(formattedValue != null && formattedValue != undefined){
+				this.textbox.value = formattedValue;
+			}
+			dijit.form.TextBox.superclass.setValue.call(this, filteredValue, priorityChange);
+		},
+
+		setDisplayedValue: function(/*String*/value, /*Boolean?*/ priorityChange){
+			//	summary: 
+			//		Sets the value of the visual element to the string "value".
+			//		The widget value is also set to a corresponding,
+			//		but not necessarily the same, value.
+			//
+			//	priorityChange:
+			//		If true, an onChange event is fired immediately instead of 
+			//		waiting for the next blur event.
+
+			this.textbox.value = value;
+			this.setValue(this.getValue(), priorityChange);
+		},
+
+		format: function(/* String */ value, /* Object */ constraints){
+			//	summary:
+			//		Replacable function to convert a value to a properly formatted string
+			return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value));
+		},
+
+		parse: function(/* String */ value, /* Object */ constraints){
+			//	summary:
+			//		Replacable function to convert a formatted string to a value
+			return value;
+		},
+
+		postCreate: function(){
+			// setting the value here is needed since value="" in the template causes "undefined"
+			// and setting in the DOM (instead of the JS object) helps with form reset actions
+			this.textbox.setAttribute("value", this.getDisplayedValue());
+			this.inherited(arguments);
+
+			/*#5297:if(this.srcNodeRef){
+				dojo.style(this.textbox, "cssText", this.style);
+				this.textbox.className += " " + this["class"];
+			}*/
+			this._layoutHack();
+		},
+
+		filter: function(val){
+			//	summary:
+			//		Apply specified filters to textbox value
+			if(val === null || val === undefined){ return ""; }
+			else if(typeof val != "string"){ return val; }
+			if(this.trim){
+				val = dojo.trim(val);
+			}
+			if(this.uppercase){
+				val = val.toUpperCase();
+			}
+			if(this.lowercase){
+				val = val.toLowerCase();
+			}
+			if(this.propercase){
+				val = val.replace(/[^\s]+/g, function(word){
+					return word.substring(0,1).toUpperCase() + word.substring(1);
+				});
+			}
+			return val;
+		},
+
+		_setBlurValue: function(){
+			this.setValue(this.getValue(), (this.isValid ? this.isValid() : true));
+		},
+
+		_onBlur: function(){
+			this._setBlurValue();
+			this.inherited(arguments);
+		},
+
+		onkeyup: function(){
+			//	summary:
+			//		User replaceable keyup event handler
+		}
+	}
+);
+
+dijit.selectInputText = function(/*DomNode*/element, /*Number?*/ start, /*Number?*/ stop){
+	//	summary:
+	//		Select text in the input element argument, from start (default 0), to stop (default end).
+
+	// TODO: use functions in _editor/selection.js?
+	var _window = dojo.global;
+	var _document = dojo.doc;
+	element = dojo.byId(element);
+	if(isNaN(start)){ start = 0; }
+	if(isNaN(stop)){ stop = element.value ? element.value.length : 0; }
+	element.focus();
+	if(_document["selection"] && dojo.body()["createTextRange"]){ // IE
+		if(element.createTextRange){
+			var range = element.createTextRange();
+			with(range){
+				collapse(true);
+				moveStart("character", start);
+				moveEnd("character", stop);
+				select();
+			}
+		}
+	}else if(_window["getSelection"]){
+		var selection = _window.getSelection();
+		// FIXME: does this work on Safari?
+		if(element.setSelectionRange){
+			element.setSelectionRange(start, stop);
+		}
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,261 @@
+if(!dojo._hasResource["dijit.form.Textarea"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Textarea"] = true;
+dojo.provide("dijit.form.Textarea");
+
+dojo.require("dijit.form._FormWidget");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit.form", "Textarea", null, "zh,pt,da,tr,ru,de,ROOT,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+	"dijit.form.Textarea",
+	dijit.form._FormValueWidget,
+	{
+	// summary: A resizing textarea widget
+	//
+	// description:
+	//	A textarea that resizes vertically to contain the data.
+	//	Takes nearly all the parameters (name, value, etc.) that a vanilla textarea takes.
+	//	Cols is not supported and the width should be specified with style width.
+	//	Rows is not supported since this widget adjusts the height.
+	//
+	// example:
+	// |	<textarea dojoType="dijit.form.TextArea">...</textarea>
+	//
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+		{style:"styleNode", 'class':"styleNode"}),
+
+	templateString: (dojo.isIE || dojo.isSafari || dojo.isFF) ?
+				((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '<fieldset id="${id}" class="dijitInline dijitInputField dijitTextArea" dojoAttachPoint="styleNode" waiRole="presentation"><div dojoAttachPoint="editNode,focusNode,eventNode" dojoAttachEvent="onpaste:_changing,oncut:_changing" waiRole="textarea" style="text-decoration:none;display:block;overflow:auto;" contentEditable="true"></div>'
+					: '<span id="${id}" class="dijitReset">'+
+					'<iframe src="javascript:<html><head><title>${_iframeEditTitle}</title></head><body><script>var _postCreate=window.frameElement?window.frameElement.postCreate:null;if(_postCreate)_postCreate();</script></body></html>"'+
+							' dojoAttachPoint="iframe,styleNode" dojoAttachEvent="onblur:_onIframeBlur" class="dijitInline dijitInputField dijitTextArea"></iframe>')
+				+ '<textarea name="${name}" value="${value}" dojoAttachPoint="formValueNode" style="display:none;"></textarea>'
+				+ ((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '</fieldset>':'</span>')
+			: '<textarea id="${id}" name="${name}" value="${value}" dojoAttachPoint="formValueNode,editNode,focusNode,styleNode" class="dijitInputField dijitTextArea">'+dojo.isFF+'</textarea>',
+
+	setAttribute: function(/*String*/ attr, /*anything*/ value){
+		this.inherited(arguments);
+		switch(attr){
+			case "disabled":
+				this.formValueNode.disabled = this.disabled;
+			case "readOnly":
+				if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){
+					this.editNode.contentEditable = (!this.disabled && !this.readOnly);
+				}else if(dojo.isFF){
+					this.iframe.contentDocument.designMode = (this.disabled || this.readOnly)? "off" : "on";
+				}
+		}
+	},
+
+	focus: function(){
+		// summary: Received focus, needed for the InlineEditBox widget
+		if(!this.disabled && !this.readOnly){
+			this._changing(); // set initial height
+		}
+		dijit.focus(this.iframe || this.focusNode);
+	},
+
+	setValue: function(/*String*/ value, /*Boolean, optional*/ priorityChange){
+		var editNode = this.editNode;
+		if(typeof value == "string"){
+			editNode.innerHTML = ""; // wipe out old nodes
+			if(value.split){
+				var _this=this;
+				var isFirst = true;
+				dojo.forEach(value.split("\n"), function(line){
+					if(isFirst){ isFirst = false; }
+					else{
+						editNode.appendChild(dojo.doc.createElement("BR")); // preserve line breaks
+					}
+					if(line){
+						editNode.appendChild(dojo.doc.createTextNode(line)); // use text nodes so that imbedded tags can be edited
+					}
+				});
+			}else if(value){
+				editNode.appendChild(dojo.doc.createTextNode(value));
+			}
+			if(!dojo.isIE){
+				editNode.appendChild(dojo.doc.createElement("BR")); // so that you see a cursor
+			}
+		}else{
+			// blah<BR>blah --> blah\nblah
+			// <P>blah</P><P>blah</P> --> blah\nblah
+			// <DIV>blah</DIV><DIV>blah</DIV> --> blah\nblah
+			// &amp;&lt;&gt; -->&< >
+			value = editNode.innerHTML;
+			if(this.iframe){ // strip sizeNode
+				value = value.replace(/<div><\/div>\r?\n?$/i,"");
+			}
+			value = value.replace(/\s*\r?\n|^\s+|\s+$|&nbsp;/g,"").replace(/>\s+</g,"><").replace(/<\/(p|div)>$|^<(p|div)[^>]*>/gi,"").replace(/([^>])<div>/g,"$1\n").replace(/<\/p>\s*<p[^>]*>|<br[^>]*>|<\/div>\s*<div[^>]*>/gi,"\n").replace(/<[^>]*>/g,"").replace(/&amp;/gi,"\&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">");
+			if(!dojo.isIE){
+				value = value.replace(/\n$/,""); // remove added <br>
+			}
+		}
+		this.value = this.formValueNode.value = value;
+		if(this.iframe){
+			var sizeNode = dojo.doc.createElement('div');
+			editNode.appendChild(sizeNode);
+			var newHeight = sizeNode.offsetTop;
+			if(editNode.scrollWidth > editNode.clientWidth){ newHeight+=16; } // scrollbar space needed?
+			if(this.lastHeight != newHeight){ // cache size so that we don't get a resize event because of a resize event
+				if(newHeight == 0){ newHeight = 16; } // height = 0 causes the browser to not set scrollHeight
+				dojo.contentBox(this.iframe, {h: newHeight});
+				this.lastHeight = newHeight;
+			}
+			editNode.removeChild(sizeNode);
+		}
+		dijit.form.Textarea.superclass.setValue.call(this, this.getValue(), priorityChange);
+	},
+
+	getValue: function(){
+		return this.value.replace(/\r/g,"");
+	},
+
+	postMixInProperties: function(){
+		this.inherited(arguments);
+		// don't let the source text be converted to a DOM structure since we just want raw text
+		if(this.srcNodeRef && this.srcNodeRef.innerHTML != ""){
+			this.value = this.srcNodeRef.innerHTML;
+			this.srcNodeRef.innerHTML = "";
+		}
+		if((!this.value || this.value == "") && this.srcNodeRef && this.srcNodeRef.value){
+			this.value = this.srcNodeRef.value;
+		}
+		if(!this.value){ this.value = ""; }
+		this.value = this.value.replace(/\r\n/g,"\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&");
+		if(dojo.isFF == 2){
+			// In the case of Firefox an iframe is used and when the text gets focus,
+			// focus is fired from the document object.  There isn't a way to put a
+			// waiRole on the document object and as a result screen readers don't
+			// announce the role.  As a result screen reader users are lost.
+			//
+			// An additional problem is that the browser gives the document object a
+			// very cryptic accessible name, e.g.
+			// wysiwyg://13/http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_InlineEditBox.html
+			// When focus is fired from the document object, the screen reader speaks
+			// the accessible name.  The cyptic accessile name is confusing.
+			//
+			// A workaround for both of these problems is to give the iframe's
+			// document a title, the name of which is similar to a role name, i.e.
+			// "edit area".  This will be used as the accessible name which will replace
+			// the cryptic name and will also convey the role information to the user.
+			// Because it is read directly to the user, the string must be localized.
+			// In addition, since a <label> element can not be associated with an iframe, if 
+			// this control has a label, insert the label text into the title as well.
+			var _nlsResources = dojo.i18n.getLocalization("dijit.form", "Textarea");
+			this._iframeEditTitle = _nlsResources.iframeEditTitle;
+			this._iframeFocusTitle = _nlsResources.iframeFocusTitle;
+			var label=dojo.query('label[for="'+this.id+'"]');
+			if(label.length){
+				this._iframeEditTitle = label[0].innerHTML + " " + this._iframeEditTitle;
+			}
+			var body = this.focusNode = this.editNode = dojo.doc.createElement('BODY');
+			body.style.margin="0px";
+			body.style.padding="0px";
+			body.style.border="0px";
+		}
+	},
+
+	postCreate: function(){
+		if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){
+			this.domNode.style.overflowY = 'hidden';
+		}else if(dojo.isFF){
+			var w = this.iframe.contentWindow;
+			var title = '';
+			try { // #4715: peeking at the title can throw a security exception during iframe setup
+				title = this.iframe.contentDocument.title;
+			} catch(e) {}
+			if(!w || !title){
+				this.iframe.postCreate = dojo.hitch(this, this.postCreate);
+				return;
+			}
+			var d = w.document;
+			d.getElementsByTagName('HTML')[0].replaceChild(this.editNode, d.getElementsByTagName('BODY')[0]);
+			if(!this.isLeftToRight()){
+				d.getElementsByTagName('HTML')[0].dir = "rtl";
+			}			
+			this.iframe.style.overflowY = 'hidden';
+			this.eventNode = d;
+			// this.connect won't destroy this handler cleanly since its on the iframe's window object
+			// resize is a method of window, not document
+			w.addEventListener("resize", dojo.hitch(this, this._changed), false); // resize is only on the window object
+		}else{
+			this.focusNode = this.domNode;
+		}
+		if(this.eventNode){
+			this.connect(this.eventNode, "keypress", this._onKeyPress);
+			this.connect(this.eventNode, "mousemove", this._changed);
+			this.connect(this.eventNode, "focus", this._focused);
+			this.connect(this.eventNode, "blur", this._blurred);
+		}
+		if(this.editNode){
+			this.connect(this.editNode, "change", this._changed); // needed for mouse paste events per #3479
+		}
+		this.inherited('postCreate', arguments);
+	},
+
+	// event handlers, you can over-ride these in your own subclasses
+	_focused: function(e){
+		dojo.addClass(this.iframe||this.domNode, "dijitInputFieldFocused");
+		this._changed(e);
+	},
+
+	_blurred: function(e){
+		dojo.removeClass(this.iframe||this.domNode, "dijitInputFieldFocused");
+		this._changed(e, true);
+	},
+
+	_onIframeBlur: function(){
+		// Reset the title back to "edit area".
+		this.iframe.contentDocument.title = this._iframeEditTitle;
+	},
+
+	_onKeyPress: function(e){
+		if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
+			// Pressing the tab key in the iframe (with designMode on) will cause the
+			// entry of a tab character so we have to trap that here.  Since we don't
+			// know the next focusable object we put focus on the iframe and then the
+			// user has to press tab again (which then does the expected thing).
+			// A problem with that is that the screen reader user hears "edit area"
+			// announced twice which causes confusion.  By setting the
+			// contentDocument's title to "edit area frame" the confusion should be
+			// eliminated.
+			this.iframe.contentDocument.title = this._iframeFocusTitle;
+			// Place focus on the iframe. A subsequent tab or shift tab will put focus
+			// on the correct control.
+			// Note: Can't use this.focus() because that results in a call to
+			// dijit.focus and if that receives an iframe target it will set focus
+			// on the iframe's contentWindow.
+			this.iframe.focus();  // this.focus(); won't work
+			dojo.stopEvent(e);
+		}else if(e.keyCode == dojo.keys.ENTER){
+			e.stopPropagation();
+		}else if(this.inherited("_onKeyPress", arguments) && this.iframe){
+			// #3752:
+			// The key press will not make it past the iframe.
+			// If a widget is listening outside of the iframe, (like InlineEditBox)
+			// it will not hear anything.
+			// Create an equivalent event so everyone else knows what is going on.
+			var te = dojo.doc.createEvent("KeyEvents");
+			te.initKeyEvent("keypress", true, true, null, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.keyCode, e.charCode);
+			this.iframe.dispatchEvent(te);
+		}
+		this._changing();
+	},
+
+	_changing: function(e){
+		// summary: event handler for when a change is imminent
+		setTimeout(dojo.hitch(this, "_changed", e, false), 1);
+	},
+
+	_changed: function(e, priorityChange){
+		// summary: event handler for when a change has already happened
+		if(this.iframe && this.iframe.contentDocument.designMode != "on" && !this.disabled && !this.readOnly){
+			this.iframe.contentDocument.designMode="on"; // in case this failed on init due to being hidden
+		}
+		this.setValue(null, priorityChange || false);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/TimeTextBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/TimeTextBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/TimeTextBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,33 @@
+if(!dojo._hasResource["dijit.form.TimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.TimeTextBox"] = true;
+dojo.provide("dijit.form.TimeTextBox");
+
+dojo.require("dijit._TimePicker");
+dojo.require("dijit.form._DateTimeTextBox");
+
+/*=====
+dojo.declare(
+	"dijit.form.TimeTextBox.__Constraints",
+	[dijit.form._DateTimeTextBox.__Constraints, dijit._TimePicker.__Constraints]
+);
+=====*/
+
+dojo.declare(
+	"dijit.form.TimeTextBox",
+	dijit.form._DateTimeTextBox,
+	{
+		// summary:
+		//		A validating, serializable, range-bound time text box with a popup time picker
+
+		popupClass: "dijit._TimePicker",
+		_selector: "time"
+
+/*=====
+		,
+		// constraints: dijit.form.TimeTextBox.__Constraints 
+		constraints:{}
+=====*/
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/ValidationTextBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/ValidationTextBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/ValidationTextBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,308 @@
+if(!dojo._hasResource["dijit.form.ValidationTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.ValidationTextBox"] = true;
+dojo.provide("dijit.form.ValidationTextBox");
+
+dojo.require("dojo.i18n");
+
+dojo.require("dijit.form.TextBox");
+dojo.require("dijit.Tooltip");
+
+dojo.requireLocalization("dijit.form", "validate", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,ROOT,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+/*=====
+	dijit.form.ValidationTextBox.__Constraints = function(){
+		// locale: String
+		//		locale used for validation, picks up value from this widget's lang attribute
+		// _flags_: anything
+		//		various flags passed to regExpGen function
+		this.locale = "";
+		this._flags_ = "";
+	}
+=====*/
+
+dojo.declare(
+	"dijit.form.ValidationTextBox",
+	dijit.form.TextBox,
+	{
+		// summary:
+		//		A TextBox subclass with the ability to validate content of various types and provide user feedback.
+
+		templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class=\"dijitReset\" dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus:_update,onkeyup:_onkeyup,onblur:_onMouse,onkeypress:_onKeyPress' autocomplete=\"off\"\n\t\t\ttype='${type}' name='${name}'\n\t\t/></div\n\t></div\n></div>\n",
+		baseClass: "dijitTextBox",
+
+		// default values for new subclass properties
+		// required: Boolean
+		//		Can be true or false, default is false.
+		required: false,
+
+		// promptMessage: String
+		//		Hint string
+		promptMessage: "",
+
+		// invalidMessage: String
+		// 		The message to display if value is invalid.
+		invalidMessage: "$_unset_$", // read from the message file if not overridden
+
+		// constraints: dijit.form.ValidationTextBox.__Constraints
+		//		user-defined object needed to pass parameters to the validator functions
+		constraints: {},
+
+		// regExp: String
+		//		regular expression string used to validate the input
+		//		Do not specify both regExp and regExpGen
+		regExp: ".*",
+
+		// regExpGen: Function
+		//		user replaceable function used to generate regExp when dependent on constraints
+		//		Do not specify both regExp and regExpGen
+		regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/constraints){ return this.regExp; },
+
+		// state: String
+		//		Shows current state (ie, validation result) of input (Normal, Warning, or Error)
+		state: "",
+
+		//	tooltipPosition: String[]
+		//		See description of dijit.Tooltip.defaultPosition for details on this parameter.
+		tooltipPosition: [],
+
+		setValue: function(){
+			this.inherited(arguments);
+			this.validate(this._focused);
+		},
+
+		validator: function(/*anything*/value, /*dijit.form.ValidationTextBox.__Constraints*/constraints){
+			// summary: user replaceable function used to validate the text input against the regular expression.
+			return (new RegExp("^(" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) &&
+				(!this.required || !this._isEmpty(value)) &&
+				(this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean
+		},
+
+		isValid: function(/*Boolean*/ isFocused){
+			// summary: Need to over-ride with your own validation code in subclasses
+			return this.validator(this.textbox.value, this.constraints);
+		},
+
+		_isEmpty: function(value){
+			// summary: Checks for whitespace
+			return /^\s*$/.test(value); // Boolean
+		},
+
+		getErrorMessage: function(/*Boolean*/ isFocused){
+			// summary: return an error message to show if appropriate
+			return this.invalidMessage; // String
+		},
+
+		getPromptMessage: function(/*Boolean*/ isFocused){
+			// summary: return a hint to show if appropriate
+			return this.promptMessage; // String
+		},
+
+		validate: function(/*Boolean*/ isFocused){
+			// summary:
+			//		Called by oninit, onblur, and onkeypress.
+			// description:
+			//		Show missing or invalid messages if appropriate, and highlight textbox field.
+			var message = "";
+			var isValid = this.isValid(isFocused);
+			var isEmpty = this._isEmpty(this.textbox.value);
+			this.state = (isValid || (!this._hasBeenBlurred && isEmpty)) ? "" : "Error";
+			this._setStateClass();
+			dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
+			if(isFocused){
+				if(isEmpty){
+					message = this.getPromptMessage(true);
+				}
+				if(!message && this.state == "Error"){
+					message = this.getErrorMessage(true);
+				}
+			}
+			this.displayMessage(message);
+			return isValid;
+		},
+
+		// currently displayed message
+		_message: "",
+
+		displayMessage: function(/*String*/ message){
+			// summary:
+			//		User overridable method to display validation errors/hints.
+			//		By default uses a tooltip.
+			if(this._message == message){ return; }
+			this._message = message;
+			dijit.hideTooltip(this.domNode);
+			if(message){
+				dijit.showTooltip(message, this.domNode, this.tooltipPosition);
+			}
+		},
+
+		_refreshState: function(){
+			this.validate(this._focused);
+		},
+
+		_update: function(/*Event*/e){
+			this._refreshState();
+			this._onMouse(e);	// update CSS classes
+		},
+
+		_onkeyup: function(/*Event*/e){
+			this._update(e);
+			this.onkeyup(e);
+		},
+
+		//////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+		constructor: function(){
+			this.constraints = {};
+		},
+
+		postMixInProperties: function(){
+			this.inherited(arguments);
+			this.constraints.locale = this.lang;
+			this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
+			if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; }
+			var p = this.regExpGen(this.constraints);
+			this.regExp = p;
+		}
+	}
+);
+
+dojo.declare(
+	"dijit.form.MappedTextBox",
+	dijit.form.ValidationTextBox,
+	{
+		// summary:
+		//		A dijit.form.ValidationTextBox subclass which provides a visible formatted display and a serializable
+		//		value in a hidden input field which is actually sent to the server.  The visible display may
+		//		be locale-dependent and interactive.  The value sent to the server is stored in a hidden
+		//		input field which uses the `name` attribute declared by the original widget.  That value sent
+		//		to the serveris defined by the dijit.form.MappedTextBox.serialize method and is typically
+		//		locale-neutral.
+
+		serialize: function(/*anything*/val, /*Object?*/options){
+			// summary: user replaceable function used to convert the getValue() result to a String
+			return val.toString ? val.toString() : ""; // String
+		},
+
+		toString: function(){
+			// summary: display the widget as a printable string using the widget's value
+			var val = this.filter(this.getValue());
+			return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String
+		},
+
+		validate: function(){
+			this.valueNode.value = this.toString();
+			return this.inherited(arguments);
+		},
+
+		setAttribute: function(/*String*/ attr, /*anything*/ value){
+			this.inherited(arguments);
+			switch(attr){
+				case "disabled":
+					if(this.valueNode){
+						this.valueNode.disabled = this.disabled;
+					}
+			}
+		},
+
+		postCreate: function(){
+			var textbox = this.textbox;
+			var valueNode = (this.valueNode = dojo.doc.createElement("input"));
+			valueNode.setAttribute("type", textbox.type);
+			valueNode.setAttribute("value", this.toString());
+			dojo.style(valueNode, "display", "none");
+			valueNode.name = this.textbox.name;
+			valueNode.disabled = this.textbox.disabled;
+			this.textbox.name = this.textbox.name + "_displayed_";
+			this.textbox.removeAttribute("name");
+			dojo.place(valueNode, textbox, "after");
+
+			this.inherited(arguments);
+		}
+	}
+);
+
+/*=====
+	dijit.form.RangeBoundTextBox.__Constraints = function(){
+		// min: Number
+		//		Minimum signed value.  Default is -Infinity
+		// max: Number
+		//		Maximum signed value.  Default is +Infinity
+		this.min = min;
+		this.max = max;
+	}
+=====*/
+
+dojo.declare(
+	"dijit.form.RangeBoundTextBox",
+	dijit.form.MappedTextBox,
+	{
+		// summary:
+		//		A dijit.form.MappedTextBox subclass which defines a range of valid values
+		//
+		// constraints: dijit.form.RangeBoundTextBox.__Constraints
+		//
+		// rangeMessage: String
+		//		The message to display if value is out-of-range
+
+		/*=====
+		constraints: {},
+		======*/
+		rangeMessage: "",
+
+		compare: function(/*anything*/val1, /*anything*/val2){
+			// summary: compare 2 values
+			return val1 - val2; // anything
+		},
+
+		rangeCheck: function(/*Number*/ primitive, /*dijit.form.RangeBoundTextBox.__Constraints*/ constraints){
+			// summary: user replaceable function used to validate the range of the numeric input value
+			var isMin = "min" in constraints;
+			var isMax = "max" in constraints;
+			if(isMin || isMax){
+				return (!isMin || this.compare(primitive,constraints.min) >= 0) &&
+					(!isMax || this.compare(primitive,constraints.max) <= 0);
+			}
+			return true; // Boolean
+		},
+
+		isInRange: function(/*Boolean*/ isFocused){
+			// summary: Need to over-ride with your own validation code in subclasses
+			return this.rangeCheck(this.getValue(), this.constraints);
+		},
+
+		isValid: function(/*Boolean*/ isFocused){
+			return this.inherited(arguments) &&
+				((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean
+		},
+
+		getErrorMessage: function(/*Boolean*/ isFocused){
+			if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this, false) && !this.isInRange(isFocused)){ return this.rangeMessage; } // String
+			return this.inherited(arguments);
+		},
+
+		postMixInProperties: function(){
+			this.inherited(arguments);
+			if(!this.rangeMessage){
+				this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
+				this.rangeMessage = this.messages.rangeMessage;
+			}
+		},
+
+		postCreate: function(){
+			this.inherited(arguments);
+			if(this.constraints.min !== undefined){
+				dijit.setWaiState(this.focusNode, "valuemin", this.constraints.min);
+			}
+			if(this.constraints.max !== undefined){
+				dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max);
+			}
+		},
+		
+		setValue: function(/*Number*/ value, /*Boolean?*/ priorityChange){
+			dijit.setWaiState(this.focusNode, "valuenow", value);
+			this.inherited('setValue', arguments);
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/_DateTimeTextBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/_DateTimeTextBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/_DateTimeTextBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,175 @@
+if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form._DateTimeTextBox"] = true;
+dojo.provide("dijit.form._DateTimeTextBox");
+
+dojo.require("dojo.date");
+dojo.require("dojo.date.locale");
+dojo.require("dojo.date.stamp");
+dojo.require("dijit.form.ValidationTextBox");
+
+/*=====
+dojo.declare(
+	"dijit.form._DateTimeTextBox.__Constraints",
+	[dijit.form.RangeBoundTextBox.__Constraints, dojo.date.locale.__FormatOptions]
+);
+=====*/
+
+dojo.declare(
+	"dijit.form._DateTimeTextBox",
+	dijit.form.RangeBoundTextBox,
+	{
+		// summary:
+		//		A validating, serializable, range-bound date or time text box.
+		//
+		// constraints: dijit.form._DateTimeTextBox.__Constraints 
+
+		/*=====
+		constraints: {},
+		======*/
+		regExpGen: dojo.date.locale.regexp,
+		compare: dojo.date.compare,
+		format: function(/*Date*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+			//	summary: formats the value as a Date, according to constraints
+			if(!value){ return ''; }
+			return dojo.date.locale.format(value, constraints);
+		},
+		parse: function(/*String*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+			//	summary: parses the value as a Date, according to constraints
+			return dojo.date.locale.parse(value, constraints) || undefined; /* can't return null to getValue since that's special */
+		},
+
+		serialize: dojo.date.stamp.toISOString,
+
+		//	value: Date
+		//		The value of this widget as a JavaScript Date object.  Use `getValue`/`setValue` to manipulate.
+		//		When passed to the parser in markup, must be specified according to `dojo.date.stamp.fromISOString`
+		value: new Date(""),	// value.toString()="NaN"
+
+		//	popupClass: String
+		//		Name of the popup widget class used to select a date/time
+		popupClass: "", // default is no popup = text only
+		_selector: "",
+
+		postMixInProperties: function(){
+			//dijit.form.RangeBoundTextBox.prototype.postMixInProperties.apply(this, arguments);
+			this.inherited(arguments);
+			if(!this.value || this.value.toString() == dijit.form._DateTimeTextBox.prototype.value.toString()){
+				this.value = undefined;
+			}
+			var constraints = this.constraints;
+			constraints.selector = this._selector;
+			constraints.fullYear = true; // see #5465 - always format with 4-digit years
+			var fromISO = dojo.date.stamp.fromISOString;
+			if(typeof constraints.min == "string"){ constraints.min = fromISO(constraints.min); }
+ 			if(typeof constraints.max == "string"){ constraints.max = fromISO(constraints.max); }
+		},
+
+		_onFocus: function(/*Event*/ evt){
+			// summary: open the TimePicker popup
+			this._open();
+		},
+
+		setValue: function(/*Date*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+			// summary:
+			//	Sets the date on this textbox.  Note that `value` must be a Javascript Date object.
+			this.inherited(arguments);
+			if(this._picker){
+				// #3948: fix blank date on popup only
+				if(!value){value=new Date();}
+				this._picker.setValue(value);
+			}
+		},
+
+		_open: function(){
+			// summary:
+			//	opens the TimePicker, and sets the onValueSelected value
+
+			if(this.disabled || this.readOnly || !this.popupClass){return;}
+
+			var textBox = this;
+
+			if(!this._picker){
+				var PopupProto=dojo.getObject(this.popupClass, false);
+				this._picker = new PopupProto({
+					onValueSelected: function(value){
+
+						textBox.focus(); // focus the textbox before the popup closes to avoid reopening the popup
+						setTimeout(dojo.hitch(textBox, "_close"), 1); // allow focus time to take
+
+						// this will cause InlineEditBox and other handlers to do stuff so make sure it's last
+						dijit.form._DateTimeTextBox.superclass.setValue.call(textBox, value, true);
+					},
+					lang: textBox.lang,
+					constraints: textBox.constraints,
+					isDisabledDate: function(/*Date*/ date){
+						// summary:
+						// 	disables dates outside of the min/max of the _DateTimeTextBox
+						var compare = dojo.date.compare;
+						var constraints = textBox.constraints;
+						return constraints && (constraints.min && (compare(constraints.min, date, "date") > 0) || 
+							(constraints.max && compare(constraints.max, date, "date") < 0));
+					}
+				});
+				this._picker.setValue(this.getValue() || new Date());
+			}
+			if(!this._opened){
+				dijit.popup.open({
+					parent: this,
+					popup: this._picker,
+					around: this.domNode,
+					onCancel: dojo.hitch(this, this._close),
+					onClose: function(){ textBox._opened=false; }
+				});
+				this._opened=true;
+			}
+			
+			dojo.marginBox(this._picker.domNode,{ w:this.domNode.offsetWidth });
+		},
+
+		_close: function(){
+			if(this._opened){
+				dijit.popup.close(this._picker);
+				this._opened=false;
+			}			
+		},
+
+		_onBlur: function(){
+			// summary: called magically when focus has shifted away from this widget and it's dropdown
+			this._close();
+			if(this._picker){
+				// teardown so that constraints will be rebuilt next time (redundant reference: #6002)
+				this._picker.destroy();
+				delete this._picker;
+			}
+			this.inherited(arguments);
+			// don't focus on <input>.  the user has explicitly focused on something else.
+		},
+
+		getDisplayedValue:function(){
+			return this.textbox.value;
+		},
+
+		setDisplayedValue:function(/*String*/ value, /*Boolean?*/ priorityChange){
+			this.setValue(this.parse(value, this.constraints), priorityChange, value);
+		},
+
+		destroy: function(){
+			if(this._picker){
+				this._picker.destroy();
+				delete this._picker;
+			}
+			this.inherited(arguments);
+		},
+
+		_onKeyPress: function(/*Event*/e){
+			if(dijit.form._DateTimeTextBox.superclass._onKeyPress.apply(this, arguments)){
+				if(this._opened && e.keyCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+					this._close();
+					dojo.stopEvent(e);
+				}
+			}
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/_FormWidget.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/_FormWidget.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/_FormWidget.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,340 @@
+if(!dojo._hasResource["dijit.form._FormWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form._FormWidget"] = true;
+dojo.provide("dijit.form._FormWidget");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
+{
+	/*
+	Summary:
+		_FormWidget's correspond to native HTML elements such as <checkbox> or <button>.
+		Each _FormWidget represents a single HTML element.
+
+		All these widgets should have these attributes just like native HTML input elements.
+		You can set them during widget construction.
+
+		They also share some common methods.
+	*/
+
+	// baseClass: String
+	//		Root CSS class of the widget (ex: dijitTextBox), used to add CSS classes of widget
+	//		(ex: "dijitTextBox dijitTextBoxInvalid dijitTextBoxFocused dijitTextBoxInvalidFocused")
+	//		See _setStateClass().
+	baseClass: "",
+
+	// name: String
+	//		Name used when submitting form; same as "name" attribute or plain HTML elements
+	name: "",
+
+	// alt: String
+	//		Corresponds to the native HTML <input> element's attribute.
+	alt: "",
+
+	// value: String
+	//		Corresponds to the native HTML <input> element's attribute.
+	value: "",
+
+	// type: String
+	//		Corresponds to the native HTML <input> element's attribute.
+	type: "text",
+
+	// tabIndex: Integer
+	//		Order fields are traversed when user hits the tab key
+	tabIndex: "0",
+
+	// disabled: Boolean
+	//		Should this widget respond to user input?
+	//		In markup, this is specified as "disabled='disabled'", or just "disabled".
+	disabled: false,
+
+	// readOnly: Boolean
+	//		Should this widget respond to user input?
+	//		In markup, this is specified as "readOnly".
+	//		Similar to disabled except readOnly form values are submitted
+	readOnly: false,
+
+	// intermediateChanges: Boolean
+	//		Fires onChange for each value change or only on demand
+	intermediateChanges: false,
+
+	// These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are.
+	// Don't attempt to mixin the 'type', 'name' attributes here programatically -- they must be declared
+	// directly in the template as read by the parser in order to function. IE is known to specifically 
+	// require the 'name' attribute at element creation time.
+	attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+		{value:"focusNode", disabled:"focusNode", readOnly:"focusNode", id:"focusNode", tabIndex:"focusNode", alt:"focusNode"}),
+
+	setAttribute: function(/*String*/ attr, /*anything*/ value){
+		this.inherited(arguments);
+		switch(attr){
+			case "disabled":
+				var tabIndexNode = this[this.attributeMap['tabIndex']||'domNode'];
+				if(value){
+					//reset those, because after the domNode is disabled, we can no longer receive
+					//mouse related events, see #4200
+					this._hovering = false;
+					this._active = false;
+					// remove the tabIndex, especially for FF
+					tabIndexNode.removeAttribute('tabIndex');
+				}else{
+					tabIndexNode.setAttribute('tabIndex', this.tabIndex);
+				}
+				dijit.setWaiState(this[this.attributeMap['disabled']||'domNode'], "disabled", value);
+				this._setStateClass();
+		}
+	},
+
+	setDisabled: function(/*Boolean*/ disabled){
+		// summary:
+		//		Set disabled state of widget (Deprecated).
+		dojo.deprecated("setDisabled("+disabled+") is deprecated. Use setAttribute('disabled',"+disabled+") instead.", "", "2.0");
+		this.setAttribute('disabled', disabled);
+	},
+
+
+	_onMouse : function(/*Event*/ event){
+		// summary:
+		//	Sets _hovering, _active, and stateModifier properties depending on mouse state,
+		//	then calls setStateClass() to set appropriate CSS classes for this.domNode.
+		//
+		//	To get a different CSS class for hover, send onmouseover and onmouseout events to this method.
+		//	To get a different CSS class while mouse button is depressed, send onmousedown to this method.
+
+		var mouseNode = event.currentTarget;
+		if(mouseNode && mouseNode.getAttribute){
+			this.stateModifier = mouseNode.getAttribute("stateModifier") || "";
+		}
+
+		if(!this.disabled){
+			switch(event.type){
+				case "mouseenter":	
+				case "mouseover":
+					this._hovering = true;
+					this._active = this._mouseDown;
+					break;
+
+				case "mouseout":
+				case "mouseleave":
+					this._hovering = false;
+					this._active = false;
+					break;
+
+				case "mousedown" :
+					this._active = true;
+					this._mouseDown = true;
+					// set a global event to handle mouseup, so it fires properly
+					//	even if the cursor leaves the button
+					var mouseUpConnector = this.connect(dojo.body(), "onmouseup", function(){
+						this._active = false;
+						this._mouseDown = false;
+						this._setStateClass();
+						this.disconnect(mouseUpConnector);
+					});
+					if(this.isFocusable()){ this.focus(); }
+					break;
+			}
+			this._setStateClass();
+		}
+	},
+
+	isFocusable: function(){
+		return !this.disabled && !this.readOnly && this.focusNode && (dojo.style(this.domNode, "display") != "none");
+	},
+
+	focus: function(){
+		setTimeout(dojo.hitch(this, dijit.focus, this.focusNode), 0); // cannot call focus() from an event handler directly
+	},
+
+	_setStateClass: function(){
+		// summary
+		//	Update the visual state of the widget by setting the css classes on this.domNode
+		//  (or this.stateNode if defined) by combining this.baseClass with
+		//	various suffixes that represent the current widget state(s).
+		//
+		//	In the case where a widget has multiple
+		//	states, it sets the class based on all possible
+		//  combinations.  For example, an invalid form widget that is being hovered
+		//	will be "dijitInput dijitInputInvalid dijitInputHover dijitInputInvalidHover".
+		//
+		//	For complex widgets with multiple regions, there can be various hover/active states,
+		//	such as "Hover" or "CloseButtonHover" (for tab buttons).
+		//	This is controlled by a stateModifier="CloseButton" attribute on the close button node.
+		//
+		//	The widget may have one or more of the following states, determined
+		//	by this.state, this.checked, this.valid, and this.selected:
+		//		Error - ValidationTextBox sets this.state to "Error" if the current input value is invalid
+		//		Checked - ex: a checkmark or a ToggleButton in a checked state, will have this.checked==true
+		//		Selected - ex: currently selected tab will have this.selected==true
+		//
+		//	In addition, it may have one or more of the following states,
+		//	based on this.disabled and flags set in _onMouse (this._active, this._hovering, this._focused):
+		//		Disabled	- if the widget is disabled
+		//		Active		- if the mouse (or space/enter key?) is being pressed down
+		//		Focused		- if the widget has focus
+		//		Hover		- if the mouse is over the widget
+
+		// Get original (non state related, non baseClass related) class specified in template
+		if(!("staticClass" in this)){
+			this.staticClass = (this.stateNode||this.domNode).className;
+		}
+
+		// Compute new set of classes
+		var classes = [ this.baseClass ];
+
+		function multiply(modifier){
+			classes=classes.concat(dojo.map(classes, function(c){ return c+modifier; }), "dijit"+modifier);
+		}
+
+		if(this.checked){
+			multiply("Checked");
+		}
+		if(this.state){
+			multiply(this.state);
+		}
+		if(this.selected){
+			multiply("Selected");
+		}
+
+		if(this.disabled){
+			multiply("Disabled");
+		}else if(this.readOnly){
+			multiply("ReadOnly");
+		}else if(this._active){
+			multiply(this.stateModifier+"Active");
+		}else{
+			if(this._focused){
+				multiply("Focused");
+			}
+			if(this._hovering){
+				multiply(this.stateModifier+"Hover");
+			}
+		}
+
+		(this.stateNode || this.domNode).className = this.staticClass + " " + classes.join(" ");
+	},
+
+	onChange: function(newValue){
+		// summary: callback when value is changed
+	},
+
+	_onChangeMonitor: 'value',
+	_onChangeActive: false,
+
+	_handleOnChange: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+		// summary: set the value of the widget.
+		this._lastValue = newValue;
+		if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){
+			this._resetValue = this._lastValueReported = newValue;
+		}
+		if((this.intermediateChanges || priorityChange || priorityChange === undefined) && 
+			((newValue && newValue.toString)?newValue.toString():newValue) !== ((this._lastValueReported && this._lastValueReported.toString)?this._lastValueReported.toString():this._lastValueReported)){
+			this._lastValueReported = newValue;
+			if(this._onChangeActive){ this.onChange(newValue); }
+		}
+	},
+
+	reset: function(){
+		this._hasBeenBlurred = false;
+		if(this.setValue && !this._getValueDeprecated){
+			this.setValue(this._resetValue, true);
+		}else if(this._onChangeMonitor){
+			this.setAttribute(this._onChangeMonitor, (this._resetValue !== undefined && this._resetValue !== null)? this._resetValue : '');
+		}
+	},
+
+	create: function(){
+		this.inherited(arguments);
+		this._onChangeActive = true;
+		this._setStateClass();
+	},
+	
+	destroy: function(){
+		if(this._layoutHackHandle){
+			clearTimeout(this._layoutHackHandle);
+		}
+		this.inherited(arguments);
+	},
+
+	setValue: function(/*String*/ value){
+		dojo.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated.  Use setAttribute('value',"+value+") instead.", "", "2.0");
+		this.setAttribute('value', value);
+	},
+
+	_getValueDeprecated: true, // Form uses this, remove when getValue is removed
+	getValue: function(){
+		dojo.deprecated("dijit.form._FormWidget:getValue() is deprecated.  Use widget.value instead.", "", "2.0");
+		return this.value;
+	},
+
+	_layoutHack: function(){
+		// summary: work around table sizing bugs on FF2 by forcing redraw
+		if(dojo.isFF == 2){
+			var node=this.domNode;
+			var old = node.style.opacity;
+			node.style.opacity = "0.999";
+			this._layoutHackHandle = setTimeout(dojo.hitch(this, function(){
+				this._layoutHackHandle = null;
+				node.style.opacity = old;
+			}), 0);
+		}
+	}
+});
+
+dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
+{
+	/*
+	Summary:
+		_FormValueWidget's correspond to native HTML elements such as <input> or <select> that have user changeable values.
+		Each _ValueWidget represents a single input value, and has a (possibly hidden) <input> element,
+		to which it serializes its input value, so that form submission (either normal submission or via FormBind?)
+		works as expected.
+	*/
+
+	attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+		{value:""}),
+
+	postCreate: function(){
+		this.setValue(this.value, null);
+	},
+
+	setValue: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+		// summary: set the value of the widget.
+		this.value = newValue;
+		this._handleOnChange(newValue, priorityChange);
+	},
+
+	_getValueDeprecated: false, // remove when _FormWidget:getValue is removed
+	getValue: function(){
+		// summary: get the value of the widget.
+		return this._lastValue;
+	},
+
+	undo: function(){
+		// summary: restore the value to the last value passed to onChange
+		this.setValue(this._lastValueReported, false);
+	},
+
+	_valueChanged: function(){
+		var v = this.getValue();
+		var lv = this._lastValueReported;
+		// Equality comparison of objects such as dates are done by reference so
+		// two distinct objects are != even if they have the same data. So use
+		// toStrings in case the values are objects.
+		return ((v !== null && (v !== undefined) && v.toString)?v.toString():'') !== ((lv !== null && (lv !== undefined) && lv.toString)?lv.toString():'');
+	},
+
+	_onKeyPress: function(e){
+		if(e.keyCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+			if(this._valueChanged()){
+				this.undo();
+				dojo.stopEvent(e);
+				return false;
+			}
+		}
+		return true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/_Spinner.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/_Spinner.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/_Spinner.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,117 @@
+if(!dojo._hasResource["dijit.form._Spinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form._Spinner"] = true;
+dojo.provide("dijit.form._Spinner");
+
+dojo.require("dijit.form.ValidationTextBox");
+
+dojo.declare(
+	"dijit.form._Spinner",
+	dijit.form.RangeBoundTextBox,
+	{
+
+		// summary: Mixin for validation widgets with a spinner
+		// description: This class basically (conceptually) extends dijit.form.ValidationTextBox.
+		//	It modifies the template to have up/down arrows, and provides related handling code.
+
+		// defaultTimeout: Number
+		//	  number of milliseconds before a held key or button becomes typematic
+		defaultTimeout: 500,
+
+		// timeoutChangeRate: Number
+		//	  fraction of time used to change the typematic timer between events
+		//	  1.0 means that each typematic event fires at defaultTimeout intervals
+		//	  < 1.0 means that each typematic event fires at an increasing faster rate
+		timeoutChangeRate: 0.90,
+
+		// smallDelta: Number
+		//	  adjust the value by this much when spinning using the arrow keys/buttons
+		smallDelta: 1,
+		// largeDelta: Number
+		//	  adjust the value by this much when spinning using the PgUp/Dn keys
+		largeDelta: 10,
+
+		templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div class=\"dijitInputLayoutContainer\"\n\t\t><div class=\"dijitReset dijitSpinnerButtonContainer\"\n\t\t\t>&nbsp;<div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"UpArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div\n\t\t\t></div\n\t\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"downArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"DownArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t\t></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class='dijitReset' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onfocus:_update,onkeyup:_onkeyup,onkeypress:_onKeyPress\"\n\t\t\t\twaiRole=\"spinbutton\" autocomplete=\"off\" name=\"${name}\"\n\t\t/></div\n\t></div\n></div>\n",
+		baseClass: "dijitSpinner",
+
+		adjust: function(/* Object */ val, /*Number*/ delta){
+			// summary: user replaceable function used to adjust a primitive value(Number/Date/...) by the delta amount specified
+			// the val is adjusted in a way that makes sense to the object type
+			return val;
+		},
+
+		_arrowState: function(/*Node*/ node, /*Boolean*/ pressed){
+			this._active = pressed;
+			this.stateModifier = node.getAttribute("stateModifier") || "";
+			this._setStateClass();
+		},
+
+		_arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction){
+			if(this.disabled || this.readOnly){ return; }
+			this._arrowState(nodePressed, true);
+			this.setValue(this.adjust(this.getValue(), direction*this.smallDelta), false);
+			dijit.selectInputText(this.textbox, this.textbox.value.length);
+		},
+
+		_arrowReleased: function(/*Node*/ node){
+			this._wheelTimer = null;
+			if(this.disabled || this.readOnly){ return; }
+			this._arrowState(node, false);
+		},
+
+		_typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){
+			if(node == this.textbox){ node = (evt.keyCode == dojo.keys.UP_ARROW) ? this.upArrowNode : this.downArrowNode; }
+			if(count == -1){ this._arrowReleased(node); }
+			else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1); }
+		},
+
+		_wheelTimer: null,
+		_mouseWheeled: function(/*Event*/ evt){
+			dojo.stopEvent(evt);
+			var scrollAmount = 0;
+			if(typeof evt.wheelDelta == 'number'){ // IE
+				scrollAmount = evt.wheelDelta;
+			}else if(typeof evt.detail == 'number'){ // Mozilla+Firefox
+				scrollAmount = -evt.detail;
+			}
+			var node, dir;
+			if(scrollAmount > 0){
+				node = this.upArrowNode;
+				dir = +1;
+			}else if(scrollAmount < 0){
+				node = this.downArrowNode;
+				dir = -1;
+			}else{ return; }
+			this._arrowPressed(node, dir);
+			if(this._wheelTimer != null){
+				clearTimeout(this._wheelTimer);
+			}
+			var _this = this;
+			this._wheelTimer = setTimeout(function(){_this._arrowReleased(node);}, 50);
+		},
+
+		postCreate: function(){
+			this.inherited('postCreate', arguments);
+
+			// extra listeners
+			this.connect(this.textbox, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+			this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {keyCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+			this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {keyCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+			if(dojo.isIE){
+				// When spinner is moved from hidden to visible, call _setStateClass to remind IE to render it. (#6123)
+				var _this = this;
+				this.connect(this.domNode, "onresize", 
+					function(){ setTimeout(dojo.hitch(_this,
+						function(){
+							// cause the IE expressions to rerun
+							this.upArrowNode.style.behavior = '';
+							this.downArrowNode.style.behavior = '';
+							// cause IE to rerender
+							this._setStateClass();
+						}), 0);
+					}
+				);
+			}
+		}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Previous choices","nextMessage":"More choices"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"الاختيارات السابقة ","nextMessage":"مزيد من الاختيارات "})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"مساحة التحرير","iframeFocusTitle":"اطار مساحة التحرير"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ar/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"هذه القيمة ليس بالمدى الصحيح. ","invalidMessage":"القيمة التي تم ادخالها غير صحيحة. ","missingMessage":"يجب ادخال هذه القيمة. "})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Předchozí volby","nextMessage":"Další volby"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"oblast úprav","iframeFocusTitle":"rámec oblasti úprav"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/cs/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Forrige valg","nextMessage":"Flere valg"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme om redigeringsområde"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/da/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ugyldig.","missingMessage":"Værdien er påkrævet."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"Editierbereich","iframeFocusTitle":"Rahmen für Editierbereich"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/de/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"περιοχή επεξεργασίας","iframeFocusTitle":"πλαίσιο περιοχής επεξεργασίας"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/el/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"área de edición","iframeFocusTitle":"marco del área de edición"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/es/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"muokkausalue","iframeFocusTitle":"muokkausalueen kehys"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fi/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Choix précédents","nextMessage":"Plus de choix"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"zone d'édition","iframeFocusTitle":"cadre de la zone d'édition"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/fr/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Cette valeur n'est pas comprise dans la plage autorisée.","invalidMessage":"La valeur indiquée n'est pas correcte.","missingMessage":"Cette valeur est requise."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"אזור עריכה","iframeFocusTitle":"מסגרת אזור עריכה"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/he/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"הערך מחוץ לטווח. ","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש. "})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"szerkesztési terület","iframeFocusTitle":"szerkesztési terület keret"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/hu/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Az érték kívül van a megengedett tartományon. ","invalidMessage":"A megadott érték érvénytelen. ","missingMessage":"Meg kell adni egy értéket. "})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"modifica area","iframeFocusTitle":"modifica frame area"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/it/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"編集域","iframeFocusTitle":"編集域フレーム"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ja/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"편집 영역","iframeFocusTitle":"편집 영역 프레임"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ko/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Tidligere valg","nextMessage":"Flere valg"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme for redigeringsområde"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nb/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Denne verdien er utenfor gyldig område.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Eerdere opties","nextMessage":"Meer opties"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"veld bewerken","iframeFocusTitle":"veldkader bewerken"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/nl/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"obszar edycji","iframeFocusTitle":"ramka obszaru edycji"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pl/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Opções anteriores","nextMessage":"Mais opções"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"área de edição","iframeFocusTitle":"quadro da área de edição"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Este valor está fora dos limites.","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Opções anteriores","nextMessage":"Mais opções"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"área de edição","iframeFocusTitle":"painel da área de edição"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/pt-pt/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"O valor é requerido."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"область редактирования","iframeFocusTitle":"фрейм области редактирования"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/ru/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Föregående alternativ","nextMessage":"Fler alternativ"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"redigeringsområdesram"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/sv/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"düzenleme alanı","iframeFocusTitle":"düzenleme alanı çerçevesi"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/tr/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"先前选项","nextMessage":"更多选项"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"编辑区","iframeFocusTitle":"编辑区框架"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/ComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/ComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/ComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/Textarea.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/Textarea.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/Textarea.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"iframeEditTitle":"編輯區","iframeFocusTitle":"編輯區框"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/nls/zh-tw/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/Button.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/Button.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/Button.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,11 @@
+<div class="dijit dijitReset dijitLeft dijitInline"
+	dojoAttachEvent="onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse"
+	waiRole="presentation"
+	><button class="dijitReset dijitStretch dijitButtonNode dijitButtonContents" dojoAttachPoint="focusNode,titleNode"
+		type="${type}" waiRole="button" waiState="labelledby-${id}_label"
+		><span class="dijitReset dijitInline ${iconClass}" dojoAttachPoint="iconNode" 
+ 			><span class="dijitReset dijitToggleButtonIconChar">&#10003;</span 
+		></span
+		><div class="dijitReset dijitInline"><center class="dijitReset dijitButtonText" id="${id}_label" dojoAttachPoint="containerNode">${label}</center></div
+	></button
+></div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/CheckBox.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/CheckBox.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/CheckBox.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+<div class="dijitReset dijitInline" waiRole="presentation"
+	><input
+	 	type="${type}" name="${name}"
+		class="dijitReset dijitCheckBoxInput"
+		dojoAttachPoint="focusNode"
+	 	dojoAttachEvent="onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick"
+/></div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ComboBox.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ComboBox.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ComboBox.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,19 @@
+<div class="dijit dijitReset dijitInlineTable dijitLeft"
+	id="widget_${id}"
+	dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse" dojoAttachPoint="comboNode" waiRole="combobox" tabIndex="-1"
+	><div style="overflow:hidden;"
+		><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'
+			dojoAttachPoint="downArrowNode" waiRole="presentation"
+			dojoAttachEvent="onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse"
+			><div class="dijitArrowButtonInner">&thinsp;</div
+			><div class="dijitArrowButtonChar">&#9660;</div
+		></div
+		><div class="dijitReset dijitValidationIcon"><br></div
+		><div class="dijitReset dijitValidationIconText">&Chi;</div
+		><div class="dijitReset dijitInputField"
+			><input type="text" autocomplete="off" name="${name}" class='dijitReset'
+			dojoAttachEvent="onkeypress:_onKeyPress, onfocus:_update, compositionend,onkeyup"
+			dojoAttachPoint="textbox,focusNode" waiRole="textbox" waiState="haspopup-true,autocomplete-list"
+		/></div
+	></div
+></div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ComboButton.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ComboButton.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ComboButton.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,21 @@
+<table class='dijit dijitReset dijitInline dijitLeft'
+	cellspacing='0' cellpadding='0' waiRole="presentation"
+	><tbody waiRole="presentation"><tr waiRole="presentation"
+		><td	class="dijitReset dijitStretch dijitButtonContents dijitButtonNode"
+			tabIndex="${tabIndex}"
+			dojoAttachEvent="ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse"  dojoAttachPoint="titleNode"
+			waiRole="button" waiState="labelledby-${id}_label"
+			><div class="dijitReset dijitInline ${iconClass}" dojoAttachPoint="iconNode" waiRole="presentation"></div
+			><div class="dijitReset dijitInline dijitButtonText" id="${id}_label" dojoAttachPoint="containerNode" waiRole="presentation">${label}</div
+		></td
+		><td class='dijitReset dijitStretch dijitButtonNode dijitArrowButton dijitDownArrowButton'
+			dojoAttachPoint="popupStateNode,focusNode"
+			dojoAttachEvent="ondijitclick:_onArrowClick, onkeypress:_onKey,onmouseenter:_onMouse,onmouseleave:_onMouse"
+			stateModifier="DownArrow"
+			title="${optionsTitle}" name="${name}"
+			waiRole="button" waiState="haspopup-true"
+			><div class="dijitReset dijitArrowButtonInner" waiRole="presentation">&thinsp;</div
+			><div class="dijitReset dijitArrowButtonChar" waiRole="presentation">&#9660;</div
+		></td
+	></tr></tbody
+></table>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/DropDownButton.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/DropDownButton.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/DropDownButton.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,13 @@
+<div class="dijit dijitReset dijitLeft dijitInline"
+	dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey"
+	waiRole="presentation"
+	><div class='dijitReset dijitRight' waiRole="presentation"
+	><button class="dijitReset dijitStretch dijitButtonNode dijitButtonContents" type="${type}"
+		dojoAttachPoint="focusNode,titleNode" waiRole="button" waiState="haspopup-true,labelledby-${id}_label"
+		><div class="dijitReset dijitInline ${iconClass}" dojoAttachPoint="iconNode" waiRole="presentation"></div
+		><div class="dijitReset dijitInline dijitButtonText"  dojoAttachPoint="containerNode,popupStateNode" waiRole="presentation"
+			id="${id}_label">${label}</div
+		><div class="dijitReset dijitInline dijitArrowButtonInner" waiRole="presentation">&thinsp;</div
+		><div class="dijitReset dijitInline dijitArrowButtonChar" waiRole="presentation">&#9660;</div
+	></button
+></div></div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/HorizontalSlider.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/HorizontalSlider.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/HorizontalSlider.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+<table class="dijit dijitReset dijitSlider" cellspacing="0" cellpadding="0" border="0" rules="none"
+	><tr class="dijitReset"
+		><td class="dijitReset" colspan="2"></td
+		><td dojoAttachPoint="containerNode,topDecoration" class="dijitReset" style="text-align:center;width:100%;"></td
+		><td class="dijitReset" colspan="2"></td
+	></tr
+	><tr class="dijitReset"
+		><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH"
+			><div class="dijitSliderDecrementIconH" tabIndex="-1" style="display:none" dojoAttachPoint="decrementButton" dojoAttachEvent="onclick: decrement"><span class="dijitSliderButtonInner">-</span></div
+		></td
+		><td class="dijitReset"
+			><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper dijitSliderLeftBumper" dojoAttachEvent="onclick:_onClkDecBumper"></div
+		></td
+		><td class="dijitReset"
+			><input dojoAttachPoint="valueNode" type="hidden" name="${name}"
+			/><div waiRole="presentation" style="position:relative;" dojoAttachPoint="sliderBarContainer"
+				><div waiRole="presentation" dojoAttachPoint="progressBar" class="dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH" dojoAttachEvent="onclick:_onBarClick"
+					><div dojoAttachPoint="sliderHandle,focusNode" class="dijitSliderMoveable dijitSliderMoveableH" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_onHandleClick" waiRole="slider" valuemin="${minimum}" valuemax="${maximum}"
+						><div class="dijitSliderImageHandle dijitSliderImageHandleH"></div
+					></div
+				></div
+				><div waiRole="presentation" dojoAttachPoint="remainingBar" class="dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH" dojoAttachEvent="onclick:_onBarClick"></div
+			></div
+		></td
+		><td class="dijitReset"
+			><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper dijitSliderRightBumper" dojoAttachEvent="onclick:_onClkIncBumper"></div
+		></td
+		><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH" style="right:0px;"
+			><div class="dijitSliderIncrementIconH" tabIndex="-1" style="display:none" dojoAttachPoint="incrementButton" dojoAttachEvent="onclick: increment"><span class="dijitSliderButtonInner">+</span></div
+		></td
+	></tr
+	><tr class="dijitReset"
+		><td class="dijitReset" colspan="2"></td
+		><td dojoAttachPoint="containerNode,bottomDecoration" class="dijitReset" style="text-align:center;"></td
+		><td class="dijitReset" colspan="2"></td
+	></tr
+></table>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/InlineEditBox.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/InlineEditBox.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/InlineEditBox.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+<span
+	><fieldset dojoAttachPoint="editNode" style="display:none;" waiRole="presentation"
+		><div dojoAttachPoint="containerNode" dojoAttachEvent="onkeypress:_onEditWidgetKeyPress"></div
+		><div dojoAttachPoint="buttonContainer"
+			><button class='saveButton' dojoAttachPoint="saveButton" dojoType="dijit.form.Button" dojoAttachEvent="onClick:save">${buttonSave}</button
+			><button class='cancelButton' dojoAttachPoint="cancelButton" dojoType="dijit.form.Button" dojoAttachEvent="onClick:cancel">${buttonCancel}</button
+		></div
+	></fieldset
+	><span tabIndex="0" dojoAttachPoint="textNode,focusNode" waiRole="button" style="display:none;"
+		dojoAttachEvent="onkeypress:_onKeyPress,onclick:_onClick,onmouseout:_onMouseOut,onmouseover:_onMouseOver,onfocus:_onMouseOver,onblur:_onMouseOut"
+	></span
+></span>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/Spinner.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/Spinner.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/Spinner.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,28 @@
+<div class="dijit dijitReset dijitInlineTable dijitLeft"
+	id="widget_${id}"
+	dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse" waiRole="presentation"
+	><div class="dijitInputLayoutContainer"
+		><div class="dijitReset dijitSpinnerButtonContainer"
+			>&nbsp;<div class="dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton"
+				dojoAttachPoint="upArrowNode"
+				dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse"
+				stateModifier="UpArrow"
+				><div class="dijitArrowButtonInner">&thinsp;</div
+				><div class="dijitArrowButtonChar">&#9650;</div
+			></div
+			><div class="dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton"
+				dojoAttachPoint="downArrowNode"
+				dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse"
+				stateModifier="DownArrow"
+				><div class="dijitArrowButtonInner">&thinsp;</div
+				><div class="dijitArrowButtonChar">&#9660;</div
+			></div
+		></div
+		><div class="dijitReset dijitValidationIcon"><br></div
+		><div class="dijitReset dijitValidationIconText">&Chi;</div
+		><div class="dijitReset dijitInputField"
+			><input class='dijitReset' dojoAttachPoint="textbox,focusNode" type="${type}" dojoAttachEvent="onfocus:_update,onkeyup:_onkeyup,onkeypress:_onKeyPress"
+				waiRole="spinbutton" autocomplete="off" name="${name}"
+		/></div
+	></div
+></div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/TextBox.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/TextBox.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/TextBox.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+<input class="dijit dijitReset dijitLeft" dojoAttachPoint='textbox,focusNode' name="${name}"
+	dojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse,onfocus:_onMouse,onblur:_onMouse,onkeypress:_onKeyPress,onkeyup'
+	autocomplete="off" type="${type}"
+	/>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/TimePicker.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/TimePicker.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/TimePicker.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+<div id="widget_${id}" class="dijitMenu"
+    ><div dojoAttachPoint="upArrow" class="dijitButtonNode"><span class="dijitTimePickerA11yText">&#9650;</span></div
+    ><div dojoAttachPoint="timeMenu,focusNode" dojoAttachEvent="onclick:_onOptionSelected,onmouseover,onmouseout"></div
+    ><div dojoAttachPoint="downArrow" class="dijitButtonNode"><span class="dijitTimePickerA11yText">&#9660;</span></div
+></div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ValidationTextBox.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ValidationTextBox.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/ValidationTextBox.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+<div class="dijit dijitReset dijitInlineTable dijitLeft"
+	id="widget_${id}"
+	dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse" waiRole="presentation"
+	><div style="overflow:hidden;"
+		><div class="dijitReset dijitValidationIcon"><br></div
+		><div class="dijitReset dijitValidationIconText">&Chi;</div
+		><div class="dijitReset dijitInputField"
+			><input class="dijitReset" dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus:_update,onkeyup:_onkeyup,onblur:_onMouse,onkeypress:_onKeyPress' autocomplete="off"
+			type='${type}' name='${name}'
+		/></div
+	></div
+></div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/form/templates/VerticalSlider.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/form/templates/VerticalSlider.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/form/templates/VerticalSlider.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,46 @@
+<table class="dijitReset dijitSlider" cellspacing="0" cellpadding="0" border="0" rules="none"
+><tbody class="dijitReset"
+	><tr class="dijitReset"
+		><td class="dijitReset"></td
+		><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV"
+			><div class="dijitSliderIncrementIconV" tabIndex="-1" style="display:none" dojoAttachPoint="incrementButton" dojoAttachEvent="onclick:_topButtonClicked"><span class="dijitSliderButtonInner">+</span></div
+		></td
+		><td class="dijitReset"></td
+	></tr
+	><tr class="dijitReset"
+		><td class="dijitReset"></td
+		><td class="dijitReset"
+			><center><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper dijitSliderTopBumper" dojoAttachEvent="onclick:_onClkIncBumper"></div></center
+		></td
+		><td class="dijitReset"></td
+	></tr
+	><tr class="dijitReset"
+		><td dojoAttachPoint="leftDecoration" class="dijitReset" style="text-align:center;height:100%;"></td
+		><td class="dijitReset" style="height:100%;"
+			><input dojoAttachPoint="valueNode" type="hidden" name="${name}"
+			/><center waiRole="presentation" style="position:relative;height:100%;" dojoAttachPoint="sliderBarContainer"
+				><div waiRole="presentation" dojoAttachPoint="remainingBar" class="dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV" dojoAttachEvent="onclick:_onBarClick"><!--#5629--></div
+				><div waiRole="presentation" dojoAttachPoint="progressBar" class="dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV" dojoAttachEvent="onclick:_onBarClick"
+					><div dojoAttachPoint="sliderHandle,focusNode" class="dijitSliderMoveable" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_onHandleClick" style="vertical-align:top;" waiRole="slider" valuemin="${minimum}" valuemax="${maximum}"
+						><div class="dijitSliderImageHandle dijitSliderImageHandleV"></div
+					></div
+				></div
+			></center
+		></td
+		><td dojoAttachPoint="containerNode,rightDecoration" class="dijitReset" style="text-align:center;height:100%;"></td
+	></tr
+	><tr class="dijitReset"
+		><td class="dijitReset"></td
+		><td class="dijitReset"
+			><center><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper dijitSliderBottomBumper" dojoAttachEvent="onclick:_onClkDecBumper"></div></center
+		></td
+		><td class="dijitReset"></td
+	></tr
+	><tr class="dijitReset"
+		><td class="dijitReset"></td
+		><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV"
+			><div class="dijitSliderDecrementIconV" tabIndex="-1" style="display:none" dojoAttachPoint="decrementButton" dojoAttachEvent="onclick:_bottomButtonClicked"><span class="dijitSliderButtonInner">-</span></div
+		></td
+		><td class="dijitReset"></td
+	></tr
+></tbody></table>

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/AccordionContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/AccordionContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/AccordionContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,229 @@
+if(!dojo._hasResource["dijit.layout.AccordionContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.AccordionContainer"] = true;
+dojo.provide("dijit.layout.AccordionContainer");
+
+dojo.require("dojo.fx");
+
+dojo.require("dijit._Container");
+dojo.require("dijit._Templated");
+dojo.require("dijit.layout.StackContainer");
+dojo.require("dijit.layout.ContentPane");
+
+dojo.declare(
+	"dijit.layout.AccordionContainer",
+	dijit.layout.StackContainer,
+	{
+		// summary:
+		//		Holds a set of panes where every pane's title is visible, but only one pane's content is visible at a time,
+		//		and switching between panes is visualized by sliding the other panes up/down.
+		// example:
+		// | 	<div dojoType="dijit.layout.AccordionContainer">
+		// |		<div dojoType="dijit.layout.AccordionPane" title="pane 1">
+		// |			<div dojoType="dijit.layout.ContentPane">...</div>
+		// | 	</div>
+		// |		<div dojoType="dijit.layout.AccordionPane" title="pane 2">
+		// |			<p>This is some text</p>
+		// ||		...
+		// |	</div>
+		//
+		// duration: Integer
+		//		Amount of time (in ms) it takes to slide panes
+		duration: 250,
+
+		_verticalSpace: 0,
+
+		postCreate: function(){
+			this.domNode.style.overflow="hidden";
+			this.inherited("postCreate",arguments); 
+			dijit.setWaiRole(this.domNode, "tablist");
+			dojo.addClass(this.domNode,"dijitAccordionContainer");
+		},
+
+		startup: function(){
+			if(this._started){ return; }
+			this.inherited("startup",arguments);	
+			if(this.selectedChildWidget){
+				var style = this.selectedChildWidget.containerNode.style;
+				style.display = "";
+				style.overflow = "auto";
+				this.selectedChildWidget._setSelectedState(true);
+			}
+		},
+
+		layout: function(){
+			// summary: 
+			//		Set the height of the open pane based on what room remains
+
+			// get cumulative height of all the title bars, and figure out which pane is open
+			var totalCollapsedHeight = 0;
+			var openPane = this.selectedChildWidget;
+			dojo.forEach(this.getChildren(), function(child){
+				totalCollapsedHeight += child.getTitleHeight();
+			});
+			var mySize = this._contentBox;
+			this._verticalSpace = (mySize.h - totalCollapsedHeight);
+			if(openPane){
+				openPane.containerNode.style.height = this._verticalSpace + "px";
+/***
+TODO: this is wrong.  probably you wanted to call resize on the SplitContainer
+inside the AccordionPane??
+				if(openPane.resize){
+					openPane.resize({h: this._verticalSpace});
+				}
+***/
+			}
+		},
+
+		_setupChild: function(/*Widget*/ page){
+			// Summary: prepare the given child
+			return page;
+		},
+
+		_transition: function(/*Widget?*/newWidget, /*Widget?*/oldWidget){
+//TODO: should be able to replace this with calls to slideIn/slideOut
+			if(this._inTransition){ return; }
+			this._inTransition = true;
+			var animations = [];
+			var paneHeight = this._verticalSpace;
+			if(newWidget){
+				newWidget.setSelected(true);
+				var newContents = newWidget.containerNode;
+				newContents.style.display = "";
+
+				animations.push(dojo.animateProperty({
+					node: newContents,
+					duration: this.duration,
+					properties: {
+						height: { start: "1", end: paneHeight }
+					},
+					onEnd: function(){
+						newContents.style.overflow = "auto";
+					}
+				}));
+			}
+			if(oldWidget){
+				oldWidget.setSelected(false);
+				var oldContents = oldWidget.containerNode;
+				oldContents.style.overflow = "hidden";
+				animations.push(dojo.animateProperty({
+					node: oldContents,
+					duration: this.duration,
+					properties: {
+						height: { start: paneHeight, end: "1" }
+					},
+					onEnd: function(){
+						oldContents.style.display = "none";
+					}
+				}));
+			}
+
+			this._inTransition = false;
+
+			dojo.fx.combine(animations).play();
+		},
+
+		// note: we are treating the container as controller here
+		_onKeyPress: function(/*Event*/ e){
+			if(this.disabled || e.altKey || !(e._dijitWidget || e.ctrlKey)){ return; }
+			var k = dojo.keys;
+			var fromTitle = e._dijitWidget;
+			switch(e.keyCode){
+				case k.LEFT_ARROW:
+				case k.UP_ARROW:
+					if (fromTitle){
+						this._adjacent(false)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+					break;
+				case k.PAGE_UP:
+					if (e.ctrlKey){
+						this._adjacent(false)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+					break;
+				case k.RIGHT_ARROW:
+				case k.DOWN_ARROW:
+					if (fromTitle){
+						this._adjacent(true)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+					break;
+				case k.PAGE_DOWN:
+					if (e.ctrlKey){
+						this._adjacent(true)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+					break;
+				default:
+					if(e.ctrlKey && e.keyCode == k.TAB){
+						this._adjacent(e._dijitWidget, !e.shiftKey)._onTitleClick();
+						dojo.stopEvent(e);
+					}
+				
+			}
+		}
+	}
+);
+
+dojo.declare("dijit.layout.AccordionPane",
+	[dijit.layout.ContentPane, dijit._Templated, dijit._Contained],
+	{
+	// summary:
+	//		AccordionPane is a ContentPane with a title that may contain another widget.
+	//		Nested layout widgets, such as SplitContainer, are not supported at this time.
+	// example: 
+	// | see dijit.layout.AccordionContainer
+
+	templateString:"<div class='dijitAccordionPane'\n\t><div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\"\n\t\t><div class='dijitAccordionArrow' waiRole=\"presentation\"></div\n\t\t><div class='arrowTextUp' waiRole=\"presentation\">&#9650;</div\n\t\t><div class='arrowTextDown' waiRole=\"presentation\">&#9660;</div\n\t\t><div waiRole=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'>${title}</div></div\n\t><div><div dojoAttachPoint='containerNode' style='overflow: hidden; height: 1px; display: none'\n\t\tclass='dijitAccordionBody' wairole=\"tabpanel\"\n\t></div></div>\n</div>\n",
+
+	postCreate: function(){
+		this.inherited("postCreate",arguments)
+		dojo.setSelectable(this.titleNode, false);
+		this.setSelected(this.selected);
+	},
+
+	getTitleHeight: function(){
+		// summary: returns the height of the title dom node
+		return dojo.marginBox(this.titleNode).h;	// Integer
+	},
+
+	_onTitleClick: function(){
+		// summary: callback when someone clicks my title
+		var parent = this.getParent();
+		if(!parent._inTransition){
+			parent.selectChild(this);
+			dijit.focus(this.focusNode);
+		}
+	},
+
+	_onTitleKeyPress: function(/*Event*/ evt){
+		evt._dijitWidget = this;
+		return this.getParent()._onKeyPress(evt);
+	},
+
+	_setSelectedState: function(/*Boolean*/ isSelected){
+		this.selected = isSelected;
+		dojo[(isSelected ? "addClass" : "removeClass")](this.titleNode,"dijitAccordionTitle-selected");
+		this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
+	},
+
+	_handleFocus: function(/*Event*/e){
+		// summary: handle the blur and focus state of this widget
+		dojo[(e.type=="focus" ? "addClass" : "removeClass")](this.focusNode,"dijitAccordionFocused");		
+	},
+
+	setSelected: function(/*Boolean*/ isSelected){
+		// summary: change the selected state on this pane
+		this._setSelectedState(isSelected);
+		if(isSelected){
+			this.onSelected();
+			this._loadCheck(true); // if href specified, trigger load
+		}
+	},
+
+	onSelected: function(){
+		// summary: called when this pane is selected
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/BorderContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/BorderContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/BorderContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,515 @@
+if(!dojo._hasResource["dijit.layout.BorderContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.BorderContainer"] = true;
+dojo.provide("dijit.layout.BorderContainer");
+
+dojo.require("dijit.layout._LayoutWidget");
+dojo.require("dojo.cookie");
+
+dojo.declare(
+	"dijit.layout.BorderContainer",
+//	[dijit._Widget, dijit._Container, dijit._Contained],
+	dijit.layout._LayoutWidget,
+{
+	// summary:
+	//	Provides layout in 5 regions, a center and borders along its 4 sides.
+	//
+	// description:
+	//	A BorderContainer is a box with a specified size (like style="width: 500px; height: 500px;"),
+	//	that contains a child widget marked region="center" and optionally children widgets marked
+	//	region equal to "top", "bottom", "leading", "trailing", "left" or "right".
+	//	Children along the edges will be laid out according to width or height dimensions.  The remaining
+	//	space is designated for the center region.
+	//	The outer size must be specified on the BorderContainer node.  Width must be specified for the sides
+	//  and height for the top and bottom, respectively.  No dimensions should be specified on the center;
+	//	it will fill the remaining space.  Regions named "leading" and "trailing" may be used just like
+	//	"left" and "right" except that they will be reversed in right-to-left environments.
+	//  Optional splitters may be specified on the edge widgets only to make them resizable by the user.
+	//
+	// example:
+	// |	<style>
+	// |		html, body { height: 100%; width: 100%; }
+	// |	</style>
+	// |	<div dojoType="BorderContainer" design="sidebar" style="width: 100%; height: 100%">
+	// |		<div dojoType="ContentPane" region="top">header text</div>
+	// |		<div dojoType="ContentPane" region="right" style="width: 200px;">table of contents</div>
+	// |		<div dojoType="ContentPane" region="center">client area</div>
+	// |	</div>
+	//
+	// design: String
+	//  choose which design is used for the layout: "headline" (default) where the top and bottom extend
+	//  the full width of the container, or "sidebar" where the left and right sides extend from top to bottom.
+	design: "headline",
+
+	// liveSplitters: Boolean
+	//  specifies whether splitters resize as you drag (true) or only upon mouseup (false)
+	liveSplitters: true,
+
+	// persist: Boolean
+	//		Save splitter positions in a cookie.
+	persist: false,	// Boolean
+
+	// _splitterClass: String
+	// 		Optional hook to override the default Splitter widget used by BorderContainer
+	_splitterClass: "dijit.layout._Splitter",
+
+	postCreate: function(){
+		this.inherited(arguments);
+
+		this._splitters = {};
+		this._splitterThickness = {};
+		dojo.addClass(this.domNode, "dijitBorderContainer");
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+		dojo.forEach(this.getChildren(), this._setupChild, this);
+		this.inherited(arguments);
+	},
+
+	_setupChild: function(/*Widget*/child){
+		var region = child.region;
+		if(region){
+//			dojo.addClass(child.domNode, "dijitBorderContainerPane");
+			child.domNode.style.position = "absolute"; // bill says not to set this in CSS, since we can't keep others
+				// from destroying the class list
+
+			var ltr = this.isLeftToRight();
+			if(region == "leading"){ region = ltr ? "left" : "right"; }
+			if(region == "trailing"){ region = ltr ? "right" : "left"; }
+
+			this["_"+region] = child.domNode;
+			this["_"+region+"Widget"] = child;
+
+			if(child.splitter){
+				var _Splitter = dojo.getObject(this._splitterClass);
+				var flip = {left:'right', right:'left', top:'bottom', bottom:'top', leading:'trailing', trailing:'leading'};
+				var oppNodeList = dojo.query('[region=' + flip[child.region] + ']', this.domNode);
+				var splitter = new _Splitter({ container: this, child: child, region: region,
+					oppNode: oppNodeList[0], live: this.liveSplitters });
+				this._splitters[region] = splitter.domNode;
+				dojo.place(splitter.domNode, child.domNode, "after");
+				this._computeSplitterThickness(region);
+			}
+			child.region = region;
+		}
+	},
+
+	_computeSplitterThickness: function(region){
+		var re = new RegExp("top|bottom");
+		this._splitterThickness[region] =
+			dojo.marginBox(this._splitters[region])[(re.test(region) ? 'h' : 'w')];
+	},
+
+	layout: function(){
+		this._layoutChildren();
+	},
+
+	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		this.inherited(arguments);
+		this._setupChild(child);
+		if(this._started){
+			this._layoutChildren(); //OPT
+		}
+	},
+
+	removeChild: function(/*Widget*/ child){
+		var region = child.region;
+		var splitter = this._splitters[region];
+		if(splitter){
+			dijit.byNode(splitter).destroy();
+			delete this._splitters[region];
+			delete this._splitterThickness[region];
+		}
+		this.inherited(arguments);
+		delete this["_"+region];
+		delete this["_" +region+"Widget"];
+		if(this._started){
+			this._layoutChildren(child.region);
+		}
+	},
+
+	_layoutChildren: function(/*String?*/changedRegion){
+		var sidebarLayout = (this.design == "sidebar");
+		var topHeight = 0, bottomHeight = 0, leftWidth = 0, rightWidth = 0;
+		var topStyle = {}, leftStyle = {}, rightStyle = {}, bottomStyle = {},
+			centerStyle = (this._center && this._center.style) || {};
+
+		var changedSide = /left|right/.test(changedRegion);
+
+		var layoutSides = !changedRegion || (!changedSide && !sidebarLayout);
+		var layoutTopBottom = !changedRegion || (changedSide && sidebarLayout);
+		if(this._top){
+			topStyle = layoutTopBottom && this._top.style;
+			topHeight = dojo.marginBox(this._top).h;
+		}
+		if(this._left){
+			leftStyle = layoutSides && this._left.style;
+			leftWidth = dojo.marginBox(this._left).w;
+		}
+		if(this._right){
+			rightStyle = layoutSides && this._right.style;
+			rightWidth = dojo.marginBox(this._right).w;
+		}
+		if(this._bottom){
+			bottomStyle = layoutTopBottom && this._bottom.style;
+			bottomHeight = dojo.marginBox(this._bottom).h;
+		}
+
+		var splitters = this._splitters;
+		var topSplitter = splitters.top;
+		var bottomSplitter = splitters.bottom;
+		var leftSplitter = splitters.left;
+		var rightSplitter = splitters.right;
+		var splitterThickness = this._splitterThickness;
+		var topSplitterThickness = splitterThickness.top || 0;
+		var leftSplitterThickness = splitterThickness.left || 0;
+		var rightSplitterThickness = splitterThickness.right || 0;
+		var bottomSplitterThickness = splitterThickness.bottom || 0;
+
+		// Check for race condition where CSS hasn't finished loading, so
+		// the splitter width == the viewport width (#5824)
+		if(leftSplitterThickness > 50 || rightSplitterThickness > 50){
+			setTimeout(dojo.hitch(this, function(){
+				for(var region in this._splitters){
+					this._computeSplitterThickness(region);
+				}
+				this._layoutChildren();
+			}), 50);
+			return false;
+		}
+
+		var splitterBounds = {
+			left: (sidebarLayout ? leftWidth + leftSplitterThickness: "0") + "px",
+			right: (sidebarLayout ? rightWidth + rightSplitterThickness: "0") + "px"
+		};
+
+		if(topSplitter){
+			dojo.mixin(topSplitter.style, splitterBounds);
+			topSplitter.style.top = topHeight + "px";
+		}
+
+		if(bottomSplitter){
+			dojo.mixin(bottomSplitter.style, splitterBounds);
+			bottomSplitter.style.bottom = bottomHeight + "px";
+		}
+
+		splitterBounds = {
+			top: (sidebarLayout ? "0" : topHeight + topSplitterThickness) + "px",
+			bottom: (sidebarLayout ? "0" : bottomHeight + bottomSplitterThickness) + "px"
+		};
+
+		if(leftSplitter){
+			dojo.mixin(leftSplitter.style, splitterBounds);
+			leftSplitter.style.left = leftWidth + "px";
+		}
+
+		if(rightSplitter){
+			dojo.mixin(rightSplitter.style, splitterBounds);
+			rightSplitter.style.right = rightWidth + "px";
+		}
+
+		dojo.mixin(centerStyle, {
+			top: topHeight + topSplitterThickness + "px",
+			left: leftWidth + leftSplitterThickness + "px",
+			right:  rightWidth + rightSplitterThickness + "px",
+			bottom: bottomHeight + bottomSplitterThickness + "px"
+		});
+
+		var bounds = {
+			top: sidebarLayout ? "0" : centerStyle.top,
+			bottom: sidebarLayout ? "0" : centerStyle.bottom
+		};
+		dojo.mixin(leftStyle, bounds);
+		dojo.mixin(rightStyle, bounds);
+		leftStyle.left = rightStyle.right = topStyle.top = bottomStyle.bottom = "0";
+		if(sidebarLayout){
+			topStyle.left = bottomStyle.left = leftWidth + (this.isLeftToRight() ? leftSplitterThickness : 0) + "px";
+			topStyle.right = bottomStyle.right = rightWidth + (this.isLeftToRight() ? 0 : rightSplitterThickness) + "px";
+		}else{
+			topStyle.left = topStyle.right = bottomStyle.left = bottomStyle.right = "0";
+		}
+
+		// Nodes in IE respond to t/l/b/r, and TEXTAREA doesn't respond in any browser
+		var janky = dojo.isIE || dojo.some(this.getChildren(), function(child){
+			return child.domNode.tagName == "TEXTAREA";
+		});
+		if(janky){
+			// Set the size of the children the old fashioned way, by calling
+			// childNode.resize({h: int, w: int}) for each child node)
+
+			var borderBox = function(n, b){
+				n=dojo.byId(n);
+				var s = dojo.getComputedStyle(n);
+				if(!b){ return dojo._getBorderBox(n, s); }
+				var me = dojo._getMarginExtents(n, s);
+				dojo._setMarginBox(n, b.l, b.t, b.w + me.w, b.h + me.h, s);
+				return null;
+			};
+
+			var resizeWidget = function(widget, dim){
+				if(widget){
+					widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
+				}
+			};
+
+			// TODO: use dim passed in to resize() (see _LayoutWidget.js resize())
+			// Then can make borderBox setBorderBox(), since no longer need to ever get the borderBox() size
+			var thisBorderBox = borderBox(this.domNode);
+
+			var containerHeight = thisBorderBox.h;
+			var middleHeight = containerHeight;
+			if(this._top){ middleHeight -= topHeight; }
+			if(this._bottom){ middleHeight -= bottomHeight; }
+			if(topSplitter){ middleHeight -= topSplitterThickness; }
+			if(bottomSplitter){ middleHeight -= bottomSplitterThickness; }
+			var centerDim = { h: middleHeight };
+
+			var sidebarHeight = sidebarLayout ? containerHeight : middleHeight;
+			if(leftSplitter){ leftSplitter.style.height = sidebarHeight; }
+			if(rightSplitter){ rightSplitter.style.height = sidebarHeight; }
+			resizeWidget(this._leftWidget, {h: sidebarHeight});
+			resizeWidget(this._rightWidget, {h: sidebarHeight});
+
+			var containerWidth = thisBorderBox.w;
+			var middleWidth = containerWidth;
+			if(this._left){ middleWidth -= leftWidth; }
+			if(this._right){ middleWidth -= rightWidth; }
+			if(leftSplitter){ middleWidth -= leftSplitterThickness; }
+			if(rightSplitter){ middleWidth -= rightSplitterThickness; }
+			centerDim.w = middleWidth;
+
+			var sidebarWidth = sidebarLayout ? middleWidth : containerWidth;
+			if(topSplitter){ topSplitter.style.width = sidebarWidth; }
+			if(bottomSplitter){ bottomSplitter.style.width = sidebarWidth; }
+			resizeWidget(this._topWidget, {w: sidebarWidth});
+			resizeWidget(this._bottomWidget, {w: sidebarWidth});
+
+			resizeWidget(this._centerWidget, centerDim);
+		}else{
+
+			// We've already sized the children by setting style.top/bottom/left/right...
+			// Now just need to call resize() on those children so they can re-layout themselves
+
+			// TODO: calling child.resize() without an argument is bad, because it forces
+			// the child to query it's own size (even though this function already knows
+			// the size), plus which querying the size of a node right after setting it
+			// is known to cause problems (incorrect answer or an exception).
+			// This is a setback from older layout widgets, which
+			// don't do that.  See #3399, #2678, #3624 and #2955, #1988
+
+			var resizeList = {};
+			if(changedRegion){
+				resizeList[changedRegion] = resizeList.center = true;
+				if(/top|bottom/.test(changedRegion) && this.design != "sidebar"){
+					resizeList.left = resizeList.right = true;
+				}else if(/left|right/.test(changedRegion) && this.design == "sidebar"){
+					resizeList.top = resizeList.bottom = true;
+				}
+			}
+
+			dojo.forEach(this.getChildren(), function(child){
+				if(child.resize && (!changedRegion || child.region in resizeList)){
+	//				console.log(this.id, ": resizing child id=" + child.id + " (region=" + child.region + "), style before resize is " +
+	//									 "{ t: " + child.domNode.style.top +
+	//									", b: " + child.domNode.style.bottom +
+	//									", l: " + child.domNode.style.left +
+	//									 ", r: " + child.domNode.style.right +
+	//									 ", w: " + child.domNode.style.width +
+	//									 ", h: " + child.domNode.style.height +
+	//									"}"
+	//						);
+					child.resize();
+	//				console.log(this.id, ": after resize of child id=" + child.id + " (region=" + child.region + ") " +
+	//									 "{ t: " + child.domNode.style.top +
+	//									", b: " + child.domNode.style.bottom +
+	//									", l: " + child.domNode.style.left +
+	//									 ", r: " + child.domNode.style.right +
+	//									 ", w: " + child.domNode.style.width +
+	//									 ", h: " + child.domNode.style.height +
+	//									"}"
+	//						);
+				}
+			}, this);
+		}
+	}
+});
+
+// This argument can be specified for the children of a BorderContainer.
+// Since any widget can be specified as a LayoutContainer child, mix it
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget, {
+	// region: String
+	//		"top", "bottom", "leading", "trailing", "left", "right", "center".
+	//		See the BorderContainer description for details on this parameter.
+	region: '',
+
+	// splitter: Boolean
+	splitter: false,
+
+	// minSize: Number
+	minSize: 0,
+
+	// maxSize: Number
+	maxSize: Infinity
+});
+
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
+{
+/*=====
+	container: null,
+	child: null,
+	region: null,
+=====*/
+
+	// live: Boolean
+	//		If true, the child's size changes and the child widget is redrawn as you drag the splitter;
+	//		otherwise, the size doesn't change until you drop the splitter (by mouse-up)
+	live: true,
+
+	// summary: A draggable spacer between two items in a BorderContainer
+	templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag" tabIndex="0" waiRole="separator"><div class="dijitSplitterThumb"></div></div>',
+
+	postCreate: function(){
+		this.inherited(arguments);
+		this.horizontal = /top|bottom/.test(this.region);
+		dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V"));
+//		dojo.addClass(this.child.domNode, "dijitSplitterPane");
+//		dojo.setSelectable(this.domNode, false); //TODO is this necessary?
+
+		this._factor = /top|left/.test(this.region) ? 1 : -1;
+		this._minSize = this.child.minSize;
+
+		this._computeMaxSize();
+		//TODO: might be more accurate to recompute constraints on resize?
+		this.connect(this.container, "layout", dojo.hitch(this, this._computeMaxSize));
+
+		this._cookieName = this.container.id + "_" + this.region;
+		if(this.container.persist){
+			// restore old size
+			var persistSize = dojo.cookie(this._cookieName);
+			if(persistSize){
+				this.child.domNode.style[this.horizontal ? "height" : "width"] = persistSize;
+			}
+		}
+	},
+
+	_computeMaxSize: function(){
+		var dim = this.horizontal ? 'h' : 'w';
+		var available = dojo.contentBox(this.container.domNode)[dim] - (this.oppNode ? dojo.marginBox(this.oppNode)[dim] : 0);
+		this._maxSize = Math.min(this.child.maxSize, available);
+	},
+
+	_startDrag: function(e){
+		if(!this.cover){
+			this.cover = dojo.doc.createElement('div');
+			dojo.addClass(this.cover, "dijitSplitterCover");
+			dojo.place(this.cover, this.child.domNode, "after");
+		}else{
+			this.cover.style.zIndex = 1;
+		}
+
+		// Safeguard in case the stop event was missed.  Shouldn't be necessary if we always get the mouse up. 
+		if(this.fake){ dojo._destroyElement(this.fake); }
+		if(!(this._resize = this.live)){ //TODO: disable live for IE6?
+			// create fake splitter to display at old position while we drag
+			(this.fake = this.domNode.cloneNode(true)).removeAttribute("id");
+			dojo.addClass(this.domNode, "dijitSplitterShadow");
+			dojo.place(this.fake, this.domNode, "after");
+		}
+		dojo.addClass(this.domNode, "dijitSplitterActive");
+
+		//Performance: load data info local vars for onmousevent function closure
+		var factor = this._factor,
+			max = this._maxSize,
+			min = this._minSize || 10;
+		var axis = this.horizontal ? "pageY" : "pageX";
+		var pageStart = e[axis];
+		var splitterStyle = this.domNode.style;
+		var dim = this.horizontal ? 'h' : 'w';
+		var childStart = dojo.marginBox(this.child.domNode)[dim];
+		var splitterStart = parseInt(this.domNode.style[this.region]);
+		var resize = this._resize;
+		var region = this.region;
+		var mb = {};
+		var childNode = this.child.domNode;
+		var layoutFunc = dojo.hitch(this.container, this.container._layoutChildren);
+
+		var de = dojo.doc.body;
+		this._handlers = (this._handlers || []).concat([
+			dojo.connect(de, "onmousemove", this._drag = function(e, forceResize){
+				var delta = e[axis] - pageStart,
+					childSize = factor * delta + childStart,
+					boundChildSize = Math.max(Math.min(childSize, max), min);
+
+				if(resize || forceResize){
+					mb[dim] = boundChildSize;
+					// TODO: inefficient; we set the marginBox here and then immediately layoutFunc() needs to query it
+					dojo.marginBox(childNode, mb);
+					layoutFunc(region);
+				}
+				splitterStyle[region] = factor * delta + splitterStart + (boundChildSize - childSize) + "px";
+			}),
+			dojo.connect(de, "onmouseup", this, "_stopDrag")
+		]);
+		dojo.stopEvent(e);
+	},
+
+	_stopDrag: function(e){
+		try{
+			if(this.cover){ this.cover.style.zIndex = -1; }
+			if(this.fake){ dojo._destroyElement(this.fake); }
+			dojo.removeClass(this.domNode, "dijitSplitterActive");
+			dojo.removeClass(this.domNode, "dijitSplitterShadow");
+			this._drag(e); //TODO: redundant with onmousemove?
+			this._drag(e, true);
+		}finally{
+			this._cleanupHandlers();
+			delete this._drag;
+		}
+
+		if(this.container.persist){
+			dojo.cookie(this._cookieName, this.child.domNode.style[this.horizontal ? "height" : "width"]);
+		}
+	},
+
+	_cleanupHandlers: function(){
+		dojo.forEach(this._handlers, dojo.disconnect);
+		delete this._handlers;
+	},
+
+	_onKeyPress: function(/*Event*/ e){
+		// should we apply typematic to this?
+		this._resize = true;
+		var horizontal = this.horizontal;
+		var tick = 1;
+		var dk = dojo.keys;
+		switch(e.keyCode){
+			case horizontal ? dk.UP_ARROW : dk.LEFT_ARROW:
+				tick *= -1;
+				break;
+			case horizontal ? dk.DOWN_ARROW : dk.RIGHT_ARROW:
+				break;
+			default:
+//				this.inherited(arguments);
+				return;
+		}
+		var childSize = dojo.marginBox(this.child.domNode)[ horizontal ? 'h' : 'w' ] + this._factor * tick;
+		var mb = {};
+		mb[ this.horizontal ? "h" : "w"] = Math.max(Math.min(childSize, this._maxSize), this._minSize);
+		dojo.marginBox(this.child.domNode, mb);
+		this.container._layoutChildren(this.region);
+		dojo.stopEvent(e);
+	},
+
+	destroy: function(){
+		this._cleanupHandlers();
+		delete this.child;
+		delete this.container;
+		delete this.fake;
+		this.inherited(arguments);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/ContentPane.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/ContentPane.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/ContentPane.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,445 @@
+if(!dojo._hasResource["dijit.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.ContentPane"] = true;
+dojo.provide("dijit.layout.ContentPane");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit.layout._LayoutWidget");
+
+dojo.require("dojo.parser");
+dojo.require("dojo.string");
+dojo.requireLocalization("dijit", "loading", null, "zh,pt,da,tr,ru,ROOT,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+	"dijit.layout.ContentPane",
+	dijit._Widget,
+{
+	// summary:
+	//		A widget that acts as a Container for other widgets, and includes a ajax interface
+	// description:
+	//		A widget that can be used as a standalone widget
+	//		or as a baseclass for other widgets
+	//		Handles replacement of document fragment using either external uri or javascript
+	//		generated markup or DOM content, instantiating widgets within that content.
+	//		Don't confuse it with an iframe, it only needs/wants document fragments.
+	//		It's useful as a child of LayoutContainer, SplitContainer, or TabContainer.
+	//		But note that those classes can contain any widget as a child.
+	// example:
+	//		Some quick samples:
+	//		To change the innerHTML use .setContent('<b>new content</b>')
+	//
+	//		Or you can send it a NodeList, .setContent(dojo.query('div [class=selected]', userSelection))
+	//		please note that the nodes in NodeList will copied, not moved
+	//
+	//		To do a ajax update use .setHref('url')
+	//
+	// href: String
+	//		The href of the content that displays now.
+	//		Set this at construction if you want to load data externally when the
+	//		pane is shown.  (Set preload=true to load it immediately.)
+	//		Changing href after creation doesn't have any effect; see setHref();
+	href: "",
+
+	// extractContent: Boolean
+	//	Extract visible content from inside of <body> .... </body>
+	extractContent: false,
+
+	// parseOnLoad: Boolean
+	//	parse content and create the widgets, if any
+	parseOnLoad:	true,
+
+	// preventCache: Boolean
+	//		Cache content retreived externally
+	preventCache:	false,
+
+	// preload: Boolean
+	//	Force load of data even if pane is hidden.
+	preload: false,
+
+	// refreshOnShow: Boolean
+	//		Refresh (re-download) content when pane goes from hidden to shown
+	refreshOnShow: false,
+
+	// loadingMessage: String
+	//	Message that shows while downloading
+	loadingMessage: "<span class='dijitContentPaneLoading'>${loadingState}</span>", 
+
+	// errorMessage: String
+	//	Message that shows if an error occurs
+	errorMessage: "<span class='dijitContentPaneError'>${errorState}</span>", 
+
+	// isLoaded: Boolean
+	//	Tells loading status see onLoad|onUnload for event hooks
+	isLoaded: false,
+
+	// class: String
+	//	Class name to apply to ContentPane dom nodes
+	// TODO: this should be called "baseClass" like in the other widgets
+	"class": "dijitContentPane",
+
+	// doLayout: String/Boolean
+	//	false - don't adjust size of children
+	//	true - looks for the first sizable child widget (ie, having resize() method) and sets it's size to
+	//			however big the ContentPane is (TODO: implement)
+	//	auto - if there is a single sizable child widget (ie, having resize() method), set it's size to
+	//			however big the ContentPane is
+	doLayout: "auto",
+
+	postCreate: function(){
+		// remove the title attribute so it doesn't show up when i hover
+		// over a node
+		this.domNode.title = "";
+
+		if(!this.containerNode){
+			// make getDescendants() work
+			this.containerNode = this.domNode;
+		}
+
+		if(this.preload){
+			this._loadCheck();
+		}
+
+		var messages = dojo.i18n.getLocalization("dijit", "loading", this.lang);
+		this.loadingMessage = dojo.string.substitute(this.loadingMessage, messages);
+		this.errorMessage = dojo.string.substitute(this.errorMessage, messages);
+		var curRole = dijit.getWaiRole(this.domNode);
+		if (!curRole){
+			dijit.setWaiRole(this.domNode, "group");
+		}
+
+		// for programatically created ContentPane (with <span> tag), need to muck w/CSS
+		// or it's as though overflow:visible is set
+		dojo.addClass(this.domNode, this["class"]);
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+		if(this.doLayout != "false" && this.doLayout !== false){
+			this._checkIfSingleChild();
+			if(this._singleChild){
+				this._singleChild.startup();
+			}
+		}
+		this._loadCheck();
+		this.inherited(arguments);
+	},
+
+	_checkIfSingleChild: function(){
+		// summary:
+		// 	Test if we have exactly one widget as a child, and if so assume that we are a container for that widget,
+		//	and should propogate startup() and resize() calls to it.
+
+		// TODO: if there are two child widgets (a data store and a TabContainer, for example),
+		//	should still find the TabContainer
+		var childNodes = dojo.query(">", this.containerNode || this.domNode),
+			childWidgets = childNodes.filter("[widgetId]");
+
+		if(childNodes.length == 1 && childWidgets.length == 1){
+			this.isContainer = true;
+			this._singleChild = dijit.byNode(childWidgets[0]);
+		}else{
+			delete this.isContainer;
+			delete this._singleChild;
+		}
+	},
+
+	refresh: function(){
+		// summary:
+		//	Force a refresh (re-download) of content, be sure to turn off cache
+
+		// we return result of _prepareLoad here to avoid code dup. in dojox.layout.ContentPane
+		return this._prepareLoad(true);
+	},
+
+	setHref: function(/*String|Uri*/ href){
+		// summary:
+		//		Reset the (external defined) content of this pane and replace with new url
+		//		Note: It delays the download until widget is shown if preload is false
+		//	href:
+		//		url to the page you want to get, must be within the same domain as your mainpage
+		this.href = href;
+
+		// we return result of _prepareLoad here to avoid code dup. in dojox.layout.ContentPane
+		return this._prepareLoad();
+	},
+
+	setContent: function(/*String|DomNode|Nodelist*/data){
+		// summary:
+		//		Replaces old content with data content, include style classes from old content
+		//	data:
+		//		the new Content may be String, DomNode or NodeList
+		//
+		//		if data is a NodeList (or an array of nodes) nodes are copied
+		//		so you can import nodes from another document implicitly
+
+		// clear href so we cant run refresh and clear content
+		// refresh should only work if we downloaded the content
+		if(!this._isDownloaded){
+			this.href = "";
+			this._onUnloadHandler();
+		}
+
+		this._setContent(data || "");
+
+		this._isDownloaded = false; // must be set after _setContent(..), pathadjust in dojox.layout.ContentPane
+
+		if(this.parseOnLoad){
+			this._createSubWidgets();
+		}
+
+		if(this.doLayout != "false" && this.doLayout !== false){
+			this._checkIfSingleChild();
+			if(this._singleChild && this._singleChild.resize){
+				this._singleChild.startup();
+				this._singleChild.resize(this._contentBox || dojo.contentBox(this.containerNode || this.domNode));
+			}
+		}
+
+		this._onLoadHandler();
+	},
+
+	cancel: function(){
+		// summary:
+		//		Cancels a inflight download of content
+		if(this._xhrDfd && (this._xhrDfd.fired == -1)){
+			this._xhrDfd.cancel();
+		}
+		delete this._xhrDfd; // garbage collect
+	},
+
+	destroy: function(){
+		// if we have multiple controllers destroying us, bail after the first
+		if(this._beingDestroyed){
+			return;
+		}
+		// make sure we call onUnload
+		this._onUnloadHandler();
+		this._beingDestroyed = true;
+		this.inherited("destroy",arguments);
+	},
+
+	resize: function(size){
+		dojo.marginBox(this.domNode, size);
+
+		// Compute content box size in case we [later] need to size child
+		// If either height or width wasn't specified by the user, then query node for it.
+		// But note that setting the margin box and then immediately querying dimensions may return
+		// inaccurate results, so try not to depend on it.
+		var node = this.containerNode || this.domNode,
+			mb = dojo.mixin(dojo.marginBox(node), size||{});
+
+		this._contentBox = dijit.layout.marginBox2contentBox(node, mb);
+
+		// If we have a single widget child then size it to fit snugly within my borders
+		if(this._singleChild && this._singleChild.resize){
+			this._singleChild.resize(this._contentBox);
+		}
+	},
+
+	_prepareLoad: function(forceLoad){
+		// sets up for a xhrLoad, load is deferred until widget onShow
+		// cancels a inflight download
+		this.cancel();
+		this.isLoaded = false;
+		this._loadCheck(forceLoad);
+	},
+
+	_isShown: function(){
+		// summary: returns true if the content is currently shown
+		if("open" in this){
+			return this.open;		// for TitlePane, etc.
+		}else{
+			var node = this.domNode;
+			return (node.style.display != 'none')  && (node.style.visibility != 'hidden');
+		}
+	},
+
+	_loadCheck: function(/*Boolean*/ forceLoad){
+		// call this when you change onShow (onSelected) status when selected in parent container
+		// it's used as a trigger for href download when this.domNode.display != 'none'
+
+		// sequence:
+		// if no href -> bail
+		// forceLoad -> always load
+		// this.preload -> load when download not in progress, domNode display doesn't matter
+		// this.refreshOnShow -> load when download in progress bails, domNode display !='none' AND
+		//						this.open !== false (undefined is ok), isLoaded doesn't matter
+		// else -> load when download not in progress, if this.open !== false (undefined is ok) AND
+		//						domNode display != 'none', isLoaded must be false
+
+		var displayState = this._isShown();
+
+		if(this.href &&	
+			(forceLoad ||
+				(this.preload && !this._xhrDfd) ||
+				(this.refreshOnShow && displayState && !this._xhrDfd) ||
+				(!this.isLoaded && displayState && !this._xhrDfd)
+			)
+		){
+			this._downloadExternalContent();
+		}
+	},
+
+	_downloadExternalContent: function(){
+		this._onUnloadHandler();
+
+		// display loading message
+		this._setContent(
+			this.onDownloadStart.call(this)
+		);
+
+		var self = this;
+		var getArgs = {
+			preventCache: (this.preventCache || this.refreshOnShow),
+			url: this.href,
+			handleAs: "text"
+		};
+		if(dojo.isObject(this.ioArgs)){
+			dojo.mixin(getArgs, this.ioArgs);
+		}
+
+		var hand = this._xhrDfd = (this.ioMethod || dojo.xhrGet)(getArgs);
+
+		hand.addCallback(function(html){
+			try{
+				self.onDownloadEnd.call(self);
+				self._isDownloaded = true;
+				self.setContent.call(self, html); // onload event is called from here
+			}catch(err){
+				self._onError.call(self, 'Content', err); // onContentError
+			}
+			delete self._xhrDfd;
+			return html;
+		});
+
+		hand.addErrback(function(err){
+			if(!hand.cancelled){
+				// show error message in the pane
+				self._onError.call(self, 'Download', err); // onDownloadError
+			}
+			delete self._xhrDfd;
+			return err;
+		});
+	},
+
+	_onLoadHandler: function(){
+		this.isLoaded = true;
+		try{
+			this.onLoad.call(this);
+		}catch(e){
+			console.error('Error '+this.widgetId+' running custom onLoad code');
+		}
+	},
+
+	_onUnloadHandler: function(){
+		this.isLoaded = false;
+		this.cancel();
+		try{
+			this.onUnload.call(this);
+		}catch(e){
+			console.error('Error '+this.widgetId+' running custom onUnload code');
+		}
+	},
+
+	_setContent: function(cont){
+		this.destroyDescendants();
+
+		try{
+			var node = this.containerNode || this.domNode;
+			while(node.firstChild){
+				dojo._destroyElement(node.firstChild);
+			}
+			if(typeof cont == "string"){
+				// dijit.ContentPane does only minimal fixes,
+				// No pathAdjustments, script retrieval, style clean etc
+				// some of these should be available in the dojox.layout.ContentPane
+				if(this.extractContent){
+					match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+					if(match){ cont = match[1]; }
+				}
+				node.innerHTML = cont;
+			}else{
+				// domNode or NodeList
+				if(cont.nodeType){ // domNode (htmlNode 1 or textNode 3)
+					node.appendChild(cont);
+				}else{// nodelist or array such as dojo.Nodelist
+					dojo.forEach(cont, function(n){
+						node.appendChild(n.cloneNode(true));
+					});
+				}
+			}
+		}catch(e){
+			// check if a domfault occurs when we are appending this.errorMessage
+			// like for instance if domNode is a UL and we try append a DIV
+			var errMess = this.onContentError(e);
+			try{
+				node.innerHTML = errMess;
+			}catch(e){
+				console.error('Fatal '+this.id+' could not change content due to '+e.message, e);
+			}
+		}
+	},
+
+	_onError: function(type, err, consoleText){
+		// shows user the string that is returned by on[type]Error
+		// overide on[type]Error and return your own string to customize
+		var errText = this['on' + type + 'Error'].call(this, err);
+		if(consoleText){
+			console.error(consoleText, err);
+		}else if(errText){// a empty string won't change current content
+			this._setContent.call(this, errText);
+		}
+	},
+
+	_createSubWidgets: function(){
+		// summary: scan my contents and create subwidgets
+		var rootNode = this.containerNode || this.domNode;
+		try{
+			dojo.parser.parse(rootNode, true);
+		}catch(e){
+			this._onError('Content', e, "Couldn't create widgets in "+this.id
+				+(this.href ? " from "+this.href : ""));
+		}
+	},
+
+	// EVENT's, should be overide-able
+	onLoad: function(e){
+		// summary:
+		//		Event hook, is called after everything is loaded and widgetified
+	},
+
+	onUnload: function(e){
+		// summary:
+		//		Event hook, is called before old content is cleared
+	},
+
+	onDownloadStart: function(){
+		// summary:
+		//		called before download starts
+		//		the string returned by this function will be the html
+		//		that tells the user we are loading something
+		//		override with your own function if you want to change text
+		return this.loadingMessage;
+	},
+
+	onContentError: function(/*Error*/ error){
+		// summary:
+		//		called on DOM faults, require fault etc in content
+		//		default is to display errormessage inside pane
+	},
+
+	onDownloadError: function(/*Error*/ error){
+		// summary:
+		//		Called when download error occurs, default is to display
+		//		errormessage inside pane. Overide function to change that.
+		//		The string returned by this function will be the html
+		//		that tells the user a error happend
+		return this.errorMessage;
+	},
+
+	onDownloadEnd: function(){
+		// summary:
+		//		called when download is finished
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/LayoutContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/LayoutContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/LayoutContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,74 @@
+if(!dojo._hasResource["dijit.layout.LayoutContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.LayoutContainer"] = true;
+dojo.provide("dijit.layout.LayoutContainer");
+
+dojo.require("dijit.layout._LayoutWidget");
+
+dojo.declare("dijit.layout.LayoutContainer",
+	dijit.layout._LayoutWidget,
+	{
+	// summary:
+	//	Provides Delphi-style panel layout semantics.
+	//
+	// description:
+	//	A LayoutContainer is a box with a specified size (like style="width: 500px; height: 500px;"),
+	//	that contains children widgets marked with "layoutAlign" of "left", "right", "bottom", "top", and "client".
+	//	It takes it's children marked as left/top/bottom/right, and lays them out along the edges of the box,
+	//	and then it takes the child marked "client" and puts it into the remaining space in the middle.
+	//
+	//  Left/right positioning is similar to CSS's "float: left" and "float: right",
+	//	and top/bottom positioning would be similar to "float: top" and "float: bottom", if there were such
+	//	CSS.
+	//
+	//	Note that there can only be one client element, but there can be multiple left, right, top,
+	//	or bottom elements.
+	//
+	// example:
+	// |	<style>
+	// |		html, body{ height: 100%; width: 100%; }
+	// |	</style>
+	// |	<div dojoType="dijit.layout.LayoutContainer" style="width: 100%; height: 100%">
+	// |		<div dojoType="dijit.layout.ContentPane" layoutAlign="top">header text</div>
+	// |		<div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="width: 200px;">table of contents</div>
+	// |		<div dojoType="dijit.layout.ContentPane" layoutAlign="client">client area</div>
+	// |	</div>
+	// |
+	// |	Lays out each child in the natural order the children occur in.
+	// |	Basically each child is laid out into the "remaining space", where "remaining space" is initially
+	// |	the content area of this widget, but is reduced to a smaller rectangle each time a child is added.
+	//	
+
+	constructor: function(){
+		dojo.deprecated("dijit.layout.LayoutContainer is deprecated", "use BorderContainer instead", 2.0);
+	},
+
+	layout: function(){
+		dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+	},
+
+	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		dijit._Container.prototype.addChild.apply(this, arguments);
+		if(this._started){
+			dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+		}
+	},
+
+	removeChild: function(/*Widget*/ widget){
+		dijit._Container.prototype.removeChild.apply(this, arguments);
+		if(this._started){
+			dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+		}
+	}
+});
+
+// This argument can be specified for the children of a LayoutContainer.
+// Since any widget can be specified as a LayoutContainer child, mix it
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget, {
+	// layoutAlign: String
+	//		"none", "left", "right", "bottom", "top", and "client".
+	//		See the LayoutContainer description for details on this parameter.
+	layoutAlign: 'none'
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/LinkPane.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/LinkPane.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/LinkPane.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,36 @@
+if(!dojo._hasResource["dijit.layout.LinkPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.LinkPane"] = true;
+dojo.provide("dijit.layout.LinkPane");
+
+dojo.require("dijit.layout.ContentPane");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.layout.LinkPane",
+	[dijit.layout.ContentPane, dijit._Templated],
+	{
+	// summary: 
+	//	A ContentPane that loads data remotely
+	// description:
+	//	LinkPane is just a ContentPane that loads data remotely (via the href attribute),
+	//	and has markup similar to an anchor.  The anchor's body (the words between `<a>` and `</a>`)
+	//	become the title of the widget (used for TabContainer, AccordionContainer, etc.)
+	// example:
+	//	<a href="foo.html">my title</a>
+
+	// I'm using a template because the user may specify the input as
+	// <a href="foo.html">title</a>, in which case we need to get rid of the
+	// <a> because we don't want a link.
+	templateString: '<div class="dijitLinkPane"></div>',
+
+	postCreate: function(){
+
+		// If user has specified node contents, they become the title
+		// (the link must be plain text)
+		if(this.srcNodeRef){
+			this.title += this.srcNodeRef.innerHTML;
+		}
+		this.inherited("postCreate",arguments);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/SplitContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/SplitContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/SplitContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/StackContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/StackContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/StackContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,493 @@
+if(!dojo._hasResource["dijit.layout.StackContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.StackContainer"] = true;
+dojo.provide("dijit.layout.StackContainer");
+
+dojo.require("dijit._Templated");
+dojo.require("dijit.layout._LayoutWidget");
+dojo.require("dijit.form.Button");
+dojo.require("dijit.Menu");
+dojo.requireLocalization("dijit", "common", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,ROOT,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+	"dijit.layout.StackContainer",
+	dijit.layout._LayoutWidget,
+	{
+	// summary: 
+	//	A container that has multiple children, but shows only
+	//	one child at a time
+	//
+	// description:
+	// 	A container for widgets (ContentPanes, for example) That displays
+	//	only one Widget at a time.
+	//	
+	//	Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
+	//
+	//	Can be base class for container, Wizard, Show, etc.
+	// 
+	//
+	// doLayout: Boolean
+	//  if true, change the size of my currently displayed child to match my size
+	doLayout: true,
+
+	_started: false,
+/*=====
+	// selectedChildWidget: Widget
+	//	References the currently selected child widget, if any
+	//
+	selectedChildWidget: null,
+=====*/
+	postCreate: function(){
+		dijit.setWaiRole((this.containerNode || this.domNode), "tabpanel");
+		this.connect(this.domNode, "onkeypress", this._onKeyPress);
+	},
+	
+	startup: function(){
+		if(this._started){ return; }
+
+		var children = this.getChildren();
+
+		// Setup each page panel
+		dojo.forEach(children, this._setupChild, this);
+
+		// Figure out which child to initially display
+		dojo.some(children, function(child){
+			if(child.selected){
+				this.selectedChildWidget = child;
+			}
+			return child.selected;
+		}, this);
+
+		var selected = this.selectedChildWidget;
+
+		// Default to the first child
+		if(!selected && children[0]){
+			selected = this.selectedChildWidget = children[0];
+			selected.selected = true;
+		}
+		if(selected){
+			this._showChild(selected);
+		}
+
+		// Now publish information about myself so any StackControllers can initialize..
+		dojo.publish(this.id+"-startup", [{children: children, selected: selected}]);
+
+		this.inherited(arguments);
+	},
+
+	_setupChild: function(/*Widget*/ page){
+		// Summary: prepare the given child
+
+		page.domNode.style.display = "none";
+
+		// since we are setting the width/height of the child elements, they need
+		// to be position:relative, or IE has problems (See bug #2033)
+		page.domNode.style.position = "relative";
+
+		return page; // dijit._Widget
+	},
+
+	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		// summary: Adds a widget to the stack
+		 
+		dijit._Container.prototype.addChild.apply(this, arguments);
+		child = this._setupChild(child);
+
+		if(this._started){
+			// in case the tab titles have overflowed from one line to two lines
+			this.layout();
+
+			dojo.publish(this.id+"-addChild", [child, insertIndex]);
+
+			// if this is the first child, then select it
+			if(!this.selectedChildWidget){
+				this.selectChild(child);
+			}
+		}
+	},
+
+	removeChild: function(/*Widget*/ page){
+		// summary: Removes the pane from the stack
+
+		dijit._Container.prototype.removeChild.apply(this, arguments);
+
+		// If we are being destroyed than don't run the code below (to select another page), because we are deleting
+		// every page one by one
+		if(this._beingDestroyed){ return; }
+
+		if(this._started){
+			// this will notify any tablists to remove a button; do this first because it may affect sizing
+			dojo.publish(this.id+"-removeChild", [page]);
+
+			// in case the tab titles now take up one line instead of two lines
+			this.layout();
+		}
+
+		if(this.selectedChildWidget === page){
+			this.selectedChildWidget = undefined;
+			if(this._started){
+				var children = this.getChildren();
+				if(children.length){
+					this.selectChild(children[0]);
+				}
+			}
+		}
+	},
+
+	selectChild: function(/*Widget*/ page){
+		// summary:
+		//	Show the given widget (which must be one of my children)
+
+		page = dijit.byId(page);
+
+		if(this.selectedChildWidget != page){
+			// Deselect old page and select new one
+			this._transition(page, this.selectedChildWidget);
+			this.selectedChildWidget = page;
+			dojo.publish(this.id+"-selectChild", [page]);
+		}
+	},
+
+	_transition: function(/*Widget*/newWidget, /*Widget*/oldWidget){
+		if(oldWidget){
+			this._hideChild(oldWidget);
+		}
+		this._showChild(newWidget);
+
+		// Size the new widget, in case this is the first time it's being shown,
+		// or I have been resized since the last time it was shown.
+		// page must be visible for resizing to work
+		if(this.doLayout && newWidget.resize){
+			newWidget.resize(this._containerContentBox || this._contentBox);
+		}
+	},
+
+	_adjacent: function(/*Boolean*/ forward){
+		// summary: Gets the next/previous child widget in this container from the current selection
+		var children = this.getChildren();
+		var index = dojo.indexOf(children, this.selectedChildWidget);
+		index += forward ? 1 : children.length - 1;
+		return children[ index % children.length ]; // dijit._Widget
+	},
+
+	forward: function(){
+		// Summary: advance to next page
+		this.selectChild(this._adjacent(true));
+	},
+
+	back: function(){
+		// Summary: go back to previous page
+		this.selectChild(this._adjacent(false));
+	},
+
+	_onKeyPress: function(e){
+		dojo.publish(this.id+"-containerKeyPress", [{ e: e, page: this}]);
+	},
+
+	layout: function(){
+		if(this.doLayout && this.selectedChildWidget && this.selectedChildWidget.resize){
+			this.selectedChildWidget.resize(this._contentBox);
+		}
+	},
+
+	_showChild: function(/*Widget*/ page){
+		var children = this.getChildren();
+		page.isFirstChild = (page == children[0]);
+		page.isLastChild = (page == children[children.length-1]);
+		page.selected = true;
+
+		page.domNode.style.display="";
+		if(page._loadCheck){
+			page._loadCheck(); // trigger load in ContentPane
+		}
+		if(page.onShow){
+			page.onShow();
+		}
+	},
+
+	_hideChild: function(/*Widget*/ page){
+		page.selected=false;
+		page.domNode.style.display="none";
+		if(page.onHide){
+			page.onHide();
+		}
+	},
+
+	closeChild: function(/*Widget*/ page){
+		// summary:
+		//	callback when user clicks the [X] to remove a page
+		//	if onClose() returns true then remove and destroy the child
+		var remove = page.onClose(this, page);
+		if(remove){
+			this.removeChild(page);
+			// makes sure we can clean up executeScripts in ContentPane onUnLoad
+			page.destroyRecursive();
+		}
+	},
+
+	destroy: function(){
+		this._beingDestroyed = true;
+		this.inherited(arguments);
+	}
+});
+
+dojo.declare(
+	"dijit.layout.StackController",
+	[dijit._Widget, dijit._Templated, dijit._Container],
+	{
+	// summary:
+	//	Set of buttons to select a page in a page list.
+	//	Monitors the specified StackContainer, and whenever a page is
+	//	added, deleted, or selected, updates itself accordingly.
+
+		templateString: "<span wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",
+
+		// containerId: String
+		//	the id of the page container that I point to
+		containerId: "",
+
+		// buttonWidget: String
+		//	the name of the button widget to create to correspond to each page
+		buttonWidget: "dijit.layout._StackButton",
+
+		postCreate: function(){
+			dijit.setWaiRole(this.domNode, "tablist");
+
+			// TODO: change key from object to id, to get more separation from StackContainer
+			this.pane2button = {};		// mapping from panes to buttons
+			this.pane2menu = {};		// mapping from panes to close menu
+
+			this._subscriptions=[
+				dojo.subscribe(this.containerId+"-startup", this, "onStartup"),
+				dojo.subscribe(this.containerId+"-addChild", this, "onAddChild"),
+				dojo.subscribe(this.containerId+"-removeChild", this, "onRemoveChild"),
+				dojo.subscribe(this.containerId+"-selectChild", this, "onSelectChild"),
+				dojo.subscribe(this.containerId+"-containerKeyPress", this, "onContainerKeyPress")
+			];
+		},
+
+		onStartup: function(/*Object*/ info){
+			// summary: called after StackContainer has finished initializing
+			dojo.forEach(info.children, this.onAddChild, this);
+			this.onSelectChild(info.selected);
+		},
+
+		destroy: function(){
+			for(var pane in this.pane2button){
+				this.onRemoveChild(pane);
+			}
+			dojo.forEach(this._subscriptions, dojo.unsubscribe);
+			this.inherited(arguments);
+		},
+
+		onAddChild: function(/*Widget*/ page, /*Integer?*/ insertIndex){
+			// summary:
+			//   Called whenever a page is added to the container.
+			//   Create button corresponding to the page.
+
+			// add a node that will be promoted to the button widget
+			var refNode = dojo.doc.createElement("span");
+			this.domNode.appendChild(refNode);
+			// create an instance of the button widget
+			var cls = dojo.getObject(this.buttonWidget);
+			var button = new cls({label: page.title, closeButton: page.closable}, refNode);
+			this.addChild(button, insertIndex);
+			this.pane2button[page] = button;
+			page.controlButton = button;	// this value might be overwritten if two tabs point to same container
+			
+			dojo.connect(button, "onClick", dojo.hitch(this,"onButtonClick",page));
+			if(page.closable){
+				dojo.connect(button, "onClickCloseButton", dojo.hitch(this,"onCloseButtonClick",page));
+				// add context menu onto title button
+				var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+				var closeMenu = new dijit.Menu({targetNodeIds:[button.id], id:button.id+"_Menu"});
+				var mItem = new dijit.MenuItem({label:_nlsResources.itemClose});
+            	dojo.connect(mItem, "onClick", dojo.hitch(this, "onCloseButtonClick", page));
+           		closeMenu.addChild(mItem);
+           		this.pane2menu[page] = closeMenu;
+			}
+			if(!this._currentChild){ // put the first child into the tab order
+				button.focusNode.setAttribute("tabIndex", "0");
+				this._currentChild = page;
+			}
+			//make sure all tabs have the same length
+			if(!this.isLeftToRight() && dojo.isIE && this._rectifyRtlTabList){
+				this._rectifyRtlTabList();
+			}
+		},
+
+		onRemoveChild: function(/*Widget*/ page){
+			// summary:
+			//   Called whenever a page is removed from the container.
+			//   Remove the button corresponding to the page.
+			if(this._currentChild === page){ this._currentChild = null; }
+			var button = this.pane2button[page];
+			var menu = this.pane2menu[page];
+			if (menu){
+				menu.destroy();
+			}
+			if(button){
+				// TODO? if current child { reassign }
+				button.destroy();
+			}
+			this.pane2button[page] = null;
+		},
+
+		onSelectChild: function(/*Widget*/ page){
+			// summary:
+			//	Called when a page has been selected in the StackContainer, either by me or by another StackController
+
+			if(!page){ return; }
+
+			if(this._currentChild){
+				var oldButton=this.pane2button[this._currentChild];
+				oldButton.setAttribute('checked', false);
+				oldButton.focusNode.setAttribute("tabIndex", "-1");
+			}
+
+			var newButton=this.pane2button[page];
+			newButton.setAttribute('checked', true);
+			this._currentChild = page;
+			newButton.focusNode.setAttribute("tabIndex", "0");
+			var container = dijit.byId(this.containerId);
+			dijit.setWaiState(container.containerNode || container.domNode, "labelledby", newButton.id);
+		},
+
+		onButtonClick: function(/*Widget*/ page){
+			// summary:
+			//   Called whenever one of my child buttons is pressed in an attempt to select a page
+			var container = dijit.byId(this.containerId);	// TODO: do this via topics?
+			container.selectChild(page); 
+		},
+
+		onCloseButtonClick: function(/*Widget*/ page){
+			// summary:
+			//   Called whenever one of my child buttons [X] is pressed in an attempt to close a page
+			var container = dijit.byId(this.containerId);
+			container.closeChild(page);
+			var b = this.pane2button[this._currentChild];
+			if(b){
+				dijit.focus(b.focusNode || b.domNode);
+			}
+		},
+		
+		// TODO: this is a bit redundant with forward, back api in StackContainer
+		adjacent: function(/*Boolean*/ forward){
+			if(!this.isLeftToRight() && (!this.tabPosition || /top|bottom/.test(this.tabPosition))){ forward = !forward; }
+			// find currently focused button in children array
+			var children = this.getChildren();
+			var current = dojo.indexOf(children, this.pane2button[this._currentChild]);
+			// pick next button to focus on
+			var offset = forward ? 1 : children.length - 1;
+			return children[ (current + offset) % children.length ]; // dijit._Widget
+		},
+
+		onkeypress: function(/*Event*/ e){
+			// summary:
+			//   Handle keystrokes on the page list, for advancing to next/previous button
+			//   and closing the current page if the page is closable.
+
+			if(this.disabled || e.altKey ){ return; }
+			var forward = null;
+			if(e.ctrlKey || !e._djpage){
+				var k = dojo.keys;
+				switch(e.keyCode){
+					case k.LEFT_ARROW:
+					case k.UP_ARROW:
+						if(!e._djpage){ forward = false; }
+						break;
+					case k.PAGE_UP:
+						if(e.ctrlKey){ forward = false; }
+						break;
+					case k.RIGHT_ARROW:
+					case k.DOWN_ARROW:
+						if(!e._djpage){ forward = true; }
+						break;
+					case k.PAGE_DOWN:
+						if(e.ctrlKey){ forward = true; }
+						break;
+					case k.DELETE:
+						if(this._currentChild.closable){
+							this.onCloseButtonClick(this._currentChild);
+						}
+						dojo.stopEvent(e);
+						break;
+					default:
+						if(e.ctrlKey){
+							if(e.keyCode == k.TAB){
+								this.adjacent(!e.shiftKey).onClick();
+								dojo.stopEvent(e);
+							}else if(e.keyChar == "w"){
+								if(this._currentChild.closable){
+									this.onCloseButtonClick(this._currentChild);
+								}
+								dojo.stopEvent(e); // avoid browser tab closing.
+							}
+						}
+				}
+				// handle page navigation
+				if(forward !== null){
+					this.adjacent(forward).onClick();
+					dojo.stopEvent(e);
+				}
+			}
+		},
+
+		onContainerKeyPress: function(/*Object*/ info){
+			info.e._djpage = info.page;
+			this.onkeypress(info.e);
+		}
+});
+
+dojo.declare("dijit.layout._StackButton",
+	dijit.form.ToggleButton,
+	{
+	// summary
+	//	Internal widget used by StackContainer.
+	//	The button-like or tab-like object you click to select or delete a page
+	
+	tabIndex: "-1", // StackContainer buttons are not in the tab order by default
+	
+	postCreate: function(/*Event*/ evt){
+		dijit.setWaiRole((this.focusNode || this.domNode), "tab");
+		this.inherited(arguments);
+	},
+	
+	onClick: function(/*Event*/ evt){
+		// summary: This is for TabContainer where the tabs are <span> rather than button,
+		// 	so need to set focus explicitly (on some browsers)
+		dijit.focus(this.focusNode);
+
+		// ... now let StackController catch the event and tell me what to do
+	},
+
+	onClickCloseButton: function(/*Event*/ evt){
+		// summary
+		//	StackContainer connects to this function; if your widget contains a close button
+		//	then clicking it should call this function.
+		evt.stopPropagation();
+	}
+});
+
+// These arguments can be specified for the children of a StackContainer.
+// Since any widget can be specified as a StackContainer child, mix them
+// into the base widget class.  (This is a hack, but it's effective.)
+dojo.extend(dijit._Widget, {
+	// title: String
+	//		Title of this widget.  Used by TabContainer to the name the tab, etc.
+	title: "",
+
+	// selected: Boolean
+	//		Is this child currently selected?
+	selected: false,
+
+	// closable: Boolean
+	//		True if user can close (destroy) this child, such as (for example) clicking the X on the tab.
+	closable: false,	// true if user can close this tab pane
+
+	onClose: function(){
+		// summary: Callback if someone tries to close the child, child will be closed if func returns true
+		return true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/TabContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/TabContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/TabContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,184 @@
+if(!dojo._hasResource["dijit.layout.TabContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.TabContainer"] = true;
+dojo.provide("dijit.layout.TabContainer");
+
+dojo.require("dijit.layout.StackContainer");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.layout.TabContainer",
+	[dijit.layout.StackContainer, dijit._Templated],
+	{	
+	// summary: 
+	//	A Container with Title Tabs, each one pointing at a pane in the container.
+	// description:
+	//	A TabContainer is a container that has multiple panes, but shows only
+	//	one pane at a time.  There are a set of tabs corresponding to each pane,
+	//	where each tab has the title (aka title) of the pane, and optionally a close button.
+	//
+	//	Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
+	//	(where [widgetId] is the id of the TabContainer itself.
+	//
+	// tabPosition: String
+	//   Defines where tabs go relative to tab content.
+	//   "top", "bottom", "left-h", "right-h"
+	tabPosition: "top",
+
+	templateString: null,	// override setting in StackContainer
+	templateString:"<div class=\"dijitTabContainer\">\n\t<div dojoAttachPoint=\"tablistNode\"></div>\n\t<div class=\"dijitTabPaneWrapper\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n",
+
+	// _controllerWidget: String
+	//		An optional parameter to overrider the default TabContainer controller used.
+	_controllerWidget: "dijit.layout.TabController",
+
+	postCreate: function(){	
+		this.inherited(arguments);
+		// create the tab list that will have a tab (a.k.a. tab button) for each tab panel
+		var TabController = dojo.getObject(this._controllerWidget);
+		this.tablist = new TabController({
+			id: this.id + "_tablist",
+			tabPosition: this.tabPosition,
+			doLayout: this.doLayout,
+			containerId: this.id
+		}, this.tablistNode);		
+	},
+
+	_setupChild: function(/* Widget */tab){
+		dojo.addClass(tab.domNode, "dijitTabPane");
+		this.inherited(arguments);
+		return tab; // Widget
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		// wire up the tablist and its tabs
+		this.tablist.startup();
+		this.inherited(arguments);
+
+		if(dojo.isSafari){
+			// sometimes safari 3.0.3 miscalculates the height of the tab labels, see #4058
+			setTimeout(dojo.hitch(this, "layout"), 0);
+		}
+
+		if(dojo.isIE && !this.isLeftToRight() && this.tabPosition == "right-h" &&
+		   this.tablist && this.tablist.pane2button){
+			//need rectify non-closable tab in IE, only for "right-h" mode
+			for(var pane in this.tablist.pane2button){
+				var tabButton = this.tablist.pane2button[pane];
+				if(!tabButton.closeButton){ continue; }
+				tabButtonStyle = tabButton.closeButtonNode.style;
+				tabButtonStyle.position ="absolute";
+				if(dojo.isIE < 7){
+					tabButtonStyle.left = tabButton.domNode.offsetWidth + "px";
+				}else{
+					tabButtonStyle.padding = "0px";
+				}
+			}
+		}
+	},
+
+	layout: function(){
+		// Summary: Configure the content pane to take up all the space except for where the tabs are
+		if(!this.doLayout){ return; }
+
+		// position and size the titles and the container node
+		var titleAlign = this.tabPosition.replace(/-h/,"");
+		var children = [
+			{ domNode: this.tablist.domNode, layoutAlign: titleAlign },
+			{ domNode: this.containerNode, layoutAlign: "client" }
+		];
+		dijit.layout.layoutChildren(this.domNode, this._contentBox, children);
+
+		// Compute size to make each of my children.
+		// children[1] is the margin-box size of this.containerNode, set by layoutChildren() call above
+		this._containerContentBox = dijit.layout.marginBox2contentBox(this.containerNode, children[1]);
+
+		if(this.selectedChildWidget){
+			this._showChild(this.selectedChildWidget);
+			if(this.doLayout && this.selectedChildWidget.resize){
+				this.selectedChildWidget.resize(this._containerContentBox);
+			}
+		}
+	},
+
+	destroy: function(){
+		if(this.tablist){
+			this.tablist.destroy();
+		}
+		this.inherited(arguments);
+	}
+});
+
+//TODO: make private?
+dojo.declare("dijit.layout.TabController",
+	dijit.layout.StackController,
+	{
+	// summary:
+	// 	Set of tabs (the things with titles and a close button, that you click to show a tab panel).
+	// description:
+	//	Lets the user select the currently shown pane in a TabContainer or StackContainer.
+	//	TabController also monitors the TabContainer, and whenever a pane is
+	//	added or deleted updates itself accordingly.
+
+	templateString: "<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",
+
+	// tabPosition: String
+	//   Defines where tabs go relative to the content.
+	//   "top", "bottom", "left-h", "right-h"
+	tabPosition: "top",
+
+	// doLayout: Boolean
+	// 	TODOC: deprecate doLayout? not sure.
+	doLayout: true,
+
+	// buttonWidget: String
+	//	The name of the tab widget to create to correspond to each page
+	buttonWidget: "dijit.layout._TabButton",
+
+	postMixInProperties: function(){
+		this["class"] = "dijitTabLabels-" + this.tabPosition + (this.doLayout ? "" : " dijitTabNoLayout");
+		this.inherited(arguments);
+	},
+
+//TODO: can this be accomplished in CSS?
+	_rectifyRtlTabList: function(){
+		//Summary: Rectify the length of all tabs in rtl, otherwise the tab lengths are different in IE
+		if(0 >= this.tabPosition.indexOf('-h')){ return; }
+		if(!this.pane2button){ return; }
+
+		var maxLen = 0;
+		for(var pane in this.pane2button){
+			maxLen = Math.max(maxLen, dojo.marginBox(this.pane2button[pane].innerDiv).w);
+		}
+		//unify the length of all the tabs
+		for(pane in this.pane2button){
+			this.pane2button[pane].innerDiv.style.width = maxLen + 'px';
+		}	
+	}
+});
+
+dojo.declare("dijit.layout._TabButton",
+	dijit.layout._StackButton,
+	{
+	// summary:
+	//	A tab (the thing you click to select a pane).
+	// description:
+	//	Contains the title of the pane, and optionally a close-button to destroy the pane.
+	//	This is an internal widget and should not be instantiated directly.
+
+	baseClass: "dijitTab",
+
+	templateString:"<div waiRole=\"presentation\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n    <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n        <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n\t        <span dojoAttachPoint='containerNode,focusNode' class='tabLabel'>${!label}</span>\n\t        <span dojoAttachPoint='closeButtonNode' class='closeImage' dojoAttachEvent='onmouseenter:_onMouse, onmouseleave:_onMouse, onclick:onClickCloseButton' stateModifier='CloseButton'>\n\t            <span dojoAttachPoint='closeText' class='closeText'>x</span>\n\t        </span>\n        </div>\n    </div>\n</div>\n",
+
+	postCreate: function(){
+		if(this.closeButton){
+			dojo.addClass(this.innerDiv, "dijitClosable");
+		}else{
+			this.closeButtonNode.style.display="none";
+		}
+		this.inherited(arguments); 
+		dojo.setSelectable(this.containerNode, false);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/_LayoutWidget.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/_LayoutWidget.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/_LayoutWidget.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,188 @@
+if(!dojo._hasResource["dijit.layout._LayoutWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout._LayoutWidget"] = true;
+dojo.provide("dijit.layout._LayoutWidget");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Container");
+
+dojo.declare("dijit.layout._LayoutWidget",
+	[dijit._Widget, dijit._Container, dijit._Contained],
+	{
+		// summary
+		//		Mixin for widgets that contain a list of children like SplitContainer.
+		//		Widgets which mixin this code must define layout() to lay out the children
+
+		isLayoutContainer: true,
+
+		postCreate: function(){
+			dojo.addClass(this.domNode, "dijitContainer");
+		},
+
+		startup: function(){
+			// summary:
+			//		Called after all the widgets have been instantiated and their
+			//		dom nodes have been inserted somewhere under dojo.doc.body.
+			//
+			//		Widgets should override this method to do any initialization
+			//		dependent on other widgets existing, and then call
+			//		this superclass method to finish things off.
+			//
+			//		startup() in subclasses shouldn't do anything
+			//		size related because the size of the widget hasn't been set yet.
+
+			if(this._started){ return; }
+
+			dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+
+			// If I am a top level widget
+			if(!this.getParent || !this.getParent()){
+				// Do recursive sizing and layout of all my descendants
+				// (passing in no argument to resize means that it has to glean the size itself)
+				this.resize();
+
+				// since my parent isn't a layout container, and my style is width=height=100% (or something similar),
+				// then I need to watch when the window resizes, and size myself accordingly
+				// (passing in no argument to resize means that it has to glean the size itself)
+				this.connect(window, 'onresize', function(){this.resize();});
+			}
+			
+			this.inherited(arguments);
+		},
+
+		resize: function(args){
+			// summary:
+			//		Explicitly set this widget's size (in pixels),
+			//		and then call layout() to resize contents (and maybe adjust child widgets)
+			//	
+			// args: Object?
+			//		{w: int, h: int, l: int, t: int}
+
+			var node = this.domNode;
+
+			// set margin box size, unless it wasn't specified, in which case use current size
+			if(args){
+				dojo.marginBox(node, args);
+
+				// set offset of the node
+				if(args.t){ node.style.top = args.t + "px"; }
+				if(args.l){ node.style.left = args.l + "px"; }
+			}
+			// If either height or width wasn't specified by the user, then query node for it.
+			// But note that setting the margin box and then immediately querying dimensions may return
+			// inaccurate results, so try not to depend on it.
+			var mb = dojo.mixin(dojo.marginBox(node), args||{});
+
+//			console.log(this, ": setting size to ", mb);
+
+			// Save the size of my content box.
+			this._contentBox = dijit.layout.marginBox2contentBox(node, mb);
+
+			// Callback for widget to adjust size of it's children
+			this.layout();
+		},
+
+		layout: function(){
+			//	summary
+			//		Widgets override this method to size & position their contents/children.
+			//		When this is called this._contentBox is guaranteed to be set (see resize()).
+			//
+			//		This is called after startup(), and also when the widget's size has been
+			//		changed.
+		}
+	}
+);
+
+dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
+	// summary:
+	//		Given the margin-box size of a node, return it's content box size.
+	//		Functions like dojo.contentBox() but is more reliable since it doesn't have
+	//		to wait for the browser to compute sizes.
+	var cs = dojo.getComputedStyle(node);
+	var me=dojo._getMarginExtents(node, cs);
+	var pb=dojo._getPadBorderExtents(node, cs);
+	return {
+		l: dojo._toPixelValue(node, cs.paddingLeft),
+		t: dojo._toPixelValue(node, cs.paddingTop),
+		w: mb.w - (me.w + pb.w),
+		h: mb.h - (me.h + pb.h)
+	};
+};
+
+(function(){
+	var capitalize = function(word){
+		return word.substring(0,1).toUpperCase() + word.substring(1);
+	};
+
+	var size = function(widget, dim){
+		// size the child
+		widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
+
+		// record child's size, but favor our own numbers when we have them.
+		// the browser lies sometimes
+		dojo.mixin(widget, dojo.marginBox(widget.domNode));
+		dojo.mixin(widget, dim);
+	};
+
+	dijit.layout.layoutChildren = function(/*DomNode*/ container, /*Object*/ dim, /*Object[]*/ children){
+		/**
+		 * summary
+		 *		Layout a bunch of child dom nodes within a parent dom node
+		 * container:
+		 *		parent node
+		 * dim:
+		 *		{l, t, w, h} object specifying dimensions of container into which to place children
+		 * children:
+		 *		an array like [ {domNode: foo, layoutAlign: "bottom" }, {domNode: bar, layoutAlign: "client"} ]
+		 */
+
+		// copy dim because we are going to modify it
+		dim = dojo.mixin({}, dim);
+
+		dojo.addClass(container, "dijitLayoutContainer");
+
+		// Move "client" elements to the end of the array for layout.  a11y dictates that the author
+		// needs to be able to put them in the document in tab-order, but this algorithm requires that
+		// client be last.
+		children = dojo.filter(children, function(item){ return item.layoutAlign != "client"; })
+			.concat(dojo.filter(children, function(item){ return item.layoutAlign == "client"; }));
+
+		// set positions/sizes
+		dojo.forEach(children, function(child){
+			var elm = child.domNode,
+				pos = child.layoutAlign;
+
+			// set elem to upper left corner of unused space; may move it later
+			var elmStyle = elm.style;
+			elmStyle.left = dim.l+"px";
+			elmStyle.top = dim.t+"px";
+			elmStyle.bottom = elmStyle.right = "auto";
+
+			dojo.addClass(elm, "dijitAlign" + capitalize(pos));
+
+			// set size && adjust record of remaining space.
+			// note that setting the width of a <div> may affect it's height.
+			if(pos=="top" || pos=="bottom"){
+				size(child, { w: dim.w });
+				dim.h -= child.h;
+				if(pos=="top"){
+					dim.t += child.h;
+				}else{
+					elmStyle.top = dim.t + dim.h + "px";
+				}
+			}else if(pos=="left" || pos=="right"){
+				size(child, { h: dim.h });
+				dim.w -= child.w;
+				if(pos=="left"){
+					dim.l += child.w;
+				}else{
+					elmStyle.left = dim.l + dim.w + "px";
+				}
+			}else if(pos=="client"){
+				size(child, dim);
+			}
+		});
+	};
+
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/AccordionPane.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/AccordionPane.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/AccordionPane.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,11 @@
+<div class='dijitAccordionPane'
+	><div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus'
+		class='dijitAccordionTitle' wairole="tab"
+		><div class='dijitAccordionArrow' waiRole="presentation"></div
+		><div class='arrowTextUp' waiRole="presentation">&#9650;</div
+		><div class='arrowTextDown' waiRole="presentation">&#9660;</div
+		><div waiRole="presentation" dojoAttachPoint='titleTextNode' class='dijitAccordionText'>${title}</div></div
+	><div><div dojoAttachPoint='containerNode' style='overflow: hidden; height: 1px; display: none'
+		class='dijitAccordionBody' wairole="tabpanel"
+	></div></div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/TabContainer.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/TabContainer.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/TabContainer.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+<div class="dijitTabContainer">
+	<div dojoAttachPoint="tablistNode"></div>
+	<div class="dijitTabPaneWrapper" dojoAttachPoint="containerNode"></div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/TooltipDialog.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/TooltipDialog.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/TooltipDialog.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+<div class="dijitTooltipDialog" waiRole="presentation">
+	<div class="dijitTooltipContainer" waiRole="presentation">
+		<div class ="dijitTooltipContents dijitTooltipFocusNode" dojoAttachPoint="containerNode" tabindex="-1" waiRole="dialog"></div>
+	</div>
+	<div class="dijitTooltipConnector" waiRole="presenation"></div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/_TabButton.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/_TabButton.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/layout/templates/_TabButton.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,10 @@
+<div waiRole="presentation" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>
+    <div waiRole="presentation" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>
+        <div waiRole="presentation" class='dijitTabContent' dojoAttachPoint='tabContent'>
+	        <span dojoAttachPoint='containerNode,focusNode' class='tabLabel'>${!label}</span>
+	        <span dojoAttachPoint='closeButtonNode' class='closeImage' dojoAttachEvent='onmouseenter:_onMouse, onmouseleave:_onMouse, onclick:onClickCloseButton' stateModifier='CloseButton'>
+	            <span dojoAttachPoint='closeText' class='closeText'>x</span>
+	        </span>
+        </div>
+    </div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/ar/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ "})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/cs/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/da/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/da/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/da/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/da/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/da/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/da/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/de/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/de/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/de/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/de/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/de/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/de/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ROOT.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ROOT.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ROOT.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ar.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ar.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ar.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"اغلاق"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_cs.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_cs.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_cs.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_da.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_da.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_da.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_de-de.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_de-de.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_de-de.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_de.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_de.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_de.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_el.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_el.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_el.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"Κλείσιμο"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en-gb.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en-gb.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en-gb.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en-us.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en-us.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en-us.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_en.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_es-es.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_es-es.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_es-es.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_es.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_es.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_es.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fi-fi.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fi-fi.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fi-fi.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fi.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fi.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fi.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fr-fr.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fr-fr.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fr-fr.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fr.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fr.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_fr.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_he-il.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_he-il.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_he-il.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"סגירה"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_he.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_he.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_he.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"סגירה"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_hu.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_hu.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_hu.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_it-it.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_it-it.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_it-it.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_it.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_it.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_it.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ja-jp.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ja-jp.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ja-jp.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"閉じる"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ja.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ja.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ja.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"閉じる"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ko-kr.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ko-kr.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ko-kr.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"닫기"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ko.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ko.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ko.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"닫기"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_nl-nl.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_nl-nl.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_nl-nl.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_nl.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_nl.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_nl.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_no.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_no.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_no.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pl.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pl.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pl.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt-br.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt-br.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt-br.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt-pt.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt-pt.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt-pt.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_pt.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ru.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ru.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_ru.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"Закрыть"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_sv.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_sv.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_sv.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_tr.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_tr.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_tr.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_xx.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_xx.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_xx.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh-cn.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh-cn.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh-cn.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"关闭"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh-tw.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh-tw.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh-tw.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"關閉"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/dijit-all_zh.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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":"关闭"};

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/el/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/el/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/el/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/el/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/el/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/el/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/es/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/es/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/es/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/es/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/es/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/es/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/fi/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/fr/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Chargement...","errorState":"Une erreur est survenue"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/he/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/he/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/he/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/he/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/he/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/he/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"טעינה...","errorState":"אירעה שגיאה"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/hu/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/it/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/it/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/it/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/it/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/it/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/it/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/ja/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"ロード中...","errorState":"エラーが発生しました。"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/ko/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Loading...","errorState":"Sorry, an error occurred"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/nb/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Laster inn...","errorState":"Det oppsto en feil"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/nl/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/pl/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Trwa ładowanie...","errorState":"Niestety, wystąpił błąd"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/pt/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Carregando...","errorState":"Ocorreu um erro"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/pt-pt/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/ru/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/sv/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Läser in...","errorState":"Det uppstod ett fel."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"Tamam","buttonCancel":"İptal","buttonSave":"Kaydet","itemClose":"Kapat"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/tr/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/zh/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"正在装入...","errorState":"对不起,发生了错误"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/loading.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/loading.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/nls/zh-tw/loading.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"loadingState":"載入中...","errorState":"抱歉,發生錯誤"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dijit/resources/_modules.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/resources/_modules.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/resources/_modules.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+};
+=====*/

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/Calendar.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/templates/Calendar.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/templates/Calendar.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,35 @@
+<table cellspacing="0" cellpadding="0" class="dijitCalendarContainer">
+	<thead>
+		<tr class="dijitReset dijitCalendarMonthContainer" valign="top">
+			<th class='dijitReset' dojoAttachPoint="decrementMonth">
+				<div class="dijitInline dijitCalendarIncrementControl dijitCalendarDecrease"><span dojoAttachPoint="decreaseArrowNode" class="dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner">-</span></div>
+			</th>
+			<th class='dijitReset' colspan="5">
+				<div dojoAttachPoint="monthLabelSpacer" class="dijitCalendarMonthLabelSpacer"></div>
+				<div dojoAttachPoint="monthLabelNode" class="dijitCalendarMonthLabel"></div>
+			</th>
+			<th class='dijitReset' dojoAttachPoint="incrementMonth">
+				<div class="dijitInline dijitCalendarIncrementControl dijitCalendarIncrease"><span dojoAttachPoint="increaseArrowNode" class="dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner">+</span></div>
+			</th>
+		</tr>
+		<tr>
+			<th class="dijitReset dijitCalendarDayLabelTemplate"><span class="dijitCalendarDayLabel"></span></th>
+		</tr>
+	</thead>
+	<tbody dojoAttachEvent="onclick: _onDayClick" class="dijitReset dijitCalendarBodyContainer">
+		<tr class="dijitReset dijitCalendarWeekTemplate">
+			<td class="dijitReset dijitCalendarDateTemplate"><span class="dijitCalendarDateLabel"></span></td>
+		</tr>
+	</tbody>
+	<tfoot class="dijitReset dijitCalendarYearContainer">
+		<tr>
+			<td class='dijitReset' valign="top" colspan="7">
+				<h3 class="dijitCalendarYearLabel">
+					<span dojoAttachPoint="previousYearLabelNode" class="dijitInline dijitCalendarPreviousYear"></span>
+					<span dojoAttachPoint="currentYearLabelNode" class="dijitInline dijitCalendarSelectedYear"></span>
+					<span dojoAttachPoint="nextYearLabelNode" class="dijitInline dijitCalendarNextYear"></span>
+				</h3>
+			</td>
+		</tr>
+	</tfoot>
+</table>	

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/ColorPalette.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/templates/ColorPalette.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/templates/ColorPalette.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+<div class="dijitInline dijitColorPalette">
+	<div class="dijitColorPaletteInner" dojoAttachPoint="divNode" waiRole="grid" tabIndex="${tabIndex}">
+		<img class="dijitColorPaletteUnder" dojoAttachPoint="imageNode" waiRole="presentation">
+	</div>	
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/Dialog.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/templates/Dialog.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/templates/Dialog.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+<div class="dijitDialog" tabindex="-1" waiRole="dialog" waiState="labelledby-${id}_title">
+	<div dojoAttachPoint="titleBar" class="dijitDialogTitleBar">
+	<span dojoAttachPoint="titleNode" class="dijitDialogTitle" id="${id}_title">${title}</span>
+	<span dojoAttachPoint="closeButtonNode" class="dijitDialogCloseIcon" dojoAttachEvent="onclick: onCancel">
+		<span dojoAttachPoint="closeText" class="closeText">x</span>
+	</span>
+	</div>
+		<div dojoAttachPoint="containerNode" class="dijitDialogPaneContent"></div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/InlineEditBox.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/templates/InlineEditBox.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/templates/InlineEditBox.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,8 @@
+<fieldset dojoAttachPoint="editNode" waiRole="presentation" style="position: absolute; visibility:hidden" class="dijitReset dijitInline"
+	dojoAttachEvent="onkeypress: _onKeyPress" 
+	><input dojoAttachPoint="editorPlaceholder"
+	/><span dojoAttachPoint="buttonContainer"
+		><button class='saveButton' dojoAttachPoint="saveButton" dojoType="dijit.form.Button" dojoAttachEvent="onClick:save" disabled="true">${buttonSave}</button
+		><button class='cancelButton' dojoAttachPoint="cancelButton" dojoType="dijit.form.Button" dojoAttachEvent="onClick:cancel">${buttonCancel}</button
+	></span
+></fieldset>

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/ProgressBar.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/templates/ProgressBar.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/templates/ProgressBar.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+<div class="dijitProgressBar dijitProgressBarEmpty"
+	><div waiRole="progressbar" tabindex="0" dojoAttachPoint="internalProgress" class="dijitProgressBarFull"
+		><div class="dijitProgressBarTile"></div
+		><span style="visibility:hidden">&nbsp;</span
+	></div
+	><div dojoAttachPoint="label" class="dijitProgressBarLabel" id="${id}_label">&nbsp;</div
+	><img dojoAttachPoint="inteterminateHighContrastImage" class="dijitProgressBarIndeterminateHighContrastImage"
+	></img
+></div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/TitlePane.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/templates/TitlePane.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/templates/TitlePane.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+<div class="${baseClass}">
+	<div dojoAttachEvent="onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus" tabindex="0"
+			waiRole="button" class="dijitTitlePaneTitle" dojoAttachPoint="titleBarNode,focusNode">
+		<div dojoAttachPoint="arrowNode" class="dijitInline dijitArrowNode"><span dojoAttachPoint="arrowNodeInner" class="dijitArrowNodeInner"></span></div>
+		<div dojoAttachPoint="titleNode" class="dijitTitlePaneTextNode"></div>
+	</div>
+	<div class="dijitTitlePaneContentOuter" dojoAttachPoint="hideNode">
+		<div class="dijitReset" dojoAttachPoint="wipeNode">
+			<div class="dijitTitlePaneContentInner" dojoAttachPoint="containerNode" waiRole="region" tabindex="-1">
+				<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc.  Put padding on inner div. -->
+			</div>
+		</div>
+	</div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/Tooltip.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/templates/Tooltip.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/templates/Tooltip.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+<div class="dijitTooltip dijitTooltipLeft" id="dojoTooltip">
+	<div class="dijitTooltipContainer dijitTooltipContents" dojoAttachPoint="containerNode" waiRole='alert'></div>
+	<div class="dijitTooltipConnector"></div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/buttons/bg-fade.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/templates/buttons/bg-fade.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/colors3x4.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/templates/colors3x4.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/templates/colors7x10.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/templates/colors7x10.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/a11y/README.txt
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/a11y/README.txt	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/a11y/README.txt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/a11y/indeterminate_progress.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/a11y/indeterminate_progress.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,1535 @@
+/*
+	Essential styles that themes can inherit.
+	In other words, works but doesn't look great.
+*/
+
+
+
+/****
+		GENERIC PIECES
+ ****/
+
+.dijitReset {
+	/* Use this style to null out padding, margin, border in your template elements
+		so that page specific styles don't break them.
+		- Use in all TABLE, TR and TD tags.	
+		- If there is more than one class on the tag, place this first so other classes override.
+	*/
+	margin:0;
+	border:0;
+	padding:0;
+	line-height:normal;
+	font: inherit;
+	color: inherit;
+}
+
+.dijitInline {
+	/*  To inline block elements.
+		Similar to InlineBox below, but this has fewer side-effects in Moz.
+		Also, apparently works on a DIV as well as a FIELDSET.
+	*/
+	display:-moz-inline-box;		/* FF2 */
+	display:inline-block;			/* webkit and FF3 */
+	#zoom: 1; /* set hasLayout:true to mimic inline-block */
+	#display:inline; /* don't use .dj_ie since that increases the priority */
+	border:0;
+	padding:0;
+	vertical-align:middle;
+}
+
+.dj_ie INPUT.dijitTextBox,
+.dj_ie .dijitInputField INPUT {
+	font-size: 100%;
+	font-family: inherit; /* trigger pseudo font-family inheritance */
+	behavior: expression( /* if the font-family = inherit, then get the parent's font-family */
+		function(self){
+			var cs, e; 
+			try{
+				if(self.currentStyle.fontFamily=='inherit'){
+					cs = self.parentNode.currentStyle || document.documentElement.currentStyle;
+					self.style.fontFamily = cs.fontFamily;
+				}
+				self.style.behavior = null; /* #5562: prevent re-eval of css expression */
+			}catch(e){} /* #6024: random exceptions thrown during init */
+		}(this)
+	);
+}
+
+.dj_ie .dijitInputField INPUT { /* try to get rid of IE implicit margin around INPUT */
+	margin: -1px 0 !important;
+}
+.dj_iequirks .dijitInputField INPUT { /* try to get rid of IE implicit margin around INPUT */
+	margin-top: -3px !important;
+}
+
+.dijitInlineTable {
+	/* To inline tables with a given width set (otherwise, use dijitInline above)
+	 * Must also put style="-moz-inline-stack" on the node itself to workaround FF2 bugs
+	 */
+	display: -moz-inline-stack;	/* FF2 */
+	display:inline-table;
+	display:inline-block;		/* webkit and FF3 */
+	#zoom: 1; /* set hasLayout:true to mimic inline-block */
+	#display:inline; /* don't use .dj_ie since that increases the priority */
+	box-sizing: content-box; -moz-box-sizing: content-box;
+	border:0;
+	padding:0;
+}
+
+.dijitTeeny {
+	font-size:1px;
+	line-height:1px;
+}
+
+/*
+ * Popup items have a wrapper div (dijitPopup)
+ * with the real popup inside, and maybe an iframe too
+ */
+.dijitPopup {
+	position: absolute;
+	background-color: transparent;
+	margin: 0;
+	border: 0;
+	padding: 0;
+}
+.dijit_a11y .dijitPopup,
+.dijit_ally .dijitPopup div,
+.dijit_a11y .dijitPopup table,
+.dijit_a11y .dijitTooltipContainer {
+	opacity: 1 !important;
+	background-color: white !important;
+}
+.dj_ie .dijit_a11y .dijitPopup * {
+	filter: none;
+}
+
+.dijitInputField {
+	overflow:hidden;
+	#zoom:1;
+}
+
+.dijitPositionOnly {
+	/* Null out all position-related properties */
+	padding: 0 !important;
+	border: 0 !important;
+	background-color: transparent !important;
+	background-image: none !important;
+	height: auto !important;
+	width: auto !important;
+}
+
+.dijitNonPositionOnly {
+	/* Null position-related properties */
+	float: none !important;
+	position: static !important;
+	margin: 0 0 0 0 !important;
+	vertical-align: middle !important;
+}
+
+.dijitBackgroundIframe {
+	/*
+	 * iframe used for FF2 in high-contrast mode to prevent menu
+	 * being transparent
+	 */
+	position: absolute;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 100%;
+	z-index: -1;
+	border: 0;
+	padding: 0;
+	margin: 0;
+}
+
+.dijitClickableRegion {
+	/* a region we expect the user to click on */
+	cursor: pointer;
+}
+
+
+.dijitDisplayNone {
+	/* hide something.  Use this as a class rather than element.style so another class can override */
+	display:none !important;
+}
+
+.dijitContainer {
+	/* for all layout containers */
+	overflow: hidden;	/* need on IE so something can be reduced in size, and so scrollbars aren't temporarily displayed when resizing */
+}
+
+/****
+		A11Y
+ ****/
+.dijit_a11y * {
+	background-image:none !important;
+}
+
+.dijit_a11y .dijitCalendarIncrementControl .dijitA11ySideArrow {
+	padding-left:.2em;
+	visibility:visible !important;
+}
+.dj_ie6 .dijit_a11y .dijitCalendarIncrementControl {
+	font-size:.75em !important;
+}
+
+.dijit_a11y .dijitCalendarSelectedDate {
+	text-decoration:overline !important;
+}
+
+.dijitA11ySideArrow {
+	vertical-align:top;
+	margin-right:0em;
+	margin-left:.2em;
+	line-height:2em;
+	text-align:center;
+}
+
+.dijit_a11y .dijit * {
+	background:white !important;
+	color:black !important;
+}
+.dijit_a11y .dijitButtonNode {
+	border-color: black!important;
+	border-style: outset!important;
+	border-width: medium!important;
+}
+
+.dijit_a11y .dijitButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitDropDownButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitComboButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitComboBoxDisabled .dijitInputField,
+.dijit_a11y .dijitComboBoxDisabled .dijitButtonNode,
+.dijit_a11y .dijitSpinnerDisabled .dijitButtonNode,
+.dijit_a11y .dijitSpinnerDisabled .dijitInputField {
+	border-style: outset!important;
+	border-width: medium!important;
+	border-color: #999 !important;
+	color:#999 !important;
+}
+
+/* button inner contents - labels, icons etc. */
+.dijitButtonNode * {
+	vertical-align: middle;
+}
+.dijit_a11y .dijitArrowButtonInner {
+	width: 1.0em;
+	display: none !important;
+}
+.dijitButtonNode .dijitArrowButtonInner {
+	background:no-repeat center;
+	width: 16px;
+}
+.dijitComboBox .dijitArrowButtonInner {
+	display: block;
+}
+
+/* In high contrast mode, display the check symbol */
+.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
+	display: inline !important;
+}
+
+
+/****
+		3-element borders:  ( dijitLeft + dijitStretch + dijitRight )
+ ****/
+	
+.dijitLeft {
+	/* Left part of a 3-element border */
+	background-position:left top;
+	background-repeat:no-repeat;
+}
+
+.dijitStretch {
+	/* Middle (stretchy) part of a 3-element border */
+	white-space:nowrap;			/* MOW: move somewhere else */
+	background-repeat:repeat-x;
+}
+
+.dijitRight {
+	/* Right part of a 3-element border */
+	#display:inline;				/* IE7 sizes to outer size w/o this */
+	background-position:right top;
+	background-repeat:no-repeat;
+}
+
+.dijitButton,
+.dijitDropDownButton,
+.dijitComboButton {
+	/* outside of button */
+	margin: 0.2em;
+}
+
+.dj_safari .dijitToolbar .dijitDropDownButton {
+	padding-left: 0.3em;
+}
+
+.dijitButtonNode {
+	/* Node that is acting as a button -- may or may not be a BUTTON element */
+	border:1px solid gray;
+	margin:0;
+	padding:.2em .2em .1em;
+	line-height:normal;
+	cursor:pointer;
+	vertical-align:middle;	
+	text-align:center;
+	white-space: nowrap;
+}
+
+.dijitArrowButton {
+	/* Node that is acting as a arrow button -- drop down (spinner has its own treatment).  Also gets dijitButtonNode */
+	/* place AFTER dijitButtonNode so it overrides */
+	padding: 0 .4em;
+}
+DIV.dijitArrowButton {
+	float: right;
+}
+
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+	border-style: solid;
+	border-width: 0 0 0 1px !important;
+	padding: 0;
+	position: absolute;
+	right: 0;
+	float: none;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+	position: absolute;
+	height: 50%;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitDownArrowButton {
+	top: none;
+	bottom: 0;
+	border-top-width: 1px !important;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitUpArrowButton {
+	top: 0;
+	bottom: none;
+}
+
+.dijitComboButton TABLE {
+	/* each cell in a combo-table should have its own separate border */
+	border-collapse: separate;
+	border:0;
+	padding:0;
+	margin:0;
+}
+
+.dijitComboButton .dijitButtonContents {
+	border-right-width:0 !important;
+}
+
+
+.dj_ie BUTTON.dijitButtonNode {
+	overflow: visible; /* eliminates arbitrary left and right padding on buttons */
+}
+
+table .dijitButton .dijitButtonNode,
+table .dijitComboButton .dijitButtonNode {
+	#overflow:hidden; /* visible messes up if the button is inside a table on IE */
+}
+
+
+
+.dijitButtonNode IMG {
+	/* make text and images line up cleanly */
+	vertical-align:middle;
+	margin-bottom:.2em;
+}
+
+/******
+	TextBox related.
+	Everything that has an <input>
+*******/
+
+.dijitTextBox,
+.dijitComboBox,
+.dijitSpinner {
+	border: solid black 1px;
+	#overflow: hidden; /* #6027, #6067 */
+	width: 15em;	/* need to set default size on outer node since inner nodes say <input style="width:100%"> and <td width=100%>.  user can override */
+}
+
+/* rules for safari to deal with fuzzy blue focus border */
+.dijitTextBox input:focus,
+.dijitComboBox input:focus,
+.dijitSpinner input:focus {
+	outline: none;	/* blue fuzzy line looks wrong on combobox or something w/validation icon showing */
+}
+.dijitTextBoxFocused,
+.dijitComboBoxFocused,
+.dijitSpinnerFocused {
+	/* should we display focus like we do on other browsers, or use the safari standard focus indicator?? */
+	outline: auto 5px -webkit-focus-ring-color;
+}
+
+.dijitTextBox INPUT,
+.dijitComboBox INPUT,
+.dijitSpinner INPUT {
+	padding:0;
+	border-left: solid black 1px;	/* TODO: for RTL mode should be border-right */
+	display:inline;
+	position:static !important;
+	border:0 !important;	
+	margin:0 !important;
+	vertical-align:0em !important;
+	visibility:visible !important;
+	background-color:transparent !important;
+	background-image:none !important;
+	width:100% !important;
+}
+
+/* Display an "X" for invalid input. Themes will override these rules to display an icon instead.
+*/
+.dijitValidationIcon {
+	visibility: hidden;
+	display: block;
+	padding: 0 2px;
+	float: right;
+	height: auto;
+}
+.dijitValidationIconText {
+	visibility: hidden;
+	display: none;
+	float:right;
+	font-family: sans-serif;
+	font-style:italic;
+	font-size: 0.45em;
+	line-height: 190%;
+}
+.dijit_a11y .dijitValidationIcon { display: none !important; }
+.dijit_a11y .dijitValidationIconText { display: block !important; }
+
+.dijitError .dijitValidationIcon,
+.dijitError .dijitValidationIconText {
+	visibility: visible;
+}
+
+.dijitTextBox .dijitArrowButton {
+	/* this is for a combo box with no arrow displayed; we set baseClass=TextBox */
+	display:none;
+}
+
+/****
+		dijit.form.CheckBox
+ 	 &
+  		dijit.form.RadioButton
+ ****/
+
+.dijitCheckBox,
+.dijitRadio,
+.dijitCheckBoxInput {
+	padding: 0;
+	border: 0;
+	width: 16px;
+	height: 16px;
+	background-position:center center;
+	background-repeat:no-repeat;
+	overflow: hidden;
+}
+
+.dijitCheckBox INPUT,
+.dijitRadio INPUT {
+	margin: 0;
+	padding: 0;
+	display: block;
+}
+
+.dijitCheckBoxInput {
+	/* place the actual input on top, but all-but-invisible */
+	opacity: 0.01;
+}
+
+.dj_ie .dijitCheckBoxInput {
+	filter: alpha(opacity=0);
+}
+
+.dijit_a11y .dijitCheckBox,
+.dijit_a11y .dijitRadio {
+	width: auto;
+	height: auto;
+}
+.dijit_a11y .dijitCheckBoxInput {
+	opacity: 1;
+	filter: none;
+	width: auto;
+	height: auto;
+}
+
+
+/****
+		dijit.ProgressBar
+ ****/
+
+.dijitProgressBarEmpty{
+	/* outer container and background of the bar that's not finished yet*/
+	position:relative;overflow:hidden;
+	border:1px solid black; 	/* a11y: border necessary for high-contrast mode */
+	z-index:0;			/* establish a stacking context for this progress bar */
+}
+
+.dijitProgressBarFull {
+	/* outer container for background of bar that is finished */
+	position:absolute;
+	overflow:hidden;
+	z-index:-1;
+	top:0;
+	width:100%;
+	height:100%;
+}
+
+.dijitProgressBarTile{
+	/* inner container for finished portion */
+	position:absolute;
+	overflow:hidden;
+	top:0;
+	left:0;
+	bottom:0;
+	right:0;
+	margin:0;
+	padding:0;
+	width:auto;
+	height:auto;
+	background-color:#aaa;
+	background-attachment: fixed;
+}
+
+.dijit_a11y .dijitProgressBarTile{
+	/* a11y:  The border provides visibility in high-contrast mode */
+	border-width:4px;
+	border-style:solid;
+	background-color:transparent !important;
+}
+
+.dj_iequirks .dijitProgressBarTile{
+	width:100%;
+	height:100%;
+}
+
+.dj_ie6 .dijitProgressBarTile{
+	/* width:auto works in IE6 with position:static but not position:absolute */
+	position:static;
+	/* height:auto does not work in IE6 */
+	height:100%;
+}
+
+.dijitProgressBarIndeterminate .dijitProgressBarLabel{
+	visibility:hidden;
+}
+
+.dijitProgressBarIndeterminate .dijitProgressBarTile{
+	/* animated gif for 'indeterminate' mode */
+}
+
+.dijitProgressBarIndeterminateHighContrastImage{
+	display:none;
+}
+
+.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage{
+	display:block;
+	position:absolute;
+	top:0;
+	bottom:0;
+	margin:0;
+	padding:0;
+	width:100%;
+	height:auto;
+}
+
+.dijitProgressBarLabel{
+	display:block;
+	position:static;
+	width:100%;
+	text-align:center;
+	background-color:transparent !important;
+}
+
+/* progress bar in vertical mode - TODO: remove? no longer supported? */
+.dijitProgressBarV .dijitProgressBarFull{
+	bottom:0;		/* start at the bottom */
+}
+
+.dj_ie6 .dijitProgressBarV .dijitProgressBarTile{
+	position:absolute;
+	/* can't use position:static here -- need absolute positioning to place
+	   the bar at the bottom of a vertical progressbar */
+	width:100%;
+}
+
+
+/****
+		dijit.Tooltip
+ ****/
+
+.dijitTooltip {
+	position: absolute;
+	z-index: 2000;
+	display: block;
+	/* make visible but off screen */
+	left: 50%;
+	top: -10000px;
+	overflow: visible;
+}
+
+.dijitTooltipContainer {
+	border: solid black 2px;
+	background: #b8b5b5;
+	color: black;
+	font-size: small;
+}
+
+.dijitTooltipFocusNode {
+	padding: 2px 2px 2px 2px;
+}
+
+.dijitTooltipConnector {
+	position: absolute;
+}
+
+/* MOW: using actual images at this time
+/* draw an arrow with CSS only * /
+.dijitTooltipConnector {
+	/* the border on the triangle * /
+	font-size: 0; line-height: 0%; width: 0;
+	border-top: none;
+	border-bottom: 14px solid black;
+	border-left: 7px solid transparent;
+	border-right: 7px solid transparent;
+	top: -14px;
+	left: 3px;
+	z-index: 2;
+}
+
+.dijitTooltipConnector div {
+	/* the background of the triangle * /
+	font-size: 0; line-height: 0%; width: 0;
+	position: absolute;
+	border-bottom: 10px solid #b8b5b5;
+	border-left: 5px solid transparent;
+	border-right: 5px solid transparent;
+	top: 6px;
+	left: -5px;
+	z-index: 3;
+}
+
+*/
+
+
+
+/* Layout widgets. This is essential CSS to make layout work (it isn't "styling" CSS)
+   make sure that the position:absolute in dijitAlign* overrides other classes */
+
+.dijitLayoutContainer{
+	position: relative;
+	display: block;
+	overflow: hidden;
+}
+
+body .dijitAlignTop,
+body .dijitAlignBottom,
+body .dijitAlignLeft,
+body .dijitAlignRight {
+	position: absolute;
+	overflow: hidden;
+}
+
+body .dijitAlignClient { position: absolute; }
+
+.dijitBorderContainer {
+	position:relative;
+	overflow: hidden;
+}
+
+.dijitBorderContainer > .dijitTextArea {
+	/* On Safari, for SimpleTextArea inside a BorderContainer,
+		don't want to display the grip to resize */
+	resize: none;
+}
+
+/* SplitContainer
+
+	'V' == container that splits vertically (up/down)
+	'H' = horizontal (left/right)
+*/
+
+.dijitSplitter {
+	position: absolute;
+	overflow: hidden;
+	z-index: 9999;
+	background-color: #fff;
+	border-color: gray;
+	border-style: solid;
+	border-width: 0;
+	z-index: 10 !important;
+}
+.dijitSplitterCover{
+	position:absolute;
+	z-index:1;
+	top:0;
+	left:0;
+	width:100%;
+	height:100%;
+}
+.dijitSplitterH {
+	height: 7px;
+	border-top:1px;
+	border-bottom:1px;
+	cursor: ns-resize;
+}
+.dijitSplitterV {
+	width: 7px;
+	border-left:1px;
+	border-right:1px;
+	cursor: ew-resize;
+}
+.dijitSplitContainer{
+	position: relative;
+	overflow: hidden;
+	display: block;
+}
+
+.dijitSplitPane{
+	position: absolute;
+}
+
+.dijitSplitContainerSizerH,
+.dijitSplitContainerSizerV {
+	position:absolute;
+	font-size: 1px;
+	cursor: move;
+	cursor: w-resize;
+	background-color: ThreeDFace;
+	border: 1px solid;
+	border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
+	margin: 0;
+}
+
+.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
+	overflow:hidden;
+	position:absolute;
+	top:49%;
+}
+
+.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
+	position:absolute;
+	left:49%;
+}
+
+.dijitSplitterShadow,
+.dijitSplitContainerVirtualSizerH,
+.dijitSplitContainerVirtualSizerV {
+	font-size: 1px;
+	background-color: ThreeDShadow;
+	-moz-opacity: 0.5;
+	opacity: 0.5;
+	filter: Alpha(Opacity=50);
+	margin: 0;
+}
+
+.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
+	cursor: w-resize;
+}
+.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
+	cursor: n-resize;
+}
+
+.dijit_a11y .dijitSplitterH {
+	border-top:1px solid #d3d3d3 !important;
+	border-bottom:1px solid #d3d3d3 !important;
+}
+.dijit_a11y .dijitSplitterV {
+	border-left:1px solid #d3d3d3 !important;
+	border-right:1px solid #d3d3d3 !important;
+}
+
+/* ContentPane */
+
+.dijitContentPane {
+	display: block;
+	overflow: auto;	/* if we don't have this (or overflow:hidden), then Widget.resizeTo() doesn't make sense for ContentPane */
+}
+/* TitlePane */
+.dijitTitlePane {
+	display: block;
+	overflow: hidden;
+}
+.dj_ie7 .dijitTitlePaneTextNode {
+	display:inline; 
+}
+
+/* Color Palette */
+
+.dijitColorPalette {
+	border:1px solid #999;
+	background:#fff;
+	-moz-border-radius:3pt;
+}
+
+img.dijitColorPaletteUnder {
+	border-style:none;
+	position:absolute;
+	left:0;
+	top:0;
+}
+.dijitColorPaletteInner {
+	position: relative;
+	overflow:hidden;
+	outline:0;
+}
+.dijitPaletteCell {
+	width: 20px;
+	height: 20px;
+	position: absolute;
+	overflow: hidden;
+	z-index: 10;
+	outline-width: 0;
+}
+.dijitPaletteImg {
+	width: 16px; /*This is the width of one color in the provided palettes. */
+	height: 14px; /* Height of one color in the provided palettes. */
+	position: absolute;
+	top: 1px;
+	left: 1px;
+	overflow: hidden;
+	cursor: default;
+	border:1px solid #999;
+	/* -moz-border-radius:2pt; */
+}
+
+.dijitPaletteCellHighlight img {
+	width: 14px; /*This is the width of one color in the provided palettes. */
+	height: 12px; /* Height of one color in the provided palettes. */
+	position: absolute;
+	top: 1px;
+	left: 1px;
+	overflow: hidden;
+	cursor: default;
+	border:2px solid #000;
+	outline:1px solid #dedede;
+	/* -moz-border-radius:0; */	
+}
+
+.dijit_a11y .dijitPaletteCell {
+	background-color:transparent !important;
+}
+.dijit_a11y .dijitPaletteImg {
+	background-color:transparent !important;
+}
+
+/* Accordion */
+
+.dijitAccordionPane {
+	overflow: hidden !important;	/* prevent spurious scrollbars */
+}
+
+.dijitAccordionPane .dijitAccordionBody {
+	overflow: auto;
+}
+
+
+.dijitAccordionContainer {
+	border:1px solid #b7b7b7;
+	border-top:0 !important;
+}
+
+.dijitAccordionTitle:hover {
+	cursor: pointer;
+}
+
+.dijitAccordionTitle .dijitAccordionArrow {
+	float: right;
+}
+
+/* images off, high-contrast mode styles */
+.dijitAccordionPane .dijitAccordionTitle .arrowTextUp,
+.dijitAccordionPane .dijitAccordionTitle .arrowTextDown {
+	display: none;
+	float: right;
+	font-size: 0.65em;
+	font-weight: normal !important;
+}
+
+.dijit_a11y .dijitAccordionPane .dijitAccordionTitle .arrowTextUp {
+	display: inline;
+}
+
+.dijit_a11y .dijitAccordionTitle-selected .arrowTextDown {
+	display: inline;
+}
+
+.dijit_a11y .dijitAccordionTitle-selected .arrowTextUp {
+	display: none;
+}
+
+/* Calendar */
+
+.dijitCalendarContainer thead tr th, .dijitCalendarContainer thead tr td, .dijitCalendarContainer tbody tr td, .dijitCalendarContainer tfoot tr td {
+	padding: 0;
+}
+
+.dijitCalendarNextYear {
+	margin:0 0 0 0.55em;
+}
+
+.dijitCalendarPreviousYear {
+	margin:0 0.55em 0 0;
+}
+
+.dijitCalendarIncrementControl {
+	cursor:pointer;
+	cursor:hand;
+	width:1em;
+}
+
+.dijitCalendarDisabledDate {
+	color:gray !important;
+}
+
+.dijitCalendarBodyContainer tbody tr td {
+	cursor:pointer;
+	cursor:hand;
+}
+
+.dijitCalendarPreviousMonthDisabled,
+.dijitCalendarCurrentMonthDisabled,
+.dijitCalendarNextMonthDisabled {
+	cursor:default !important
+}
+
+.dijitCalendarDateTemplate,
+.dijitCalendarSelectedYear,
+.dijitCalendarNextYear,
+.dijitCalendarPreviousYear {
+	cursor:pointer;
+}
+
+.dijitCalendarMonthLabelSpacer {
+	/* don't display it, but make it affect the width */
+  	position: relative;
+  	height: 1px;
+  	overflow: hidden;
+  	visibility: hidden;
+}
+
+
+/* Menu */
+
+.dijitMenu {
+	border:1px solid black;
+	background-color:white;
+}
+.dijitMenuTable {
+	margin:1px 0;
+	border-collapse:collapse;
+	border-width:0;
+	background-color:white;
+}
+
+.dijitMenuItem{
+	white-space: nowrap;
+	padding:.1em .2em;
+}
+
+.dijitMenuItemHover {
+	cursor:pointer;
+	cursor:hand;
+	background-color:black;
+	color:white;
+}
+
+.dijitMenuItemIcon {
+	position: relative;
+	background-repeat: no-repeat;
+}
+
+.dijitMenuItemDisabled * {
+	/* for a disabled menu item, just set it to mostly transparent */
+	opacity:0.3;
+	cursor:default;
+}
+.dj_ie .dijit_a11y .dijitMenuItemDisabled td,
+.dj_ie .dijitMenuItemDisabled *,
+.dj_ie .dijitMenuItemDisabled td {
+	color:gray !important;
+	filter: alpha(opacity=35);
+}
+
+.dijitMenuItemLabel {
+	position: relative;
+	vertical-align: middle;
+}
+
+.dijit_a11y .dijitMenuItemHover .dijitMenuItemLabel {
+	border-width: 1px;
+	border-style: solid;
+}
+.dijit_a11y .dijitMenuItemHover {
+	border: 1px #fff dotted !important;
+}
+
+.dijit_a11y .dijitMenuExpandInner {
+	display:block !important;
+}
+
+/* separator can be two pixels -- set border of either one to 0 to have only one */
+.dijitMenuSeparatorTop {
+	height: 50%;
+	margin: 0;
+	margin-top:3px;
+	font-size: 1px;
+}
+
+.dijitMenuSeparatorBottom {
+	height: 50%;
+	margin: 0;
+	margin-bottom:3px;
+	font-size: 1px;
+}
+
+
+
+/* Tab */
+
+
+.dijitTabLabels-top {
+/* position the tab labels row down by 1 px, and on top of the dijitTabPaneWrapper
+	so the buttons can overlay the tab pane properly		*/
+	top:1px !important;
+	z-index:10;	
+}
+
+.dijitTabLabels-bottom {
+/* position the tab labels row up by 1 px so they overlap	*/
+	margin-top:-1px !important;
+	z-index:10;	
+}
+
+.dijitTabLabels-left-h {
+/* position the tab labels left by 1 px so they overlap		*/
+	margin-right:-1px !important;
+	z-index:10;	
+}
+
+.dijitTabLabels-right-h {
+/* position the tab labels right by 1 px, on top of the dijitTabPaneWrapper
+	so the buttons can overlay the tab pane properly		*/
+	margin-left:-1px !important;
+	z-index:10;	
+}
+
+.dijitTabPaneWrapper {
+	z-index:0;
+	overflow: hidden;
+	clear: both;	/* needed for doLayout=false mode */
+}
+
+.dijitTab {
+	position:relative;
+	float:left;
+	cursor:pointer;
+	white-space:nowrap;
+	z-index:3;
+}
+
+.dijitTabContainer .dijitAlignLeft .dijitTab,
+.dijitTabContainer .dijitAlignRight .dijitTab {
+	float:none;
+}
+
+.dijitTabInnerDiv {
+	position:relative;
+}
+
+.dijitTab .close {
+	display: inline-block;
+	cursor: default;
+	font-size: small;
+}
+
+/* images off, high-contrast mode styles */
+.dijitTab .closeText {
+	display:none;
+	padding: 0 2px;
+	margin: 0 2px;
+}
+.dijit_a11y .dijitTab .closeImage {
+	padding: 0 !important;
+	margin: 0 !important;
+	top: 0 !important;
+	bottom: 0 !important;
+}
+.dijit_a11y .closeText {
+	display:inline;
+	margin-left:6px;
+}
+.dijit_a11y .closeText:hover {
+	border:thin solid;
+}
+.dijit_a11y .dijitTabChecked {
+	border-style:dashed !important;
+}
+
+.dijit_a11y .dijitTabInnerDiv {
+	border-left:none !important;
+ }
+
+
+.dijitInlineEditor {
+	/* span around an inline-editable value when in edit mode */
+	position:relative;
+	vertical-align:bottom;
+}
+.dj_ie .dijitInlineEditor {
+	vertical-align:middle;
+}
+
+.dijitInlineValue {
+	/* span around an inline-editable value when NOT in edit mode */
+}
+
+.dijitInlineEditor .dijitButtonContainer {
+	/* div around the buttons -- makes them float below the field */
+	position:absolute;
+	right:0;
+	overflow:visible;
+}
+
+.dijitInlineEditor .saveButton,
+.dijitInlineEditor .cancelButton {
+}
+
+/* Tree */
+
+.dijitTreeExpando, .dijitTreeExpand {
+	float:left;
+	display:inline;
+}
+
+.dijitTreeExpando {
+	clear:both;
+}
+
+.dijitTreeContent {
+    cursor: default;
+    /* can't make inline - multiline bugs */
+}
+
+.dijitExpandoText {
+	display: none;
+}
+
+.dijit_a11y .dijitExpandoText {
+	float: left;
+	display: inline;
+	padding-left: 10px;
+	padding-right: 10px;
+	font-family: monospace;
+	border-style: solid;
+	border-width: thin;
+	cursor: pointer;
+}
+
+/* Dialog */
+
+.dijitDialog {
+	position: absolute;
+	z-index: 999;
+	padding: 1px;
+}
+
+.dijitDialogUnderlayWrapper {
+	position: absolute;
+	left: 0;
+	top: 0;
+	z-index: 998;
+	display: none;
+	background: transparent !important;
+}
+
+.dijitDialogUnderlay {
+	background: #eee;
+	opacity: 0.5;
+}
+
+.dj_ie .dijitDialogUnderlay {
+	filter: alpha(opacity=50);
+}
+
+/* images off, high-contrast mode styles */
+.dijit_a11y .dijitInputLayoutContainer,
+.dijit_a11y .dijitDialog {
+	opacity: 1 !important;
+	background-color: white !important;
+}
+
+.dijitDialog .closeText {
+	display:none;
+	/* for the onhover border in high contrast on IE: */
+	position:absolute;
+}
+
+.dijit_a11y .dijitDialog .closeText {
+	display:inline;
+}
+
+.dijitSliderMoveable {
+	z-index:99;
+	position:absolute !important;
+	display:block;
+	vertical-align:middle;
+}
+
+.dijitSliderMoveableH {
+	right:0;
+}
+
+.dijit_a11y div.dijitSliderImageHandle,
+.dijitSliderImageHandle {
+	margin:0;
+	padding:0;
+	position:absolute !important;
+	border:8px solid gray;
+	width:0;
+	height:0;
+}
+.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
+	border:4px solid #000;
+	height:8px;
+	width:8px;
+}
+
+.dijitSliderImageHandleV {
+	top:-8px;
+	left:-6px;
+}
+
+.dijitSliderImageHandleH {
+	left:-8px;
+	top:-5px;
+	vertical-align:top;
+}
+
+.dijitSliderBar {
+	border-style:solid;
+	border-color:black;
+}
+
+.dijitSliderBarH {
+	height:4px;
+	border-width:1px 0;
+}
+
+.dijitSliderBarV {
+	width:4px;
+	border-width:0 1px;
+}
+
+.dijitSliderProgressBar {
+	background-color:red;
+	#z-index:0;
+}
+
+.dijitSliderProgressBarV {
+	position:static !important;
+	height:0%;
+	vertical-align:top;
+	text-align:left;
+}
+
+.dijitSliderProgressBarH {
+	position:absolute !important;
+	width:0%;
+	vertical-align:middle;
+	overflow:visible;
+}
+
+.dijitSliderRemainingBar {
+	overflow:hidden;
+	background-color:transparent;
+	#z-index:-1;
+}
+
+.dijitSliderRemainingBarV {
+	height:100%;
+	text-align:left;
+}
+
+.dijitSliderRemainingBarH {
+	width:100% !important;
+}
+
+/* the slider bumper is the space consumed by the slider handle when it hangs over an edge */
+.dijitSliderBumper {
+	overflow:hidden;
+	#z-index:-1
+}
+
+.dijitSliderBumperV {
+	width:4px;
+	height:8px;
+	border-width:0 1px;
+}
+
+.dijitSliderBumperH {
+	width:8px;
+	height:4px;
+	border-width:1px 0;
+}
+
+.dijitSliderBottomBumper,
+.dijitSliderLeftBumper {
+	background-color:red;
+}
+
+.dijitSliderTopBumper,
+.dijitSliderRightBumper {
+	background-color:transparent;
+}
+
+.dijitSliderDecorationH {
+	text-align:center;
+}
+
+.dijitSlider .dijitSliderButton {
+	font-family:monospace;
+	margin:0;
+	padding:0;
+	display:block;
+}
+
+.dijit_a11y .dijitSliderButtonInner {
+	visibility:visible !important;
+}
+
+.dijitSliderButtonContainer {
+	text-align:center;
+	height:0;
+}
+
+.dijitSlider .dijitButtonNode {
+	padding:0;
+	display:block;
+}
+
+.dj_ie .dijitRuleContainer {
+	z-index: -1; /* #4809 */
+}
+
+.dijitRuleContainer {
+	position:relative;
+	overflow:visible;
+}
+
+.dijitRuleContainerV {
+	height:100%;
+	line-height:0;
+	float:left;
+	text-align:left;
+}
+
+.dj_opera .dijitRuleContainerV {
+	line-height:2%;
+}
+
+.dj_ie .dijitRuleContainerV {
+	line-height:normal;
+}
+
+.dj_gecko .dijitRuleContainerV {
+	margin:0 0 1px 0; /* mozilla bug workaround for float:left,height:100% block elements */
+}
+
+.dijitRuleMark {
+	position:absolute;
+	border:1px solid black;
+	line-height:0;
+	height:100%;
+}
+
+.dijitRuleMarkH {
+	width:0;
+	border-top-width:0 !important;
+	border-bottom-width:0 !important;
+	border-left-width:0 !important;
+}
+
+.dijitRuleLabelContainer {
+	position:absolute;
+}
+
+.dijitRuleLabelContainerH {
+	text-align:center;
+	display:inline-block;
+}
+
+.dijitRuleLabelH {
+	position:relative;
+	left:-50%;
+}
+
+.dijitRuleMarkV {
+	height:0;
+	border-right-width:0 !important;
+	border-bottom-width:0 !important;
+	border-left-width:0 !important;
+	width:100%;
+	left:0;
+}
+
+.dj_ie .dijitRuleLabelContainerV {
+	margin-top:-.55em;
+}
+
+/* Toolbar A11y */
+.dijit_a11y .dijitButtonContents .dijitButtonText {
+	display: inline !important;
+}
+
+.dijitTextArea {
+	width:100%;
+	overflow: auto;	/* w/out this IE's SimpleTextArea goes to overflow: scroll */
+}
+
+.dj_ie .dijitTextArea p {
+	margin-top:0;
+	margin-bottom:0;
+	line-height: normal !important;
+}
+
+.dijitToolbarSeparator {
+	height: 18px;
+	width: 5px;
+	padding: 0 1px;
+	margin: 0;
+}
+
+/* Editor */
+.dijitIEFixedToolbar {
+	position:absolute;
+	/* top:0; */
+	top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+
+/* TimePicker */
+
+.dijitTimePickerItemInner {
+	text-align:center;
+	border:0;
+	padding:2px 8px 2px 8px;
+}
+.dijitTimePickerTick {
+	/* opacity:0.1 !important; */
+	color:#dedede;	
+	border-bottom:1px solid #dedede;
+	border-top:1px solid #dedede;
+	position:relative;
+}
+.dijitTimePickerTick .dijitTimePickerItemInner {
+	font-size:0.25em;
+}
+.dijitTimePickerMarker {
+	background-color:#ededed;
+	border-top:1px solid #999;
+	border-bottom:1px solid #999;
+}
+
+.dijitTimePickerItemHover {
+	opacity:1 !important;
+	background-color:#808080;
+	color:#fff;
+	border-top:1px solid #333;
+	border-bottom:1px solid #333;
+	cursor:pointer;
+}
+.dijitTimePickerMarker.dijitTimePickerItemHover {
+	font-size:1.3em;
+}
+
+.dijitTimePickerItemHover .dijitTimePickerItemInner {
+	display:block;
+	overflow:visible;
+	background-color:#808080;
+	font-size:1em;
+}
+
+.dijitTimePickerItemSelected {
+	font-weight:bold;
+	color:#333;
+	background-color:#b7cdee !important;
+}
+
+.dijit_a11y .dijitTimePickerItem {
+	border-bottom:1px solid #333;	
+}
+
+
+/* Disable the high contrast character */
+.dijitToggleButtonIconChar {
+	display:none !important;
+}
+.dijit_a11y .dijitToggleButtonIconChar {
+	display:inline !important;
+}
+
+.dijit_a11y .dijitToggleButtonIconChar {
+	visibility:hidden;
+}
+.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
+	visibility:visible !important;
+}
+
+.dijitArrowButtonChar {
+	display:none !important;
+}
+.dijit_a11y .dijitArrowButtonChar {
+	display:inline !important;
+}
+.dijitInputLayoutContainer {
+	position: relative;
+	overflow: hidden;
+}
+.dijitSpinnerButtonContainer {
+	float: right;
+	width: 18px;
+	position: relative;
+	overflow: hidden;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+	height: 50%;
+	width: 16px;
+	overflow: hidden;
+}
+.dj_ie .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+	behavior: expression(
+		function(self){
+			var e; 
+			try{
+				var h = self.parentNode.offsetHeight/2;
+				if(h > 1){
+					self.style.height = h;
+					self.style.behavior = null; /* prevent re-eval of css expression */
+				}
+			}catch(e){} /* random exceptions thrown during init */
+		}(this)
+	);
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButtonInner {
+	overflow: hidden;
+	line-height: 50%;
+}
+.dijit_a11y .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+	width: 100%;
+}
+.dijit_a11y .dijitSpinner .dijitArrowButton .dijitArrowButtonChar {
+	font-size: 0.4em;
+	vertical-align: top;
+}
+.dijit_a11y .dijitSpinnerButtonContainer {
+	width: 0.5em;
+	margin-left: 2px;
+	overflow: visible;
+}
+.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
+	border-width: 1px 0px 0px 1px;
+	border-style: solid !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/dijit_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ColorPalette.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ColorPalette.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ColorPalette.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+	border:1px solid #d3d3d3;
+	background:#fff;
+	-moz-border-radius: 0px !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ColorPalette.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ColorPalette.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ColorPalette.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+	border:1px solid #d3d3d3;
+	background:#fff;
+	-moz-border-radius: 0px !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Common.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Common.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Common.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Common.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Common.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Common.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,175 @@
+
+/* Dialog */
+
+.nihilo .dijitDialog {
+	background: #eee;
+	border: 1px solid #d3d3d3;
+	-webkit-box-shadow: 0px 5px 10px #adadad;
+	padding: 0px;
+}
+
+.nihilo .dijitDialog .dijitDialogTitle {
+	border-top: none;
+	border-left: none;
+	border-right: none;
+	font-size: 0.9em;
+	color: #3243C5F;
+}
+
+.nihilo .dijitDialog .dijitDialogPaneContent {
+	background: #ffffff;
+	border:none;
+	border-top: 1px solid #d3d3d3; /* #cddde9;	/* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+	padding:10px;
+
+}
+
+.nihilo .dijitDialogTitleBar {
+	/* outer container for the titlebar of the dialog */
+	background: #fafafa url("images/titleBar.png") repeat-x top left;
+	/* border: 1px solid #bfbfbf; */
+	padding: 5px 6px 3px 2px;
+	cursor: move;
+	outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
+}
+
+.nihilo .dijitDialogTitle {
+	/* typography and styling of the dialog title */
+	font-weight: bold;
+	padding: 8px 12px 8px 12px;
+	outline:0;
+}
+
+.nihilo .dijitDialogCloseIcon {
+	/* the default close icon for the dialog */
+	background : url("images/spriteRoundedIconsSmall.png") no-repeat right top;
+	float: right;
+	position: absolute;
+	vertical-align: middle;
+	right: 6px;
+	top: 4px;
+	height: 15px;
+	width: 15px;
+	cursor: pointer;
+}
+.dj_ie6 .nihilo .dijitDialogCloseIcon {
+	background : url("images/spriteRoundedIconsSmall.gif") no-repeat right top;
+}
+
+.nihilo .dijitDialogContent {
+	/* the body of the dialog */
+	padding: 8px;
+}
+
+
+/* Tooltip and TooltipDialog */
+
+.nihilo .dijitTooltip,
+.nihilo .dijitTooltipDialog {
+	/* the outermost dom node, holding the connector and container */
+	opacity: 0.95;
+	background: transparent;	/* make the area on the sides of the arrow transparent */
+}
+
+.dijitTooltipBelow {
+	/* leave room for arrow above content */
+	padding-top: 10px;
+}
+
+.dijitTooltipAbove {
+	/* leave room for arrow below content */
+	padding-bottom: 10px;
+}
+
+.nihilo .dijitTooltipContainer {
+	/*
+		The part with the text.
+
+		NOTE:
+			FF doesn't clip images used as CSS bgs if you specify a border
+			radius. If you use a solid color, it does. Webkit gets it right.
+			Sigh.
+		background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
+	*/
+	background-color: #fff;
+	border:1px solid #d3d3d3;
+	padding:0.45em;
+	/*
+	border-radius: 6px;
+	-moz-border-radius: 7px;
+	-webkit-border-radius: 6px;
+	*/
+}
+
+.nihilo .dijitTooltipConnector {
+	/* the arrow piece */
+	border:0px;
+	z-index: 2;
+}
+
+.nihilo .dijitTooltipABRight .dijitTooltipConnector {
+	/* above or below tooltip, but the arrow appears on the right,
+		and the right edges of target and tooltip are aligned rather than the left */
+	left: auto !important;
+	right: 6px;
+}
+
+.nihilo .dijitTooltipBelow .dijitTooltipConnector {
+	/* the arrow piece for tooltips below an element */
+	top: 0px;
+	left: 6px;
+	background:url("images/tooltipConnectorUp.png") no-repeat top left;
+	width:17px;
+	height:11px;
+}
+
+.dj_ie6 .nihilo .dijitTooltipBelow .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorUp.gif");
+}
+
+.nihilo .dijitTooltipAbove .dijitTooltipConnector {
+	/* the arrow piece for tooltips above an element */
+	bottom: 0px;
+	left: 6px;
+	background:url("images/tooltipConnectorDown.png") no-repeat top left;
+	width:17px;
+	height:11px;
+}
+.dj_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorDown.gif");
+	bottom: -5px;
+}
+
+.nihilo .dijitTooltipLeft {
+	padding-right: 10px;
+}
+.dj_ie6 .nihilo .dijitTooltipLeft {
+	padding-left: 11px;
+}
+.nihilo .dijitTooltipLeft .dijitTooltipConnector {
+	/* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+	right: 0px;
+	bottom: 7px;
+	background:url("images/tooltipConnectorRight.png") no-repeat top left;
+	width:11px;
+	height:17px;
+}
+.dj_ie6 .nihilo .dijitTooltipLeft .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorRight.gif");
+}
+
+.nihilo .dijitTooltipRight {
+	padding-left: 10px;
+}
+.nihilo .dijitTooltipRight .dijitTooltipConnector {
+	/* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+	left: 0px;
+	bottom: 7px;
+	background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+	width:11px;
+	height:17px;
+}
+.dj_ie6 .nihilo .dijitTooltipRight .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorLeft.gif");
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; }

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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%; */}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+
+.dijitRtl .dijitEditorIcon {
+	background-image: url('images/editor_rtl.gif'); 
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+	background-image: url('images/editor_rtl.gif');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Editor_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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'); 
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Menu_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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'); 
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ProgressBar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ProgressBar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ProgressBar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ProgressBar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ProgressBar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/ProgressBar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,77 @@
+/** 
+ * dijit.layout.TitlePane 
+ *
+ */ 
+ 
+.nihilo .dijitTitlePane .dijitTitlePaneTitle {
+	background: #cccccc;
+	background:#fff url("images/titleBar.png") repeat-x top left;
+	border:1px solid #bfbfbf;
+	padding:4px 4px 2px 4px;
+	cursor: pointer;
+	font-size: 0.9em;
+	font-weight: bold;
+	color: #6d6d6d;
+}
+
+/* TODO: merge these, and all other icons to a series of background-image:() and background-position: -16*n px styles */
+.nihilo .dijitTitlePane .dijitArrowNode {
+	width:15px;
+	height:15px;
+	float:right;
+	margin-top: -2px;
+}
+
+.nihilo .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+	color: #243C5F;
+}
+
+
+.nihilo .dijitOpen .dijitTitlePaneTextNode {
+	color: #243C5F;
+}
+
+.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background: url('images/spriteRoundedIconsSmall.png') no-repeat top left;
+}
+.dj_ie6 .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background:url('images/spriteRoundedIconsSmall.gif') no-repeat top left;
+}
+.nihilo .dijitTitlePane .dijitOpen .dijitArrowNode {
+	background:url('images/spriteRoundedIconsSmall.png') no-repeat -15px top;
+}
+.dj_ie6 .nihilo .dijitTitlePane .dijitOpen .dijitArrowNode {
+	background:url('images/spriteRoundedIconsSmall.gif') no-repeat -15px top;
+}
+.nihilo .dijitTitlePane .dijitArrowNodeInner {
+	visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+	visibility:visible;
+}
+
+.nihilo .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+	margin-right:5px;
+}
+
+.nihilo .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+	position:relative;
+	top:2px;
+}
+
+.nihilo .dijitTitlePaneContentOuter {
+	background: #ffffff;
+	border:1px solid #bfbfbf;
+	border-top: 0px solid #3d3d3d;	/* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+}
+.nihilo .dijitTitlePaneContentInner {
+	padding:10px;
+}
+/* force hasLayout to ensure borders etc, show up */
+.dj_ie6 .nihilo .dijitTitlePaneContentOuter,
+.dj_ie6 .nihilo .dijitTitlePane .dijitTitlePaneTitle {
+	zoom: 1;
+}
+.nihilo .dijitClickableRegion {
+	background-color : #ffc !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -30px top;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -30px top;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Toolbar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Toolbar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Toolbar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Toolbar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Toolbar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Toolbar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/Tree_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+.dijitRtl .dijitComboBox .dijitButtonNode {
+	border-width: 0px 0px 0px 1px;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+.dijitRtl .dijitComboBox .dijitButtonNode {
+	border-width: 0px 0px 0px 1px;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Checkbox.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Checkbox.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Checkbox.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Checkbox.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Checkbox.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Checkbox.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/ComboBox.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/ComboBox.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/ComboBox.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+.nihilo .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+	background:url("../images/spriteArrows.png") no-repeat left center;
+	width: 11px;
+}
+.nihilo .dijitComboBoxHover .dijitArrowButtonInner {
+	
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/ComboBox.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/ComboBox.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/ComboBox.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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? */
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,82 @@
+
+/****
+		dijit.form.TextBox
+		dijit.form.ValidationTextBox
+		dijit.form.SerializableTextBox
+		dijit.form.RangeBoundTextBox
+		dijit.form.NumberTextBox
+		dijit.form.CurrencyTextBox
+		dijit.form.NumberSpinner
+		dijit.form.ComboBox (partial)
+ ****/
+
+.nihilo .dijitInputField INPUT,
+.nihilo .dijitTextBox,
+.nihilo .dijitComboBox,
+.nihilo .dijitSpinner {
+	margin: 0em 0.1em;
+}
+
+.nihilo .dijitTextBox,
+.nihilo .dijitComboBox,
+.nihilo .dijitSpinner,
+.nihilo .dijitInlineEditor input,
+.nihilo .dijitTextArea {
+	/* 	For all except dijit.form.NumberSpinner:  the actual input element.
+		For TextBox, ComboBox, Spinner: the table that contains the input.
+		Otherwise the actual input element.
+	*/
+	background:#fff url("../images/validationInputBg.png") repeat-x top left;
+	#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+	border:1px solid #d3d3d3;
+	line-height: normal;
+}
+
+.nihilo .dijitComboBox .dijitButtonNode {
+	padding: 0 0.2em;
+}
+.nihilo .dijitComboBox .dijitButtonNode,
+.nihilo .dijitSpinner .dijitButtonNode {
+	/* line between the input area and the drop down button */
+	border-color: #d3d3d3;
+	border-left: 1px solid #d3d3d3;
+}
+
+.nihilo .dijitTextBoxFocused,
+.nihilo .dijitComboBoxFocused,
+.nihilo .dijitSpinnerFocused {
+	/* input field when focused (ie: typing affects it) */
+	border-color:#b3b3b3;
+}
+.nihilo .dijitComboBoxFocused .dijitButtonNode, .nihilo .dijitSpinnerFocused .dijitButtonNode {
+	border-left-color:#d3d3d3;
+}
+.nihilo .dijitSpinnerFocused .dijitDownArrowButton {
+	border-top-color:#d3d3d3;
+}
+
+.nihilo .dijitError {
+	border-color:#b3b3b3;
+	background-color:#f9f7ba;
+	background-image:none;
+}
+.dj_ie6 .nihilo .dijitError INPUT {
+	/* background-color: transparent on an <input> doesn't work on IE6 */
+	background-color:#f9f7ba !important;
+}
+
+.nihilo .dijitErrorFocused {
+	background-color:#ff6;
+	background-image:none;
+}
+.dj_ie6 .nihilo .dijitErrorFocused INPUT {
+	/* background-color: transparent on an <input> doesn't work on IE6 */
+	background-color:#ff6 !important;
+}
+
+/* Validation errors  */
+.nihilo .dijitValidationIcon {
+	/* prevent height change when widget goes from valid to invalid state */
+	width: 16px;
+	background: transparent url('../images/warning.png') no-repeat center center;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+.dijitRtl .dijitComboBox .dijitButtonNode,
+.dijitRtl .dijitSpinner .dijitButtonNode {
+	
+	border-color: #8ba0bd;
+	border-left: 0px solid #8ba0bd;
+	border-right: 1px solid #8ba0bd;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/RadioButton.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/RadioButton.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/RadioButton.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/RadioButton.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/RadioButton.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/RadioButton.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Textarea.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Textarea.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Textarea.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Textarea.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Textarea.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/Textarea.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/TimeTextBox.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/TimeTextBox.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/TimeTextBox.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+@CHARSET "UTF-8";

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+@CHARSET "UTF-8";

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/accordionItemActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/accordionItemActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonDisabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonDisabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonEnabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonEnabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonHover.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/buttonHover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndCopy.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndCopy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndMove.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndMove.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndNoCopy.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndNoCopy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndNoMove.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/dndNoMove.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/editor.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/editor.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/editor_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/editor_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/no.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/no.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumb.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumb.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarAnim.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarAnim.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarEmpty.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarEmpty.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarFull.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/progressBarFull.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderEmpty.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderEmpty.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderEmptyVertical.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderEmptyVertical.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFull.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFull.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullVertical.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullVertical.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullVerticalFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderFullVerticalFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumbFocus.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumbFocus.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumbFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/sliderThumbFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerH-thumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerH-thumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerH.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerH.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerV-thumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerV-thumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerV.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/splitContainerSizerV.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteArrows.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteArrows.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteArrows.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteArrows.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteCheckbox.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteCheckbox.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteCheckbox.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteCheckbox.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteDivIcons.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteDivIcons.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteDivIcons.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteDivIcons.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRadio.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRadio.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRadio.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRadio.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree_rtl.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/spriteTree_rtl.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomActiveC.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomActiveC.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomEnabledC.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomEnabledC.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomHoverC.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomHoverC.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabContainerSprite.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabContainerSprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabLeftChecked.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabLeftChecked.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabRightChecked.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabRightChecked.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripe.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripe.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeBottom.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeBottom.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeLeft.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeLeft.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeRight.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tabStripeRight.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/titleBar.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/titleBar.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/titleBarActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/titleBarActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorDown.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorDown.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorDown.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorDown.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorLeft.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorLeft.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorLeft.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorLeft.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorRight.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorRight.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorRight.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorRight.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorUp.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorUp.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorUp.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/tooltipConnectorUp.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeExpand_loading.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeExpand_loading.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_half.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_half.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_half_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_half_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/treeI_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/validationInputBg.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/validationInputBg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/validationInputBg.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/validationInputBg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/warning.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/images/warning.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+.dijitRtl .dijitAccordionArrow {
+	background-position: -30px top;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+.dijitRtl .dijitAccordionArrow {
+	background-position: -30px top;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/BorderContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/BorderContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/BorderContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/SplitContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/SplitContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/SplitContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Calendar_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ColorPalette.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ColorPalette.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ColorPalette.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+	border:1px solid #cbcbcb;
+	background:#fff;
+	-moz-border-radius: 0px !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ColorPalette.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ColorPalette.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ColorPalette.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+	border:1px solid #cbcbcb;
+	background:#fff;
+	-moz-border-radius: 0px !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Common.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Common.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Common.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Common.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Common.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Common.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,175 @@
+
+/* Dialog */
+
+.soria .dijitDialog {
+	background: #eee;
+	border: 1px solid #cbcbcb;
+	-webkit-box-shadow: 0px 5px 10px #adadad;
+	padding: 0px;
+}
+
+.soria .dijitDialog .dijitDialogTitle {
+	border-top: none;
+	border-left: none;
+	border-right: none;
+	font-size: 0.9em;
+	color: #3243C5F;
+}
+
+.soria .dijitDialog .dijitDialogPaneContent {
+	background: #ffffff;
+	border:none;
+	border-top: 1px solid #b1badf; /* #cddde9;	/* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+	padding:10px;
+
+}
+
+.soria .dijitDialogTitleBar {
+	/* outer container for the titlebar of the dialog */
+	background: #fafafa url("images/titleBar.png") repeat-x top left;
+	/* border: 1px solid #bfbfbf; */
+	padding: 5px 6px 3px 2px;
+	cursor: move;
+	outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
+}
+
+.soria .dijitDialogTitle {
+	/* typography and styling of the dialog title */
+	font-weight: bold;
+	padding: 8px 12px 8px 12px;
+	outline:0;
+}
+
+.soria .dijitDialogCloseIcon {
+	/* the default close icon for the dialog */
+	background : url("images/spriteRoundedIconsSmallBl.png") no-repeat right top;
+	float: right;
+	position: absolute;
+	vertical-align: middle;
+	right: 6px;
+	top: 4px;
+	height: 15px;
+	width: 15px;
+	cursor: pointer;
+}
+.dj_ie6 .soria .dijitDialogCloseIcon {
+	background : url("images/spriteRoundedIconsSmallBl.gif") no-repeat right top;
+}
+
+.soria .dijitDialogContent {
+	/* the body of the dialog */
+	padding: 8px;
+}
+
+
+/* Tooltip and TooltipDialog */
+
+.soria .dijitTooltip,
+.soria .dijitTooltipDialog {
+	/* the outermost dom node, holding the connector and container */
+	opacity: 0.95;
+	background: transparent;	/* make the area on the sides of the arrow transparent */
+}
+
+.dijitTooltipBelow {
+	/* leave room for arrow above content */
+	padding-top: 10px;
+}
+
+.dijitTooltipAbove {
+	/* leave room for arrow below content */
+	padding-bottom: 10px;
+}
+
+.soria .dijitTooltipContainer {
+	/*
+		The part with the text.
+
+		NOTE:
+			FF doesn't clip images used as CSS bgs if you specify a border
+			radius. If you use a solid color, it does. Webkit gets it right.
+			Sigh.
+		background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
+	*/
+	background-color: #fff;
+	border:1px solid #cbcbcb;
+	padding:0.45em;
+	/*
+	border-radius: 6px;
+	-moz-border-radius: 7px;
+	-webkit-border-radius: 6px;
+	*/
+}
+
+.soria .dijitTooltipConnector {
+	/* the arrow piece */
+	border:0px;
+	z-index: 2;
+}
+
+.soria .dijitTooltipABRight .dijitTooltipConnector {
+	/* above or below tooltip, but the arrow appears on the right,
+		and the right edges of target and tooltip are aligned rather than the left */
+	left: auto !important;
+	right: 6px;
+}
+
+.soria .dijitTooltipBelow .dijitTooltipConnector {
+	/* the arrow piece for tooltips below an element */
+	top: 0px;
+	left: 6px;
+	background:url("images/tooltipConnectorUp.png") no-repeat top left;
+	width:17px;
+	height:11px;
+}
+
+.dj_ie6 .soria .dijitTooltipBelow .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorUp.gif");
+}
+
+.soria .dijitTooltipAbove .dijitTooltipConnector {
+	/* the arrow piece for tooltips above an element */
+	bottom: 0px;
+	left: 6px;
+	background:url("images/tooltipConnectorDown.png") no-repeat top left;
+	width:17px;
+	height:11px;
+}
+.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorDown.gif");
+	bottom: -5px;
+}
+
+.soria .dijitTooltipLeft {
+	padding-right: 10px;
+}
+.dj_ie6 .soria .dijitTooltipLeft {
+	padding-left: 11px;
+}
+.soria .dijitTooltipLeft .dijitTooltipConnector {
+	/* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+	right: 0px;
+	bottom: 7px;
+	background:url("images/tooltipConnectorRight.png") no-repeat top left;
+	width:11px;
+	height:17px;
+}
+.dj_ie6 .soria .dijitTooltipLeft .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorRight.gif");
+}
+
+.soria .dijitTooltipRight {
+	padding-left: 10px;
+}
+.soria .dijitTooltipRight .dijitTooltipConnector {
+	/* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+	left: 0px;
+	bottom: 7px;
+	background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+	width:11px;
+	height:17px;
+}
+.dj_ie6 .soria .dijitTooltipRight .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorLeft.gif");
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Dialog_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; }

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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%; */}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+
+.dijitRtl .dijitEditorIcon {
+	background-image: url('images/editor_rtl.gif'); 
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+	background-image: url('images/editor_rtl.gif');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Editor_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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'); 
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Menu_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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'); 
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ProgressBar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ProgressBar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ProgressBar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ProgressBar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ProgressBar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/ProgressBar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,77 @@
+/** 
+ * dijit.layout.TitlePane 
+ *
+ */ 
+ 
+.soria .dijitTitlePane .dijitTitlePaneTitle {
+	background: #cccccc;
+	background:#fff url("images/titleBar.png") repeat-x top left;
+	border:1px solid #bfbfbf;
+	padding:4px 4px 2px 4px;
+	cursor: pointer;
+	font-size: 0.9em;
+	font-weight: bold;
+	color: #6d6d6d;
+}
+
+/* TODO: merge these, and all other icons to a series of background-image:() and background-position: -16*n px styles */
+.soria .dijitTitlePane .dijitArrowNode {
+	width:15px;
+	height:15px;
+	float:right;
+	margin-top: -2px;
+}
+
+.soria .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+	color: #243C5F;
+}
+
+
+.soria .dijitOpen .dijitTitlePaneTextNode {
+	color: #243C5F;
+}
+
+.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background: url('images/spriteRoundedIconsSmall.png') no-repeat top left;
+}
+.dj_ie6 .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background:url('images/spriteRoundedIconsSmall.gif') no-repeat top left;
+}
+.soria .dijitTitlePane .dijitOpen .dijitArrowNode {
+	background:url('images/spriteRoundedIconsSmall.png') no-repeat -15px top;
+}
+.dj_ie6 .soria .dijitTitlePane .dijitOpen .dijitArrowNode {
+	background:url('images/spriteRoundedIconsSmall.gif') no-repeat -15px top;
+}
+.soria .dijitTitlePane .dijitArrowNodeInner {
+	visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+	visibility:visible;
+}
+
+.soria .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+	margin-right:5px;
+}
+
+.soria .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+	position:relative;
+	top:2px;
+}
+
+.soria .dijitTitlePaneContentOuter {
+	background: #ffffff;
+	border:1px solid #bfbfbf;
+	border-top: 0px solid #3d3d3d;	/* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+}
+.soria .dijitTitlePaneContentInner {
+	padding:10px;
+}
+/* force hasLayout to ensure borders etc, show up */
+.dj_ie6 .soria .dijitTitlePaneContentOuter,
+.dj_ie6 .soria .dijitTitlePane .dijitTitlePaneTitle {
+	zoom: 1;
+}
+.soria .dijitClickableRegion {
+	background-color : #ffc !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -30px top;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/TitlePane_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -30px top;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Toolbar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Toolbar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Toolbar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Toolbar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Toolbar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Toolbar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/Tree_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+.dijitRtl .dijitComboBox .dijitButtonNode {
+	border-width: 0px 0px 0px 1px;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Button_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+.dijitRtl .dijitComboBox .dijitButtonNode {
+	border-width: 0px 0px 0px 1px;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Checkbox.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Checkbox.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Checkbox.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Checkbox.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Checkbox.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Checkbox.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/ComboBox.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/ComboBox.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/ComboBox.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+.soria .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+	background:url("../images/spriteArrows.png") no-repeat left center;
+	width: 11px;
+}
+.soria .dijitComboBoxHover .dijitArrowButtonInner {
+	
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/ComboBox.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/ComboBox.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/ComboBox.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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? */
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,82 @@
+
+/****
+		dijit.form.TextBox
+		dijit.form.ValidationTextBox
+		dijit.form.SerializableTextBox
+		dijit.form.RangeBoundTextBox
+		dijit.form.NumberTextBox
+		dijit.form.CurrencyTextBox
+		dijit.form.NumberSpinner
+		dijit.form.ComboBox (partial)
+ ****/
+
+.soria .dijitInputField INPUT,
+.soria .dijitTextBox,
+.soria .dijitComboBox,
+.soria .dijitSpinner {
+	margin: 0em 0.1em;
+}
+
+.soria .dijitTextBox,
+.soria .dijitComboBox,
+.soria .dijitSpinner,
+.soria .dijitInlineEditor input,
+.soria .dijitTextArea {
+	/* 	For all except dijit.form.NumberSpinner:  the actual input element.
+		For TextBox, ComboBox, Spinner: the table that contains the input.
+		Otherwise the actual input element.
+	*/
+	background:#fff url("../images/validationInputBg.png") repeat-x top left;
+	#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+	border:1px solid #8ba0bd;
+	line-height: normal;
+}
+
+.soria .dijitComboBox .dijitButtonNode {
+	padding: 0 0.2em;
+}
+.soria .dijitComboBox .dijitButtonNode,
+.soria .dijitSpinner .dijitButtonNode {
+	/* line between the input area and the drop down button */
+	border-color: #8ba0bd;
+	border-left: 1px solid #8ba0bd;
+}
+
+.soria .dijitTextBoxFocused,
+.soria .dijitComboBoxFocused,
+.soria .dijitSpinnerFocused {
+	/* input field when focused (ie: typing affects it) */
+	border-color:#406b9b;
+}
+.soria .dijitComboBoxFocused .dijitButtonNode, .soria .dijitSpinnerFocused .dijitButtonNode {
+	border-left-color:#8ba0bd;
+}
+.soria .dijitSpinnerFocused .dijitDownArrowButton {
+	border-top-color:#8ba0bd;
+}
+
+.soria .dijitError {
+	border-color:#f3d118;
+	background-color:#f9f7ba;
+	background-image:none;
+}
+.dj_ie6 .soria .dijitError INPUT {
+	/* background-color: transparent on an <input> doesn't work on IE6 */
+	background-color:#f9f7ba !important;
+}
+
+.soria .dijitErrorFocused {
+	background-color:#ff6;
+	background-image:none;
+}
+.dj_ie6 .soria .dijitErrorFocused INPUT {
+	/* background-color: transparent on an <input> doesn't work on IE6 */
+	background-color:#ff6 !important;
+}
+
+/* Validation errors  */
+.soria .dijitValidationIcon {
+	/* prevent height change when widget goes from valid to invalid state */
+	width: 16px;
+	background: transparent url('../images/warning.png') no-repeat center center;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+.dijitRtl .dijitComboBox .dijitButtonNode,
+.dijitRtl .dijitSpinner .dijitButtonNode {
+	
+	border-color: #8ba0bd;
+	border-left: 0px solid #8ba0bd;
+	border-right: 1px solid #8ba0bd;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Common_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/RadioButton.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/RadioButton.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/RadioButton.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/RadioButton.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/RadioButton.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/RadioButton.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Slider_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Textarea.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Textarea.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Textarea.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Textarea.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Textarea.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/Textarea.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/TimeTextBox.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/TimeTextBox.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/TimeTextBox.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+@CHARSET "UTF-8";

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/TimeTextBox.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/TimeTextBox.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/form/TimeTextBox.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+@CHARSET "UTF-8";

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/accordionItemActive.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/accordionItemActive.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/accordionItemActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/accordionItemActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonDisabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonDisabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonEnabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonEnabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonHover.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/buttonHover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndCopy.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndCopy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndMove.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndMove.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndNoCopy.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndNoCopy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndNoMove.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/dndNoMove.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/editor.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/editor.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/editor_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/editor_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumb.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumb.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumbFocus.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumbFocus.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumbFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/preciseSliderThumbFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarAnim.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarAnim.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarEmpty.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarEmpty.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarFull.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/progressBarFull.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderEmpty.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderEmpty.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderEmptyVertical.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderEmptyVertical.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFull.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFull.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullVertical.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullVertical.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullVerticalFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderFullVerticalFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumbFocus.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumbFocus.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumbFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/sliderThumbFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerH-thumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerH-thumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerH.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerH.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerV-thumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerV-thumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerV.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/splitContainerSizerV.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteArrows.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteArrows.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteArrows.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteArrows.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteCheckbox.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteCheckbox.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteCheckbox.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteCheckbox.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteDivIcons.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteDivIcons.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteDivIcons.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteDivIcons.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRadio.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRadio.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRadio.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRadio.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmall.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmall.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmall.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmall.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree_rtl.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/spriteTree_rtl.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomActiveC.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomActiveC.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomEnabledC.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomEnabledC.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomHoverC.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomHoverC.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabContainerSprite.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabContainerSprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabLeftChecked.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabLeftChecked.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabRightChecked.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabRightChecked.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripe.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripe.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeBottom.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeBottom.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeLeft.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeLeft.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeRight.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tabStripeRight.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/titleBar.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/titleBar.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/titleBarActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/titleBarActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorDown.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorDown.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorDown.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorDown.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorLeft.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorLeft.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorLeft.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorLeft.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorRight.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorRight.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorRight.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorRight.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorUp.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorUp.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorUp.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/tooltipConnectorUp.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeExpand_loading.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeExpand_loading.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_half.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_half.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_half_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_half_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/treeI_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/validationInputBg.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/validationInputBg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/validationInputBg.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/validationInputBg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/warning.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/images/warning.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+.dijitRtl .dijitAccordionArrow {
+	background-position: -30px top;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+.dijitRtl .dijitAccordionArrow {
+	background-position: -30px top;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/BorderContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/BorderContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/BorderContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/BorderContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/BorderContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/BorderContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/SplitContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/SplitContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/SplitContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/SplitContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/SplitContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/SplitContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/soria/soria_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/templateThemeTest.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/templateThemeTest.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/templateThemeTest.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,184 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+		"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+	<head>
+		<title>Test Widget Templates in Multiple Themes</title>
+
+		<style type="text/css">
+			@import "../../dojo/resources/dojo.css";
+			@import "noir/noir.css";
+			@import "tundra/tundra.css";
+			@import "soria/soria.css";
+			@import "../tests/css/dijitTests.css"; 
+
+			/* group multiple buttons in a row */
+			body {
+				margin:10px;
+			}
+			.box {
+				display: block;
+			}
+			.box .dijitButton {
+				margin-right: 10px;
+			}
+		</style>
+
+		<script type="text/javascript" src="../../dojo/dojo.js"
+			djConfig="parseOnLoad: true, isDebug: true"></script>
+		<script type="text/javascript" src="../tests/_testCommon.js"></script>
+
+		<script type="text/javascript">
+			dojo.require("dijit.Menu");
+			dojo.require("dijit.form.Button");
+			dojo.require("dijit.form.ComboBox");
+			dojo.require("dijit.form.NumberSpinner");
+			dojo.require("dojo.parser");
+			logMessage = console.debug;
+		</script>
+	</head>
+	<body>
+		<h2>Tundra</h2>
+		<div id='tundra' class="box tundra">
+			<button dojoType="dijit.form.Button" onClick='logMessage("clicked simple")'>
+				Button
+			</button>
+			<button dojoType="dijit.form.Button" iconClass="noteIcon" onClick='logMessage("clicked simple")'>
+				Button w/image
+			</button>
+			<button dojoType="dijit.form.Button" onClick='logMessage("clicked simple")' disabled='true'>
+				Disabled Button
+			</button>
+		<br><br>
+			<button dojoType="dijit.form.DropDownButton">
+				<span>Drop Down Button</span>
+				<div dojoType="dijit.Menu" style="display: none;">
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconCut"
+						onClick="logMessage('not actually cutting anything, just a test!')">Cut</div>
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconCopy"
+						onClick="logMessage('not actually copying anything, just a test!')">Copy</div>
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconPaste"
+						onClick="logMessage('not actually pasting anything, just a test!')">Paste</div>
+				</div>
+			</button>
+			<button dojoType="dijit.form.DropDownButton" iconClass="noteIcon">
+				<span>Button w/image</span>
+				<div dojoType="dijit.Menu" style="display: none;">
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconCut"
+						onClick="logMessage('not actually cutting anything, just a test!')">Cut</div>
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconCopy"
+						onClick="logMessage('not actually copying anything, just a test!')">Copy</div>
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconPaste"
+						onClick="logMessage('not actually pasting anything, just a test!')">Paste</div>
+				</div>
+			</button>
+			<button dojoType="dijit.form.DropDownButton" disabled='true'>
+				<span>Drop Down Disabled</span>
+				<div dojoType="dijit.Menu" style="display: none;">
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconCut"
+						onClick="logMessage('not actually cutting anything, just a test!')">Cut</div>
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconCopy"
+						onClick="logMessage('not actually copying anything, just a test!')">Copy</div>
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconPaste"
+						onClick="logMessage('not actually pasting anything, just a test!')">Paste</div>
+				</div>
+			</button>
+		<br><br>
+			<button dojoType="dijit.form.ComboButton" onClick='logMessage("clicked combo save")'>
+				<span>Combo Button</span>
+				<div dojoType="dijit.Menu" style="display: none;">
+					<div dojoType="dijit.MenuItem" iconSrc="../../templates/buttons/save.gif"
+						onClick="logMessage('not actually saving anything, just a test!')">Save</div>
+					<div dojoType="dijit.MenuItem" iconSrc="../../templates/buttons/save.gif"
+						onClick="logMessage('not actually saving anything, just a test!')">Save As</div>
+				</div>
+			</button>
+			<button dojoType="dijit.form.ComboButton" iconClass="noteIcon" onClick='logMessage("clicked combo save")'>
+				<span>Combo w/image</span>
+				<div dojoType="dijit.Menu" style="display: none;">
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconSave"
+						onClick="logMessage('not actually saving anything, just a test!')">Save</div>
+					<div dojoType="dijit.MenuItem"
+						onClick="logMessage('not actually saving anything, just a test!')">Save As</div>
+				</div>
+			</button>
+			<button dojoType="dijit.form.ComboButton" onClick='logMessage("clicked combo save")' disabled='true'>
+				<span>Combo Disabled</span>
+				<div dojoType="dijit.Menu" style="display: none;">
+					<div dojoType="dijit.MenuItem"  iconClass="dijitEditorIconSave"
+						onClick="logMessage('not actually saving anything, just a test!')">Save</div>
+					<div dojoType="dijit.MenuItem"
+						onClick="logMessage('not actually saving anything, just a test!')">Save As</div>
+				</div>
+			</button>
+		<br><br>
+			<input dojoType="dijit.form.ComboBox"
+					value="California"
+					class="medium"
+					url="../tests/form/states.json"
+					searchAttr="name"
+					labelField="label"
+					labelType="html"
+					style="width: 300px;"
+					name="state2"
+					promptMessage="Please enter a state"
+			>
+
+			<input dojoType="dijit.form.ComboBox"
+					value="California"
+					class="medium"
+					url="../tests/form/states.json"
+					searchAttr="name"
+					labelField="label"
+					labelType="html"
+					style="width: 300px;"
+					name="state2"
+					promptMessage="Please enter a state"
+					disabled="true"
+			>
+
+		<br><br>
+		<input dojoType="dijit.form.NumberSpinner" 
+			onChange="console.debug('onChange fired for widget id = ' + this.id + ' with value = ' + arguments[0]);"
+			value="900" 
+			constraints={max:1550,places:0}
+			maxLength="10" 
+		>
+
+
+		<input dojoType="dijit.form.NumberSpinner" 
+			onChange="console.debug('onChange fired for widget id = ' + this.id + ' with value = ' + arguments[0]);"
+			value="900" 
+			disabled='true'
+			constraints={max:1550,places:0}
+			maxLength="10" 
+		>
+
+		</div>
+		<br clear=both>
+
+		<h2>Noir</h2>
+		<div id='noir' class="box noir">
+		</div>
+		<br clear=both>
+
+		<h2>Soria</h2>
+		<div id='soria' class="box soria">
+		</div>
+		<br clear=both>
+
+		<h2>a11y mode</h2>
+		<div id='a11y' class="box dijit_a11y">
+		</div>
+		<br clear=both>
+
+		
+
+<script language='javascript'>
+	var html = dojo.byId("tundra").innerHTML;
+	dojo.byId("noir").innerHTML = html;
+	dojo.byId("a11y").innerHTML = html;
+	dojo.byId("soria").innerHTML = html;
+</script>
+
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTester.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTester.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTester.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,745 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+	"http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Dijit Theme Tester</title>
+
+	<style type="text/css">
+		@import "../../dojo/resources/dojo.css";
+		@import "../tests/css/dijitTests.css";
+
+		html, body { height: 100%; width: 100%; padding: 0; border: 0; }
+		#main { height: 100%; width: 100%; padding: 0; border: 0; }
+/*		#header, #mainSplit { margin: 10px; } */
+		#leftAccordion { width: 25%; }
+		#bottomTabs { height: 40%; }
+		#main .dijitSplitterH { height: 7px }
+		#main .dijitSplitterV { width: 7px }
+
+		/* pre-loader specific stuff to prevent unsightly flash of unstyled content */
+		#loader { 
+			padding:0;
+			margin:0;
+			position:absolute; 
+			top:0; left:0; 
+			width:100%; height:100%;  
+			background:#ededed; 
+			z-index:999;
+			vertical-align:center; 
+		}
+		#loaderInner {
+			padding:5px;
+			position:relative; 
+			left:0;
+			top:0; 		
+			width:175px; 
+			background:#3c3; 
+			color:#fff; 			
+			
+		}
+
+		hr.spacer { border:0; background-color:#ededed; width:80%; height:1px; } 
+
+		/* for custom menu buttons, do not appear to have any effect */
+		.myCustomTheme .dijitButtonNode {
+			border:1px solid #000;
+			vertical-align: middle;
+			padding: 0.2em 0.2em;
+			background: url("themeTesterImages/blackButtonEnabled.gif") repeat-x bottom left #474747;
+			color: blue;
+		}
+		
+		.myCustomTheme .dijitButtonHover .dijitButtonNode,
+		.myCustomTheme .dijitToggleButtonHover .dijitButtonNode {
+			background: url("themeTesterImages/blackButtonHover.gif") repeat-x bottom left #3b3b3b !important;
+		}
+	</style>
+
+	<script type="text/javascript">
+		window.__globalList = {dojo: true, dijit: true, dojox: true, djConfig: true};
+		for(var i in window){
+			window.__globalList[i] = true;
+		}
+	</script>
+
+	<script type="text/javascript" src="../../dojo/dojo.js" 
+		djConfig="parseOnLoad: false, isDebug: true"></script>
+	<!--
+	<script type="text/javascript" src="http://prototypejs.org/assets/2007/10/16/prototype.js";></script>
+	-->
+	<script type="text/javascript" src="../dijit.js"></script>
+	<script type="text/javascript" src="../dijit-all.js" charset="utf-8"></script>
+
+	<script type="text/javascript" src="../tests/_testCommon.js"></script>
+	<script type="text/javascript"> // dojo.requires()
+
+		dojo.require("dijit.Menu");
+		dojo.require("dijit._Calendar");
+		dojo.require("dijit.ColorPalette");
+		dojo.require("dijit.ProgressBar");
+		dojo.require("dijit.TitlePane");
+		dojo.require("dijit.Tooltip");
+		dojo.require("dijit.Tree");
+
+		// editor:
+		dojo.require("dijit.Editor"); 
+		
+		// dnd:
+		dojo.require("dojo.dnd.Source");
+
+		// various Form elemetns
+		dojo.require("dijit.form.CheckBox");
+		dojo.require("dijit.form.Textarea");
+		dojo.require("dijit.form.FilteringSelect");
+		dojo.require("dijit.form.TextBox");
+		dojo.require("dijit.form.DateTextBox");	
+		dojo.require("dijit.form.TimeTextBox");	
+		dojo.require("dijit.form.Button");
+		dojo.require("dijit.InlineEditBox");
+		dojo.require("dijit.form.NumberSpinner");
+		dojo.require("dijit.form.Slider"); 
+
+		// layouts used in page
+		dojo.require("dijit.layout.AccordionContainer");
+		dojo.require("dijit.layout.ContentPane");
+		dojo.require("dijit.layout.TabContainer");
+		dojo.require("dijit.layout.BorderContainer");
+		dojo.require("dijit.Dialog");
+
+		// scan page for widgets and instantiate them
+		dojo.require("dojo.parser");	
+
+		// humm?		
+		dojo.require("dojo.date.locale");
+
+		// for the Tree
+		dojo.require("dojo.data.ItemFileReadStore");
+
+		// for the colorpalette
+		function setColor(color){
+			var theSpan = dojo.byId("outputSpan");
+			dojo.style(theSpan,"color",color); 
+			theSpan.innerHTML = color;
+		}
+
+		// for the calendar
+		function myHandler(id,newValue){
+			console.debug("onChange for id = " + id + ", value: " + newValue);
+		}
+
+		dojo.addOnLoad(function() {
+
+			// this is just a list of 'official' dijit themes, you can use ?theme=String 
+			// for 'un-supported' themes, too. (eg: yours) 
+			var availableThemes = [
+				{ theme:"tundra", author:"Dojo", baseUri:"../themes/" },
+				{ theme:"soria", author:"nikolai", baseUri:"../themes/" },
+				//{ theme:"noir", author:"owen", baseUri:"../themes/"},
+				{ theme:"nihilo", author:"nikolai", baseUri:"../themes/" }
+			];
+
+			var holder = dojo.byId('themeData');
+			var tmpString='';
+			dojo.forEach(availableThemes,function(theme){
+				tmpString += '<a href="?theme='+theme.theme+'">'+theme.theme+'</'+'a> - by: '+theme.author+' <br>';
+			});
+			holder.innerHTML = tmpString;
+
+			var start = new Date().getTime();
+			dojo.parser.parse(dojo.byId('container')); 
+			console.info("Total parse time: " + (new Date().getTime() - start) + "ms");
+
+			dojo.byId('loaderInner').innerHTML += " done.";
+			setTimeout(function hideLoader(){
+				var loader = dojo.byId('loader'); 
+				dojo.fadeOut({ node: loader, duration:500,
+					onEnd: function(){ 
+						loader.style.display = "none"; 
+					}
+				}).play();
+			}, 250);
+
+			var strayGlobals = [];
+			for(var i in window){
+				if(!window.__globalList[i]){ strayGlobals.push(i); }
+			}
+			if(strayGlobals.length){
+				console.warn("Stray globals: "+strayGlobals.join(", "));
+			}
+		});
+
+		/***
+		dojo.addOnLoad(function(){
+			// use "before advice" to print log message each time resize is called on a layout widget
+			var origResize = dijit.layout._LayoutWidget.prototype.resize;
+			dijit.layout._LayoutWidget.prototype.resize = function(mb){
+				console.log(this + ": resize({w:"+ mb.w + ", h:" + mb.h + "})");
+				origResize.apply(this, arguments);
+			};
+
+			// content pane has no children so just use dojo's builtin after advice
+			dojo.connect(dijit.layout.ContentPane.prototype, "resize", function(mb){
+				console.log(this + ": resize({w:"+ mb.w + ", h:" + mb.h + "})");
+			});
+		});
+		***/
+	</script>
+</head>
+<body>
+	<!-- basic preloader: -->
+	<div id="loader"><div id="loaderInner">Loading themeTester ... </div></div>
+
+	<!-- data for tree and combobox -->
+	<div dojoType="dojo.data.ItemFileReadStore" jsId="continentStore"
+		url="../tests/_data/countries.json"></div>
+	<div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+		url="../tests/_data/states.json"></div>
+	<!-- contentMenu popup -->
+	<div dojoType="dijit.Menu" id="submenu1" contextMenuForWindow="true" style="display: none;">
+		<div dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</div>
+		<div dojoType="dijit.MenuItem" disabled="true">Disabled Item</div>
+		<div dojoType="dijit.MenuSeparator"></div>
+		<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+			onClick="alert('not actually cutting anything, just a test!')">Cut</div>
+		<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+			onClick="alert('not actually copying anything, just a test!')">Copy</div>
+		<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+			onClick="alert('not actually pasting anything, just a test!')">Paste</div>
+		<div dojoType="dijit.MenuSeparator"></div>
+		<div dojoType="dijit.PopupMenuItem">
+			<span>Enabled Submenu</span>
+			<div dojoType="dijit.Menu" id="submenu2">
+				<div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+				<div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+				<div dojoType="dijit.PopupMenuItem">
+					<span>Deeper Submenu</span>
+					<div dojoType="dijit.Menu" id="submenu4">
+						<div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</div>
+						<div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div dojoType="dijit.PopupMenuItem" disabled="true">
+			<span>Disabled Submenu</span>
+			<div dojoType="dijit.Menu" id="submenu3" style="display: none;">
+				<div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+				<div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+			</div>
+		</div>
+		<div dojoType="dijit.PopupMenuItem">
+			<span>Different popup</span>
+			<div dojoType="dijit.ColorPalette"></div>
+		</div>
+		<div dojoType="dijit.PopupMenuItem">
+			<span>Different popup</span>
+			<div dojoType="dijit._Calendar"></div>
+		</div>
+	</div>
+	<!-- end contextMenu -->
+
+	<!-- "main" BorderContainer just contains page title and another BorderContainer -->
+	<div id="main" dojoType="dijit.layout.BorderContainer">
+
+		<h1 id="header" dojoType="dijit.layout.ContentPane" region="top">Dijit Theme Test Page</h1>
+
+		<!-- "mainSplit" BorderContainer has all the real content -->
+		<div dojoType="dijit.layout.BorderContainer" liveSplitters="false" design="sidebar"
+			region="center" id="mainSplit">
+	
+			<div dojoType="dijit.layout.AccordionContainer" duration="200"
+				minSize="20" style="width: 300px;" id="leftAccordion" region="leading" splitter="true">
+
+				<div dojoType="dijit.layout.AccordionPane" title="Popups and Alerts"><div style="padding:8px">
+					<h2>Tooltips:</h2>
+					<ul>
+						<li>
+						<span id="ttRich">rich text tooltip</span>
+						<span dojoType="dijit.Tooltip" connectId="ttRich" style="display:none;">
+							Embedded <b>bold</b> <i>RICH</i> text <span style="color:#309; font-size:x-large;">weirdness!</span>
+						</span>
+						</li>
+
+						<li><a id="ttOne" href="#bogus">anchor tooltip</a>
+						<span dojoType="dijit.Tooltip" connectId="ttOne" style="display:none;">tooltip on anchor</span>
+						</li>
+
+					</ul>
+
+					<hr class="spacer">
+
+					<h2>Dialogs:</h2>
+					<ul>
+						<li><a href="#" onclick="dijit.byId('dialog1').show()">show Modal Dialog</a></li>
+					</ul>
+
+					<div dojoType="dijit.form.DropDownButton">
+						<span>Show Tooltip Dialog</span>
+						<div dojoType="dijit.TooltipDialog" id="tooltipDlg" title="Enter Login information"
+							execute="alert('submitted w/args:\n' + dojo.toJson(arguments[0], true));">
+							<table>
+								<tr>
+									<td><label for="user">User:</label></td>
+									<td><input dojoType=dijit.form.TextBox type="text" id="user" name="user" ></td>
+								</tr>
+								<tr>
+									<td><label for="pwd">Password:</label></td>
+									<td><input dojoType=dijit.form.TextBox type="password" id="pwd" name="pwd"></td>
+								</tr>
+								<tr>
+									<td colspan="2" align="center">
+										<button dojoType=dijit.form.Button type="submit" name="submit">Login</button>
+								</tr>
+							</table>
+						</div>
+					</div> 
+				</div>
+				</div>
+
+				<div dojoType="dijit.layout.AccordionPane" title="Dojo Tree from Store">
+					<!-- tree widget -->
+					<div dojoType="dijit.Tree" store="continentStore" query="{type:'continent'}"
+						label="Continents">
+					</div>
+				</div>
+	
+				<div dojoType="dijit.layout.AccordionPane" title="Calendar" selected="true">
+					<!-- calendar widget pane -->
+					<input id="calendar1" dojoType="dijit._Calendar" onChange="myHandler(this.id,arguments[0])">
+				</div>
+	
+				<div dojoType="dijit.layout.AccordionPane" title="Color Picker">
+					<!-- color palette picker -->
+					<h2 class="testHeader">Dijit Color Palette(7x10)</h2>
+					<div dojoType="dijit.ColorPalette" onChange="setColor(this.value);"></div>
+					<br>
+					Test color is: <span id="outputSpan"></span>
+
+					<br><br>
+					<div dojoType="dijit.ColorPalette" palette="3x4"></div>
+				</div>
+
+				
+	
+			</div><!-- end AccordionContainer -->
+
+			<!-- top tabs (marked as "center" to take up the main part of the BorderContainer) -->
+			<div dojoType="dijit.layout.TabContainer" region="center" id="topTabs">
+				<!-- first tab? -->
+				<div id="tab1" dojoType="dijit.layout.ContentPane" title="Form Feel" style="padding:10px;display:none;">
+					<h2>Various Form Elements:</h2>
+
+					<form name="dijitFormTest">
+
+					<p><input type="checkBox" dojoType="dijit.form.CheckBox" checked="checked"> Standard Dijit CheckBox
+					<br><input type="checkBox" dojoType="dijit.form.CheckBox" disabled="disabled"> Disabled Dijit
+					<br><input type="checkBox" dojoType="dijit.form.CheckBox" disabled="disabled" checked="checked"> Checked and Disabled Dijit
+					</p>
+
+					<p>
+					<span>Radio group #1:</span>
+					<input type="radio" name="g1" id="g1rb1" value="news" dojoType="dijit.form.RadioButton">
+					<label for="g1rb1">news</label>
+					<input type="radio" name="g1" id="g1rb2" value="talk" dojoType="dijit.form.RadioButton" checked="checked"/>
+					<label for="g1rb2">talk</label>
+					<input type="radio" name="g1" id="g1rb3" value="weather" dojoType="dijit.form.RadioButton" disabled="disabled"/>
+					<label for="g1rb3">weather (disabled)</label>
+					</p>
+
+					<p>
+					<span>Radio group #2: (no default value, and has breaks)</span><br>
+					<input type="radio" name="g2" id="g2rb1" value="top40" dojoType="dijit.form.RadioButton">
+					<label for="g2rb1">top 40</label><br>
+					<input type="radio" name="g2" id="g2rb2" value="oldies" dojoType="dijit.form.RadioButton">
+					<label for="g2rb2">oldies</label><br>
+
+					<input type="radio" name="g2" id="g2rb3" value="country" dojoType="dijit.form.RadioButton">
+					<label for="g2rb3">country</label><br>
+
+					<br>
+					(Note if using keyboard: tab to navigate, and use arrow or space to select)
+					</p>
+
+					<hr class="spacer">
+
+					<h2>dijit.form.NumberSpinner max=100</h2>
+					<input dojoType="dijit.form.NumberSpinner" constraints="{max:100,places:0}" id="integertextbox3" value="10">
+
+					<hr class="spacer">
+
+					<h2>dijit.form.Textarea: (sans <i>any</i> styling...)</h2>
+					<textarea dojoType="dijit.form.Textarea" name="areText">Lorem ipsum dolor sit amet,
+					consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet
+					dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci
+					tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis
+					autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,
+					vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
+					dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait
+					nulla facilisi.
+					</textarea>
+
+					<hr class="spacer">
+
+					<h2>dijit.form.ComboBox</h2>
+					<label for="datatestComboBox">US State test 2: </label>
+					<input dojoType="dijit.form.ComboBox"
+						value="California"
+						class="medium"
+						store="stateStore"
+						searchAttr="name"
+						style="width: 300px;"
+						name="state2"
+						id="datatestComboBox"
+					>
+
+					</form>
+
+				</div><!-- end first tab -->
+
+				<!-- second upper tab -->
+				<div id="tab2" dojoType="dijit.layout.ContentPane" title="Various Dijits"
+					style="padding:10px; display:none;">
+
+					<!-- Sliders: -->
+					<div style="float:right;">
+					<div dojoType="dijit.form.VerticalSlider" name="vertical1"
+						onChange="dojo.byId('slider2input').value=arguments[0];"
+						value="10"
+						maximum="100"
+						minimum="0"
+						discreteValues="11"
+						style="height:175px; clear:both"
+						id="slider2">
+							<ol dojoType="dijit.form.VerticalRuleLabels" container="leftDecoration"style="width:2em;color:gray;" labelStyle="right:0px;">
+								<li>0
+								<li>100
+							</ol>
+
+							<div dojoType="dijit.form.VerticalRule" container="leftDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+							<div dojoType="dijit.form.VerticalRule" container="rightDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+							<ol dojoType="dijit.form.VerticalRuleLabels" container="rightDecoration"style="width:2em;color:gray;" maximum="100" count="6" numericMargin="1" constraints="{pattern:'#'}"></ol>
+					</div>
+					<br> Slider2 Value:<input readonly id="slider2input" size="3" value="10">
+					</div>
+											<h2>Sliders</h2>
+					<div dojoType="dijit.form.HorizontalSlider" name="horizontal1"
+						onChange="dojo.byId('slider1input').value=dojo.number.format(arguments[0]/100,{places:1,pattern:'#%'});"
+						value="10"
+						maximum="100"
+						minimum="0"
+						showButtons="false"
+						intermediateChanges="true"
+						style="width:50%; height: 20px;"
+						id="horizontal1">
+							<ol dojoType="dijit.form.HorizontalRuleLabels" container="topDecoration" style="height:1.2em;font-size:75%;color:gray;" numericMargin="1" count="6"></ol>
+							<div dojoType="dijit.form.HorizontalRule" container="topDecoration" count=11 style="height:5px;"></div>
+							<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=5 style="height:5px;"></div>
+							<ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" style="height:1em;font-size:75%;color:gray;">
+								<li>lowest
+								<li>normal
+								<li>highest
+							</ol>
+
+					</div>
+					<br>Value: <input readonly id="slider1input" size="5" value="10.0%">
+
+					<div dojoType="dijit.form.HorizontalSlider" name="horizontal2"
+						minimum="1"
+						value="2"
+						maximum="3"
+						discreteValues="3"
+						showButtons="false"
+						intermediateChanges="true"
+						style="width:300px; height: 40px;"
+						id="horizontal2">
+							<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=3 style="height:5px;"></div>
+							<ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration"style="height:1em;font-size:75%;color:gray;">
+								<li><img width=10 height=10 src="../tests/images/note.gif"><br><span style="font-size: small">small</span>
+								<li><img width=15 height=15 src="../tests/images/note.gif"><br><span style="font-size: medium">medium</span>
+
+								<li><img width=20 height=20 src="../tests/images/note.gif"><br><span style="font-size: large">large</span>
+							</ol>
+					</div>
+
+					<br style="clear:both;">
+					<hr class="spacer">
+
+					<h2>ProgressBar</h2>
+					<div style="width:400px; height:20px;" annotate="true" maximum="200" id="setTestBar"
+						progress="20" dojoType="dijit.ProgressBar"></div>
+
+					Indeterminate:
+					<div style="width:400px; height:20px" indeterminate="true" dojoType="dijit.ProgressBar"></div>
+
+					<hr class="spacer">
+
+					<h2>TitlePane (nested)</h2>
+					<div dojoType="dijit.TitlePane" title="Outer pane" width="275">
+						<p>This is a title pane, containing another title pane ...</p>
+						<div dojoType="dijit.TitlePane" title="Inner pane" width="125">
+
+							<p>And this is the inner title pane...</p>
+
+							<p>Sed sollicitudin suscipit risus. Nam
+							ullamcorper. Sed nisl lectus, pellentesque nec,
+							malesuada eget, ornare a, libero. Lorem ipsum dolor
+							sit amet, consectetuer adipiscing elit.</p>
+
+						</div><!-- end inner titlepane -->
+						<p>And this is the closing line for the outer title pane.</p>
+					</div><!-- end outer title pane -->
+					<h2>HTML After, check indent</h2>
+				</div><!-- end:second upper tab -->
+
+				<!-- start third upper tab -->
+				<div id="tab3" dojoType="dijit.layout.ContentPane" title="Buttons"
+					style="padding:10px; display:none;  ">
+
+					<h2>Simple, drop down &amp; combo buttons</h2>
+					<p>Buttons can do an action, display a menu, or both:</p>
+
+					<div class="box">
+						<button dojoType="dijit.form.Button" iconClass="plusIcon" onClick='console.debug("clicked simple")'>
+							Create
+						</button>
+
+						<button dojoType="dijit.form.DropDownButton" iconClass="noteIcon">
+							<span>Edit</span>
+							<div dojoType="dijit.Menu" id="editMenu" style="display: none;">
+								<div dojoType="dijit.MenuItem"
+									iconClass="dijitEditorIcon dijitEditorIconCut"
+									onClick="console.debug('not actually cutting anything, just a test!')">
+									Cut
+								</div>
+
+								<div dojoType="dijit.MenuItem"
+									 iconClass="dijitEditorIcon dijitEditorIconCopy"
+									onClick="console.debug('not actually copying anything, just a test!')">
+									Copy
+								</div>
+
+								<div dojoType="dijit.MenuItem"
+									 iconClass="dijitEditorIcon dijitEditorIconPaste"
+									onClick="console.debug('not actually pasting anything, just a test!')">
+									Paste
+								</div>
+							</div>
+						</button>
+
+						<button dojoType="dijit.form.ComboButton" iconClass="noteIcon"
+							optionsTitle='save options'
+							onClick='console.debug("clicked combo save")'>
+							<span>Save</span>
+							<div dojoType="dijit.Menu" id="saveMenu" style="display: none;">
+								<div dojoType="dijit.MenuItem"
+									 iconClass="dijitEditorIcon dijitEditorIconSave"
+									onClick="console.debug('not actually saving anything, just a test!')">
+									Save
+								</div>
+								<div dojoType="dijit.MenuItem"
+									onClick="console.debug('not actually saving anything, just a test!')">
+									Save As
+								</div>
+							</div>
+						</button>
+
+						<button dojoType="dijit.form.Button" iconClass="plusIcon" onClick='console.debug("clicked simple")'
+							disabled='true'>
+							Disabled
+						</button>
+					</div><!-- end:box -->
+
+					<hr class="spacer">
+
+					<h2>Sizing</h2>
+					<p>Short button, tall buttons, big buttons, small buttons... These buttons
+					size to their content (just like &lt;button&gt;).</p>
+
+					<div class="box">
+						<button dojoType="dijit.form.Button" iconClass="flatScreenIcon" onclick='console.debug("big");'>
+							<span style="font-size:xx-large">big</span>
+						</button>
+
+						<button id="smallButton1" dojoType="dijit.form.Button" onclick='console.debug("small");'>
+							<img src="../tests/images/arrowSmall.gif" width="15" height="5">
+							<span style="font-size:x-small">small</span>
+						</button>
+
+						<button dojoType="dijit.form.Button" onclick='console.debug("long");'>
+							<img src="../tests/images/tube.gif" width="150" height="16"> long
+						</button>
+
+						<button dojoType="dijit.form.Button" onclick='console.debug("tall");' width2height="0.1">
+							<img src="../tests/images/tubeTall.gif" height="75" width="35"><br>
+							<span style="font-size:medium">tall</span>
+						</button>
+						<div style="clear: both;"></div>
+					</div><!-- end box -->
+
+					<hr class="spacer">
+
+					<h2>Customized buttons</h2>
+					<p>Dojo users can mix in their styles.  Here's an example:</p>
+
+					<div><!-- custom styled button tests -->
+						<button dojoType="dijit.form.Button" class="myCustomTheme"
+							onclick='console.debug("short");'>
+							<div class="dc">short</div>
+						</button>
+
+						<button dojoType="dijit.form.Button" class="myCustomTheme"
+							onclick='console.debug("longer");'>
+							<div class="dc">bit longer</div>
+						</button>
+
+						<button dojoType="dijit.form.Button" class="myCustomTheme"
+							onclick='console.debug("longer yet");'>
+							<div class="dc">ridiculously long</div>
+						</button>
+
+						<div style="clear: both;"></div>
+					</div><!-- end styled buttons -->
+
+				</div><!-- end third upper tab-->
+
+				<!-- fourth upper tab -->
+				<div id="tab" dojoType="dijit.layout.ContentPane" title="Editable Text" style="padding:10px;" selected="selected">
+
+					<h2>dijit.Editor:</h2>
+					<!-- FIXME:
+						set height on this node to size the whole editor, but causes the tab to not scroll
+						until you select another tab and come back. alternative is no height: here, but that
+						causes editor to become VERY tall, and size to a normal height when selected (like the
+						dijit.form.TextArea in "Form Feel" Tab), but in reverse. refs #3980 and is maybe new bug?
+					-->
+					<div style="border:1px solid #ededed;">
+					<textarea height="175" dojoType="dijit.Editor" styleSheets="../../dojo/resources/dojo.css" sytle="width:400px; height:175px; overflow:auto; ">
+						<ul>
+							<li>Lorem <a href="http://dojotoolkit.org";>and a link</a>, what do you think?</li>
+							<li>This is the Editor with a Toolbar attached.</li>
+						</ul>
+					</textarea>
+					</div>
+					<hr class="spacer">
+
+
+					<h2 class="testTitle">dijit.InlineEditBox + dijit.form.TextBox on &lt;h3&gt;</h2>
+
+					(HTML before)
+					<h3 id="editable" style="font-size:larger;" dojoType="dijit.InlineEditBox" onChange="myHandler(this.id,arguments[0])">
+						Edit me - I trigger the onChange callback
+					</h3>
+					(HTML after)
+
+					<hr class="spacer">
+
+					<h2>dijit.InlineEditBox + dijit.form.Textarea</h2>
+
+					(HTML before)
+					<p id="areaEditable" dojoType="dijit.InlineEditBox" editor="dijit.form.Textarea" autoSave="false">
+						I'm one big paragraph.  Go ahead and edit me.  I dare you.
+						The quick brown fox jumped over the lazy dog.  Blah blah blah blah blah blah blah ...
+					</p>
+					(HTML after)
+
+					<p>
+						These links will
+						<a href="#" onClick="dijit.byId('areaEditable').setDisabled(true)">disable</a> /
+						<a href="#" onClick="dijit.byId('areaEditable').setDisabled(false)">enable</a>
+						the text area above.
+					</p>
+
+					<hr class="spacer">
+
+					<h2>dijit.form.DateTextBox:</h2>
+
+					(HTML inline before)
+					<span id="backgroundArea" dojoType="dijit.InlineEditBox" editor="dijit.form.DateTextBox" width="170px">12/30/2005</span>
+					(HTML after)
+
+					<hr class="spacer">
+
+					<h2>dijit.form.TimeTextBox:</h2>
+
+					(HTML inline before)
+					<span id="timePicker" dojoType="dijit.InlineEditBox" editor="dijit.form.TimeTextBox" width="150px">9:00 AM</span>
+					(HTML after)
+
+					<hr class="spacer">
+
+
+					<h2>dijit.form.FilteringSelect + Inline + remote data store:</h2>
+					(HTML inline before)
+					<span id="backgroundArea2" dojoType="dijit.InlineEditBox" editor="dijit.form.FilteringSelect"
+						editorParams="{store: stateStore, autoComplete: true, promptMessage: 'Please enter a state'}"
+						width="300px">
+						Indiana
+					</span>
+					(HTML after)
+
+				</div><!-- end fourth upper tab -->
+
+				<!-- fifth upper tab -->
+				<div id="tab5" dojoType="dijit.layout.ContentPane" title="DnD"
+					style="padding:10px; display:none;  ">
+					<div style="float:left; margin:5px; ">
+						<h3>Source 1</h3>
+						<div dojoType="dojo.dnd.Source" style="border:3px solid #ccc; padding: 1em 3em; ">
+							<div class="dojoDndItem">Item <strong>X</strong></div>
+							<div class="dojoDndItem">Item <strong>Y</strong></div>
+							<div class="dojoDndItem">Item <strong>Z</strong></div>
+						</div>
+					</div>
+					<div style="float:left; margin:5px; ">
+						<h3>Source 2</h3>
+						<div dojoType="dojo.dnd.Source" style="border:3px solid #ccc; padding: 1em 3em; ">
+							<div class="dojoDndItem">Item <strong>1</strong></div>
+							<div class="dojoDndItem">Item <strong>2</strong></div>
+							<div class="dojoDndItem">Item <strong>3</strong></div>
+						</div>
+					</div>
+				</div>
+
+				<!-- sixth upper tab -->
+				<div id="tab6" dojoType="dijit.layout.ContentPane" title="Closable"
+					style="display:none; padding:10px; " closable="true">
+					This pane is closable, just for the icon ...
+				</div>
+			</div><!-- end of region="center" TabContainer -->
+	
+			<!-- bottom right tabs -->
+			<div dojoType="dijit.layout.TabContainer" id="bottomTabs" tabPosition="bottom" selectedChild="btab1" region="bottom" splitter="true">
+
+				<!-- btab 1 -->
+				<div id="btab1" dojoType="dijit.layout.ContentPane" title="Info" style=" padding:10px; ">
+					<p>You can explore this single page after applying a Theme
+					for use in creation of your own theme.</p>
+
+					<p>I am whole slew of Widgets on a page. Jump to <a href="../tests/">dijit tests</a> to
+					test individual components.</p>
+
+					<p>There is a right-click [context] pop-up menu here, as well.</p>
+				</div><!-- end:info btab1 -->
+
+				<div id="btab2" dojoType="dijit.layout.ContentPane" title="Alternate Themes" style="padding:20px;">
+					<span id="themeData"></span>
+				</div><!-- btab2 -->
+
+				<div id="btab3" dojoType="dijit.layout.ContentPane" title="Bottom 3" closable="true">
+					<p>I am the last Tab</p>
+					<div id="dialog2" dojoType="dijit.Dialog" title="Encased Dialog" style="display:none;">
+					I am the second dialog. I am
+					parented by the Low Tab Pane #3
+					</div>
+				</div><!-- btab3 -->
+
+			</div><!-- end Bottom TabContainer -->
+
+		</div> <!-- end of "mainSplit" BorderContainer -->
+	</div><!-- end of "main" BorderContainer -->
+
+	<!-- dialog in body -->
+	<div id="dialog1" dojoType="dijit.Dialog" title="Floating Modal Dialog" style="display:none;" href="../tests/layout/doc0.html"></div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterImages/blackButtonHover.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterImages/blackButtonHover.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterQuirk.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterQuirk.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/themeTesterQuirk.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,743 @@
+<html>
+<head>
+	<title>Dijit Theme Tester</title>
+
+	<style type="text/css">
+		@import "../../dojo/resources/dojo.css";
+		@import "../tests/css/dijitTests.css";
+
+		html, body { height: 100%; width: 100%; padding: 0; border: 0; }
+		#main { height: 100%; width: 100%; padding: 0; border: 0; }
+/*		#header, #mainSplit { margin: 10px; } */
+		#leftAccordion { width: 25%; }
+		#bottomTabs { height: 40%; }
+		#main .dijitSplitterH { height: 7px }
+		#main .dijitSplitterV { width: 7px }
+
+		/* pre-loader specific stuff to prevent unsightly flash of unstyled content */
+		#loader { 
+			padding:0;
+			margin:0;
+			position:absolute; 
+			top:0; left:0; 
+			width:100%; height:100%;  
+			background:#ededed; 
+			z-index:999;
+			vertical-align:center; 
+		}
+		#loaderInner {
+			padding:5px;
+			position:relative; 
+			left:0;
+			top:0; 		
+			width:175px; 
+			background:#3c3; 
+			color:#fff; 			
+			
+		}
+
+		hr.spacer { border:0; background-color:#ededed; width:80%; height:1px; } 
+
+		/* for custom menu buttons, do not appear to have any effect */
+		.myCustomTheme .dijitButtonNode {
+			border:1px solid #000;
+			vertical-align: middle;
+			padding: 0.2em 0.2em;
+			background: url("themeTesterImages/blackButtonEnabled.gif") repeat-x bottom left #474747;
+			color: blue;
+		}
+		
+		.myCustomTheme .dijitButtonHover .dijitButtonNode,
+		.myCustomTheme .dijitToggleButtonHover .dijitButtonNode {
+			background: url("themeTesterImages/blackButtonHover.gif") repeat-x bottom left #3b3b3b !important;
+		}
+	</style>
+
+	<script type="text/javascript">
+		window.__globalList = {dojo: true, dijit: true, dojox: true, djConfig: true};
+		for(var i in window){
+			window.__globalList[i] = true;
+		}
+	</script>
+
+	<script type="text/javascript" src="../../dojo/dojo.js" 
+		djConfig="parseOnLoad: false, isDebug: true"></script>
+	<!--
+	<script type="text/javascript" src="http://prototypejs.org/assets/2007/10/16/prototype.js";></script>
+	-->
+	<script type="text/javascript" src="../dijit.js"></script>
+	<script type="text/javascript" src="../dijit-all.js" charset="utf-8"></script>
+
+	<script type="text/javascript" src="../tests/_testCommon.js"></script>
+	<script type="text/javascript"> // dojo.requires()
+
+		dojo.require("dijit.Menu");
+		dojo.require("dijit._Calendar");
+		dojo.require("dijit.ColorPalette");
+		dojo.require("dijit.ProgressBar");
+		dojo.require("dijit.TitlePane");
+		dojo.require("dijit.Tooltip");
+		dojo.require("dijit.Tree");
+
+		// editor:
+		dojo.require("dijit.Editor"); 
+		
+		// dnd:
+		dojo.require("dojo.dnd.Source");
+
+		// various Form elemetns
+		dojo.require("dijit.form.CheckBox");
+		dojo.require("dijit.form.Textarea");
+		dojo.require("dijit.form.FilteringSelect");
+		dojo.require("dijit.form.TextBox");
+		dojo.require("dijit.form.DateTextBox");	
+		dojo.require("dijit.form.TimeTextBox");	
+		dojo.require("dijit.form.Button");
+		dojo.require("dijit.InlineEditBox");
+		dojo.require("dijit.form.NumberSpinner");
+		dojo.require("dijit.form.Slider"); 
+
+		// layouts used in page
+		dojo.require("dijit.layout.AccordionContainer");
+		dojo.require("dijit.layout.ContentPane");
+		dojo.require("dijit.layout.TabContainer");
+		dojo.require("dijit.layout.BorderContainer");
+		dojo.require("dijit.Dialog");
+
+		// scan page for widgets and instantiate them
+		dojo.require("dojo.parser");	
+
+		// humm?		
+		dojo.require("dojo.date.locale");
+
+		// for the Tree
+		dojo.require("dojo.data.ItemFileReadStore");
+
+		// for the colorpalette
+		function setColor(color){
+			var theSpan = dojo.byId("outputSpan");
+			dojo.style(theSpan,"color",color); 
+			theSpan.innerHTML = color;
+		}
+
+		// for the calendar
+		function myHandler(id,newValue){
+			console.debug("onChange for id = " + id + ", value: " + newValue);
+		}
+
+		dojo.addOnLoad(function() {
+
+			// this is just a list of 'official' dijit themes, you can use ?theme=String 
+			// for 'un-supported' themes, too. (eg: yours) 
+			var availableThemes = [
+				{ theme:"tundra", author:"Dojo", baseUri:"../themes/" },
+				{ theme:"soria", author:"nikolai", baseUri:"../themes/" },
+				//{ theme:"noir", author:"owen", baseUri:"../themes/"},
+				{ theme:"nihilo", author:"nikolai", baseUri:"../themes/" }
+			];
+
+			var holder = dojo.byId('themeData');
+			var tmpString='';
+			dojo.forEach(availableThemes,function(theme){
+				tmpString += '<a href="?theme='+theme.theme+'">'+theme.theme+'</'+'a> - by: '+theme.author+' <br>';
+			});
+			holder.innerHTML = tmpString;
+
+			var start = new Date().getTime();
+			dojo.parser.parse(dojo.byId('container')); 
+			console.info("Total parse time: " + (new Date().getTime() - start) + "ms");
+
+			dojo.byId('loaderInner').innerHTML += " done.";
+			setTimeout(function hideLoader(){
+				var loader = dojo.byId('loader'); 
+				dojo.fadeOut({ node: loader, duration:500,
+					onEnd: function(){ 
+						loader.style.display = "none"; 
+					}
+				}).play();
+			}, 250);
+
+			var strayGlobals = [];
+			for(var i in window){
+				if(!window.__globalList[i]){ strayGlobals.push(i); }
+			}
+			if(strayGlobals.length){
+				console.warn("Stray globals: "+strayGlobals.join(", "));
+			}
+		});
+
+		/***
+		dojo.addOnLoad(function(){
+			// use "before advice" to print log message each time resize is called on a layout widget
+			var origResize = dijit.layout._LayoutWidget.prototype.resize;
+			dijit.layout._LayoutWidget.prototype.resize = function(mb){
+				console.log(this + ": resize({w:"+ mb.w + ", h:" + mb.h + "})");
+				origResize.apply(this, arguments);
+			};
+
+			// content pane has no children so just use dojo's builtin after advice
+			dojo.connect(dijit.layout.ContentPane.prototype, "resize", function(mb){
+				console.log(this + ": resize({w:"+ mb.w + ", h:" + mb.h + "})");
+			});
+		});
+		***/
+	</script>
+</head>
+<body>
+	<!-- basic preloader: -->
+	<div id="loader"><div id="loaderInner">Loading themeTester ... </div></div>
+
+	<!-- data for tree and combobox -->
+	<div dojoType="dojo.data.ItemFileReadStore" jsId="continentStore"
+		url="../tests/_data/countries.json"></div>
+	<div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+		url="../tests/_data/states.json"></div>
+	<!-- contentMenu popup -->
+	<div dojoType="dijit.Menu" id="submenu1" contextMenuForWindow="true" style="display: none;">
+		<div dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</div>
+		<div dojoType="dijit.MenuItem" disabled="true">Disabled Item</div>
+		<div dojoType="dijit.MenuSeparator"></div>
+		<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+			onClick="alert('not actually cutting anything, just a test!')">Cut</div>
+		<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+			onClick="alert('not actually copying anything, just a test!')">Copy</div>
+		<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+			onClick="alert('not actually pasting anything, just a test!')">Paste</div>
+		<div dojoType="dijit.MenuSeparator"></div>
+		<div dojoType="dijit.PopupMenuItem">
+			<span>Enabled Submenu</span>
+			<div dojoType="dijit.Menu" id="submenu2">
+				<div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+				<div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+				<div dojoType="dijit.PopupMenuItem">
+					<span>Deeper Submenu</span>
+					<div dojoType="dijit.Menu" id="submenu4">
+						<div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</div>
+						<div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div dojoType="dijit.PopupMenuItem" disabled="true">
+			<span>Disabled Submenu</span>
+			<div dojoType="dijit.Menu" id="submenu3" style="display: none;">
+				<div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+				<div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+			</div>
+		</div>
+		<div dojoType="dijit.PopupMenuItem">
+			<span>Different popup</span>
+			<div dojoType="dijit.ColorPalette"></div>
+		</div>
+		<div dojoType="dijit.PopupMenuItem">
+			<span>Different popup</span>
+			<div dojoType="dijit._Calendar"></div>
+		</div>
+	</div>
+	<!-- end contextMenu -->
+
+	<!-- "main" BorderContainer just contains page title and another BorderContainer -->
+	<div id="main" dojoType="dijit.layout.BorderContainer">
+
+		<h1 id="header" dojoType="dijit.layout.ContentPane" region="top">Dijit Theme Test Page</h1>
+
+		<!-- "mainSplit" BorderContainer has all the real content -->
+		<div dojoType="dijit.layout.BorderContainer" liveSplitters="false" design="sidebar"
+			region="center" id="mainSplit">
+	
+			<div dojoType="dijit.layout.AccordionContainer" duration="200"
+				minSize="20" style="width: 300px;" id="leftAccordion" region="leading" splitter="true">
+
+				<div dojoType="dijit.layout.AccordionPane" title="Popups and Alerts"><div style="padding:8px">
+					<h2>Tooltips:</h2>
+					<ul>
+						<li>
+						<span id="ttRich">rich text tooltip</span>
+						<span dojoType="dijit.Tooltip" connectId="ttRich" style="display:none;">
+							Embedded <b>bold</b> <i>RICH</i> text <span style="color:#309; font-size:x-large;">weirdness!</span>
+						</span>
+						</li>
+
+						<li><a id="ttOne" href="#bogus">anchor tooltip</a>
+						<span dojoType="dijit.Tooltip" connectId="ttOne" style="display:none;">tooltip on anchor</span>
+						</li>
+
+					</ul>
+
+					<hr class="spacer">
+
+					<h2>Dialogs:</h2>
+					<ul>
+						<li><a href="#" onclick="dijit.byId('dialog1').show()">show Modal Dialog</a></li>
+					</ul>
+
+					<div dojoType="dijit.form.DropDownButton">
+						<span>Show Tooltip Dialog</span>
+						<div dojoType="dijit.TooltipDialog" id="tooltipDlg" title="Enter Login information"
+							execute="alert('submitted w/args:\n' + dojo.toJson(arguments[0], true));">
+							<table>
+								<tr>
+									<td><label for="user">User:</label></td>
+									<td><input dojoType=dijit.form.TextBox type="text" id="user" name="user" ></td>
+								</tr>
+								<tr>
+									<td><label for="pwd">Password:</label></td>
+									<td><input dojoType=dijit.form.TextBox type="password" id="pwd" name="pwd"></td>
+								</tr>
+								<tr>
+									<td colspan="2" align="center">
+										<button dojoType=dijit.form.Button type="submit" name="submit">Login</button>
+								</tr>
+							</table>
+						</div>
+					</div> 
+				</div>
+				</div>
+
+				<div dojoType="dijit.layout.AccordionPane" title="Dojo Tree from Store">
+					<!-- tree widget -->
+					<div dojoType="dijit.Tree" store="continentStore" query="{type:'continent'}"
+						label="Continents">
+					</div>
+				</div>
+	
+				<div dojoType="dijit.layout.AccordionPane" title="Calendar" selected="true">
+					<!-- calendar widget pane -->
+					<input id="calendar1" dojoType="dijit._Calendar" onChange="myHandler(this.id,arguments[0])">
+				</div>
+	
+				<div dojoType="dijit.layout.AccordionPane" title="Color Picker">
+					<!-- color palette picker -->
+					<h2 class="testHeader">Dijit Color Palette(7x10)</h2>
+					<div dojoType="dijit.ColorPalette" onChange="setColor(this.value);"></div>
+					<br>
+					Test color is: <span id="outputSpan"></span>
+
+					<br><br>
+					<div dojoType="dijit.ColorPalette" palette="3x4"></div>
+				</div>
+
+				
+	
+			</div><!-- end AccordionContainer -->
+
+			<!-- top tabs (marked as "center" to take up the main part of the BorderContainer) -->
+			<div dojoType="dijit.layout.TabContainer" region="center" id="topTabs">
+				<!-- first tab? -->
+				<div id="tab1" dojoType="dijit.layout.ContentPane" title="Form Feel" style="padding:10px;display:none;">
+					<h2>Various Form Elements:</h2>
+
+					<form name="dijitFormTest">
+
+					<p><input type="checkBox" dojoType="dijit.form.CheckBox" checked="checked"> Standard Dijit CheckBox
+					<br><input type="checkBox" dojoType="dijit.form.CheckBox" disabled="disabled"> Disabled Dijit
+					<br><input type="checkBox" dojoType="dijit.form.CheckBox" disabled="disabled" checked="checked"> Checked and Disabled Dijit
+					</p>
+
+					<p>
+					<span>Radio group #1:</span>
+					<input type="radio" name="g1" id="g1rb1" value="news" dojoType="dijit.form.RadioButton">
+					<label for="g1rb1">news</label>
+					<input type="radio" name="g1" id="g1rb2" value="talk" dojoType="dijit.form.RadioButton" checked="checked"/>
+					<label for="g1rb2">talk</label>
+					<input type="radio" name="g1" id="g1rb3" value="weather" dojoType="dijit.form.RadioButton" disabled="disabled"/>
+					<label for="g1rb3">weather (disabled)</label>
+					</p>
+
+					<p>
+					<span>Radio group #2: (no default value, and has breaks)</span><br>
+					<input type="radio" name="g2" id="g2rb1" value="top40" dojoType="dijit.form.RadioButton">
+					<label for="g2rb1">top 40</label><br>
+					<input type="radio" name="g2" id="g2rb2" value="oldies" dojoType="dijit.form.RadioButton">
+					<label for="g2rb2">oldies</label><br>
+
+					<input type="radio" name="g2" id="g2rb3" value="country" dojoType="dijit.form.RadioButton">
+					<label for="g2rb3">country</label><br>
+
+					<br>
+					(Note if using keyboard: tab to navigate, and use arrow or space to select)
+					</p>
+
+					<hr class="spacer">
+
+					<h2>dijit.form.NumberSpinner max=100</h2>
+					<input dojoType="dijit.form.NumberSpinner" constraints="{max:100,places:0}" id="integertextbox3" value="10">
+
+					<hr class="spacer">
+
+					<h2>dijit.form.Textarea: (sans <i>any</i> styling...)</h2>
+					<textarea dojoType="dijit.form.Textarea" name="areText">Lorem ipsum dolor sit amet,
+					consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet
+					dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci
+					tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis
+					autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,
+					vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
+					dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait
+					nulla facilisi.
+					</textarea>
+
+					<hr class="spacer">
+
+					<h2>dijit.form.ComboBox</h2>
+					<label for="datatestComboBox">US State test 2: </label>
+					<input dojoType="dijit.form.ComboBox"
+						value="California"
+						class="medium"
+						store="stateStore"
+						searchAttr="name"
+						style="width: 300px;"
+						name="state2"
+						id="datatestComboBox"
+					>
+
+					</form>
+
+				</div><!-- end first tab -->
+
+				<!-- second upper tab -->
+				<div id="tab2" dojoType="dijit.layout.ContentPane" title="Various Dijits"
+					style="padding:10px; display:none;">
+
+					<!-- Sliders: -->
+					<div style="float:right;">
+					<div dojoType="dijit.form.VerticalSlider" name="vertical1"
+						onChange="dojo.byId('slider2input').value=arguments[0];"
+						value="10"
+						maximum="100"
+						minimum="0"
+						discreteValues="11"
+						style="height:175px; clear:both"
+						id="slider2">
+							<ol dojoType="dijit.form.VerticalRuleLabels" container="leftDecoration"style="width:2em;color:gray;" labelStyle="right:0px;">
+								<li>0
+								<li>100
+							</ol>
+
+							<div dojoType="dijit.form.VerticalRule" container="leftDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+							<div dojoType="dijit.form.VerticalRule" container="rightDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+							<ol dojoType="dijit.form.VerticalRuleLabels" container="rightDecoration"style="width:2em;color:gray;" maximum="100" count="6" numericMargin="1" constraints="{pattern:'#'}"></ol>
+					</div>
+					<br> Slider2 Value:<input readonly id="slider2input" size="3" value="10">
+					</div>
+											<h2>Sliders</h2>
+					<div dojoType="dijit.form.HorizontalSlider" name="horizontal1"
+						onChange="dojo.byId('slider1input').value=dojo.number.format(arguments[0]/100,{places:1,pattern:'#%'});"
+						value="10"
+						maximum="100"
+						minimum="0"
+						showButtons="false"
+						intermediateChanges="true"
+						style="width:50%; height: 20px;"
+						id="horizontal1">
+							<ol dojoType="dijit.form.HorizontalRuleLabels" container="topDecoration" style="height:1.2em;font-size:75%;color:gray;" numericMargin="1" count="6"></ol>
+							<div dojoType="dijit.form.HorizontalRule" container="topDecoration" count=11 style="height:5px;"></div>
+							<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=5 style="height:5px;"></div>
+							<ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" style="height:1em;font-size:75%;color:gray;">
+								<li>lowest
+								<li>normal
+								<li>highest
+							</ol>
+
+					</div>
+					<br>Value: <input readonly id="slider1input" size="5" value="10.0%">
+
+					<div dojoType="dijit.form.HorizontalSlider" name="horizontal2"
+						minimum="1"
+						value="2"
+						maximum="3"
+						discreteValues="3"
+						showButtons="false"
+						intermediateChanges="true"
+						style="width:300px; height: 40px;"
+						id="horizontal2">
+							<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=3 style="height:5px;"></div>
+							<ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration"style="height:1em;font-size:75%;color:gray;">
+								<li><img width=10 height=10 src="../tests/images/note.gif"><br><span style="font-size: small">small</span>
+								<li><img width=15 height=15 src="../tests/images/note.gif"><br><span style="font-size: medium">medium</span>
+
+								<li><img width=20 height=20 src="../tests/images/note.gif"><br><span style="font-size: large">large</span>
+							</ol>
+					</div>
+
+					<br style="clear:both;">
+					<hr class="spacer">
+
+					<h2>ProgressBar</h2>
+					<div style="width:400px; height:20px;" annotate="true" maximum="200" id="setTestBar"
+						progress="20" dojoType="dijit.ProgressBar"></div>
+
+					Indeterminate:
+					<div style="width:400px; height:20px" indeterminate="true" dojoType="dijit.ProgressBar"></div>
+
+					<hr class="spacer">
+
+					<h2>TitlePane (nested)</h2>
+					<div dojoType="dijit.TitlePane" title="Outer pane" width="275">
+						<p>This is a title pane, containing another title pane ...</p>
+						<div dojoType="dijit.TitlePane" title="Inner pane" width="125">
+
+							<p>And this is the inner title pane...</p>
+
+							<p>Sed sollicitudin suscipit risus. Nam
+							ullamcorper. Sed nisl lectus, pellentesque nec,
+							malesuada eget, ornare a, libero. Lorem ipsum dolor
+							sit amet, consectetuer adipiscing elit.</p>
+
+						</div><!-- end inner titlepane -->
+						<p>And this is the closing line for the outer title pane.</p>
+					</div><!-- end outer title pane -->
+					<h2>HTML After, check indent</h2>
+				</div><!-- end:second upper tab -->
+
+				<!-- start third upper tab -->
+				<div id="tab3" dojoType="dijit.layout.ContentPane" title="Buttons"
+					style="padding:10px; display:none;  ">
+
+					<h2>Simple, drop down &amp; combo buttons</h2>
+					<p>Buttons can do an action, display a menu, or both:</p>
+
+					<div class="box">
+						<button dojoType="dijit.form.Button" iconClass="plusIcon" onClick='console.debug("clicked simple")'>
+							Create
+						</button>
+
+						<button dojoType="dijit.form.DropDownButton" iconClass="noteIcon">
+							<span>Edit</span>
+							<div dojoType="dijit.Menu" id="editMenu" style="display: none;">
+								<div dojoType="dijit.MenuItem"
+									iconClass="dijitEditorIcon dijitEditorIconCut"
+									onClick="console.debug('not actually cutting anything, just a test!')">
+									Cut
+								</div>
+
+								<div dojoType="dijit.MenuItem"
+									 iconClass="dijitEditorIcon dijitEditorIconCopy"
+									onClick="console.debug('not actually copying anything, just a test!')">
+									Copy
+								</div>
+
+								<div dojoType="dijit.MenuItem"
+									 iconClass="dijitEditorIcon dijitEditorIconPaste"
+									onClick="console.debug('not actually pasting anything, just a test!')">
+									Paste
+								</div>
+							</div>
+						</button>
+
+						<button dojoType="dijit.form.ComboButton" iconClass="noteIcon"
+							optionsTitle='save options'
+							onClick='console.debug("clicked combo save")'>
+							<span>Save</span>
+							<div dojoType="dijit.Menu" id="saveMenu" style="display: none;">
+								<div dojoType="dijit.MenuItem"
+									 iconClass="dijitEditorIcon dijitEditorIconSave"
+									onClick="console.debug('not actually saving anything, just a test!')">
+									Save
+								</div>
+								<div dojoType="dijit.MenuItem"
+									onClick="console.debug('not actually saving anything, just a test!')">
+									Save As
+								</div>
+							</div>
+						</button>
+
+						<button dojoType="dijit.form.Button" iconClass="plusIcon" onClick='console.debug("clicked simple")'
+							disabled='true'>
+							Disabled
+						</button>
+					</div><!-- end:box -->
+
+					<hr class="spacer">
+
+					<h2>Sizing</h2>
+					<p>Short button, tall buttons, big buttons, small buttons... These buttons
+					size to their content (just like &lt;button&gt;).</p>
+
+					<div class="box">
+						<button dojoType="dijit.form.Button" iconClass="flatScreenIcon" onclick='console.debug("big");'>
+							<span style="font-size:xx-large">big</span>
+						</button>
+
+						<button id="smallButton1" dojoType="dijit.form.Button" onclick='console.debug("small");'>
+							<img src="../tests/images/arrowSmall.gif" width="15" height="5">
+							<span style="font-size:x-small">small</span>
+						</button>
+
+						<button dojoType="dijit.form.Button" onclick='console.debug("long");'>
+							<img src="../tests/images/tube.gif" width="150" height="16"> long
+						</button>
+
+						<button dojoType="dijit.form.Button" onclick='console.debug("tall");' width2height="0.1">
+							<img src="../tests/images/tubeTall.gif" height="75" width="35"><br>
+							<span style="font-size:medium">tall</span>
+						</button>
+						<div style="clear: both;"></div>
+					</div><!-- end box -->
+
+					<hr class="spacer">
+
+					<h2>Customized buttons</h2>
+					<p>Dojo users can mix in their styles.  Here's an example:</p>
+
+					<div><!-- custom styled button tests -->
+						<button dojoType="dijit.form.Button" class="myCustomTheme"
+							onclick='console.debug("short");'>
+							<div class="dc">short</div>
+						</button>
+
+						<button dojoType="dijit.form.Button" class="myCustomTheme"
+							onclick='console.debug("longer");'>
+							<div class="dc">bit longer</div>
+						</button>
+
+						<button dojoType="dijit.form.Button" class="myCustomTheme"
+							onclick='console.debug("longer yet");'>
+							<div class="dc">ridiculously long</div>
+						</button>
+
+						<div style="clear: both;"></div>
+					</div><!-- end styled buttons -->
+
+				</div><!-- end third upper tab-->
+
+				<!-- fourth upper tab -->
+				<div id="tab" dojoType="dijit.layout.ContentPane" title="Editable Text" style="padding:10px;" selected="selected">
+
+					<h2>dijit.Editor:</h2>
+					<!-- FIXME:
+						set height on this node to size the whole editor, but causes the tab to not scroll
+						until you select another tab and come back. alternative is no height: here, but that
+						causes editor to become VERY tall, and size to a normal height when selected (like the
+						dijit.form.TextArea in "Form Feel" Tab), but in reverse. refs #3980 and is maybe new bug?
+					-->
+					<div style="border:1px solid #ededed;">
+					<textarea height="175" dojoType="dijit.Editor" styleSheets="../../dojo/resources/dojo.css" sytle="width:400px; height:175px; overflow:auto; ">
+						<ul>
+							<li>Lorem <a href="http://dojotoolkit.org";>and a link</a>, what do you think?</li>
+							<li>This is the Editor with a Toolbar attached.</li>
+						</ul>
+					</textarea>
+					</div>
+					<hr class="spacer">
+
+
+					<h2 class="testTitle">dijit.InlineEditBox + dijit.form.TextBox on &lt;h3&gt;</h2>
+
+					(HTML before)
+					<h3 id="editable" style="font-size:larger;" dojoType="dijit.InlineEditBox" onChange="myHandler(this.id,arguments[0])">
+						Edit me - I trigger the onChange callback
+					</h3>
+					(HTML after)
+
+					<hr class="spacer">
+
+					<h2>dijit.InlineEditBox + dijit.form.Textarea</h2>
+
+					(HTML before)
+					<p id="areaEditable" dojoType="dijit.InlineEditBox" editor="dijit.form.Textarea" autoSave="false">
+						I'm one big paragraph.  Go ahead and edit me.  I dare you.
+						The quick brown fox jumped over the lazy dog.  Blah blah blah blah blah blah blah ...
+					</p>
+					(HTML after)
+
+					<p>
+						These links will
+						<a href="#" onClick="dijit.byId('areaEditable').setDisabled(true)">disable</a> /
+						<a href="#" onClick="dijit.byId('areaEditable').setDisabled(false)">enable</a>
+						the text area above.
+					</p>
+
+					<hr class="spacer">
+
+					<h2>dijit.form.DateTextBox:</h2>
+
+					(HTML inline before)
+					<span id="backgroundArea" dojoType="dijit.InlineEditBox" editor="dijit.form.DateTextBox" width="170px">12/30/2005</span>
+					(HTML after)
+
+					<hr class="spacer">
+
+					<h2>dijit.form.TimeTextBox:</h2>
+
+					(HTML inline before)
+					<span id="timePicker" dojoType="dijit.InlineEditBox" editor="dijit.form.TimeTextBox" width="150px">9:00 AM</span>
+					(HTML after)
+
+					<hr class="spacer">
+
+
+					<h2>dijit.form.FilteringSelect + Inline + remote data store:</h2>
+					(HTML inline before)
+					<span id="backgroundArea2" dojoType="dijit.InlineEditBox" editor="dijit.form.FilteringSelect"
+						editorParams="{store: stateStore, autoComplete: true, promptMessage: 'Please enter a state'}"
+						width="300px">
+						Indiana
+					</span>
+					(HTML after)
+
+				</div><!-- end fourth upper tab -->
+
+				<!-- fifth upper tab -->
+				<div id="tab5" dojoType="dijit.layout.ContentPane" title="DnD"
+					style="padding:10px; display:none;  ">
+					<div style="float:left; margin:5px; ">
+						<h3>Source 1</h3>
+						<div dojoType="dojo.dnd.Source" style="border:3px solid #ccc; padding: 1em 3em; ">
+							<div class="dojoDndItem">Item <strong>X</strong></div>
+							<div class="dojoDndItem">Item <strong>Y</strong></div>
+							<div class="dojoDndItem">Item <strong>Z</strong></div>
+						</div>
+					</div>
+					<div style="float:left; margin:5px; ">
+						<h3>Source 2</h3>
+						<div dojoType="dojo.dnd.Source" style="border:3px solid #ccc; padding: 1em 3em; ">
+							<div class="dojoDndItem">Item <strong>1</strong></div>
+							<div class="dojoDndItem">Item <strong>2</strong></div>
+							<div class="dojoDndItem">Item <strong>3</strong></div>
+						</div>
+					</div>
+				</div>
+
+				<!-- sixth upper tab -->
+				<div id="tab6" dojoType="dijit.layout.ContentPane" title="Closable"
+					style="display:none; padding:10px; " closable="true">
+					This pane is closable, just for the icon ...
+				</div>
+			</div><!-- end of region="center" TabContainer -->
+	
+			<!-- bottom right tabs -->
+			<div dojoType="dijit.layout.TabContainer" id="bottomTabs" tabPosition="bottom" selectedChild="btab1" region="bottom" splitter="true">
+
+				<!-- btab 1 -->
+				<div id="btab1" dojoType="dijit.layout.ContentPane" title="Info" style=" padding:10px; ">
+					<p>You can explore this single page after applying a Theme
+					for use in creation of your own theme.</p>
+
+					<p>I am whole slew of Widgets on a page. Jump to <a href="../tests/">dijit tests</a> to
+					test individual components.</p>
+
+					<p>There is a right-click [context] pop-up menu here, as well.</p>
+				</div><!-- end:info btab1 -->
+
+				<div id="btab2" dojoType="dijit.layout.ContentPane" title="Alternate Themes" style="padding:20px;">
+					<span id="themeData"></span>
+				</div><!-- btab2 -->
+
+				<div id="btab3" dojoType="dijit.layout.ContentPane" title="Bottom 3" closable="true">
+					<p>I am the last Tab</p>
+					<div id="dialog2" dojoType="dijit.Dialog" title="Encased Dialog" style="display:none;">
+					I am the second dialog. I am
+					parented by the Low Tab Pane #3
+					</div>
+				</div><!-- btab3 -->
+
+			</div><!-- end Bottom TabContainer -->
+
+		</div> <!-- end of "mainSplit" BorderContainer -->
+	</div><!-- end of "main" BorderContainer -->
+
+	<!-- dialog in body -->
+	<div id="dialog1" dojoType="dijit.Dialog" title="Floating Modal Dialog" style="display:none;" href="../tests/layout/doc0.html"></div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Calendar_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ColorPalette.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ColorPalette.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ColorPalette.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+	border:1px solid #7eabcd;
+	background:#fff;
+	-moz-border-radius: 0px !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ColorPalette.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ColorPalette.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ColorPalette.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+	border:1px solid #7eabcd;
+	background:#fff;
+	-moz-border-radius: 0px !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Common.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Common.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Common.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Common.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Common.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Common.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,179 @@
+
+/* Dialog */
+
+
+
+.tundra .dijitDialog {
+	background: #fff;
+	border: 1px solid #7eabcd;
+	-webkit-box-shadow: 0px 5px 10px #adadad;
+	padding: 0px;
+}
+
+.tundra .dijitDialog .dijitDialogTitle {
+	border-top: none;
+	border-left: none;
+	border-right: none;
+}
+
+.tundra .dijitDialog .dijitDialogPaneContent {
+	background: #fff;
+	border:none;
+	border-top: 1px solid #d3d3d3; /* #cddde9;	/* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+	padding:10px;
+
+}
+
+.tundra .dijitDialogTitleBar {
+	/* outer container for the titlebar of the dialog */
+	background: #fafafa url("images/titleBar.png") repeat-x top left;
+	/* border: 1px solid #bfbfbf; */
+	padding: 5px 6px 3px 2px;
+	cursor: move;
+	outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
+}
+
+.tundra .dijitDialogTitle {
+	/* typography and styling of the dialog title */
+	font-weight: bold;
+	padding: 8px 12px 8px 12px;
+	outline:0;
+}
+
+.tundra .dijitDialogCloseIcon {
+	/* the default close icon for the dialog */
+	background : url("images/spriteRoundedIconsSmall.png") no-repeat right top;
+	float: right;
+	position: absolute;
+	vertical-align: middle;
+	right: 6px;
+	top: 4px;
+	height: 15px;
+	width: 15px;
+	cursor: pointer;
+}
+.dj_ie6 .tundra .dijitDialogCloseIcon {
+	background : url("images/spriteRoundedIconsSmall.gif") no-repeat right top;
+}
+
+.tundra .dijitDialogContent {
+	/* the body of the dialog */
+	padding: 8px;
+}
+
+
+/* Tooltip and TooltipDialog */
+
+.tundra .dijitTooltip,
+.tundra .dijitTooltipDialog {
+	/* the outermost dom node, holding the connector and container */
+	/* opacity: 0.95; */
+	background: transparent;	/* make the area on the sides of the arrow transparent */
+}
+
+.dijitTooltipBelow {
+	/* leave room for arrow above content */
+	padding-top: 13px;
+}
+
+.dijitTooltipAbove {
+	/* leave room for arrow below content */
+	padding-bottom: 13px;
+}
+
+.tundra .dijitTooltipContainer {
+	/*
+		The part with the text.
+	*/
+	background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
+	border:1px solid #7eabcd;
+	padding:0.45em;	
+	-webkit-border-radius: 6px;
+}
+
+.tundra .dijitTooltipConnector {
+	/* the arrow piece */
+	border:0px;
+	z-index: 2;
+}
+.tundra .dijitTooltipABRight .dijitTooltipConnector {
+	/* above or below tooltip, but the arrow appears on the right,
+		and the right edges of target and tooltip are aligned rather than the left */
+	left: auto !important;
+	right: 3px;
+}
+
+.tundra .dijitTooltipBelow .dijitTooltipConnector {
+	/* the arrow piece for tooltips below an element */
+	top: 0px;
+	left: 3px;
+	background:url("images/tooltipConnectorUp.png") no-repeat top left;
+	width:16px;
+	height:14px;
+}
+
+.dj_ie6 .tundra .dijitTooltipBelow .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorUp.gif");
+}
+
+.tundra .dijitTooltipAbove .dijitTooltipConnector {
+	/* the arrow piece for tooltips above an element */
+	bottom: 0px;
+	left: 3px;
+	background:url("images/tooltipConnectorDown.png") no-repeat top left;
+	width:16px;
+	height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorDown.gif");
+	bottom: -3px;
+}
+
+.tundra .dijitTooltipLeft {
+	padding-right: 14px;
+}
+.dj_ie6 .tundra .dijitTooltipLeft {
+	padding-left: 15px;
+}
+.tundra .dijitTooltipLeft .dijitTooltipConnector {
+	/* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+	right: 0px;
+	bottom: 7px;
+	background:url("images/tooltipConnectorRight.png") no-repeat top left;
+	width:16px;
+	height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipLeft .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorRight.gif");
+}
+
+.tundra .dijitTooltipRight {
+	padding-left: 14px;
+}
+.tundra .dijitTooltipRight .dijitTooltipConnector {
+	/* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+	left: 0px;
+	bottom: 7px;
+	background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+	width:16px;
+	height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipRight .dijitTooltipConnector {
+	background-image: url("images/tooltipConnectorLeft.gif");
+}
+
+
+.dj_safari .tundra .dijitPopup .dijitTooltipContainer,
+.dj_safari .tundra .dijitPopup .dijitMenu {
+	/* -webkit-border-radius: 5px; */
+	-webkit-box-shadow: 0px 5px 10px #adadad;
+}
+
+
+/*
+ * Control opacity of popups
+ */
+.tundra .dijitPopup > div,
+.tundra .dijitPopup > table {
+	opacity: 0.95;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Dialog_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; }

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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%; */}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+
+.dijitRtl .dijitEditorIcon {
+	background-image: url('images/editor_rtl.gif'); 
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+	background-image: url('images/editor_rtl.gif');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Editor_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+	padding-left: 3px;
+	padding-right: 0px;
+}
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+	background-image:url('images/arrowLeft.gif');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Menu_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,8 @@
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+	padding-left: 3px;
+	padding-right: 0px;
+}
+
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+	background-image:url('images/arrowLeft.gif');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ProgressBar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ProgressBar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ProgressBar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ProgressBar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ProgressBar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/ProgressBar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,63 @@
+.tundra .dijitTitlePane .dijitTitlePaneTitle {
+	background: #cccccc;
+	background:#fff url("images/titleBar.png") repeat-x bottom left;
+	border:1px solid #bfbfbf;
+	padding:4px 4px 2px 4px;
+	cursor: pointer;
+}
+
+/* TODO: merge these, and all other icons to a series of background-image:() and background-position: -16*n px styles */
+.tundra .dijitTitlePane .dijitArrowNode {
+	width:16px;
+	height:16px;
+	float:right;
+}
+.tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background:url('images/arrowRight.png') no-repeat center center;
+}
+
+.tundra .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+	text-decoration:underline;
+}
+
+.dj_ie6 .tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-image:url('images/arrowRight.gif');
+}
+.tundra .dijitTitlePane .dijitOpen .dijitArrowNode {
+	background:url('images/arrowDown.png') no-repeat center center;
+}
+.dj_ie6 .tundra .dijitTitlePane .dijitOpen .dijitArrowNode {
+	background-image:url('images/arrowDown.gif');
+}
+.tundra .dijitTitlePane .dijitArrowNodeInner {
+	visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+	visibility:visible;
+}
+
+.tundra .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+	margin-right:5px;
+}
+
+.tundra .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+	position:relative;
+	top:2px;
+}
+
+.tundra .dijitTitlePaneContentOuter {
+	background: #ffffff;
+	border:1px solid #bfbfbf;
+	border-top: 1px solid #ccc;	/* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+}
+.tundra .dijitTitlePaneContentInner {
+	padding:10px;
+}
+/* force hasLayout to ensure borders etc, show up */
+.dj_ie6 .tundra .dijitTitlePaneContentOuter,
+.dj_ie6 .tundra .dijitTitlePane .dijitTitlePaneTitle {
+	zoom: 1;
+}
+.tundra .dijitClickableRegion {
+	background-color : #ffc !important;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Toolbar.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Toolbar.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Toolbar.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Toolbar.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Toolbar.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Toolbar.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/Tree_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Button.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Button.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Button.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 {
+	
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Button.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Button.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Button.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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? */
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Checkbox.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Checkbox.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Checkbox.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Checkbox.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Checkbox.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Checkbox.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Common.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Common.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Common.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Common.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Common.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Common.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,126 @@
+
+/****
+		dijit.form.TextBox
+		dijit.form.ValidationTextBox
+		dijit.form.SerializableTextBox
+		dijit.form.RangeBoundTextBox
+		dijit.form.NumberTextBox
+		dijit.form.CurrencyTextBox
+		dijit.form.NumberSpinner
+		dijit.form.ComboBox (partial)
+ ****/
+
+.tundra .dijitInputField INPUT,
+.tundra .dijitTextBox,
+.tundra .dijitComboBox,
+.tundra .dijitSpinner {
+	margin: 0em 0.1em;
+}
+
+.tundra .dijitTextBox,
+.tundra .dijitComboBox,
+.tundra .dijitSpinner,
+.tundra .dijitInlineEditor input {
+	/* 	For all except dijit.form.NumberSpinner:  the actual input element.
+		For TextBox, ComboBox, Spinner: the table that contains the input.
+		Otherwise the actual input element.
+	*/
+	background:#fff url("../images/validationInputBg.png") repeat-x top left;
+	#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+	border:1px solid #b3b3b3;
+	line-height: normal;
+}
+
+.tundra .dijitComboBox .dijitButtonNode {
+	padding: 0 0.2em;
+}
+.tundra .dijitComboBox .dijitButtonNode,
+.tundra .dijitSpinner .dijitButtonNode {
+	/* line between the input area and the drop down button */
+	border-color: #9b9b9b;
+}
+
+.tundra .dijitTextBoxFocused,
+.tundra .dijitComboBoxFocused,
+.tundra .dijitSpinnerFocused {
+	/* input field when focused (ie: typing affects it) */
+	border-color:#406b9b;
+}
+.tundra .dijitComboBoxFocused .dijitButtonNode, .tundra .dijitSpinnerFocused .dijitButtonNode {
+	border-left-color:#366dba;
+}
+.tundra .dijitSpinnerFocused .dijitDownArrowButton {
+	border-top-color:#366dba;
+}
+
+.tundra .dijitError {
+	border-color:#f3d118;
+	background-color:#f9f7ba;
+	background-image:none;
+}
+.dj_ie6 .tundra .dijitError INPUT {
+	/* background-color: transparent on an <input> doesn't work on IE6 */
+	background-color:#f9f7ba !important;
+}
+
+.tundra .dijitErrorFocused {
+	background-color:#ff6;
+	background-image:none;
+}
+.dj_ie6 .tundra .dijitErrorFocused INPUT {
+	/* background-color: transparent on an <input> doesn't work on IE6 */
+	background-color:#ff6 !important;
+}
+
+/* Validation errors  */
+.tundra .dijitValidationIcon {
+	/* prevent height change when widget goes from valid to invalid state */
+	width: 16px;
+	background: transparent url('../images/warning.png') no-repeat center center;
+}
+
+
+
+/* inline edit boxen */
+.tundra .dijitInlineValue {
+	/* span around an inline-editable value when NOT in edit mode */
+	padding:3px;
+	margin:4px;
+}
+
+
+/* MOW: trying to get this to look like a mini-dialog.  Advised? */
+.tundra .dijitInlineEditor {
+	/* fieldset surrounding an inlineEditor in edit mode */
+	display: inline-block;
+	display: -moz-inline-stack;
+	#display:inline;
+	/*
+	border-style: solid;
+	border-color: #7788a0 #344257 #344257 #7788a0;
+	border-width:1px 2px 2px 1px;
+	-moz-border-radius:0px 2px 0px 2px;	make BL and TR corners indent on Moz so it looks like we have a shadow
+	background-color:white;
+	*/
+}
+
+.dijitInlineEditor .saveButton,
+.dijitInlineEditor .cancelButton {
+	margin:3px 3px 3px 0px;
+}
+
+.RichTextEditable {
+	border:1px solid #bfbfbf;
+	border-top:0;
+}
+
+/*
+ * IE6: can't display PNG images with gradient transparency.
+ * Want to use filter property for those images, but then need to specify a path relative
+ * to the main page, rather than relative to this file... using gifs for now
+ */
+
+.dj_ie6 .tundra .dijitInputField
+{
+	background: url("../images/validationInputBg.gif") repeat-x top left #fff;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/RadioButton.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/RadioButton.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/RadioButton.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/RadioButton.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/RadioButton.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/RadioButton.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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');
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/TextArea.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/TextArea.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/TextArea.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/TextArea.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/TextArea.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/form/TextArea.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/accordionItemActive.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/accordionItemActive.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowDown.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowDown.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowDown.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowDown.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowLeft.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowLeft.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowLeft.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowLeft.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowRight.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowRight.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowRight.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowRight.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowUp.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowUp.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowUp.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/arrowUp.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonDisabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonDisabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonEnabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonEnabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonHover.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/buttonHover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarDayLabel.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarDayLabel.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarMonthLabel.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarMonthLabel.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarYearLabel.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/calendarYearLabel.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxDisabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxDisabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxEnabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxEnabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxHover.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkboxHover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmark.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmark.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmark.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmark.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmarkNoBorder.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmarkNoBorder.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmarkNoBorder.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/checkmarkNoBorder.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/circleIcon.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/circleIcon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/circleIcon.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/circleIcon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/comboArrowDown.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/comboArrowDown.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dijitProgressBarAnim.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dijitProgressBarAnim.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dijitProgressBarAnim.psd
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dijitProgressBarAnim.psd
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndCopy.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndCopy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndMove.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndMove.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndNoCopy.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndNoCopy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndNoMove.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dndNoMove.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dojoTundraGradientBg.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dojoTundraGradientBg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dojoTundraGradientBg.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/dojoTundraGradientBg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/doubleArrowDown.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/doubleArrowDown.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/doubleArrowUp.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/doubleArrowUp.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/editor.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/editor.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/editor_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/editor_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/folderClosed.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/folderClosed.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/folderOpened.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/folderOpened.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_half.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_half.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_half_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_half_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/i_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/leaf.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/leaf.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/loading.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/loading.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/menu.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/menu.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/minusButton.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/minusButton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/no.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/no.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/noX.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/noX.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/plusButton.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/plusButton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/popupMenuBg.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/popupMenuBg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumb.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumb.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumbFocus.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumbFocus.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumbFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/preciseSliderThumbFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-1.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-1.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-2.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-2.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-3.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-3.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-4.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-4.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-5.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-5.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-6.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-6.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-7.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-7.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-8.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-8.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-9.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim-9.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim.psd
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarAnim.psd
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarEmpty.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarEmpty.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarFull.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/progressBarFull.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActiveDisabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActiveDisabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActiveHover.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonActiveHover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonDisabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonDisabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonEnabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonEnabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonHover.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/radioButtonHover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderEmpty.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderEmpty.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderEmptyVertical.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderEmptyVertical.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFull.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFull.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullVertical.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullVertical.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullVerticalFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderFullVerticalFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumbFocus.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumbFocus.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumbFocus.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/sliderThumbFocus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/smallArrowDown.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/smallArrowDown.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/smallArrowUp.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/smallArrowUp.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerH-thumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerH-thumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerH.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerH.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerV-thumb.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerV-thumb.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerV.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/splitContainerSizerV.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabActive.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabActive.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabClose.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabClose.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabClose.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabClose.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabCloseHover.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabCloseHover.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabCloseHover.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabCloseHover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabDisabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabDisabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabEnabled.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabEnabled.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabHover.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabHover.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabHover.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tabHover.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/titleBar.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/titleBar.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/titleBarBg.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/titleBarBg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorDown.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorDown.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorDown.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorDown.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorLeft.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorLeft.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorLeft.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorLeft.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorRight.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorRight.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorRight.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorRight.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorUp.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorUp.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorUp.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/tooltipConnectorUp.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_leaf.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_leaf.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_leaf_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_leaf_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_loading.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_loading.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_minus.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_minus.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_minus_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_minus_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_mius.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_mius.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_plus.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_plus.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_plus_rtl.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/treeExpand_plus_rtl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/validationInputBg.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/validationInputBg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/validationInputBg.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/validationInputBg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/warning.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/images/warning.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/AccordionContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/AccordionContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/AccordionContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/BorderContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/BorderContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/BorderContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/SplitContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/SplitContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/SplitContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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%;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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%;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+}

Added: branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dijit/themes/tundra/tundra_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");

Added: branches/vhffs-design/vhffs-panel/js/dojo/AdapterRegistry.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/AdapterRegistry.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/AdapterRegistry.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/DeferredList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/DeferredList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/DeferredList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.

Added: branches/vhffs-design/vhffs-panel/js/dojo/NodeList-fx.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/NodeList-fx.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/NodeList-fx.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/OpenAjax.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/OpenAjax.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/OpenAjax.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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", {});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/Color.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/Color.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/Color.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/Deferred.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/Deferred.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/Deferred.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 <http://twistedmatrix.com>.
+	// 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);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/NodeList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/NodeList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/NodeList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice>
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat>
+			// item: Object...?
+			//		Any number of optional parameters may be passed in to be
+			//		spliced into the NodeList
+			// returns:
+			//		dojo.NodeList
+			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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf>
+			//	returns:
+			//		Positive Integer or 0 for a match, -1 of not found.
+			return d.indexOf(this, value, fromIndex); // Integer
+		},
+
+		lastIndexOf: function(/*===== value, fromIndex =====*/){
+			// summary:
+			//		see dojo.lastIndexOf(). The primary difference is that the
+			//		acted-on array is implicitly this NodeList
+			//	description:
+			//		For more details on the behavior of lastIndexOf, see:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf>
+			// value: Object
+			//		The value to search for.
+			// fromIndex: Integer?
+			//		The 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every>
+			//		Takes the same structure of arguments and returns as
+			//		dojo.every() with the caveat that the passed array is
+			//		implicitly this NodeList
+			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("<h4>NOTE:</h4>", "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); }
+							})
+				);
+			}
+			*/
+		}
+	);
+
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/bootstrap.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/bootstrap.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/bootstrap.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	//		`<script>` tag inclusion. This may double-request resources and
+	//		cause problems with scripts which expect `dojo.require()` to
+	//		preform synchronously. `debugAtAllCosts` can be an invaluable
+	//		debugging aid, but when using it, ensure that all code which
+	//		depends on Dojo modules is wrapped in `dojo.addOnLoad()` handlers.
+	//		Due to the somewhat unpredictable side-effects of using
+	//		`debugAtAllCosts`, it is strongly recommended that you enable this
+	//		flag as a last resort. `debugAtAllCosts` has no effect when loading
+	//		resources across domains. For usage information, see the
+	//		[Dojo Book](http://dojotoolkit.org/book/book-dojo/part-4-meta-dojo-making-your-dojo-code-run-faster-and-better/debugging-facilities/deb)
+	debugAtAllCosts: false,
+	// locale: String
+	//		The locale to assume for loading localized resources in this page,
+	//		specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
+	//		Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
+	//		See the documentation for `dojo.i18n` and `dojo.requireLocalization`
+	//		for details on loading localized resources. If no locale is specified,
+	//		Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
+	//		or `navigator.language` properties.
+	locale: undefined,
+	// extraLocale: Array
+	//		No default value. Specifies additional locales whose
+	//		resources should also be loaded alongside the default locale when
+	//		calls to `dojo.requireLocalization()` are processed.
+	extraLocale: undefined,
+	// baseUrl: String
+	//		The directory in which `dojo.js` is located. Under normal
+	//		conditions, Dojo auto-detects the correct location from which it
+	//		was loaded. You may need to manually configure `baseUrl` in cases
+	//		where you have renamed `dojo.js` or in which `<base>` tags confuse
+	//		some browsers (e.g., IE 6). The variable `dojo.baseUrl` is assigned
+	//		either the value of `djConfig.baseUrl` if one is provided or the
+	//		auto-detected root if not. Other modules are located relative to
+	//		this path.
+	baseUrl: undefined,
+	// modulePaths: Object
+	//		A map of module names to paths relative to `dojo.baseUrl`. The
+	//		key/value pairs correspond directly to the arguments which
+	//		`dojo.registerModulePath` accepts. Specifiying
+	//		`djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
+	//		of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
+	//		modules may be configured via `djConfig.modulePaths`.
+	modulePaths: {},
+}
+=====*/
+
+(function(){
+	// firebug stubs
+
+	// if((!this["console"])||(!console["firebug"])){
+
+	if(!this["console"]){
+		this.console = {
+			log: function(){} // no-op
+		};
+	}
+
+	var cn = [
+		"assert", "count", "debug", "dir", "dirxml", "error", "group",
+		"groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
+		"trace", "warn", "log" 
+	];
+	var i=0, tn;
+	while((tn=cn[i++])){
+		if(!console[tn]){
+			(function(){
+				var tcn = tn+"";
+				console[tcn] = function(){ 
+					var a = Array.apply({}, arguments);
+					a.unshift(tcn+":");
+					console.log(a.join(" "));
+				}
+			})();
+		}
+	}
+
+	//TODOC:  HOW TO DOC THIS?
+	// dojo is the root variable of (almost all) our public symbols -- make sure it is defined.
+	if(typeof dojo == "undefined"){
+		this.dojo = {
+			_scopeName: "dojo",
+			_scopePrefix: "",
+			_scopePrefixArgs: "",
+			_scopeSuffix: "",
+			_scopeMap: {},
+			_scopeMapRev: {}
+		};
+	}
+
+	var d = dojo;
+
+	//Need placeholders for dijit and dojox for scoping code.
+	if(typeof dijit == "undefined"){
+		this.dijit = {_scopeName: "dijit"};
+	}
+	if(typeof dojox == "undefined"){
+		this.dojox = {_scopeName: "dojox"};
+	}
+	
+	if(!d._scopeArgs){
+		d._scopeArgs = [dojo, dijit, dojox];
+	}
+
+/*=====
+dojo.global = {
+	//	summary:
+	//		Alias for the global scope
+	//		(e.g. the window object in a browser).
+	//	description:
+	//		Refer to 'dojo.global' rather than referring to window to ensure your
+	//		code runs correctly in contexts other than web browsers (e.g. Rhino on a server).
+}
+=====*/
+	d.global = this;
+
+	d.config =/*===== djConfig = =====*/{
+		isDebug: false,
+		debugAtAllCosts: false
+	};
+
+	if(typeof djConfig != "undefined"){
+		for(var opt in djConfig){
+			d.config[opt] = djConfig[opt];
+		}
+	}
+
+	var _platforms = ["Browser", "Rhino", "Spidermonkey", "Mobile"];
+	var t;
+	while((t=_platforms.shift())){
+		d["is"+t] = false;
+	}
+
+/*=====
+	// Override locale setting, if specified
+	dojo.locale = {
+		// summary: the locale as defined by Dojo (read-only)
+	};
+=====*/
+	dojo.locale = d.config.locale;
+	
+	var rev = "$Rev: 13707 $".match(/\d+/);
+
+	dojo.version = {
+		// summary: 
+		//		version number of dojo
+		//	major: Integer
+		//		Major version. If total version is "1.2.0beta1", will be 1
+		//	minor: Integer
+		//		Minor version. If total version is "1.2.0beta1", will be 2
+		//	patch: Integer
+		//		Patch version. If total version is "1.2.0beta1", will be 0
+		//	flag: String
+		//		Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
+		//	revision: Number
+		//		The SVN rev from which dojo was pulled
+		major: 1, minor: 1, patch: 1, flag: "",
+		revision: rev ? +rev[0] : 999999, //FIXME: use NaN?
+		toString: function(){
+			with(d.version){
+				return major + "." + minor + "." + patch + flag + " (" + revision + ")";	// String
+			}
+		}
+	}
+
+	// Register with the OpenAjax hub
+	if(typeof OpenAjax != "undefined"){
+		OpenAjax.hub.registerLibrary(dojo._scopeName, "http://dojotoolkit.org";, d.version.toString());
+	}
+
+	dojo._mixin = function(/*Object*/ obj, /*Object*/ props){
+		// summary:
+		//		Adds all properties and methods of props to obj. This addition
+		//		is "prototype extension safe", so that instances of objects
+		//		will not pass along prototype defaults.
+		var tobj = {};
+		for(var x in props){
+			// the "tobj" condition avoid copying properties in "props"
+			// inherited from Object.prototype.  For example, if obj has a custom
+			// toString() method, don't overwrite it with the toString() method
+			// that props inherited from Object.prototype
+			if(tobj[x] === undefined || tobj[x] != props[x]){
+				obj[x] = props[x];
+			}
+		}
+		// IE doesn't recognize custom toStrings in for..in
+		if(d["isIE"] && props){
+			var p = props.toString;
+			if(typeof p == "function" && p != obj.toString && p != tobj.toString &&
+				p != "\nfunction toString() {\n    [native code]\n}\n"){
+					obj.toString = props.toString;
+			}
+		}
+		return obj; // Object
+	}
+
+	dojo.mixin = function(/*Object*/obj, /*Object...*/props){
+		// summary:	
+		//		Adds all properties and methods of props to obj and returns the
+		//		(now modified) obj.
+		//	description:
+		//		`dojo.mixin` can mix multiple source objects into a
+		//		destionation object which is then returned. Unlike regular
+		//		`for...in` iteration, `dojo.mixin` is also smart about avoiding
+		//		extensions which other toolkits may unwisely add to the root
+		//		object prototype
+		//	obj:
+		//		The object to mix properties into. Also the return value.
+		//	props:
+		//		One or more objects whose values are successively copied into
+		//		obj. If more than one of these objects contain the same value,
+		//		the one specified last in the function call will "win".
+		//	example:
+		//		make a shallow copy of an object
+		//	|	var copy = dojo.mixin({}, source);
+		//	example:
+		//		many class constructors often take an object which specifies
+		//		values to be configured on the object. In this case, it is
+		//		often simplest to call `dojo.mixin` on the `this` object:
+		//	|	dojo.declare("acme.Base", null, {
+		//	|		constructor: function(properties){
+		//	|			// property configuration:
+		//	|			dojo.mixin(this, properties);
+		//	|	
+		//	|			console.debug(this.quip);
+		//	|			//  ...
+		//	|		},
+		//	|		quip: "I wasn't born yesterday, you know - I've seen movies.",
+		//	|		// ...
+		//	|	});
+		//	|
+		//	|	// create an instance of the class and configure it
+		//	|	var b = new acme.Base({quip: "That's what it does!" });
+		//	example:
+		//		copy in properties from multiple objects
+		//	|	var flattened = dojo.mixin(
+		//	|		{
+		//	|			name: "Frylock",
+		//	|			braces: true,
+		//	|		}
+		//	|		{
+		//	|			name: "Carl Brutanananadilewski"
+		//	|		}
+		//	|	);
+		//	|	
+		//	|	// will print "Carl Brutanananadilewski"
+		//	|	console.debug(flattened.name);
+		//	|	// will print "true"
+		//	|	console.debug(flattened.braces);
+		for(var i=1, l=arguments.length; i<l; i++){
+			d._mixin(obj, arguments[i]);
+		}
+		return obj; // Object
+	}
+
+	dojo._getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){
+		var obj=context || d.global;
+		for(var i=0, p; obj && (p=parts[i]); i++){
+			if(i == 0 && this._scopeMap[p]){
+				p = this._scopeMap[p];
+			}
+			obj = (p in obj ? obj[p] : (create ? obj[p]={} : undefined));
+		}
+		return obj; // mixed
+	}
+
+	dojo.setObject = function(/*String*/name, /*Object*/value, /*Object?*/context){
+		// summary: 
+		//		Set a property from a dot-separated string, such as "A.B.C"
+		//	description: 
+		//		Useful for longer api chains where you have to test each object in
+		//		the chain, or when you have an object reference in string format.
+		//		Objects are created as needed along `path`. Returns the passed
+		//		value if setting is successful or `undefined` if not.
+		//	name: 	
+		//		Path to a property, in the form "A.B.C".
+		//	context:
+		//		Optional. Object to use as root of path. Defaults to
+		//		`dojo.global`.
+		//	example:
+		//		set the value of `foo.bar.baz`, regardless of whether
+		//		intermediate objects already exist:
+		//	|	dojo.setObject("foo.bar.baz", value);
+		//	example:
+		//		without `dojo.setObject`, we often see code like this:
+		//	|	// ensure that intermediate objects are available
+		//	|	if(!obj["parent"]){ obj.parent = {}; }
+		//	|	if(!obj.parent["child"]){ obj.parent.child= {}; }
+		//	|	// now we can safely set the property
+		//	|	obj.parent.child.prop = "some value";
+		//		wheras with `dojo.setObject`, we can shorten that to:
+		//	|	dojo.setObject("parent.child.prop", "some value", obj);
+		var parts=name.split("."), p=parts.pop(), obj=d._getProp(parts, true, context);
+		return obj && p ? (obj[p]=value) : undefined; // Object
+	}
+
+	dojo.getObject = function(/*String*/name, /*Boolean*/create, /*Object*/context){
+		// summary: 
+		//		Get a property from a dot-separated string, such as "A.B.C"
+		//	description: 
+		//		Useful for longer api chains where you have to test each object in
+		//		the chain, or when you have an object reference in string format.
+		//	name: 	
+		//		Path to an property, in the form "A.B.C".
+		//	context:
+		//		Optional. Object to use as root of path. Defaults to
+		//		'dojo.global'. Null may be passed.
+		//	create: 
+		//		Optional. Defaults to `false`. If `true`, Objects will be
+		//		created at any point along the 'path' that is undefined.
+		return d._getProp(name.split("."), create, context); // Object
+	}
+
+	dojo.exists = function(/*String*/name, /*Object?*/obj){
+		//	summary: 
+		//		determine if an object supports a given method
+		//	description: 
+		//		useful for longer api chains where you have to test each object in
+		//		the chain
+		//	name: 	
+		//		Path to an object, in the form "A.B.C".
+		//	obj:
+		//		Object to use as root of path. Defaults to
+		//		'dojo.global'. Null may be passed.
+		//	example:
+		//	|	// define an object
+		//	|	var foo = {
+		//	|		bar: { }
+		//	|	};
+		//	|
+		//	|	// search the global scope
+		//	|	dojo.exists("foo.bar"); // true
+		//	|	dojo.exists("foo.bar.baz"); // false
+		//	|
+		//	|	// search from a particular scope
+		//	|	dojo.exists("bar", foo); // true
+		//	|	dojo.exists("bar.baz", foo); // false
+		return !!d.getObject(name, false, obj); // Boolean
+	}
+
+
+	dojo["eval"] = function(/*String*/ scriptFragment){
+		//	summary: 
+		//		Perform an evaluation in the global scope. Use this rather than
+		//		calling 'eval()' directly.
+		//	description: 
+		//		Placed in a separate function to minimize size of trapped
+		//		exceptions. Calling eval() directly from some other scope may
+		//		complicate tracebacks on some platforms.
+		//	return:
+		//		The result of the evaluation. Often `undefined`
+
+
+		// note:
+		//	 - JSC eval() takes an optional second argument which can be 'unsafe'.
+		//	 - Mozilla/SpiderMonkey eval() takes an optional second argument which is the
+		//  	 scope object for new symbols.
+
+		// FIXME: investigate Joseph Smarr's technique for IE:
+		//		http://josephsmarr.com/2007/01/31/fixing-eval-to-use-global-scope-in-ie/
+		//	see also:
+		// 		http://trac.dojotoolkit.org/ticket/744
+		return d.global.eval ? d.global.eval(scriptFragment) : eval(scriptFragment); 	// Object
+	}
+
+	/*=====
+		dojo.deprecated = function(behaviour, extra, removal){
+			//	summary: 
+			//		Log a debug message to indicate that a behavior has been
+			//		deprecated.
+			//	behaviour: String
+			//		The API or behavior being deprecated. Usually in the form
+			//		of "myApp.someFunction()".
+			//	extra: String?
+			//		Text to append to the message. Often provides advice on a
+			//		new function or facility to achieve the same goal during
+			//		the deprecation period.
+			//	removal: String?
+			//		Text to indicate when in the future the behavior will be
+			//		removed. Usually a version number.
+			//	example:
+			//	|	dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0");
+		}
+
+		dojo.experimental = function(moduleName, extra){
+			//	summary: Marks code as experimental.
+			//	description: 
+			//	 	This can be used to mark a function, file, or module as
+			//	 	experimental.  Experimental code is not ready to be used, and the
+			//	 	APIs are subject to change without notice.  Experimental code may be
+			//	 	completed deleted without going through the normal deprecation
+			//	 	process.
+			//	moduleName: String
+			//	 	The name of a module, or the name of a module file or a specific
+			//	 	function
+			//	extra: String?
+			//	 	some additional message for the user
+			//	example:
+			//	|	dojo.experimental("dojo.data.Result");
+			//	example:
+			//	|	dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
+		}
+	=====*/
+
+	//Real functions declared in dojo._firebug.firebug.
+	d.deprecated = d.experimental = function(){};
+
+})();
+// vim:ai:ts=4:noet

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_browser.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_browser.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_browser.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,379 @@
+/*=====
+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('<scr'+'ipt defer src="//:" '
+					+ 'onreadystatechange="if(this.readyState==\'complete\'){' + dojo._scopeName + '._loadInit();}">'
+					+ '</scr'+'ipt>'
+				);
+			}
+
+			// 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");
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_rhino.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_rhino.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_rhino.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,238 @@
+/*
+* Rhino host environment
+*/
+
+if(dojo.config["baseUrl"]){
+	dojo.baseUrl = dojo.config["baseUrl"];
+}else{
+	dojo.baseUrl = "./";
+}
+
+dojo.locale = dojo.locale || String(java.util.Locale.getDefault().toString().replace('_','-').toLowerCase());
+dojo._name = 'rhino';
+dojo.isRhino = true;
+
+if(typeof print == "function"){
+	console.debug = print;
+}
+
+if(typeof dojo["byId"] == "undefined"){
+	dojo.byId = function(id, doc){
+		if(id && (typeof id == "string" || id instanceof String)){
+			if(!doc){ doc = document; }
+			return doc.getElementById(id);
+		}
+		return id; // assume it's a node
+	}
+}
+
+// see comments in spidermonkey loadUri
+dojo._loadUri = function(uri, cb){
+	try{
+		var local = (new java.io.File(uri)).exists();
+		if(!local){
+			try{
+				// try it as a file first, URL second
+				var stream = (new java.net.URL(uri)).openStream();
+				// close the stream so we don't leak resources
+				stream.close();
+			}catch(e){
+				// no debug output; this failure just means the uri was not found.
+				return false;
+			}
+		}
+		//FIXME: Use Rhino 1.6 native readFile/readUrl if available?
+		if(cb){
+			var contents = (local ? readText : readUri)(uri, "UTF-8");
+			cb(eval('('+contents+')'));
+		}else{
+			load(uri);
+		}
+		return true;
+	}catch(e){
+		console.debug("rhino load('" + uri + "') failed. Exception: " + e);
+		return false;
+	}
+}
+
+dojo.exit = function(exitcode){ 
+	quit(exitcode);
+}
+
+// Hack to determine current script...
+//
+// These initial attempts failed:
+//   1. get an EcmaError and look at e.getSourceName(): try {eval ("static in return")} catch(e) { ...
+//   Won't work because NativeGlobal.java only does a put of "name" and "message", not a wrapped reflecting object.
+//   Even if the EcmaError object had the sourceName set.
+//  
+//   2. var e = Packages.org.mozilla.javascript.Context.getCurrentContext().reportError('');
+//   Won't work because it goes directly to the errorReporter, not the return value.
+//   We want context.interpreterSourceFile and context.interpreterLine, which are used in static Context.getSourcePositionFromStack
+//   (set by Interpreter.java at interpretation time, if in interpreter mode).
+//
+//   3. var e = Packages.org.mozilla.javascript.Context.getCurrentContext().reportRuntimeError('');
+//   This returns an object, but e.message still does not have source info.
+//   In compiler mode, perhaps not set; in interpreter mode, perhaps not used by errorReporter?
+//
+// What we found works is to do basically the same hack as is done in getSourcePositionFromStack,
+// making a new java.lang.Exception() and then calling printStackTrace on a string stream.
+// We have to parse the string for the .js files (different from the java files).
+// This only works however in compiled mode (-opt 0 or higher).
+// In interpreter mode, entire stack is java.
+// When compiled, printStackTrace is like:
+// java.lang.Exception
+//	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+//	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
+//	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
+//	at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
+//	at org.mozilla.javascript.NativeJavaClass.constructSpecific(NativeJavaClass.java:228)
+//	at org.mozilla.javascript.NativeJavaClass.construct(NativeJavaClass.java:185)
+//	at org.mozilla.javascript.ScriptRuntime.newObject(ScriptRuntime.java:1269)
+//	at org.mozilla.javascript.gen.c2.call(/Users/mda/Sites/burstproject/testrhino.js:27)
+//    ...
+//	at org.mozilla.javascript.tools.shell.Main.main(Main.java:76)
+//
+// Note may get different answers based on:
+//    Context.setOptimizationLevel(-1)
+//    Context.setGeneratingDebug(true)
+//    Context.setGeneratingSource(true) 
+//
+// Some somewhat helpful posts:
+//    http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&selm=9v9n0g%246gr1%40ripley.netscape.com
+//    http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&selm=3BAA2DC4.6010702%40atg.com
+//
+// Note that Rhino1.5R5 added source name information in some exceptions.
+// But this seems not to help in command-line Rhino, because Context.java has an error reporter
+// so no EvaluationException is thrown.
+
+// do it by using java java.lang.Exception
+dojo._rhinoCurrentScriptViaJava = function(depth){
+    var optLevel = Packages.org.mozilla.javascript.Context.getCurrentContext().getOptimizationLevel();  
+    var caw = new java.io.CharArrayWriter();
+    var pw = new java.io.PrintWriter(caw);
+    var exc = new java.lang.Exception();
+    var s = caw.toString();
+    // we have to exclude the ones with or without line numbers because they put double entries in:
+    //   at org.mozilla.javascript.gen.c3._c4(/Users/mda/Sites/burstproject/burst/Runtime.js:56)
+    //   at org.mozilla.javascript.gen.c3.call(/Users/mda/Sites/burstproject/burst/Runtime.js)
+    var matches = s.match(/[^\(]*\.js\)/gi);
+    if(!matches){
+		throw Error("cannot parse printStackTrace output: " + s);
+	}
+
+    // matches[0] is entire string, matches[1] is this function, matches[2] is caller, ...
+    var fname = ((typeof depth != 'undefined')&&(depth)) ? matches[depth + 1] : matches[matches.length - 1];
+    var fname = matches[3];
+	if(!fname){ fname = matches[1]; }
+    // print("got fname '" + fname + "' from stack string '" + s + "'");
+    if (!fname){ throw Error("could not find js file in printStackTrace output: " + s); }
+    //print("Rhino getCurrentScriptURI returning '" + fname + "' from: " + s); 
+    return fname;
+}
+
+// reading a file from disk in Java is a humiliating experience by any measure.
+// Lets avoid that and just get the freaking text
+function readText(path, encoding){
+	encoding = encoding || "utf-8";
+	// NOTE: we intentionally avoid handling exceptions, since the caller will
+	// want to know
+	var jf = new java.io.File(path);
+	var is = new java.io.FileInputStream(jf);
+	return dj_readInputStream(is, encoding);
+}
+
+function readUri(uri, encoding){
+	var conn = (new java.net.URL(uri)).openConnection();
+	encoding = encoding || conn.getContentEncoding() || "utf-8";
+	var is = conn.getInputStream();
+	return dj_readInputStream(is, encoding);
+}
+
+function dj_readInputStream(is, encoding){
+	var input = new java.io.BufferedReader(new java.io.InputStreamReader(is, encoding));
+	try {
+		var sb = new java.lang.StringBuffer();
+		var line = "";
+		while((line = input.readLine()) !== null){
+			sb.append(line);
+			sb.append(java.lang.System.getProperty("line.separator"));
+		}
+		return sb.toString();
+	} finally {
+		input.close();
+	}
+}
+
+// call this now because later we may not be on the top of the stack
+if(
+	(!dojo.config.libraryScriptUri)||
+	(!dojo.config.libraryScriptUri.length)
+){
+	try{
+		dojo.config.libraryScriptUri = dojo._rhinoCurrentScriptViaJava(1);
+	}catch(e){
+		// otherwise just fake it
+		if(dojo.config["isDebug"]){
+			print("\n");
+			print("we have no idea where Dojo is located.");
+			print("Please try loading rhino in a non-interpreted mode or set a");
+			print("\n\tdjConfig.libraryScriptUri\n");
+			print("Setting the dojo path to './'");
+			print("This is probably wrong!");
+			print("\n");
+			print("Dojo will try to load anyway");
+		}
+		dojo.config.libraryScriptUri = "./";
+	}
+}
+
+// summary:
+//		return the document object associated with the dojo.global
+dojo.doc = typeof(document) != "undefined" ? document : null;
+
+dojo.body = function(){
+	return document.body;	
+}
+
+dojo._timeouts = [];
+
+function clearTimeout(idx){
+	if(!dojo._timeouts[idx]){ return; }
+	dojo._timeouts[idx].stop();
+}
+
+function setTimeout(func, delay){
+	// summary: provides timed callbacks using Java threads
+
+	var def={
+		sleepTime:delay,
+		hasSlept:false,
+		
+		run:function(){
+			if(!this.hasSlept){
+				this.hasSlept=true;
+				java.lang.Thread.currentThread().sleep(this.sleepTime);
+			}
+			try{
+				func();
+			}catch(e){
+				console.debug("Error running setTimeout thread:" + e);
+			}
+		}
+	};
+	
+	var runnable = new java.lang.Runnable(def);
+	var thread = new java.lang.Thread(runnable);
+	thread.start();
+	return dojo._timeouts.push(thread)-1;
+}
+
+//Register any module paths set up in djConfig. Need to do this
+//in the hostenvs since hostenv_browser can read djConfig from a
+//script tag's attribute.
+if(dojo.config["modulePaths"]){
+	for(var param in dojo.config["modulePaths"]){
+		dojo.registerModulePath(param, dojo.config["modulePaths"][param]);
+	}
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_spidermonkey.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_spidermonkey.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/hostenv_spidermonkey.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,80 @@
+/*
+ * SpiderMonkey host environment
+ */
+
+if(dojo.config["baseUrl"]){
+	dojo.baseUrl = dojo.config["baseUrl"];
+}else{
+	dojo.baseUrl = "./";
+}
+
+dojo._name = 'spidermonkey';
+
+/*=====
+dojo.isSpidermonkey = {
+	// summary: Detect spidermonkey 
+};
+=====*/
+
+dojo.isSpidermonkey = true;
+dojo.exit = function(exitcode){ 
+	quit(exitcode); 
+}
+
+if(typeof print == "function"){
+	console.debug = print;
+}
+
+if(typeof line2pc == 'undefined'){
+	throw new Error("attempt to use SpiderMonkey host environment when no 'line2pc' global");
+}
+
+dojo._spidermonkeyCurrentFile = function(depth){
+	//	
+	//	This is a hack that determines the current script file by parsing a
+	//	generated stack trace (relying on the non-standard "stack" member variable
+	//	of the SpiderMonkey Error object).
+	//	
+	//	If param depth is passed in, it'll return the script file which is that far down
+	//	the stack, but that does require that you know how deep your stack is when you are
+	//	calling.
+	//	
+    var s = '';
+    try{
+		throw Error("whatever");
+	}catch(e){
+		s = e.stack;
+	}
+    // lines are like: bu_getCurrentScriptURI_spidermonkey("ScriptLoader.js")@burst/Runtime.js:101
+    var matches = s.match(/[^@]*\.js/gi);
+    if(!matches){ 
+		throw Error("could not parse stack string: '" + s + "'");
+	}
+    var fname = (typeof depth != 'undefined' && depth) ? matches[depth + 1] : matches[matches.length - 1];
+    if(!fname){ 
+		throw Error("could not find file name in stack string '" + s + "'");
+	}
+    //print("SpiderMonkeyRuntime got fname '" + fname + "' from stack string '" + s + "'");
+    return fname;
+}
+
+// print(dojo._spidermonkeyCurrentFile(0)); 
+
+dojo._loadUri = function(uri){
+	// spidermonkey load() evaluates the contents into the global scope (which
+	// is what we want).
+	// TODO: sigh, load() does not return a useful value. 
+	// Perhaps it is returning the value of the last thing evaluated?
+	var ok = load(uri);
+	// console.debug("spidermonkey load(", uri, ") returned ", ok);
+	return 1;
+}
+
+//Register any module paths set up in djConfig. Need to do this
+//in the hostenvs since hostenv_browser can read djConfig from a
+//script tag's attribute.
+if(dojo.config["modulePaths"]){
+	for(var param in dojo.config["modulePaths"]){
+		dojo.registerModulePath(param, dojo.config["modulePaths"][param]);
+	}
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,690 @@
+if(!dojo._hasResource["dojo.foo"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.foo"] = true;
+/*
+ * loader.js - A bootstrap module.  Runs before the hostenv_*.js file. Contains
+ * all of the package loading methods.
+ */
+
+(function(){
+	var d = dojo;
+
+	d.mixin(d, {
+		_loadedModules: {},
+		_inFlightCount: 0,
+		_hasResource: {},
+
+		_modulePrefixes: {
+			dojo: 	{	name: "dojo", value: "." },
+			// dojox: 	{	name: "dojox", value: "../dojox" },
+			// dijit: 	{	name: "dijit", value: "../dijit" },
+			doh: 	{	name: "doh", value: "../util/doh" },
+			tests: 	{	name: "tests", value: "tests" }
+		},
+
+		_moduleHasPrefix: function(/*String*/module){
+			// summary: checks to see if module has been established
+			var mp = this._modulePrefixes;
+			return !!(mp[module] && mp[module].value); // Boolean
+		},
+
+		_getModulePrefix: function(/*String*/module){
+			// summary: gets the prefix associated with module
+			var mp = this._modulePrefixes;
+			if(this._moduleHasPrefix(module)){
+				return mp[module].value; // String
+			}
+			return module; // String
+		},
+
+		_loadedUrls: [],
+
+		//WARNING: 
+		//		This variable is referenced by packages outside of bootstrap:
+		//		FloatingPane.js and undo/browser.js
+		_postLoad: false,
+		
+		//Egad! Lots of test files push on this directly instead of using dojo.addOnLoad.
+		_loaders: [],
+		_unloaders: [],
+		_loadNotifying: false
+	});
+
+
+		dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){
+		// 	summary:
+		//		Load a Javascript module given a relative path
+		//
+		//	description:
+		//		Loads and interprets the script located at relpath, which is
+		//		relative to the script root directory.  If the script is found but
+		//		its interpretation causes a runtime exception, that exception is
+		//		not caught by us, so the caller will see it.  We return a true
+		//		value if and only if the script is found.
+		//
+		// relpath: 
+		//		A relative path to a script (no leading '/', and typically ending
+		//		in '.js').
+		// module: 
+		//		A module whose existance to check for after loading a path.  Can be
+		//		used to determine success or failure of the load.
+		// cb: 
+		//		a callback function to pass the result of evaluating the script
+
+		var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : this.baseUrl) + relpath;
+		try{
+			return !module ? this._loadUri(uri, cb) : this._loadUriAndCheck(uri, module, cb); // Boolean
+		}catch(e){
+			console.error(e);
+			return false; // Boolean
+		}
+	}
+
+	dojo._loadUri = function(/*String*/uri, /*Function?*/cb){
+		//	summary:
+		//		Loads JavaScript from a URI
+		//	description:
+		//		Reads the contents of the URI, and evaluates the contents.  This is
+		//		used to load modules as well as resource bundles. Returns true if
+		//		it succeeded. Returns false if the URI reading failed.  Throws if
+		//		the evaluation throws.
+		//	uri: a uri which points at the script to be loaded
+		//	cb: 
+		//		a callback function to process the result of evaluating the script
+		//		as an expression, typically used by the resource bundle loader to
+		//		load JSON-style resources
+
+		if(this._loadedUrls[uri]){
+			return true; // Boolean
+		}
+		var contents = this._getText(uri, true);
+		if(!contents){ return false; } // Boolean
+		this._loadedUrls[uri] = true;
+		this._loadedUrls.push(uri);
+		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;
+		}
+		if(d.isMoz){ contents += "\r\n//@ sourceURL=" + uri; } // debugging assist for Firebug
+		var value = d["eval"](contents);
+		if(cb){ cb(value); }
+		return true; // Boolean
+	}
+	
+	// FIXME: probably need to add logging to this method
+	dojo._loadUriAndCheck = function(/*String*/uri, /*String*/moduleName, /*Function?*/cb){
+		// summary: calls loadUri then findModule and returns true if both succeed
+		var ok = false;
+		try{
+			ok = this._loadUri(uri, cb);
+		}catch(e){
+			console.error("failed loading " + uri + " with error: " + e);
+		}
+		return !!(ok && this._loadedModules[moduleName]); // Boolean
+	}
+
+	dojo.loaded = function(){
+		// summary:
+		//		signal fired when initial environment and package loading is
+		//		complete. You may use dojo.addOnLoad() or dojo.connect() to
+		//		this method in order to handle initialization tasks that
+		//		require the environment to be initialized. In a browser host,
+		//		declarative widgets will be constructed when this function
+		//		finishes runing.
+		this._loadNotifying = true;
+		this._postLoad = true;
+		var mll = d._loaders;
+		
+		//Clear listeners so new ones can be added
+		//For other xdomain package loads after the initial load.
+		this._loaders = [];
+
+		for(var x = 0; x < mll.length; x++){
+			try{
+				mll[x]();
+			}catch(e){
+				throw e;
+				console.error("dojo.addOnLoad callback failed: " + e, e); /* let other load events fire, like the parser, but report the error */
+			}
+		}
+
+		this._loadNotifying = false;
+		
+		//Make sure nothing else got added to the onload queue
+		//after this first run. If something did, and we are not waiting for any
+		//more inflight resources, run again.
+		if(d._postLoad && d._inFlightCount == 0 && mll.length){
+			d._callLoaded();
+		}
+	}
+
+	dojo.unloaded = function(){
+		// summary:
+		//		signal fired by impending environment destruction. You may use
+		//		dojo.addOnUnload() or dojo.connect() to this method to perform
+		//		page/application cleanup methods.
+		var mll = this._unloaders;
+		while(mll.length){
+			(mll.pop())();
+		}
+	}
+
+	var onto = function(arr, obj, fn){
+		if(!fn){
+			arr.push(obj);
+		}else if(fn){
+			var func = (typeof fn == "string") ? obj[fn] : fn;
+			arr.push(function(){ func.call(obj); });
+		}
+	}
+
+	dojo.addOnLoad = function(/*Object?*/obj, /*String|Function*/functionName){
+		// summary:
+		//		Registers a function to be triggered after the DOM has finished
+		//		loading and widgets declared in markup have been instantiated.
+		//		Images and CSS files may or may not have finished downloading when
+		//		the specified function is called.  (Note that widgets' CSS and HTML
+		//		code is guaranteed to be downloaded before said widgets are
+		//		instantiated.)
+		// example:
+		//	|	dojo.addOnLoad(functionPointer);
+		//	|	dojo.addOnLoad(object, "functionName");
+		//	|	dojo.addOnLoad(object, function(){ /* ... */});
+
+		onto(d._loaders, obj, functionName);
+
+		//Added for xdomain loading. dojo.addOnLoad is used to
+		//indicate callbacks after doing some dojo.require() statements.
+		//In the xdomain case, if all the requires are loaded (after initial
+		//page load), then immediately call any listeners.
+		if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){
+			d._callLoaded();
+		}
+	}
+
+	dojo.addOnUnload = function(/*Object?*/obj, /*String|Function?*/functionName){
+		// summary:
+		//		registers a function to be triggered when the page unloads
+		// example:
+		//	|	dojo.addOnUnload(functionPointer)
+		//	|	dojo.addOnUnload(object, "functionName")
+		//	|	dojo.addOnUnload(object, function(){ /* ... */});
+
+		onto(d._unloaders, obj, functionName);
+	}
+
+	dojo._modulesLoaded = function(){
+		if(d._postLoad){ return; }
+		if(d._inFlightCount > 0){ 
+			console.warn("files still in flight!");
+			return;
+		}
+		d._callLoaded();
+	}
+
+	dojo._callLoaded = function(){
+
+		// The "object" check is for IE, and the other opera check fixes an
+		// issue in Opera where it could not find the body element in some
+		// widget test cases.  For 0.9, maybe route all browsers through the
+		// setTimeout (need protection still for non-browser environments
+		// though). This might also help the issue with FF 2.0 and freezing
+		// issues where we try to do sync xhr while background css images are
+		// being loaded (trac #2572)? Consider for 0.9.
+		if(typeof setTimeout == "object" || (dojo.config.useXDomain && d.isOpera)){
+			if(dojo.isAIR){
+				setTimeout(function(){dojo.loaded();}, 0);
+			}else{
+				setTimeout(dojo._scopeName + ".loaded();", 0);
+			}
+		}else{
+			d.loaded();
+		}
+	}
+
+	dojo._getModuleSymbols = function(/*String*/modulename){
+		// summary:
+		//		Converts a module name in dotted JS notation to an array
+		//		representing the path in the source tree
+		var syms = modulename.split(".");
+		for(var i = syms.length; i>0; i--){
+			var parentModule = syms.slice(0, i).join(".");
+			if((i==1) && !this._moduleHasPrefix(parentModule)){		
+				// Support default module directory (sibling of dojo) for top-level modules 
+				syms[0] = "../" + syms[0];
+			}else{
+				var parentModulePath = this._getModulePrefix(parentModule);
+				if(parentModulePath != parentModule){
+					syms.splice(0, i, parentModulePath);
+					break;
+				}
+			}
+		}
+		// console.debug(syms);
+		return syms; // Array
+	}
+
+	dojo._global_omit_module_check = false;
+
+	dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){
+		//	summary:
+		//		loads a Javascript module from the appropriate URI
+		//	moduleName:
+		//		module name to load. Module paths are de-referenced by dojo's
+		//		internal mapping of locations to names and are disambiguated by
+		//		longest prefix. See `dojo.registerModulePath()` for details on
+		//		registering new modules.
+		//	omitModuleCheck:
+		//		if `true`, omitModuleCheck skips the step of ensuring that the
+		//		loaded file actually defines the symbol it is referenced by.
+		//		For example if it called as `dojo._loadModule("a.b.c")` and the
+		//		file located at `a/b/c.js` does not define an object `a.b.c`,
+		//		and exception will be throws whereas no exception is raised
+		//		when called as `dojo._loadModule("a.b.c", true)`
+		//	description:
+		//		`dojo._loadModule("A.B")` first checks to see if symbol A.B is
+		//		defined. If it is, it is simply returned (nothing to do).
+		//	
+		//		If it is not defined, it will look for `A/B.js` in the script root
+		//		directory.
+		//	
+		//		`dojo._loadModule` throws an excpetion if it cannot find a file
+		//		to load, or if the symbol `A.B` is not defined after loading.
+		//	
+		//		It returns the object `A.B`.
+		//	
+		//		`dojo._loadModule()` does nothing about importing symbols into
+		//		the current namespace.  It is presumed that the caller will
+		//		take care of that. For example, to import all symbols into a
+		//		local block, you might write:
+		//	
+		//		|	with (dojo._loadModule("A.B")) {
+		//		|		...
+		//		|	}
+		//	
+		//		And to import just the leaf symbol to a local variable:
+		//	
+		//		|	var B = dojo._loadModule("A.B");
+		//	   	|	...
+		//	returns: the required namespace object
+		omitModuleCheck = this._global_omit_module_check || omitModuleCheck;
+
+		//Check if it is already loaded.
+		var module = this._loadedModules[moduleName];
+		if(module){
+			return module;
+		}
+
+		// convert periods to slashes
+		var relpath = this._getModuleSymbols(moduleName).join("/") + '.js';
+
+		var modArg = (!omitModuleCheck) ? moduleName : null;
+		var ok = this._loadPath(relpath, modArg);
+
+		if(!ok && !omitModuleCheck){
+			throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'");
+		}
+
+		// check that the symbol was defined
+		// Don't bother if we're doing xdomain (asynchronous) loading.
+		if(!omitModuleCheck && !this._isXDomain){
+			// pass in false so we can give better error
+			module = this._loadedModules[moduleName];
+			if(!module){
+				throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'"); 
+			}
+		}
+
+		return module;
+	}
+
+	dojo.provide = function(/*String*/ resourceName){
+		//	summary:
+		//		Each javascript source file must have at least one
+		//		`dojo.provide()` call at the top of the file, corresponding to
+		//		the file name.  For example, `js/dojo/foo.js` must have
+		//		`dojo.provide("dojo.foo");` before any calls to
+		//		`dojo.require()` are made.
+		//	description:
+		//		Each javascript source file is called a resource.  When a
+		//		resource is loaded by the browser, `dojo.provide()` registers
+		//		that it has been loaded.
+		//	
+		//		For backwards compatibility reasons, in addition to registering
+		//		the resource, `dojo.provide()` also ensures that the javascript
+		//		object for the module exists.  For example,
+		//		`dojo.provide("dojox.data.FlickrStore")`, in addition to
+		//		registering that `FlickrStore.js` is a resource for the
+		//		`dojox.data` module, will ensure that the `dojox.data`
+		//		javascript object exists, so that calls like 
+		//		`dojo.data.foo = function(){ ... }` don't fail.
+		//
+		//		In the case of a build where multiple javascript source files
+		//		are combined into one bigger file (similar to a .lib or .jar
+		//		file), that file may contain multiple dojo.provide() calls, to
+		//		note that it includes multiple resources.
+
+		//Make sure we have a string.
+		resourceName = resourceName + "";
+		return (d._loadedModules[resourceName] = d.getObject(resourceName, true)); // Object
+	}
+
+	//Start of old bootstrap2:
+
+	dojo.platformRequire = function(/*Object*/modMap){
+		//	summary:
+		//		require one or more modules based on which host environment
+		//		Dojo is currently operating in
+		//	description:
+		//		This method takes a "map" of arrays which one can use to
+		//		optionally load dojo modules. The map is indexed by the
+		//		possible dojo.name_ values, with two additional values:
+		//		"default" and "common". The items in the "default" array will
+		//		be loaded if none of the other items have been choosen based on
+		//		dojo.name_, set by your host environment. The items in the
+		//		"common" array will *always* be loaded, regardless of which
+		//		list is chosen.
+		//	example:
+		//		|	dojo.platformRequire({
+		//		|		browser: [
+		//		|			"foo.sample", // simple module
+		//		|			"foo.test",
+		//		|			["foo.bar.baz", true] // skip object check in _loadModule
+		//		|		],
+		//		|		default: [ "foo.sample._base" ],
+		//		|		common: [ "important.module.common" ]
+		//		|	});
+
+		var common = modMap.common || [];
+		var result = common.concat(modMap[d._name] || modMap["default"] || []);
+
+		for(var x=0; x<result.length; x++){
+			var curr = result[x];
+			if(curr.constructor == Array){
+				d._loadModule.apply(d, curr);
+			}else{
+				d._loadModule(curr);
+			}
+		}
+	}
+
+	dojo.requireIf = function(/*Boolean*/ condition, /*String*/ resourceName){
+		// summary:
+		//		If the condition is true then call dojo.require() for the specified
+		//		resource
+		if(condition === true){
+			// FIXME: why do we support chained require()'s here? does the build system?
+			var args = [];
+			for(var i = 1; i < arguments.length; i++){ 
+				args.push(arguments[i]);
+			}
+			d.require.apply(d, args);
+		}
+	}
+
+	dojo.requireAfterIf = d.requireIf;
+
+	dojo.registerModulePath = function(/*String*/module, /*String*/prefix){
+		//	summary: 
+		//		maps a module name to a path
+		//	description: 
+		//		An unregistered module is given the default path of ../[module],
+		//		relative to Dojo root. For example, module acme is mapped to
+		//		../acme.  If you want to use a different module name, use
+		//		dojo.registerModulePath. 
+		//	example:
+		//		If your dojo.js is located at this location in the web root:
+		//	|	/myapp/js/dojo/dojo/dojo.js
+		//		and your modules are located at:
+		//	|	/myapp/js/foo/bar.js
+		//	|	/myapp/js/foo/baz.js
+		//	|	/myapp/js/foo/thud/xyzzy.js
+		//		Your application can tell Dojo to locate the "foo" namespace by calling:
+		//	|	dojo.registerModulePath("foo", "../../foo");
+		//		At which point you can then use dojo.require() to load the
+		//		modules (assuming they provide() the same things which are
+		//		required). The full code might be:
+		//	|	<script type="text/javascript" 
+		//	|		src="/myapp/js/dojo/dojo/dojo.js"></script>
+		//	|	<script type="text/javascript">
+		//	|		dojo.registerModulePath("foo", "../../foo");
+		//	|		dojo.require("foo.bar");
+		//	|		dojo.require("foo.baz");
+		//	|		dojo.require("foo.thud.xyzzy");
+		//	|	</script>
+		d._modulePrefixes[module] = { name: module, value: prefix };
+	}
+
+	dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
+		// summary:
+		//		Declares translated resources and loads them if necessary, in the
+		//		same style as dojo.require.  Contents of the resource bundle are
+		//		typically strings, but may be any name/value pair, represented in
+		//		JSON format.  See also dojo.i18n.getLocalization.
+		// 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
+	}
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader_debug.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader_debug.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader_debug.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+		}
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader_xd.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader_xd.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/_loader/loader_xd.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<extra.length; i++){
+				dojo._xdReqLoc(m,b,extra[i], fLocales);
+			}
+		};
+	}
+}
+
+dojo._xdBundleMap = {};
+
+dojo.xdRequireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String*/availableFlatLocales){
+	//summary: Internal xd loader function. The xd version of dojo.requireLocalization.
+	
+
+	//Account for allowing multiple extra locales. Do this here inside the function
+	//since dojo._xdInitExtraLocales() depends on djConfig being set up, but that only
+	//happens after hostenv_browser runs. loader_xd has to come before hostenv_browser
+	//though since hostenv_browser can do a dojo.require for the debug module.
+	if(dojo._xdInitExtraLocales){
+		dojo._xdInitExtraLocales();
+		dojo._xdInitExtraLocales = null;
+		dojo.xdRequireLocalization.apply(dojo, arguments);
+		return;
+	}
+
+	var locales = availableFlatLocales.split(",");
+	
+	//Find the best-match locale to load.
+	//Assumes dojo.i18n has already been loaded. This is true for xdomain builds,
+	//since it is included in dojo.xd.js.
+	var jsLoc = dojo.i18n.normalizeLocale(locale);
+
+	var bestLocale = "";
+	for(var i = 0; i < locales.length; i++){
+		//Locale must match from start of string.
+		if(jsLoc.indexOf(locales[i]) == 0){
+			if(locales[i].length > bestLocale.length){
+				bestLocale = locales[i];
+			}
+		}
+	}
+
+	var fixedBestLocale = bestLocale.replace('-', '_');
+	//See if the bundle we are going to use is already loaded.
+ 	var bundleResource = dojo.getObject([moduleName, "nls", bundleName].join("."));
+	if(bundleResource && bundleResource[fixedBestLocale]){
+		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();
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/array.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/array.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/array.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:
+			// 			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf>
+
+			var step = 1, end = array.length || 0, i = 0;
+			if(findLast){
+				i = end - 1;
+				step = end = -1;
+			}
+			if(fromIndex != undefined){ i = fromIndex; }
+			if((findLast && i > end) || i < end){
+				for(; i != end; i += step){
+					if(array[i] == value){ return i; }
+				}
+			}
+			return -1;	// Number
+		},
+
+		lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){
+			// summary:
+			//		locates the last index of the provided value in the passed array. 
+			//		If the value is not found, -1 is returned.
+			// description:
+			//		For details on this method, see:
+			// 			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf>
+			return dojo.indexOf(array, value, fromIndex, true); // Number
+		},
+
+		forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		for every item in arr, callback is invoked.  Return values are ignored.
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:forEach>
+
+			// 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<l; i++){ 
+				_p[2].call(_p[1], arr[i], i, arr);
+			}
+		},
+
+		_everyOrSome: function(/*Boolean*/every, /*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			var _p = _getParts(arr, thisObject, callback); arr = _p[0];
+			for(var i = 0, l = arr.length; i < l; i++){
+				var result = !!_p[2].call(_p[1], arr[i], i, arr);
+				if(every ^ result){
+					return result; // Boolean
+				}
+			}
+			return every; // Boolean
+		},
+
+		every: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		Determines whether or not every item in arr satisfies the
+			//		condition implemented by callback.
+			// arr: the array to iterate on.  If a string, operates on individual characters.
+			// callback: a function is invoked with three arguments: item, index, and array and returns true
+			//		if the condition is met.
+			// thisObject: may be used to scope the call to callback
+			// description:
+			//		This function corresponds to the JavaScript 1.6 Array.every() method.
+			//		In environments that support JavaScript 1.6, this function is a passthrough to the built-in method.
+			//		For more details, see:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every>
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some>
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:map>
+			// 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<arr.length;++i){
+				outArr.push(_p[2].call(_p[1], arr[i], i, arr));
+			}
+			return outArr; // Array
+		},
+
+		filter: function(/*Array*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		Returns a new Array with those items from arr that match the
+			//		condition implemented by callback.
+			// arr: the array to iterate 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.filter() method.
+			//		In environments that support JavaScript 1.6, this function is a passthrough to the built-in method.
+			//		For more details, see:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:filter>
+			// 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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/browser.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/browser.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/browser.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);");
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/connect.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/connect.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/connect.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; i<l; i++){	args.push(a[i]); }
+	// do the actual work
+	return dojo._connect.apply(this, args); /*Handle*/
+}
+
+// used by non-browser hostenvs. always overriden by event.js
+dojo._connect = function(obj, event, context, method){
+	var l=dojo._listener, h=l.add(obj, event, dojo.hitch(context, method)); 
+	return [obj, event, h, l]; // Handle
+}
+
+dojo.disconnect = function(/*Handle*/ handle){
+	// summary:
+	//		Remove a link created by dojo.connect.
+	// description:
+	//		Removes the connection between event and the method referenced by handle.
+	// handle:
+	//		the return value of the dojo.connect call that created the connection.
+	if(handle && handle[0] !== undefined){
+		dojo._disconnect.apply(this, handle);
+		// let's not keep this reference
+		delete handle[0];
+	}
+}
+
+dojo._disconnect = function(obj, event, handle, listener){
+	listener.remove(obj, event, handle);
+}
+
+// topic publish/subscribe
+
+dojo._topics = {};
+
+dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Function*/ method){
+	//	summary:
+	//		Attach a listener to a named topic. The listener function is invoked whenever the
+	//		named topic is published (see: dojo.publish).
+	//		Returns a handle which is needed to unsubscribe this listener.
+	//	context:
+	//		Scope in which method will be invoked, or null for default scope.
+	//	method:
+	//		The name of a function in context, or a function reference. This is the function that
+	//		is invoked when topic is published.
+	//	example:
+	//	|	dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+	//	|	dojo.publish("alerts", [ "read this", "hello world" ]);																	
+
+	// support for 2 argument invocation (omitting context) depends on hitch
+	return [topic, dojo._listener.add(dojo._topics, topic, dojo.hitch(context, method))]; /*Handle*/
+}
+
+dojo.unsubscribe = function(/*Handle*/ handle){
+	//	summary:
+	//	 	Remove a topic listener. 
+	//	handle:
+	//	 	The handle returned from a call to subscribe.
+	//	example:
+	//	|	var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+	//	|	...
+	//	|	dojo.unsubscribe(alerter);
+	if(handle){
+		dojo._listener.remove(dojo._topics, handle[0], handle[1]);
+	}
+}
+
+dojo.publish = function(/*String*/ topic, /*Array*/ args){
+	//	summary:
+	//	 	Invoke all listener method subscribed to topic.
+	//	topic:
+	//	 	The name of the topic to publish.
+	//	args:
+	//	 	An array of arguments. The arguments will be applied 
+	//	 	to each topic subscriber (as first class parameters, via apply).
+	//	example:
+	//	|	dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+	//	|	dojo.publish("alerts", [ "read this", "hello world" ]);	
+
+	// Note that args is an array, which is more efficient vs variable length
+	// argument list.  Ideally, var args would be implemented via Array
+	// throughout the APIs.
+	var f = dojo._topics[topic];
+	if(f){
+		f.apply(this, args||[]);
+	}
+}
+
+dojo.connectPublisher = function(	/*String*/ topic, 
+									/*Object|null*/ obj, 
+									/*String*/ event){
+	//	summary:
+	//	 	Ensure that everytime obj.event() is called, a message is published
+	//	 	on the topic. Returns a handle which can be passed to
+	//	 	dojo.disconnect() to disable subsequent automatic publication on
+	//	 	the topic.
+	//	topic:
+	//	 	The name of the topic to publish.
+	//	obj: 
+	//	 	The source object for the event function. Defaults to dojo.global
+	//	 	if null.
+	//	event:
+	//	 	The name of the event function in obj. 
+	//	 	I.e. identifies a property obj[event].
+	//	example:
+	//	|	dojo.connectPublisher("/ajax/start", dojo, "xhrGet"};
+	var pf = function(){ dojo.publish(topic, arguments); }
+	return (event) ? dojo.connect(obj, event, pf) : dojo.connect(obj, pf); //Handle
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/declare.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/declare.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/declare.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,178 @@
+if(!dojo._hasResource["dojo._base.declare"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo._base.declare"] = true;
+dojo.provide("dojo._base.declare");
+dojo.require("dojo._base.lang");
+
+// 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);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/event.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/event.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/event.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,529 @@
+if(!dojo._hasResource["dojo._base.event"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo._base.event"] = true;
+dojo.provide("dojo._base.event");
+dojo.require("dojo._base.connect");
+
+// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA
+
+(function(){
+	// DOM event listener machinery
+	var del = (dojo._event_listener = {
+		add: function(/*DOMNode*/node, /*String*/name, /*Function*/fp){
+			if(!node){return;} 
+			name = del._normalizeEventName(name);
+			fp = del._fixCallback(name, fp);
+			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)); };
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/fx.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/fx.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/fx.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/html.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/html.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/html.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/json.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/json.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/json.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/lang.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/lang.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/lang.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<l; i++){
+		dojo._mixin(constructor.prototype, arguments[i]);
+	}
+	return constructor; // Object
+}
+
+dojo._hitchArgs = function(scope, method /*,...*/){
+	var pre = dojo._toArray(arguments, 2);
+	var named = dojo.isString(method);
+	return function(){
+		// arrayify arguments
+		var args = dojo._toArray(arguments);
+		// locate our method
+		var f = named ? (scope||dojo.global)[method] : method;
+		// invoke with collected args
+		return f && f.apply(scope || this, pre.concat(args)); // mixed
+ 	} // Function
+}
+
+dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){
+	//	summary: 
+	//		Returns a function that will only ever execute in the a given scope. 
+	//		This allows for easy use of object member functions
+	//		in callbacks and other places in which the "this" keyword may
+	//		otherwise not reference the expected scope. 
+	//		Any number of default positional arguments may be passed as parameters 
+	//		beyond "method".
+	//		Each of these values will be used to "placehold" (similar to curry)
+	//		for the hitched function. 
+	//	scope: 
+	//		The scope to use when method executes. If method is a string, 
+	//		scope is also the object containing method.
+	//	method:
+	//		A function to be hitched to scope, or the name of the method in
+	//		scope to be hitched.
+	//	example:
+	//	|	dojo.hitch(foo, "bar")(); 
+	//		runs foo.bar() in the scope of foo
+	//	example:
+	//	|	dojo.hitch(foo, myFunction);
+	//		returns a function that runs myFunction in the scope of foo
+	if(arguments.length > 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
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/query.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/query.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/query.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<ql; x++){
+			if(lc == "\\"){ continue; }
+			if(!currentPart){
+				// NOTE: I hate all this alloc, but it's shorter than writing tons of if's
+				pStart = x;
+				currentPart = {
+					query: null,
+					pseudos: [],
+					attrs: [],
+					classes: [],
+					tag: null,
+					oper: null,
+					id: null
+				};
+				inTag = x;
+			}
+
+			if(inBrackets >= 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<ecnl, te=ecn[x]; x++){
+				if(tf(te)){
+					if(isFinal){
+						matchArr.push(te);
+					}else{
+						_filterDown(te, queryParts, matchArr, nidx);
+					}
+				}
+				/*
+				if(x==0){
+					break;
+				}
+				*/
+			}
+		}
+
+		// otherwise, keep going down, unless we'er at the end
+		var candidates = getElementsFunc(tqp)(element);
+		if(isFinal){
+			while(candidates.length){
+				matchArr.push(candidates.shift());
+			}
+			/*
+			candidates.unshift(0, matchArr.length-1);
+			matchArr.splice.apply(matchArr, candidates);
+			*/
+		}else{
+			// if we're not yet at the bottom, keep going!
+			while(candidates.length){
+				_filterDown(candidates.shift(), queryParts, matchArr, nidx);
+			}
+		}
+	}
+
+	var filterDown = function(elements, queryParts){
+		var ret = [];
+
+		// for every root, get the elements that match the descendant selector
+		// for(var x=elements.length-1, 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 <http://www.w3.org/TR/css3-selectors/#selectors>
+		//	root:
+		//		A DOMNode (or node id) to scope the search from. Optional.
+		//	returns: dojo.NodeList
+		//		An instance of `dojo.NodeList`. Many methods are available on
+		//		NodeLists for searching, iterating, manipulating, and handling
+		//		events on the matched nodes in the returned list.
+		//	example:
+		//		search the entire document for elements with the class "foo":
+		//	|	dojo.query(".foo");
+		//		these elements will match:
+		//	|	<span class="foo"></span>
+		//	|	<span class="foo bar"></span>
+		//	|	<p class="thud foo"></p>
+		//	example:
+		//		search the entire document for elements with the classes "foo" *and* "bar":
+		//	|	dojo.query(".foo.bar");
+		//		these elements will match:
+		//	|	<span class="foo bar"></span>
+		//		while these will not:
+		//	|	<span class="foo"></span>
+		//	|	<p class="thud foo"></p>
+		//	example:
+		//		find `<span>` elements which are descendants of paragraphs and
+		//		which have a "highlighted" class:
+		//	|	dojo.query("p span.highlighted");
+		//		the innermost span in this fragment matches:
+		//	|	<p class="foo">
+		//	|		<span>...
+		//	|			<span class="highlighted foo bar">...</span>
+		//	|		</span>
+		//	|	</p>
+		//	example:
+		//		set an "odd" class on all odd table rows inside of the table
+		//		`#tabular_data`, using the `>` (direct child) selector to avoid
+		//		affecting any nested tables:
+		//	|	dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd");
+		//	example:
+		//		remove all elements with the class "error" from the document
+		//		and store them in a list:
+		//	|	var errors = dojo.query(".error").orphan();
+		//	example:
+		//		add an onclick handler to every submit button in the document
+		//		which causes the form to be sent via Ajax instead:
+		//	|	dojo.query("input[type='submit']").onclick(function(e){
+		//	|		dojo.stopEvent(e); // prevent sending the form
+		//	|		var btn = e.target;
+		//	|		dojo.xhrPost({
+		//	|			form: btn.form,
+		//	|			load: function(data){
+		//	|				// replace the form with the response
+		//	|				var div = dojo.doc.createElement("div");
+		//	|				dojo.place(div, btn.form, "after");
+		//	|				div.innerHTML = data;
+		//	|				dojo.style(btn.form, "display", "none");
+		//	|			}
+		//	|		});
+		//	|	});
+
+
+		// 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;
+	}
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/window.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/window.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/window.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base/xhr.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base/xhr.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base/xhr.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:
+		//
+		//		|	<form id="test_form">
+		//		|		<input type="text" name="blah" value="blah">
+		//		|		<input type="text" name="no_value" value="blah" disabled>
+		//		|		<input type="button" name="no_value2" value="blah">
+		//		|		<select type="select" multiple name="multi" size="5">
+		//		|			<option value="blah">blah</option>
+		//		|			<option value="thud" selected>thud</option>
+		//		|			<option value="thonk" selected>thonk</option>
+		//		|		</select>
+		//		|	</form>
+		//
+		//		yields this object structure as the result of a call to
+		//		formToObject():
+		//
+		//		|	{ 
+		//		|		blah: "blah",
+		//		|		multi: [
+		//		|			"thud",
+		//		|			"thonk"
+		//		|		]
+		//		|	};
+	
+		var ret = {};
+		var 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");
+	}
+	*/
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_firebug/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_firebug/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.

Added: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/errorIcon.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/errorIcon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/_firebug/firebug.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 = ['<table>'];
+			for(var i = 0; i < pairs.length; ++i){
+				var name = pairs[i][0], value = pairs[i][1];
+				
+				html.push('<tr>', 
+				'<td class="propertyNameCell"><span class="propertyName">',
+					escapeHTML(name), '</span></td>', '<td><span class="propertyValue">');
+				appendObject(value, html);
+				html.push('</span></td></tr>');
+			}
+			html.push('</table>');
+			
+			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=	'<html style="height:100%;"><head><title>Firebug Lite</title></head>\n' +
+					'<body bgColor="#ccc" style="height:98%;" onresize="opener.onFirebugResize()">\n' +
+					'<div id="fb"></div>' +
+					'</body></html>';
+	
+		newDoc.write(HTMLstring);
+		newDoc.close();
+		return win;
+	}
+
+	function createResizeHandler(wn){
+		// summary
+		//		Creates handle for onresize window. Called from script in popup's body tag (so that it will work with IE).
+		//
+		
+		var d = new Date();
+			d.setTime(d.getTime()+(60*24*60*60*1000)); // 60 days
+			d = d.toUTCString();
+			
+			var dc = wn.document,
+				getViewport;
+				
+			if (wn.innerWidth){
+				getViewport = function(){
+					return{w:wn.innerWidth, h:wn.innerHeight};
+				}
+			}else if (dc.documentElement && dc.documentElement.clientWidth){
+				getViewport = function(){
+					return{w:dc.documentElement.clientWidth, h:dc.documentElement.clientHeight};
+				}
+			}else if (dc.body){
+				getViewport = function(){
+					return{w:dc.body.clientWidth, h:dc.body.clientHeight};
+				}
+			}
+			
+
+		window.onFirebugResize = function(){ 
+			
+			//resize the height of the console log body
+			layout(getViewport().h);
+			
+			clearInterval(wn._firebugWin_resize);
+			wn._firebugWin_resize = setTimeout(function(){
+				var x = wn.screenLeft,
+					y = wn.screenTop,
+					w = wn.outerWidth  || wn.document.body.offsetWidth,
+					h = wn.outerHeight || wn.document.body.offsetHeight;
+				
+				document.cookie = "_firebugPosition=" + [x,y,w,h].join(",") + "; expires="+d+"; path=/";
+					 
+			 }, 5000); //can't capture window.onMove - long timeout gives better chance of capturing a resize, then the move
+		
+		}
+	}
+	
+	
+	/*****************************************************************************/
+	
+	
+	function createFrame(){
+		if(consoleFrame){
+			return;
+		}
+		
+		if(dojo.config.popup){
+			var containerHeight = "100%";
+			var cookieMatch = document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
+			var p = cookieMatch ? cookieMatch[1].split(",") : [2,2,320,480];
+
+			_firebugWin = openWin(p[0],p[1],p[2],p[3]);	// global
+			_firebugDoc = _firebugWin.document;			// global
+
+			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 ? "" : '    <a href="#" onclick="console.close(); return false;">Close</a>';
+		consoleFrame.innerHTML = 
+			  '<div id="firebugToolbar">'
+			+ '  <a href="#" onclick="console.clear(); return false;">Clear</a>'
+			+ '  <span class="firebugToolbarRight">'
+			+ closeStr
+			+ '  </span>'
+			+ '</div>'
+			+ '<input type="text" id="firebugCommandLine" />'
+			+ '<div id="firebugLog"></div>'
+			+ '<div id="objectLog" style="display:none;"></div>';
+
+
+		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 = '<a id="'+id+'" href="javascript:void(0);">'+getObjectAbbr(object)+'</a>';
+				
+				appendLink( str , html);
+			}
+		}
+		
+		logRow(html, className);
+		
+		// Now that the row is inserted in the DOM, loop through all of the links that were just created
+		for(i=0; i<ids.length; i++){
+			var btn = _firebugDoc.getElementById(ids[i]);
+			if(!btn){ continue; }
+	
+			// store the object in the dom btn for reference later
+			// avoid parsing these objects unless necessary
+			btn.obj = obs[i];
+	
+			_firebugWin.console._connects.push(dojo.connect(btn, "onclick", function(){
+				// hide rows
+				consoleBody.style.display = "none";
+				consoleObjectInspector.style.display = "block";
+				// create a back button
+				var bkBtn = '<a href="javascript:console.closeObjectInspector();">&nbsp;<<&nbsp;Back</a>';
+				try{
+					printObject(this.obj);
+				}catch(e){
+					this.obj = e;
+				}
+				consoleObjectInspector.innerHTML = bkBtn + "<pre>" + printObject( this.obj ) + "</pre>";
+			}));
+		}
+	}
+
+	function parseFormat(format){
+		var parts = [];
+
+		var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;	  
+		var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat};
+
+		for(var m = reg.exec(format); m; m = reg.exec(format)){
+			var type = m[8] ? m[8] : m[5];
+			var appender = type in appenderMap ? appenderMap[type] : appendObject;
+			var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0);
+
+			parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1));
+			parts.push({appender: appender, precision: precision});
+
+			format = format.substr(m.index+m[0].length);
+		}
+
+		parts.push(format);
+
+		return parts;
+	}
+
+	function escapeHTML(value){
+		function replaceChars(ch){
+			switch(ch){
+				case "<":
+					return "&lt;";
+				case ">":
+					return "&gt;";
+				case "&":
+					return "&amp;";
+				case "'":
+					return "&#39;";
+				case '"':
+					return "&quot;";
+			}
+			return "?";
+		}
+		return String(value).replace(/[<>&"']/g, replaceChars);
+	}
+
+	function objectToString(object){
+		try{
+			return object+"";
+		}catch(e){
+			return null;
+		}
+	}
+
+	// ***************************************************************************
+	function appendLink(object, html){
+		// needed for object links - no HTML escaping
+		html.push( objectToString(object) );
+	}
+	
+	function appendText(object, html){
+		html.push(escapeHTML(objectToString(object)));
+	}
+
+	function appendNull(object, html){
+		html.push('<span class="objectBox-null">', escapeHTML(objectToString(object)), '</span>');
+	}
+
+	function appendString(object, html){
+		html.push('<span class="objectBox-string">&quot;', escapeHTML(objectToString(object)),
+			'&quot;</span>');
+	}
+
+	function appendInteger(object, html){
+		html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+	}
+
+	function appendFloat(object, html){
+		html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+	}
+
+	function appendFunction(object, html){
+		html.push('<span class="objectBox-function">', getObjectAbbr(object), '</span>');
+	}
+	
+	function appendObject(object, html){
+		try{
+			if(object === undefined){
+				appendNull("undefined", html);
+			}else if(object === null){
+				appendNull("null", html);
+			}else if(typeof object == "string"){
+				appendString(object, html);
+			}else if(typeof object == "number"){
+				appendInteger(object, html);
+			}else if(typeof object == "function"){
+				appendFunction(object, html);
+			}else if(object.nodeType == 1){
+				appendSelector(object, html);
+			}else if(typeof object == "object"){
+				appendObjectFormatted(object, html);
+			}else{
+				appendText(object, html);
+			}
+		}catch(e){
+			/* squelch */
+		}
+	}
+		
+	function appendObjectFormatted(object, html){
+		var text = objectToString(object);
+		var reObject = /\[object (.*?)\]/;
+
+		var m = reObject.exec(text);
+		html.push('<span class="objectBox-object">', m ? m[1] : text, '</span>');
+	}
+	
+	function appendSelector(object, html){
+		html.push('<span class="objectBox-selector">');
+
+		html.push('<span class="selectorTag">', escapeHTML(object.nodeName.toLowerCase()), '</span>');
+		if(object.id){
+			html.push('<span class="selectorId">#', escapeHTML(object.id), '</span>');
+		}
+		if(object.className){
+			html.push('<span class="selectorClass">.', escapeHTML(object.className), '</span>');
+		}
+
+		html.push('</span>');
+	}
+
+	function appendNode(node, html){
+		if(node.nodeType == 1){
+			html.push(
+				'<div class="objectBox-element">',
+					'&lt;<span class="nodeTag">', node.nodeName.toLowerCase(), '</span>');
+
+			for(var i = 0; i < node.attributes.length; ++i){
+				var attr = node.attributes[i];
+				if(!attr.specified){ continue; }
+				
+				html.push('&nbsp;<span class="nodeName">', attr.nodeName.toLowerCase(),
+					'</span>=&quot;<span class="nodeValue">', escapeHTML(attr.nodeValue),
+					'</span>&quot;');
+			}
+
+			if(node.firstChild){
+				html.push('&gt;</div><div class="nodeChildren">');
+
+				for(var child = node.firstChild; child; child = child.nextSibling){
+					appendNode(child, html);
+				}
+					
+				html.push('</div><div class="objectBox-element">&lt;/<span class="nodeTag">', 
+					node.nodeName.toLowerCase(), '&gt;</span></div>');
+			}else{
+				html.push('/&gt;</div>');
+			}
+		}else if (node.nodeType == 3){
+			html.push('<div class="nodeText">', escapeHTML(node.nodeValue),
+				'</div>');
+		}
+	}
+
+	// ***************************************************************************
+	
+	function addEvent(object, name, handler){
+		if(document.all){
+			object.attachEvent("on"+name, handler);
+		}else{
+			object.addEventListener(name, handler, false);
+		}
+	}
+	
+	function removeEvent(object, name, handler){
+		if(document.all){
+			object.detachEvent("on"+name, handler);
+		}else{
+			object.removeEventListener(name, handler, false);
+		}
+	}
+	
+	function cancelEvent(event){
+		if(document.all){
+			event.cancelBubble = true;
+		}else{
+			event.stopPropagation();		
+		}
+	}
+
+	function onError(msg, href, lineNo){
+		var lastSlash = href.lastIndexOf("/");
+		var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1);
+
+		var html = [
+			'<span class="errorMessage">', msg, '</span>', 
+			'<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>'
+		];
+
+		logRow(html, "error");
+	}
+
+
+	//After converting to div instead of iframe, now getting two keydowns right away in IE 6.
+	//Make sure there is a little bit of delay.
+	var onKeyDownTime = (new Date()).getTime();
+
+	function onKeyDown(event){
+		var timestamp = (new Date()).getTime();
+		if(timestamp > onKeyDownTime + 200){
+			event = dojo.fixEvent(event);
+			var keys = dojo.keys;
+			var ekc = event.keyCode;
+			onKeyDownTime = timestamp;
+			if(ekc == keys.F12){
+				toggleConsole();
+			}else if(
+				(ekc == keys.NUMPAD_ENTER || ekc == 76) &&
+				event.shiftKey && 
+				(event.metaKey || event.ctrlKey)
+			){
+				focusCommandLine();
+			}else{
+				return;
+			}
+			cancelEvent(event);
+		}
+	}
+
+
+	function 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 <pre>... otherwise we'd need a <br />
+		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);
+	}
+})();
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/infoIcon.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/infoIcon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/warningIcon.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojo/_firebug/warningIcon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojo/back.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/back.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/back.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,394 @@
+if(!dojo._hasResource["dojo.back"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.back"] = true;
+dojo.provide("dojo.back");
+
+/*=====
+dojo.back = {
+	// summary: Browser history management resources
+}
+=====*/
+
+
+(function(){ 
+	var back = dojo.back;
+
+	// everyone deals with encoding the hash slightly differently
+
+	function getHash(){ 
+		var h = window.location.hash;
+		if(h.charAt(0) == "#"){ h = h.substring(1); }
+		return dojo.isMozilla ? h : decodeURIComponent(h); 
+	}
+	
+	function setHash(h){
+		if(!h){ h = ""; }
+		window.location.hash = encodeURIComponent(h);
+		historyCounter = history.length;
+	}
+	
+	// if we're in the test for these methods, expose them on dojo.back. ok'd with alex.
+	if(dojo.exists("tests.back-hash")){
+		back.getHash = getHash;
+		back.setHash = setHash;		
+	}
+	
+	var initialHref = (typeof(window) !== "undefined") ? window.location.href : "";
+	var initialHash = (typeof(window) !== "undefined") ? getHash() : "";
+	var initialState = null;
+
+	var locationTimer = null;
+	var bookmarkAnchor = null;
+	var historyIframe = null;
+	var forwardStack = [];
+	var historyStack = [];
+	var moveForward = false;
+	var changingUrl = false;
+	var historyCounter;
+
+	function handleBackButton(){
+		//summary: private method. Do not call this directly.
+
+		//The "current" page is always at the top of the history stack.
+		//console.debug("handlingBackButton");
+		var current = historyStack.pop();
+		if(!current){ return; }
+		var last = historyStack[historyStack.length-1];
+		if(!last && historyStack.length == 0){
+			last = initialState;
+		}
+		if(last){
+			if(last.kwArgs["back"]){
+				last.kwArgs["back"]();
+			}else if(last.kwArgs["backButton"]){
+				last.kwArgs["backButton"]();
+			}else if(last.kwArgs["handle"]){
+				last.kwArgs.handle("back");
+			}
+		}
+		forwardStack.push(current);
+		//console.debug("done handling back");
+	}
+
+	back.goBack = handleBackButton;
+
+	function handleForwardButton(){
+		//summary: private method. Do not call this directly.
+		//console.debug("handling forward");
+		var last = forwardStack.pop();
+		if(!last){ return; }
+		if(last.kwArgs["forward"]){
+			last.kwArgs.forward();
+		}else if(last.kwArgs["forwardButton"]){
+			last.kwArgs.forwardButton();
+		}else if(last.kwArgs["handle"]){
+			last.kwArgs.handle("forward");
+		}
+		historyStack.push(last);
+		//console.debug("done handling forward");
+	}
+
+	back.goForward = handleForwardButton;
+
+	function createState(url, args, hash){
+		//summary: private method. Do not call this directly.
+		return {"url": url, "kwArgs": args, "urlHash": hash};	//Object
+	}
+
+	function getUrlQuery(url){
+		//summary: private method. Do not call this directly.
+		var segments = url.split("?");
+		if(segments.length < 2){
+			return null; //null
+		}
+		else{
+			return segments[1]; //String
+		}
+	}
+	
+	function loadIframeHistory(){
+		//summary: private method. Do not call this directly.
+		var url = (dojo.config["dojoIframeHistoryUrl"] || dojo.moduleUrl("dojo", "resources/iframe_history.html")) + "?" + (new Date()).getTime();
+		moveForward = true;
+        if(historyIframe){
+		    dojo.isSafari ? historyIframe.location = url : window.frames[historyIframe.name].location = url;
+        }else{
+            //console.warn("dojo.back: Not initialised. You need to call dojo.back.init() from a <script> block that lives inside the <body> tag.");
+        }
+		return url; //String
+	}
+
+	function checkLocation(){
+		//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 <script> 
+		//         block that lives inside the <body> tag to prevent bugs on IE.
+		if(dojo.byId("dj_history")){ return; } // prevent reinit
+		var src = dojo.config["dojoIframeHistoryUrl"] || dojo.moduleUrl("dojo", "resources/iframe_history.html");
+		document.write('<iframe style="border:0;width:1px;height:1px;position:absolute;visibility:hidden;bottom:0;right:0;" name="dj_history" id="dj_history" src="' + src + '"></iframe>');
+	};
+
+	back.setInitialState = function(/*Object*/args){
+		//summary: 
+		//		Sets the state object and back callback for the very first page
+		//		that is loaded.
+		//description:
+		//		It is recommended that you call this method as part of an event
+		//		listener that is registered via dojo.addOnLoad().
+		//args: Object
+		//		See the addToHistory() function for the list of valid args properties.
+		initialState = createState(initialHref, args, initialHash);
+	};
+
+	//FIXME: Make these doc comments not be awful. At least they're not wrong.
+	//FIXME: Would like to support arbitrary back/forward jumps. Have to rework iframeLoaded among other things.
+	//FIXME: is there a slight race condition in moz using change URL with the timer check and when
+	//       the hash gets set? I think I have seen a back/forward call in quick succession, but not consistent.
+
+	
+	/*=====
+	dojo.__backArgs = function(kwArgs){
+		// back: Function?
+		//		A function to be called when this state is reached via the user
+		//		clicking the back button.
+		//	forward: Function?
+		//		Upon return to this state from the "back, forward" combination
+		//		of navigation steps, this function will be called. Somewhat
+		//		analgous to the semantic of an "onRedo" event handler.
+		//	changeUrl: Boolean?|String?
+		//		Boolean indicating whether or not to create a unique hash for
+		//		this state. If a string is passed instead, it is used as the
+		//		hash.
+	}
+	=====*/
+
+	back.addToHistory = function(/*dojo.__backArgs*/ args){
+		//	summary: 
+		//		adds a state object (args) to the history list. 
+		//	description:
+		//		To support getting back button notifications, the object
+		//		argument should implement a function called either "back",
+		//		"backButton", or "handle". The string "back" will be passed as
+		//		the first and only argument to this callback.
+		//	
+		//		To support getting forward button notifications, the object
+		//		argument should implement a function called either "forward",
+		//		"forwardButton", or "handle". The string "forward" will be
+		//		passed as the first and only argument to this callback.
+		//
+		//		If you want the browser location string to change, define "changeUrl" on the object. If the
+		//		value of "changeUrl" is true, then a unique number will be appended to the URL as a fragment
+		//		identifier (http://some.domain.com/path#uniquenumber). If it is any other value that does
+		//		not evaluate to false, that value will be used as the fragment identifier. For example,
+		//		if changeUrl: 'page1', then the URL will look like: http://some.domain.com/path#page1
+		//
+	 	//	example:
+		//		|	dojo.back.addToHistory({
+		//		|		back: function(){ console.debug('back pressed'); },
+		//		|		forward: function(){ console.debug('forward pressed'); },
+		//		|		changeUrl: true
+		//		|	});
+
+		//	BROWSER NOTES:
+		//  Safari 1.2: 
+		//	back button "works" fine, however it's not possible to actually
+		//	DETECT that you've moved backwards by inspecting window.location.
+		//	Unless there is some other means of locating.
+		//	FIXME: perhaps we can poll on history.length?
+		//	Safari 2.0.3+ (and probably 1.3.2+):
+		//	works fine, except when changeUrl is used. When changeUrl is used,
+		//	Safari jumps all the way back to whatever page was shown before
+		//	the page that uses dojo.undo.browser support.
+		//	IE 5.5 SP2:
+		//	back button behavior is macro. It does not move back to the
+		//	previous hash value, but to the last full page load. This suggests
+		//	that the iframe is the correct way to capture the back button in
+		//	these cases.
+		//	Don't test this page using local disk for MSIE. MSIE will not create 
+		//	a history list for iframe_history.html if served from a file: URL. 
+		//	The XML served back from the XHR tests will also not be properly 
+		//	created if served from local disk. Serve the test pages from a web 
+		//	server to test in that browser.
+		//	IE 6.0:
+		//	same behavior as IE 5.5 SP2
+		//	Firefox 1.0+:
+		//	the back button will return us to the previous hash on the same
+		//	page, thereby not requiring an iframe hack, although we do then
+		//	need to run a timer to detect inter-page movement.
+
+		//If addToHistory is called, then that means we prune the
+		//forward stack -- the user went back, then wanted to
+		//start a new forward path.
+		forwardStack = []; 
+
+		var hash = null;
+		var url = null;
+		if(!historyIframe){
+			if(dojo.config["useXDomain"] && !dojo.config["dojoIframeHistoryUrl"]){
+				console.debug("dojo.back: When using cross-domain Dojo builds,"
+					+ " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"
+					+ " to the path on your domain to iframe_history.html");
+			}
+			historyIframe = window.frames["dj_history"];
+		}
+		if(!bookmarkAnchor){
+			bookmarkAnchor = document.createElement("a");
+			dojo.body().appendChild(bookmarkAnchor);
+			bookmarkAnchor.style.display = "none";
+		}
+		if(args["changeUrl"]){
+			hash = ""+ ((args["changeUrl"]!==true) ? args["changeUrl"] : (new Date()).getTime());
+			
+			//If the current hash matches the new one, just replace the history object with
+			//this new one. It doesn't make sense to track different state objects for the same
+			//logical URL. This matches the browser behavior of only putting in one history
+			//item no matter how many times you click on the same #hash link, at least in Firefox
+			//and Safari, and there is no reliable way in those browsers to know if a #hash link
+			//has been clicked on multiple times. So making this the standard behavior in all browsers
+			//so that dojo.back's behavior is the same in all browsers.
+			if(historyStack.length == 0 && initialState.urlHash == hash){
+				initialState = createState(url, args, hash);
+				return;
+			}else if(historyStack.length > 0 && historyStack[historyStack.length - 1].urlHash == hash){
+				historyStack[historyStack.length - 1] = createState(url, args, hash);
+				return;
+			}
+
+			changingUrl = true;
+			setTimeout(function() { 
+					setHash(hash); 
+					changingUrl = false; 					
+				}, 1);
+			bookmarkAnchor.href = hash;
+			
+			if(dojo.isIE){
+				url = loadIframeHistory();
+
+				var oldCB = args["back"]||args["backButton"]||args["handle"];
+
+				//The function takes handleName as a parameter, in case the
+				//callback we are overriding was "handle". In that case,
+				//we will need to pass the handle name to handle.
+				var tcb = function(handleName){
+					if(getHash() != ""){
+						setTimeout(function() { setHash(hash); }, 1);
+					}
+					//Use apply to set "this" to args, and to try to avoid memory leaks.
+					oldCB.apply(this, [handleName]);
+				};
+		
+				//Set interceptor function in the right place.
+				if(args["back"]){
+					args.back = tcb;
+				}else if(args["backButton"]){
+					args.backButton = tcb;
+				}else if(args["handle"]){
+					args.handle = tcb;
+				}
+		
+				var oldFW = args["forward"]||args["forwardButton"]||args["handle"];
+		
+				//The function takes handleName as a parameter, in case the
+				//callback we are overriding was "handle". In that case,
+				//we will need to pass the handle name to handle.
+				var tfw = function(handleName){
+					if(getHash() != ""){
+						setHash(hash);
+					}
+					if(oldFW){ // we might not actually have one
+						//Use apply to set "this" to args, and to try to avoid memory leaks.
+						oldFW.apply(this, [handleName]);
+					}
+				};
+
+				//Set interceptor function in the right place.
+				if(args["forward"]){
+					args.forward = tfw;
+				}else if(args["forwardButton"]){
+					args.forwardButton = tfw;
+				}else if(args["handle"]){
+					args.handle = tfw;
+				}
+
+			}else if(!dojo.isIE){
+				// start the timer
+				if(!locationTimer){
+					locationTimer = setInterval(checkLocation, 200);
+				}
+				
+			}
+		}else{
+			url = loadIframeHistory();
+		}
+
+		historyStack.push(createState(url, args, hash));
+	};
+
+	back._iframeLoaded = function(evt, ifrLoc){
+		//summary: 
+		//		private method. Do not call this directly.
+		var query = getUrlQuery(ifrLoc.href);
+		if(query == null){ 
+			// alert("iframeLoaded");
+			// we hit the end of the history, so we should go back
+			if(historyStack.length == 1){
+				handleBackButton();
+			}
+			return;
+		}
+		if(moveForward){
+			// we were expecting it, so it's not either a forward or backward movement
+			moveForward = false;
+			return;
+		}
+	
+		//Check the back stack first, since it is more likely.
+		//Note that only one step back or forward is supported.
+		if(historyStack.length >= 2 && query == getUrlQuery(historyStack[historyStack.length-2].url)){
+			handleBackButton();
+		}else if(forwardStack.length > 0 && query == getUrlQuery(forwardStack[forwardStack.length-1].url)){
+			handleForwardButton();
+		}
+	};
+ })();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/behavior.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/behavior.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/behavior.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,185 @@
+if(!dojo._hasResource["dojo.behavior"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.behavior"] = true;
+dojo.provide("dojo.behavior");
+
+dojo.behavior = new function(){
+	function arrIn(obj, name){
+		if(!obj[name]){ obj[name] = []; }
+		return obj[name];
+	}
+
+	var _inc = 0;
+
+	function forIn(obj, scope, func){
+		var tmpObj = {};
+		for(var x in obj){
+			if(typeof tmpObj[x] == "undefined"){
+				if(!func){
+					scope(obj[x], x);
+				}else{
+					func.call(scope, obj[x], x);
+				}
+			}
+		}
+	}
+
+	// FIXME: need a better test so we don't exclude nightly Safari's!
+	this._behaviors = {};
+	this.add = function(behaviorObj){
+		//	summary:
+		//		add the specified behavior to the list of behaviors which will
+		//		be applied the next time apply() is called. Calls to add() for
+		//		an already existing behavior do not replace the previous rules,
+		//		but are instead additive. New nodes which match the rule will
+		//		have all add()-ed behaviors applied to them when matched.
+		//
+		//	description:
+		//		behavior objects are specified in the following format(s):
+		//		
+		//			{ 
+		//			 	"#id": {
+		//					"found": function(element){
+		//						// ...
+		//					},
+		//			
+		//					"onblah": {targetObj: foo, targetFunc: "bar"},
+		//			
+		//					"onblarg": "/foo/bar/baz/blarg",
+		//			
+		//					"onevent": function(evt){
+		//					},
+		//			
+		//					"onotherevent: function(evt){
+		//						// ...
+		//					}
+		//				},
+		//			
+		//				"#id2": {
+		//					// ...
+		//				},
+		//			
+		//				"#id3": function(element){
+		//					// ...
+		//				},
+		//			
+		//				// publish the match on a topic
+		//				"#id4": "/found/topic/name",
+		//			
+		//				// match all direct descendants
+		//				"#id4 > *": function(element){
+		//					// ...
+		//				},
+		//			
+		//				// match the first child node that's an element
+		//				"#id4 > :first-child": { ... },
+		//			
+		//				// match the last child node that's an element
+		//				"#id4 > :last-child":  { ... },
+		//			
+		//				// all elements of type tagname
+		//				"tagname": {
+		//					// ...
+		//				},
+		//			
+		//				"tagname1 tagname2 tagname3": {
+		//					// ...
+		//				},
+		//			
+		//				".classname": {
+		//					// ...
+		//				},
+		//			
+		//				"tagname.classname": {
+		//					// ...
+		//				},
+		//			}
+		//		
+		//		The "found" method is a generalized handler that's called as soon
+		//		as the node matches the selector. Rules for values that follow also
+		//		apply to the "found" key.
+		//		
+		//		The "on*" handlers are attached with dojo.connect(). 
+		//		
+		//		If the value corresponding to the ID key is a function and not a
+		//		list, it's treated as though it was the value of "found".
+
+		var tmpObj = {};
+		forIn(behaviorObj, this, function(behavior, name){
+			var tBehavior = arrIn(this._behaviors, name);
+			if(typeof tBehavior["id"] != "number"){
+				tBehavior.id = _inc++;
+			}
+			var cversion = [];
+			tBehavior.push(cversion);
+			if((dojo.isString(behavior))||(dojo.isFunction(behavior))){
+				behavior = { found: behavior };
+			}
+			forIn(behavior, function(rule, ruleName){
+				arrIn(cversion, ruleName).push(rule);
+			});
+		});
+	}
+
+	var _applyToNode = function(node, action, ruleSetName){
+		if(dojo.isString(action)){
+			if(ruleSetName == "found"){
+				dojo.publish(action, [ node ]);
+			}else{
+				dojo.connect(node, ruleSetName, function(){
+					dojo.publish(action, arguments);
+				});
+			}
+		}else if(dojo.isFunction(action)){
+			if(ruleSetName == "found"){
+				action(node);
+			}else{
+				dojo.connect(node, ruleSetName, action);
+			}
+		}
+	}
+
+	this.apply = function(){
+		// summary:
+		//		applies all currently registered behaviors to the document,
+		//		taking care to ensure that only incremental updates are made
+		//		since the last time add() or apply() were called. If new
+		//		matching nodes have been added, all rules in a behavior will be
+		//		applied to that node. For previously matched nodes, only
+		//		behaviors which have been added since the last call to apply()
+		//		will be added to the nodes.
+		forIn(this._behaviors, function(tBehavior, id){
+			dojo.query(id).forEach( 
+				function(elem){
+					var runFrom = 0;
+					var bid = "_dj_behavior_"+tBehavior.id;
+					if(typeof elem[bid] == "number"){
+						runFrom = elem[bid];
+						// console.debug(bid, runFrom);
+						if(runFrom == (tBehavior.length)){
+							return;
+						}
+					}
+					// run through the versions, applying newer rules at each step
+
+					for(var x=runFrom, tver; tver = tBehavior[x]; x++){
+						// console.debug(tver);
+						forIn(tver, function(ruleSet, ruleSetName){
+							if(dojo.isArray(ruleSet)){
+								dojo.forEach(ruleSet, function(action){
+									_applyToNode(elem, action, ruleSetName);
+								});
+							}
+						});
+					}
+
+					// ensure that re-application only adds new rules to the node
+					elem[bid] = tBehavior.length;
+				}
+			);
+		});
+	}
+}
+
+dojo.addOnLoad(dojo.behavior, "apply");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/build.txt
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/build.txt	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/build.txt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,126 @@
+Files baked into this build:
+
+dojo.js:
+./jslib/dojoGuardStart.jsfrag
+./../../dojo/_base/_loader/bootstrap.js
+./../../dojo/_base/_loader/loader.js
+./../../dojo/_base/_loader/hostenv_browser.js
+./../../release/dojo-release-1.1.1/dojo/_base/lang.js
+./../../release/dojo-release-1.1.1/dojo/_base/declare.js
+./../../release/dojo-release-1.1.1/dojo/_base/connect.js
+./../../release/dojo-release-1.1.1/dojo/_base/Deferred.js
+./../../release/dojo-release-1.1.1/dojo/_base/json.js
+./../../release/dojo-release-1.1.1/dojo/_base/array.js
+./../../release/dojo-release-1.1.1/dojo/_base/Color.js
+./../../release/dojo-release-1.1.1/dojo/_base.js
+./../../release/dojo-release-1.1.1/dojo/_base/window.js
+./../../release/dojo-release-1.1.1/dojo/_base/event.js
+./../../release/dojo-release-1.1.1/dojo/_base/html.js
+./../../release/dojo-release-1.1.1/dojo/_base/NodeList.js
+./../../release/dojo-release-1.1.1/dojo/_base/query.js
+./../../release/dojo-release-1.1.1/dojo/_base/xhr.js
+./../../release/dojo-release-1.1.1/dojo/_base/fx.js
+./../../release/dojo-release-1.1.1/dojo/_base/browser.js
+./jslib/dojoGuardEnd.jsfrag
+
+../dijit/dijit.js:
+./../../release/dojo-release-1.1.1/dijit/_base/focus.js
+./../../release/dojo-release-1.1.1/dijit/_base/manager.js
+./../../release/dojo-release-1.1.1/dijit/_base/place.js
+./../../release/dojo-release-1.1.1/dijit/_base/window.js
+./../../release/dojo-release-1.1.1/dijit/_base/popup.js
+./../../release/dojo-release-1.1.1/dijit/_base/scroll.js
+./../../release/dojo-release-1.1.1/dijit/_base/sniff.js
+./../../release/dojo-release-1.1.1/dijit/_base/bidi.js
+./../../release/dojo-release-1.1.1/dijit/_base/typematic.js
+./../../release/dojo-release-1.1.1/dijit/_base/wai.js
+./../../release/dojo-release-1.1.1/dijit/_base.js
+./../../release/dojo-release-1.1.1/dojo/date/stamp.js
+./../../release/dojo-release-1.1.1/dojo/parser.js
+./../../release/dojo-release-1.1.1/dijit/_Widget.js
+./../../release/dojo-release-1.1.1/dojo/string.js
+./../../release/dojo-release-1.1.1/dijit/_Templated.js
+./../../release/dojo-release-1.1.1/dijit/_Container.js
+./../../release/dojo-release-1.1.1/dijit/layout/_LayoutWidget.js
+./../../release/dojo-release-1.1.1/dijit/form/_FormWidget.js
+./../../release/dojo-release-1.1.1/dijit/dijit.js
+
+../dijit/dijit-all.js:
+./../../release/dojo-release-1.1.1/dojo/colors.js
+./../../release/dojo-release-1.1.1/dojo/i18n.js
+./../../release/dojo-release-1.1.1/dijit/ColorPalette.js
+./../../release/dojo-release-1.1.1/dijit/Declaration.js
+./../../release/dojo-release-1.1.1/dojo/dnd/common.js
+./../../release/dojo-release-1.1.1/dojo/dnd/autoscroll.js
+./../../release/dojo-release-1.1.1/dojo/dnd/Mover.js
+./../../release/dojo-release-1.1.1/dojo/dnd/Moveable.js
+./../../release/dojo-release-1.1.1/dojo/dnd/TimedMoveable.js
+./../../release/dojo-release-1.1.1/dojo/fx.js
+./../../release/dojo-release-1.1.1/dijit/layout/ContentPane.js
+./../../release/dojo-release-1.1.1/dijit/form/Form.js
+./../../release/dojo-release-1.1.1/dijit/Dialog.js
+./../../release/dojo-release-1.1.1/dijit/_editor/selection.js
+./../../release/dojo-release-1.1.1/dijit/_editor/html.js
+./../../release/dojo-release-1.1.1/dijit/_editor/RichText.js
+./../../release/dojo-release-1.1.1/dijit/Toolbar.js
+./../../release/dojo-release-1.1.1/dijit/form/Button.js
+./../../release/dojo-release-1.1.1/dijit/_editor/_Plugin.js
+./../../release/dojo-release-1.1.1/dijit/Editor.js
+./../../release/dojo-release-1.1.1/dijit/Menu.js
+./../../release/dojo-release-1.1.1/dojo/regexp.js
+./../../release/dojo-release-1.1.1/dojo/number.js
+./../../release/dojo-release-1.1.1/dijit/ProgressBar.js
+./../../release/dojo-release-1.1.1/dijit/TitlePane.js
+./../../release/dojo-release-1.1.1/dijit/Tooltip.js
+./../../release/dojo-release-1.1.1/dojo/cookie.js
+./../../release/dojo-release-1.1.1/dijit/Tree.js
+./../../release/dojo-release-1.1.1/dijit/form/TextBox.js
+./../../release/dojo-release-1.1.1/dijit/InlineEditBox.js
+./../../release/dojo-release-1.1.1/dijit/form/CheckBox.js
+./../../release/dojo-release-1.1.1/dijit/form/ValidationTextBox.js
+./../../release/dojo-release-1.1.1/dijit/form/ComboBox.js
+./../../release/dojo-release-1.1.1/dojo/cldr/monetary.js
+./../../release/dojo-release-1.1.1/dojo/currency.js
+./../../release/dojo-release-1.1.1/dijit/form/NumberTextBox.js
+./../../release/dojo-release-1.1.1/dijit/form/CurrencyTextBox.js
+./../../release/dojo-release-1.1.1/dojo/cldr/supplemental.js
+./../../release/dojo-release-1.1.1/dojo/date.js
+./../../release/dojo-release-1.1.1/dojo/date/locale.js
+./../../release/dojo-release-1.1.1/dijit/_Calendar.js
+./../../release/dojo-release-1.1.1/dijit/form/_DateTimeTextBox.js
+./../../release/dojo-release-1.1.1/dijit/form/DateTextBox.js
+./../../release/dojo-release-1.1.1/dijit/form/FilteringSelect.js
+./../../release/dojo-release-1.1.1/dijit/form/_Spinner.js
+./../../release/dojo-release-1.1.1/dijit/form/NumberSpinner.js
+./../../release/dojo-release-1.1.1/dojo/dnd/move.js
+./../../release/dojo-release-1.1.1/dijit/form/Slider.js
+./../../release/dojo-release-1.1.1/dijit/form/Textarea.js
+./../../release/dojo-release-1.1.1/dijit/layout/StackContainer.js
+./../../release/dojo-release-1.1.1/dijit/layout/AccordionContainer.js
+./../../release/dojo-release-1.1.1/dijit/layout/BorderContainer.js
+./../../release/dojo-release-1.1.1/dijit/layout/LayoutContainer.js
+./../../release/dojo-release-1.1.1/dijit/layout/LinkPane.js
+./../../release/dojo-release-1.1.1/dijit/layout/SplitContainer.js
+./../../release/dojo-release-1.1.1/dijit/layout/TabContainer.js
+./../../release/dojo-release-1.1.1/dijit/dijit-all.js
+
+../dojox/off/offline.js:
+./../../release/dojo-release-1.1.1/dojox/storage/Provider.js
+./../../release/dojo-release-1.1.1/dojox/storage/manager.js
+./../../release/dojo-release-1.1.1/dojox/_sql/_crypto.js
+./../../release/dojo-release-1.1.1/dojox/_sql/common.js
+./../../release/dojo-release-1.1.1/dojox/sql.js
+./../../release/dojo-release-1.1.1/dojox/storage/GearsStorageProvider.js
+./../../release/dojo-release-1.1.1/dojox/storage/WhatWGStorageProvider.js
+./../../release/dojo-release-1.1.1/dijit/_base/place.js
+./../../release/dojo-release-1.1.1/dojox/flash/_base.js
+./../../release/dojo-release-1.1.1/dojox/flash.js
+./../../release/dojo-release-1.1.1/dojox/storage/FlashStorageProvider.js
+./../../release/dojo-release-1.1.1/dojox/storage/_common.js
+./../../release/dojo-release-1.1.1/dojox/storage.js
+./../../release/dojo-release-1.1.1/dojox/off/files.js
+./../../release/dojo-release-1.1.1/dojox/off/sync.js
+./../../release/dojo-release-1.1.1/dojox/off/_common.js
+./../../release/dojo-release-1.1.1/dojox/off.js
+./../../release/dojo-release-1.1.1/dojox/off/ui.js
+./../../release/dojo-release-1.1.1/dojox/off/offline.js

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,29 @@
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+Unicode Data Files include all data files under the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, 
+and http://www.unicode.org/cldr/data/ . Unicode Software includes any source code published in the Unicode Standard or under
+the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/.
+NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR 
+OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU
+UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS
+AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+Copyright \xA9 1991-2007 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated
+documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data 
+Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell 
+copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided
+that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the
+above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File 
+or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified.
+THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
+INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, 
+OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF 
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other 
+dealings in these Data Files or Software without prior written authorization of the copyright holder.
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,18 @@
+All files within this directory were derived from the Common Locale
+Data Repository (see http://unicode.org/cldr)  The CLDR project is
+responsible for the accuracy and maintenance of this data.  A copy
+of this data is checked into the Dojo util project as a zip file.
+The XML data is transformed to the JSON-style Javascript you see
+under the nls/ directory.  These Javascript files include data
+necessary to do things like format and parse dates, numbers, and
+currencies in different locales to consider cultural differences.
+They are used by other modules in core Dojo such as dojo.date,
+dojo.number and dojo.currency.  It usually is not necessary to use
+dojo.cldr directly.
+
+An arbitrary subset of locales have been checked in to dojo/cldr
+under svn.  To support other locales, the full set may be generated
+by using xslt scripts in the util/buildscripts/cldr/ ant script.
+Hundreds of locales are supported by the CLDR project.
+
+See terms of use: http://www.unicode.org/copyright.html#Exhibit1

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/monetary.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/monetary.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/monetary.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,27 @@
+if(!dojo._hasResource["dojo.cldr.monetary"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cldr.monetary"] = true;
+dojo.provide("dojo.cldr.monetary");
+
+dojo.cldr.monetary.getData = function(/*String*/code){
+// summary: A mapping of currency code to currency-specific formatting information. Returns a unique object with properties: places, round.
+// code: an [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code
+
+// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/currencyData/fractions
+
+	var placesData = {
+		ADP:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,DJF:0,ESP:0,GNF:0,
+		IQD:3,ITL:0,JOD:3,JPY:0,KMF:0,KRW:0,KWD:3,LUF:0,LYD:3,
+		MGA:0,MGF:0,OMR:3,PYG:0,RWF:0,TND:3,TRL:0,VUV:0,XAF:0,
+		XOF:0,XPF:0
+	};
+
+	var roundingData = {CHF:5};
+
+	var places = placesData[code], round = roundingData[code];
+	if(typeof places == "undefined"){ places = 2; }
+	if(typeof round == "undefined"){ round = 0; }
+
+	return {places: places, round: round}; // Object
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0 %","currencyFormat":"#,##0.00 ¤","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de-de/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de-de/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/de-de/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"currencyFormat":"#,##0.00 ¤","decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0 %","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"AUD_symbol":"$","USD_symbol":"US$","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":"£","EUR_displayName":"Euro","EUR_symbol":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"dateFormat-short":"d/MM/yy","dateFormat-medium":"dd/MM/yyyy","dateFormat-long":"d MMMM yyyy","dateFormat-full":"EEEE, d MMMM yyyy","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"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","field-dayperiod":"AM/PM","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"],"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-au/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"currencyFormat":"¤#,##0.00","group":",","decimal":".","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"CAD_symbol":"$","USD_symbol":"US$","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","USD_displayName":"US Dollar","CNY_symbol":"Y","GBP_displayName":"British Pound Sterling","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Euro","EUR_symbol":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-ca/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"dateFormat-medium":"yyyy-MM-dd","dateFormat-short":"yy-MM-dd","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"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","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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-gb/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"currencyFormat":"¤#,##0.00","group":",","decimal":".","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/en-us/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"currencyFormat":"¤ #,##0.00","group":".","decimal":",","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/es-es/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"currencyFormat":"#,##0.00 ¤","group":".","decimal":",","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/fr/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"decimalFormat":"#,##0.###","group":" ","scientificFormat":"#E0","percentFormat":"#,##0 %","currencyFormat":"#,##0.00 ¤","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it-it/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it-it/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/it-it/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja-jp/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja-jp/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ja-jp/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/ko-kr/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt-br/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt-br/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/pt-br/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"€"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"currencyFormat":"¤#,##0.00","group":",","decimal":".","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-cn/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"currencyFormat":"¤#,##0.00","group":",","decimal":".","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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¥"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/gregorian.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/gregorian.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/gregorian.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"]})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/nls/zh-tw/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/cldr/supplemental.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cldr/supplemental.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cldr/supplemental.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,74 @@
+if(!dojo._hasResource["dojo.cldr.supplemental"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cldr.supplemental"] = true;
+dojo.provide("dojo.cldr.supplemental");
+
+dojo.require("dojo.i18n");
+
+dojo.cldr.supplemental.getFirstDayOfWeek = function(/*String?*/locale){
+// summary: Returns a zero-based index for first day of the week
+// description:
+//		Returns a zero-based index for first day of the week, as used by the local (Gregorian) calendar.
+//		e.g. Sunday (returns 0), or Monday (returns 1)
+
+	// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/firstDay
+	var firstDay = {/*default is 1=Monday*/
+		mv:5,
+		ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,lb:6,ly:6,ma:6,om:6,qa:6,sa:6,
+		sd:6,so:6,tn:6,ye:6,
+		as:0,au:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,ie:0,il:0,is:0,jm:0,jp:0,kg:0,kr:0,la:0,
+		mh:0,mo:0,mp:0,mt:0,nz:0,ph:0,pk:0,sg:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,vi:0,za:0,zw:0,
+		et:0,mw:0,ng:0,tj:0,
+// variant. do not use?		gb:0,
+		sy:4
+	};
+
+	var country = dojo.cldr.supplemental._region(locale);
+	var dow = firstDay[country];
+	return (dow === undefined) ? 1 : dow; /*Number*/
+};
+
+dojo.cldr.supplemental._region = function(/*String?*/locale){
+	locale = dojo.i18n.normalizeLocale(locale);
+	var tags = locale.split('-');
+	var region = tags[1];
+	if(!region){
+		// IE often gives language only (#2269)
+		// Arbitrary mappings of language-only locales to a country:
+        region = {de:"de", en:"us", es:"es", fi:"fi", fr:"fr", hu:"hu", it:"it",
+        ja:"jp", ko:"kr", nl:"nl", pt:"br", sv:"se", zh:"cn"}[tags[0]];
+	}else if(region.length == 4){
+		// The ISO 3166 country code is usually in the second position, unless a
+		// 4-letter script is given. See http://www.ietf.org/rfc/rfc4646.txt
+		region = tags[2];
+	}
+	return region;
+}
+
+dojo.cldr.supplemental.getWeekend = function(/*String?*/locale){
+// summary: Returns a hash containing the start and end days of the weekend
+// description:
+//		Returns a hash containing the start and end days of the weekend according to local custom using locale,
+//		or by default in the user's locale.
+//		e.g. {start:6, end:0}
+
+	// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/weekend{Start,End}
+	var weekendStart = {/*default is 6=Saturday*/
+		eg:5,il:5,sy:5,
+		'in':0,
+		ae:4,bh:4,dz:4,iq:4,jo:4,kw:4,lb:4,ly:4,ma:4,om:4,qa:4,sa:4,sd:4,tn:4,ye:4		
+	};
+
+	var weekendEnd = {/*default is 0=Sunday*/
+		ae:5,bh:5,dz:5,iq:5,jo:5,kw:5,lb:5,ly:5,ma:5,om:5,qa:5,sa:5,sd:5,tn:5,ye:5,af:5,ir:5,
+		eg:6,il:6,sy:6
+	};
+
+	var country = dojo.cldr.supplemental._region(locale);
+	var start = weekendStart[country];
+	var end = weekendEnd[country];
+	if(start === undefined){start=6;}
+	if(end === undefined){end=0;}
+	return {start:start, end:end}; /*Object {start,end}*/
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,225 @@
+if(!dojo._hasResource["dojo.colors"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.colors"] = true;
+dojo.provide("dojo.colors");
+
+//TODO: this module appears to break naming conventions
+
+/*=====
+dojo.colors = {
+	// summary: Color utilities
+}
+=====*/
+
+(function(){
+	// this is a standard conversion prescribed by the CSS3 Color Module
+	var hue2rgb = function(m1, m2, h){
+		if(h < 0){ ++h; }
+		if(h > 1){ --h; }
+		var h6 = 6 * h;
+		if(h6 < 1){ return m1 + (m2 - m1) * h6; }
+		if(2 * h < 1){ return m2; }
+		if(3 * h < 2){ return m1 + (m2 - m1) * (2 / 3 - h) * 6; }
+		return m1;
+	};
+	
+	dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
+		// summary:
+		//		get rgb(a) array from css-style color declarations
+		// description:
+		//		this function can handle all 4 CSS3 Color Module formats: rgb,
+		//		rgba, hsl, hsla, including rgb(a) with percentage values.
+		var m = color.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);
+		if(m){
+			var c = m[2].split(/\s*,\s*/), l = c.length, t = m[1];
+			if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){
+				var r = c[0];
+				if(r.charAt(r.length - 1) == "%"){
+					// 3 rgb percentage values
+					var a = dojo.map(c, function(x){
+						return parseFloat(x) * 2.56;
+					});
+					if(l == 4){ a[3] = c[3]; }
+					return dojo.colorFromArray(a, obj);	// dojo.Color
+				}
+				return dojo.colorFromArray(c, obj);	// dojo.Color
+			}
+			if((t == "hsl" && l == 3) || (t == "hsla" && l == 4)){
+				// normalize hsl values
+				var H = ((parseFloat(c[0]) % 360) + 360) % 360 / 360,
+					S = parseFloat(c[1]) / 100,
+					L = parseFloat(c[2]) / 100,
+					// calculate rgb according to the algorithm 
+					// recommended by the CSS3 Color Module 
+					m2 = L <= 0.5 ? L * (S + 1) : L + S - L * S, 
+					m1 = 2 * L - m2,
+					a = [hue2rgb(m1, m2, H + 1 / 3) * 256,
+						hue2rgb(m1, m2, H) * 256, hue2rgb(m1, m2, H - 1 / 3) * 256, 1];
+				if(l == 4){ a[3] = c[3]; }
+				return dojo.colorFromArray(a, obj);	// dojo.Color
+			}
+		}
+		return null;	// dojo.Color
+	};
+	
+	var confine = function(c, low, high){
+		// summary:
+		//		sanitize a color component by making sure it is a number,
+		//		and clamping it to valid values
+		c = Number(c);
+		return isNaN(c) ? high : c < low ? low : c > high ? high : c;	// Number
+	};
+	
+	dojo.Color.prototype.sanitize = function(){
+		// summary: makes sure that the object has correct attributes
+		var t = this;
+		t.r = Math.round(confine(t.r, 0, 255));
+		t.g = Math.round(confine(t.g, 0, 255));
+		t.b = Math.round(confine(t.b, 0, 255));
+		t.a = confine(t.a, 0, 1);
+		return this;	// dojo.Color
+	};
+})();
+
+
+dojo.colors.makeGrey = function(/*Number*/ g, /*Number?*/ a){
+	// summary: creates a greyscale color with an optional alpha
+	return dojo.colorFromArray([g, g, g, a]);
+};
+
+// mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings
+dojo.Color.named = dojo.mixin({
+	aliceblue:	[240,248,255],
+	antiquewhite:	[250,235,215],
+	aquamarine:	[127,255,212],
+	azure:	[240,255,255],
+	beige:	[245,245,220],
+	bisque:	[255,228,196],
+	blanchedalmond:	[255,235,205],
+	blueviolet:	[138,43,226],
+	brown:	[165,42,42],
+	burlywood:	[222,184,135],
+	cadetblue:	[95,158,160],
+	chartreuse:	[127,255,0],
+	chocolate:	[210,105,30],
+	coral:	[255,127,80],
+	cornflowerblue:	[100,149,237],
+	cornsilk:	[255,248,220],
+	crimson:	[220,20,60],
+	cyan:	[0,255,255],
+	darkblue:	[0,0,139],
+	darkcyan:	[0,139,139],
+	darkgoldenrod:	[184,134,11],
+	darkgray:	[169,169,169],
+	darkgreen:	[0,100,0],
+	darkgrey:	[169,169,169],
+	darkkhaki:	[189,183,107],
+	darkmagenta:	[139,0,139],
+	darkolivegreen:	[85,107,47],
+	darkorange:	[255,140,0],
+	darkorchid:	[153,50,204],
+	darkred:	[139,0,0],
+	darksalmon:	[233,150,122],
+	darkseagreen:	[143,188,143],
+	darkslateblue:	[72,61,139],
+	darkslategray:	[47,79,79],
+	darkslategrey:	[47,79,79],
+	darkturquoise:	[0,206,209],
+	darkviolet:	[148,0,211],
+	deeppink:	[255,20,147],
+	deepskyblue:	[0,191,255],
+	dimgray:	[105,105,105],
+	dimgrey:	[105,105,105],
+	dodgerblue:	[30,144,255],
+	firebrick:	[178,34,34],
+	floralwhite:	[255,250,240],
+	forestgreen:	[34,139,34],
+	gainsboro:	[220,220,220],
+	ghostwhite:	[248,248,255],
+	gold:	[255,215,0],
+	goldenrod:	[218,165,32],
+	greenyellow:	[173,255,47],
+	grey:	[128,128,128],
+	honeydew:	[240,255,240],
+	hotpink:	[255,105,180],
+	indianred:	[205,92,92],
+	indigo:	[75,0,130],
+	ivory:	[255,255,240],
+	khaki:	[240,230,140],
+	lavender:	[230,230,250],
+	lavenderblush:	[255,240,245],
+	lawngreen:	[124,252,0],
+	lemonchiffon:	[255,250,205],
+	lightblue:	[173,216,230],
+	lightcoral:	[240,128,128],
+	lightcyan:	[224,255,255],
+	lightgoldenrodyellow:	[250,250,210],
+	lightgray:	[211,211,211],
+	lightgreen:	[144,238,144],
+	lightgrey:	[211,211,211],
+	lightpink:	[255,182,193],
+	lightsalmon:	[255,160,122],
+	lightseagreen:	[32,178,170],
+	lightskyblue:	[135,206,250],
+	lightslategray:	[119,136,153],
+	lightslategrey:	[119,136,153],
+	lightsteelblue:	[176,196,222],
+	lightyellow:	[255,255,224],
+	limegreen:	[50,205,50],
+	linen:	[250,240,230],
+	magenta:	[255,0,255],
+	mediumaquamarine:	[102,205,170],
+	mediumblue:	[0,0,205],
+	mediumorchid:	[186,85,211],
+	mediumpurple:	[147,112,219],
+	mediumseagreen:	[60,179,113],
+	mediumslateblue:	[123,104,238],
+	mediumspringgreen:	[0,250,154],
+	mediumturquoise:	[72,209,204],
+	mediumvioletred:	[199,21,133],
+	midnightblue:	[25,25,112],
+	mintcream:	[245,255,250],
+	mistyrose:	[255,228,225],
+	moccasin:	[255,228,181],
+	navajowhite:	[255,222,173],
+	oldlace:	[253,245,230],
+	olivedrab:	[107,142,35],
+	orange:	[255,165,0],
+	orangered:	[255,69,0],
+	orchid:	[218,112,214],
+	palegoldenrod:	[238,232,170],
+	palegreen:	[152,251,152],
+	paleturquoise:	[175,238,238],
+	palevioletred:	[219,112,147],
+	papayawhip:	[255,239,213],
+	peachpuff:	[255,218,185],
+	peru:	[205,133,63],
+	pink:	[255,192,203],
+	plum:	[221,160,221],
+	powderblue:	[176,224,230],
+	rosybrown:	[188,143,143],
+	royalblue:	[65,105,225],
+	saddlebrown:	[139,69,19],
+	salmon:	[250,128,114],
+	sandybrown:	[244,164,96],
+	seagreen:	[46,139,87],
+	seashell:	[255,245,238],
+	sienna:	[160,82,45],
+	skyblue:	[135,206,235],
+	slateblue:	[106,90,205],
+	slategray:	[112,128,144],
+	slategrey:	[112,128,144],
+	snow:	[255,250,250],
+	springgreen:	[0,255,127],
+	steelblue:	[70,130,180],
+	tan:	[210,180,140],
+	thistle:	[216,191,216],
+	tomato:	[255,99,71],
+	transparent: [0, 0, 0, 0],
+	turquoise:	[64,224,208],
+	violet:	[238,130,238],
+	wheat:	[245,222,179],
+	whitesmoke:	[245,245,245],
+	yellowgreen:	[154,205,50]
+}, dojo.Color.named);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/cookie.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/cookie.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/cookie.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,95 @@
+if(!dojo._hasResource["dojo.cookie"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cookie"] = true;
+dojo.provide("dojo.cookie");
+
+dojo.require("dojo.regexp");
+
+/*=====
+dojo.__cookieProps = function(){
+	//	expires: Date|String|Number?
+	//		If a number, the number of days from today at which the cookie
+	//		will expire. If a date, the date past which the cookie will expire.
+	//		If expires is in the past, the cookie will be deleted.
+	//		If expires is omitted or is 0, the cookie will expire when the browser closes. << FIXME: 0 seems to disappear right away? FF3.
+	//	path: String?
+	//		The path to use for the cookie.
+	//	domain: String?
+	//		The domain to use for the cookie.
+	//	secure: Boolean?
+	//		Whether to only send the cookie on secure connections
+	this.expires = expires;
+	this.path = path;
+	this.domain = domain;
+	this.secure = secure;
+}
+=====*/
+
+
+dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){
+	//	summary: 
+	//		Get or set a cookie.
+	//	description:
+	// 		If one argument is passed, returns the value of the cookie
+	// 		For two or more arguments, acts as a setter.
+	//	name:
+	//		Name of the cookie
+	//	value:
+	//		Value for the cookie
+	//	props: 
+	//		Properties for the cookie
+	//	example:
+	//		set a cookie with the JSON-serialized contents of an object which
+	//		will expire 5 days from now:
+	//	|	dojo.cookie("configObj", dojo.toJson(config), { expires: 5 });
+	//	
+	//	example:
+	//		de-serialize a cookie back into a JavaScript object:
+	//	|	var config = dojo.fromJson(dojo.cookie("configObj"));
+	//	
+	//	example:
+	//		delete a cookie:
+	//	|	dojo.cookie("configObj", null, {expires: -1});
+	var c = document.cookie;
+	if(arguments.length == 1){
+		var matches = c.match(new RegExp("(?:^|; )" + dojo.regexp.escapeString(name) + "=([^;]*)"));
+		return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined
+	}else{
+		props = props || {};
+// FIXME: expires=0 seems to disappear right away, not on close? (FF3)  Change docs?
+		var exp = props.expires;
+		if(typeof exp == "number"){ 
+			var d = new Date();
+			d.setTime(d.getTime() + exp*24*60*60*1000);
+			exp = props.expires = d;
+		}
+		if(exp && exp.toUTCString){ props.expires = exp.toUTCString(); }
+
+		value = encodeURIComponent(value);
+		var updatedCookie = name + "=" + value;
+		for(propName in props){
+			updatedCookie += "; " + propName;
+			var propValue = props[propName];
+			if(propValue !== true){ updatedCookie += "=" + propValue; }
+		}
+		document.cookie = updatedCookie;
+	}
+};
+
+dojo.cookie.isSupported = function(){
+	//	summary:
+	//		Use to determine if the current browser supports cookies or not.
+	//		
+	//		Returns true if user allows cookies.
+	//		Returns false if user doesn't allow cookies.
+
+	if(!("cookieEnabled" in navigator)){
+		this("__djCookieTest__", "CookiesAllowed");
+		navigator.cookieEnabled = this("__djCookieTest__") == "CookiesAllowed";
+		if(navigator.cookieEnabled){
+			this("__djCookieTest__", "", {expires: -1});
+		}
+	}
+	return navigator.cookieEnabled;
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/currency.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/currency.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/currency.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,97 @@
+if(!dojo._hasResource["dojo.currency"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.currency"] = true;
+dojo.provide("dojo.currency");
+
+dojo.require("dojo.number");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojo.cldr", "currency", null, "zh,en-ca,pt,en-us,de,ja,en,en-au,ROOT,fr,es,ko,zh-tw,it");
+dojo.require("dojo.cldr.monetary");
+
+/*=====
+dojo.currency = {
+	// summary: localized formatting and parsing routines for currencies
+}
+=====*/
+
+dojo.currency._mixInDefaults = function(options){
+	options = options || {};
+	options.type = "currency";
+
+	// Get locale-depenent currency data, like the symbol
+	var bundle = dojo.i18n.getLocalization("dojo.cldr", "currency", options.locale) || {};
+
+	// Mixin locale-independent currency data, like # of places
+	var iso = options.currency;
+	var data = dojo.cldr.monetary.getData(iso);
+
+	dojo.forEach(["displayName","symbol","group","decimal"], function(prop){
+		data[prop] = bundle[iso+"_"+prop];
+	});
+
+	data.fractional = [true, false];
+
+	// Mixin with provided options
+	return dojo.mixin(data, options);
+}
+
+dojo.currency.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
+// summary:
+//		Format a Number as a currency, using locale-specific settings
+//
+// description:
+//		Create a string from a Number using a known, localized pattern.
+//		[Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Elements) appropriate to the locale are chosen from the [CLDR](http://unicode.org/cldr)
+//		as well as the appropriate symbols and delimiters.
+//
+// value:
+//		the number to be formatted.
+
+	return dojo.number.format(value, dojo.currency._mixInDefaults(options));
+}
+
+dojo.currency.regexp = function(/*dojo.number.__RegexpOptions?*/options){
+//
+// summary:
+//		Builds the regular needed to parse a currency value
+//
+// description:
+//		Returns regular expression with positive and negative match, group and decimal separators
+//		Note: the options.places default, the number of decimal places to accept, is defined by the currency type.
+	return dojo.number.regexp(dojo.currency._mixInDefaults(options)); // String
+}
+
+/*=====
+dojo.declare("dojo.currency.__ParseOptions", [dojo.number.__ParseOptions], {
+	//	type: String?
+	//		currency, set by default.
+	//	symbol: String?
+	//		override currency symbol. Normally, will be looked up in table of supported currencies,
+	//		and ISO currency code will be used if not found.  See dojo.i18n.cldr.nls->currency.js
+	//	places: Number?
+	//		number of decimal places to accept.  Default is defined by currency.
+	//	fractional: Boolean?|Array?
+	//		where places are implied by pattern or explicit 'places' parameter, whether to include the fractional portion.
+	//		By default for currencies, it the fractional portion is optional.
+	type: "",
+	symbol: "",
+	places: "",
+	fractional: ""
+});
+=====*/
+
+dojo.currency.parse = function(/*String*/expression, /*dojo.currency.__ParseOptions?*/options){
+	//
+	// summary:
+	//		Convert a properly formatted currency string to a primitive Number,
+	//		using locale-specific settings.
+	//
+	// description:
+	//		Create a Number from a string using a known, localized pattern.
+	//		[Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) are chosen appropriate to the locale.
+	//
+	// expression: A string representation of a Number
+
+	return dojo.number.parse(expression, dojo.currency._mixInDefaults(options));
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/ItemFileReadStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/ItemFileReadStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/ItemFileReadStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,765 @@
+if(!dojo._hasResource["dojo.data.ItemFileReadStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.ItemFileReadStore"] = true;
+dojo.provide("dojo.data.ItemFileReadStore");
+
+dojo.require("dojo.data.util.filter");
+dojo.require("dojo.data.util.simpleFetch");
+dojo.require("dojo.date.stamp");
+
+dojo.declare("dojo.data.ItemFileReadStore", null,{
+	//	summary:
+	//		The ItemFileReadStore implements the dojo.data.api.Read API and reads
+	//		data from JSON files that have contents in this format --
+	//		{ items: [
+	//			{ name:'Kermit', color:'green', age:12, friends:['Gonzo', {_reference:{name:'Fozzie Bear'}}]},
+	//			{ name:'Fozzie Bear', wears:['hat', 'tie']},
+	//			{ name:'Miss Piggy', pets:'Foo-Foo'}
+	//		]}
+	//		Note that it can also contain an 'identifer' property that specified which attribute on the items 
+	//		in the array of items that acts as the unique identifier for that item.
+	//
+	constructor: function(/* Object */ keywordParameters){
+		//	summary: constructor
+		//	keywordParameters: {url: String}
+		//	keywordParameters: {data: jsonObject}
+		//	keywordParameters: {typeMap: object)
+		//		The structure of the typeMap object is as follows:
+		//		{
+		//			type0: function || object,
+		//			type1: function || object,
+		//			...
+		//			typeN: function || object
+		//		}
+		//		Where if it is a function, it is assumed to be an object constructor that takes the 
+		//		value of _value as the initialization parameters.  If it is an object, then it is assumed
+		//		to be an object of general form:
+		//		{
+		//			type: function, //constructor.
+		//			deserialize:	function(value) //The function that parses the value and constructs the object defined by type appropriately.
+		//		}
+	
+		this._arrayOfAllItems = [];
+		this._arrayOfTopLevelItems = [];
+		this._loadFinished = false;
+		this._jsonFileUrl = keywordParameters.url;
+		this._jsonData = keywordParameters.data;
+		this._datatypeMap = keywordParameters.typeMap || {};
+		if(!this._datatypeMap['Date']){
+			//If no default mapping for dates, then set this as default.
+			//We use the dojo.date.stamp here because the ISO format is the 'dojo way'
+			//of generically representing dates.
+			this._datatypeMap['Date'] = {
+											type: Date,
+											deserialize: function(value){
+												return dojo.date.stamp.fromISOString(value);
+											}
+										};
+		}
+		this._features = {'dojo.data.api.Read':true, 'dojo.data.api.Identity':true};
+		this._itemsByIdentity = null;
+		this._storeRefPropName = "_S";  // Default name for the store reference to attach to every item.
+		this._itemNumPropName = "_0"; // Default Item Id for isItem to attach to every item.
+		this._rootItemPropName = "_RI"; // Default Item Id for isItem to attach to every item.
+		this._reverseRefMap = "_RRM"; // Default attribute for constructing a reverse reference map for use with reference integrity
+		this._loadInProgress = false;	//Got to track the initial load to prevent duelling loads of the dataset.
+		this._queuedFetches = [];
+	},
+	
+	url: "",	// use "" rather than undefined for the benefit of the parser (#3539)
+
+	_assertIsItem: function(/* item */ item){
+		//	summary:
+		//		This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
+		}
+	},
+
+	_assertIsAttribute: function(/* attribute-name-string */ attribute){
+		//	summary:
+		//		This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		if(typeof attribute !== "string"){ 
+			throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");
+		}
+	},
+
+	getValue: function(	/* item */ item, 
+						/* attribute-name-string */ attribute, 
+						/* value? */ defaultValue){
+		//	summary: 
+		//		See dojo.data.api.Read.getValue()
+		var values = this.getValues(item, attribute);
+		return (values.length > 0)?values[0]:defaultValue; // mixed
+	},
+
+	getValues: function(/* item */ item, 
+						/* attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.getValues()
+
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		return item[attribute] || []; // Array
+	},
+
+	getAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getAttributes()
+		this._assertIsItem(item);
+		var attributes = [];
+		for(var key in item){
+			// Save off only the real item attributes, not the special id marks for O(1) isItem.
+			if((key !== this._storeRefPropName) && (key !== this._itemNumPropName) && (key !== this._rootItemPropName) && (key !== this._reverseRefMap)){
+				attributes.push(key);
+			}
+		}
+		return attributes; // Array
+	},
+
+	hasAttribute: function(	/* item */ item,
+							/* attribute-name-string */ attribute) {
+		//	summary: 
+		//		See dojo.data.api.Read.hasAttribute()
+		return this.getValues(item, attribute).length > 0;
+	},
+
+	containsValue: function(/* item */ item, 
+							/* attribute-name-string */ attribute, 
+							/* anything */ value){
+		//	summary: 
+		//		See dojo.data.api.Read.containsValue()
+		var regexp = undefined;
+		if(typeof value === "string"){
+			regexp = dojo.data.util.filter.patternToRegExp(value, false);
+		}
+		return this._containsValue(item, attribute, value, regexp); //boolean.
+	},
+
+	_containsValue: function(	/* item */ item, 
+								/* attribute-name-string */ attribute, 
+								/* anything */ value,
+								/* RegExp?*/ regexp){
+		//	summary: 
+		//		Internal function for looking at the values contained by the item.
+		//	description: 
+		//		Internal function for looking at the values contained by the item.  This 
+		//		function allows for denoting if the comparison should be case sensitive for
+		//		strings or not (for handling filtering cases where string case should not matter)
+		//	
+		//	item:
+		//		The data item to examine for attribute values.
+		//	attribute:
+		//		The attribute to inspect.
+		//	value:	
+		//		The value to match.
+		//	regexp:
+		//		Optional regular expression generated off value if value was of string type to handle wildcarding.
+		//		If present and attribute values are string, then it can be used for comparison instead of 'value'
+		return dojo.some(this.getValues(item, attribute), function(possibleValue){
+			if(possibleValue !== null && !dojo.isObject(possibleValue) && regexp){
+				if(possibleValue.toString().match(regexp)){
+					return true; // Boolean
+				}
+			}else if(value === possibleValue){
+				return true; // Boolean
+			}
+		});
+	},
+
+	isItem: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItem()
+		if(something && something[this._storeRefPropName] === this){
+			if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){
+				return true;
+			}
+		}
+		return false; // Boolean
+	},
+
+	isItemLoaded: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItemLoaded()
+		return this.isItem(something); //boolean
+	},
+
+	loadItem: function(/* object */ keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Read.loadItem()
+		this._assertIsItem(keywordArgs.item);
+	},
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return this._features; //Object
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabel()
+		if(this._labelAttr && this.isItem(item)){
+			return this.getValue(item,this._labelAttr); //String
+		}
+		return undefined; //undefined
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabelAttributes()
+		if(this._labelAttr){
+			return [this._labelAttr]; //array
+		}
+		return null; //null
+	},
+
+	_fetchItems: function(	/* Object */ keywordArgs, 
+							/* Function */ findCallback, 
+							/* Function */ errorCallback){
+		//	summary: 
+		//		See dojo.data.util.simpleFetch.fetch()
+		var self = this;
+		var filter = function(requestArgs, arrayOfItems){
+			var items = [];
+			if(requestArgs.query){
+				var ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false; 
+
+				//See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+				//same value for each item examined.  Much more efficient.
+				var regexpList = {};
+				for(var key in requestArgs.query){
+					var value = requestArgs.query[key];
+					if(typeof value === "string"){
+						regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
+					}
+				}
+
+				for(var i = 0; i < arrayOfItems.length; ++i){
+					var match = true;
+					var candidateItem = arrayOfItems[i];
+					if(candidateItem === null){
+						match = false;
+					}else{
+						for(var key in requestArgs.query) {
+							var value = requestArgs.query[key];
+							if (!self._containsValue(candidateItem, key, value, regexpList[key])){
+								match = false;
+							}
+						}
+					}
+					if(match){
+						items.push(candidateItem);
+					}
+				}
+				findCallback(items, requestArgs);
+			}else{
+				// We want a copy to pass back in case the parent wishes to sort the array. 
+				// We shouldn't allow resort of the internal list, so that multiple callers 
+				// can get lists and sort without affecting each other.  We also need to
+				// filter out any null values that have been left as a result of deleteItem()
+				// calls in ItemFileWriteStore.
+				for(var i = 0; i < arrayOfItems.length; ++i){
+					var item = arrayOfItems[i];
+					if(item !== null){
+						items.push(item);
+					}
+				}
+				findCallback(items, requestArgs);
+			}
+		};
+
+		if(this._loadFinished){
+			filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
+		}else{
+
+			if(this._jsonFileUrl){
+				//If fetches come in before the loading has finished, but while
+				//a load is in progress, we have to defer the fetching to be 
+				//invoked in the callback.
+				if(this._loadInProgress){
+					this._queuedFetches.push({args: keywordArgs, filter: filter});
+				}else{
+					this._loadInProgress = true;
+					var getArgs = {
+							url: self._jsonFileUrl, 
+							handleAs: "json-comment-optional"
+						};
+					var getHandler = dojo.xhrGet(getArgs);
+					getHandler.addCallback(function(data){
+						try{
+							self._getItemsFromLoadedData(data);
+							self._loadFinished = true;
+							self._loadInProgress = false;
+							
+							filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions));
+							self._handleQueuedFetches();
+						}catch(e){
+							self._loadFinished = true;
+							self._loadInProgress = false;
+							errorCallback(e, keywordArgs);
+						}
+					});
+					getHandler.addErrback(function(error){
+						self._loadInProgress = false;
+						errorCallback(error, keywordArgs);
+					});
+				}
+			}else if(this._jsonData){
+				try{
+					this._loadFinished = true;
+					this._getItemsFromLoadedData(this._jsonData);
+					this._jsonData = null;
+					filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
+				}catch(e){
+					errorCallback(e, keywordArgs);
+				}
+			}else{
+				errorCallback(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."), keywordArgs);
+			}
+		}
+	},
+
+	_handleQueuedFetches: function(){
+		//	summary: 
+		//		Internal function to execute delayed request in the store.
+		//Execute any deferred fetches now.
+		if (this._queuedFetches.length > 0) {
+			for(var i = 0; i < this._queuedFetches.length; i++){
+				var fData = this._queuedFetches[i];
+				var delayedQuery = fData.args;
+				var delayedFilter = fData.filter;
+				if(delayedFilter){
+					delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions)); 
+				}else{
+					this.fetchItemByIdentity(delayedQuery);
+				}
+			}
+			this._queuedFetches = [];
+		}
+	},
+
+	_getItemsArray: function(/*object?*/queryOptions){
+		//	summary: 
+		//		Internal function to determine which list of items to search over.
+		//	queryOptions: The query options parameter, if any.
+		if(queryOptions && queryOptions.deep) {
+			return this._arrayOfAllItems; 
+		}
+		return this._arrayOfTopLevelItems;
+	},
+
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		 //	summary: 
+		 //		See dojo.data.api.Read.close()
+	},
+
+	_getItemsFromLoadedData: function(/* Object */ dataObject){
+		//	summary:
+		//		Function to parse the loaded data into item format and build the internal items array.
+		//	description:
+		//		Function to parse the loaded data into item format and build the internal items array.
+		//
+		//	dataObject:
+		//		The JS data object containing the raw data to convery into item format.
+		//
+		// 	returns: array
+		//		Array of items in store item format.
+		
+		// First, we define a couple little utility functions...
+		
+		function valueIsAnItem(/* anything */ aValue){
+			// summary:
+			//		Given any sort of value that could be in the raw json data,
+			//		return true if we should interpret the value as being an
+			//		item itself, rather than a literal value or a reference.
+			// example:
+			// 	|	false == valueIsAnItem("Kermit");
+			// 	|	false == valueIsAnItem(42);
+			// 	|	false == valueIsAnItem(new Date());
+			// 	|	false == valueIsAnItem({_type:'Date', _value:'May 14, 1802'});
+			// 	|	false == valueIsAnItem({_reference:'Kermit'});
+			// 	|	true == valueIsAnItem({name:'Kermit', color:'green'});
+			// 	|	true == valueIsAnItem({iggy:'pop'});
+			// 	|	true == valueIsAnItem({foo:42});
+			var isItem = (
+				(aValue != null) &&
+				(typeof aValue == "object") &&
+				(!dojo.isArray(aValue)) &&
+				(!dojo.isFunction(aValue)) &&
+				(aValue.constructor == Object) &&
+				(typeof aValue._reference == "undefined") && 
+				(typeof aValue._type == "undefined") && 
+				(typeof aValue._value == "undefined")
+			);
+			return isItem;
+		}
+		
+		var self = this;
+		function addItemAndSubItemsToArrayOfAllItems(/* Item */ anItem){
+			self._arrayOfAllItems.push(anItem);
+			for(var attribute in anItem){
+				var valueForAttribute = anItem[attribute];
+				if(valueForAttribute){
+					if(dojo.isArray(valueForAttribute)){
+						var valueArray = valueForAttribute;
+						for(var k = 0; k < valueArray.length; ++k){
+							var singleValue = valueArray[k];
+							if(valueIsAnItem(singleValue)){
+								addItemAndSubItemsToArrayOfAllItems(singleValue);
+							}
+						}
+					}else{
+						if(valueIsAnItem(valueForAttribute)){
+							addItemAndSubItemsToArrayOfAllItems(valueForAttribute);
+						}
+					}
+				}
+			}
+		}
+
+		this._labelAttr = dataObject.label;
+
+		// We need to do some transformations to convert the data structure
+		// that we read from the file into a format that will be convenient
+		// to work with in memory.
+
+		// Step 1: Walk through the object hierarchy and build a list of all items
+		var i;
+		var item;
+		this._arrayOfAllItems = [];
+		this._arrayOfTopLevelItems = dataObject.items;
+
+		for(i = 0; i < this._arrayOfTopLevelItems.length; ++i){
+			item = this._arrayOfTopLevelItems[i];
+			addItemAndSubItemsToArrayOfAllItems(item);
+			item[this._rootItemPropName]=true;
+		}
+
+		// Step 2: Walk through all the attribute values of all the items, 
+		// and replace single values with arrays.  For example, we change this:
+		//		{ name:'Miss Piggy', pets:'Foo-Foo'}
+		// into this:
+		//		{ name:['Miss Piggy'], pets:['Foo-Foo']}
+		// 
+		// We also store the attribute names so we can validate our store  
+		// reference and item id special properties for the O(1) isItem
+		var allAttributeNames = {};
+		var key;
+
+		for(i = 0; i < this._arrayOfAllItems.length; ++i){
+			item = this._arrayOfAllItems[i];
+			for(key in item){
+				if (key !== this._rootItemPropName)
+				{
+					var value = item[key];
+					if(value !== null){
+						if(!dojo.isArray(value)){
+							item[key] = [value];
+						}
+					}else{
+						item[key] = [null];
+					}
+				}
+				allAttributeNames[key]=key;
+			}
+		}
+
+		// Step 3: Build unique property names to use for the _storeRefPropName and _itemNumPropName
+		// This should go really fast, it will generally never even run the loop.
+		while(allAttributeNames[this._storeRefPropName]){
+			this._storeRefPropName += "_";
+		}
+		while(allAttributeNames[this._itemNumPropName]){
+			this._itemNumPropName += "_";
+		}
+		while(allAttributeNames[this._reverseRefMap]){
+			this._reverseRefMap += "_";
+		}
+
+		// Step 4: Some data files specify an optional 'identifier', which is 
+		// the name of an attribute that holds the identity of each item. 
+		// If this data file specified an identifier attribute, then build a 
+		// hash table of items keyed by the identity of the items.
+		var arrayOfValues;
+
+		var identifier = dataObject.identifier;
+		if(identifier){
+			this._itemsByIdentity = {};
+			this._features['dojo.data.api.Identity'] = identifier;
+			for(i = 0; i < this._arrayOfAllItems.length; ++i){
+				item = this._arrayOfAllItems[i];
+				arrayOfValues = item[identifier];
+				var identity = arrayOfValues[0];
+				if(!this._itemsByIdentity[identity]){
+					this._itemsByIdentity[identity] = item;
+				}else{
+					if(this._jsonFileUrl){
+						throw new Error("dojo.data.ItemFileReadStore:  The json data as specified by: [" + this._jsonFileUrl + "] is malformed.  Items within the list have identifier: [" + identifier + "].  Value collided: [" + identity + "]");
+					}else if(this._jsonData){
+						throw new Error("dojo.data.ItemFileReadStore:  The json data provided by the creation arguments is malformed.  Items within the list have identifier: [" + identifier + "].  Value collided: [" + identity + "]");
+					}
+				}
+			}
+		}else{
+			this._features['dojo.data.api.Identity'] = Number;
+		}
+
+		// Step 5: Walk through all the items, and set each item's properties 
+		// for _storeRefPropName and _itemNumPropName, so that store.isItem() will return true.
+		for(i = 0; i < this._arrayOfAllItems.length; ++i){
+			item = this._arrayOfAllItems[i];
+			item[this._storeRefPropName] = this;
+			item[this._itemNumPropName] = i;
+		}
+
+		// Step 6: We walk through all the attribute values of all the items,
+		// looking for type/value literals and item-references.
+		//
+		// We replace item-references with pointers to items.  For example, we change:
+		//		{ name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+		// into this:
+		//		{ name:['Kermit'], friends:[miss_piggy] } 
+		// (where miss_piggy is the object representing the 'Miss Piggy' item).
+		//
+		// We replace type/value pairs with typed-literals.  For example, we change:
+		//		{ name:['Nelson Mandela'], born:[{_type:'Date', _value:'July 18, 1918'}] }
+		// into this:
+		//		{ name:['Kermit'], born:(new Date('July 18, 1918')) } 
+		//
+		// We also generate the associate map for all items for the O(1) isItem function.
+		for(i = 0; i < this._arrayOfAllItems.length; ++i){
+			item = this._arrayOfAllItems[i]; // example: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+			for(key in item){
+				arrayOfValues = item[key]; // example: [{_reference:{name:'Miss Piggy'}}]
+				for(var j = 0; j < arrayOfValues.length; ++j) {
+					value = arrayOfValues[j]; // example: {_reference:{name:'Miss Piggy'}}
+					if(value !== null && typeof value == "object"){
+						if(value._type && value._value){
+							var type = value._type; // examples: 'Date', 'Color', or 'ComplexNumber'
+							var mappingObj = this._datatypeMap[type]; // examples: Date, dojo.Color, foo.math.ComplexNumber, {type: dojo.Color, deserialize(value){ return new dojo.Color(value)}}
+							if(!mappingObj){ 
+								throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '" + type + "'");
+							}else if(dojo.isFunction(mappingObj)){
+								arrayOfValues[j] = new mappingObj(value._value);
+							}else if(dojo.isFunction(mappingObj.deserialize)){
+								arrayOfValues[j] = mappingObj.deserialize(value._value);
+							}else{
+								throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");
+							}
+						}
+						if(value._reference){
+							var referenceDescription = value._reference; // example: {name:'Miss Piggy'}
+							if(!dojo.isObject(referenceDescription)){
+								// example: 'Miss Piggy'
+								// from an item like: { name:['Kermit'], friends:[{_reference:'Miss Piggy'}]}
+								arrayOfValues[j] = this._itemsByIdentity[referenceDescription];
+							}else{
+								// example: {name:'Miss Piggy'}
+								// from an item like: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+								for(var k = 0; k < this._arrayOfAllItems.length; ++k){
+									var candidateItem = this._arrayOfAllItems[k];
+									var found = true;
+									for(var refKey in referenceDescription){
+										if(candidateItem[refKey] != referenceDescription[refKey]){ 
+											found = false; 
+										}
+									}
+									if(found){ 
+										arrayOfValues[j] = candidateItem; 
+									}
+								}
+							}
+							if(this.referenceIntegrity){
+								var refItem = arrayOfValues[j];
+								if(this.isItem(refItem)){
+									this._addReferenceToMap(refItem, item, key);
+								}
+							}
+						}else if(this.isItem(value)){
+							//It's a child item (not one referenced through _reference).  
+							//We need to treat this as a referenced item, so it can be cleaned up
+							//in a write store easily.
+							if(this.referenceIntegrity){
+								this._addReferenceToMap(value, item, key);
+							}
+						}
+					}
+				}
+			}
+		}
+	},
+
+	_addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){
+		 //	summary:
+		 //		Method to add an reference map entry for an item and attribute.
+		 //	description:
+		 //		Method to add an reference map entry for an item and attribute. 		 //
+		 //	refItem:
+		 //		The item that is referenced.
+		 //	parentItem:
+		 //		The item that holds the new reference to refItem.
+		 //	attribute:
+		 //		The attribute on parentItem that contains the new reference.
+		 
+		 //Stub function, does nothing.  Real processing is in ItemFileWriteStore.
+	},
+
+	getIdentity: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Identity.getIdentity()
+		var identifier = this._features['dojo.data.api.Identity'];
+		if(identifier === Number){
+			return item[this._itemNumPropName]; // Number
+		}else{
+			var arrayOfValues = item[identifier];
+			if(arrayOfValues){
+				return arrayOfValues[0]; // Object || String
+			}
+		}
+		return null; // null
+	},
+
+	fetchItemByIdentity: function(/* Object */ keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Identity.fetchItemByIdentity()
+
+		// Hasn't loaded yet, we have to trigger the load.
+		if(!this._loadFinished){
+			var self = this;
+			if(this._jsonFileUrl){
+
+				if(this._loadInProgress){
+					this._queuedFetches.push({args: keywordArgs});
+				}else{
+					this._loadInProgress = true;
+					var getArgs = {
+							url: self._jsonFileUrl, 
+							handleAs: "json-comment-optional"
+					};
+					var getHandler = dojo.xhrGet(getArgs);
+					getHandler.addCallback(function(data){
+						var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+						try{
+							self._getItemsFromLoadedData(data);
+							self._loadFinished = true;
+							self._loadInProgress = false;
+							var item = self._getItemByIdentity(keywordArgs.identity);
+							if(keywordArgs.onItem){
+								keywordArgs.onItem.call(scope, item);
+							}
+							self._handleQueuedFetches();
+						}catch(error){
+							self._loadInProgress = false;
+							if(keywordArgs.onError){
+								keywordArgs.onError.call(scope, error);
+							}
+						}
+					});
+					getHandler.addErrback(function(error){
+						self._loadInProgress = false;
+						if(keywordArgs.onError){
+							var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+							keywordArgs.onError.call(scope, error);
+						}
+					});
+				}
+
+			}else if(this._jsonData){
+				// Passed in data, no need to xhr.
+				self._getItemsFromLoadedData(self._jsonData);
+				self._jsonData = null;
+				self._loadFinished = true;
+				var item = self._getItemByIdentity(keywordArgs.identity);
+				if(keywordArgs.onItem){
+					var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+					keywordArgs.onItem.call(scope, item);
+				}
+			} 
+		}else{
+			// Already loaded.  We can just look it up and call back.
+			var item = this._getItemByIdentity(keywordArgs.identity);
+			if(keywordArgs.onItem){
+				var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+				keywordArgs.onItem.call(scope, item);
+			}
+		}
+	},
+
+	_getItemByIdentity: function(/* Object */ identity){
+		//	summary:
+		//		Internal function to look an item up by its identity map.
+		var item = null;
+		if(this._itemsByIdentity){
+			item = this._itemsByIdentity[identity];
+		}else{
+			item = this._arrayOfAllItems[identity];
+		}
+		if(item === undefined){
+			item = null;
+		}
+		return item; // Object
+	},
+
+	getIdentityAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Identity.getIdentifierAttributes()
+		 
+		var identifier = this._features['dojo.data.api.Identity'];
+		if(identifier === Number){
+			// If (identifier === Number) it means getIdentity() just returns
+			// an integer item-number for each item.  The dojo.data.api.Identity
+			// spec says we need to return null if the identity is not composed 
+			// of attributes 
+			return null; // null
+		}else{
+			return [identifier]; // Array
+		}
+	},
+	
+	_forceLoad: function(){
+		//	summary: 
+		//		Internal function to force a load of the store if it hasn't occurred yet.  This is required
+		//		for specific functions to work properly.  
+		var self = this;
+		if(this._jsonFileUrl){
+				var getArgs = {
+					url: self._jsonFileUrl, 
+					handleAs: "json-comment-optional",
+					sync: true
+				};
+			var getHandler = dojo.xhrGet(getArgs);
+			getHandler.addCallback(function(data){
+				try{
+					//Check to be sure there wasn't another load going on concurrently 
+					//So we don't clobber data that comes in on it.  If there is a load going on
+					//then do not save this data.  It will potentially clobber current data.
+					//We mainly wanted to sync/wait here.
+					//TODO:  Revisit the loading scheme of this store to improve multi-initial
+					//request handling.
+					if (self._loadInProgress !== true && !self._loadFinished) {
+						self._getItemsFromLoadedData(data);
+						self._loadFinished = true;
+					}
+				}catch(e){
+					console.log(e);
+					throw e;
+				}
+			});
+			getHandler.addErrback(function(error){
+				throw error;
+			});
+		}else if(this._jsonData){
+			self._getItemsFromLoadedData(self._jsonData);
+			self._jsonData = null;
+			self._loadFinished = true;
+		} 
+	}
+});
+//Mix in the simple fetch implementation to this class.
+dojo.extend(dojo.data.ItemFileReadStore,dojo.data.util.simpleFetch);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/ItemFileWriteStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/ItemFileWriteStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/ItemFileWriteStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,804 @@
+if(!dojo._hasResource["dojo.data.ItemFileWriteStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.ItemFileWriteStore"] = true;
+dojo.provide("dojo.data.ItemFileWriteStore");
+dojo.require("dojo.data.ItemFileReadStore");
+
+dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
+	constructor: function(/* object */ keywordParameters){
+		//	keywordParameters: {typeMap: object)
+		//		The structure of the typeMap object is as follows:
+		//		{
+		//			type0: function || object,
+		//			type1: function || object,
+		//			...
+		//			typeN: function || object
+		//		}
+		//		Where if it is a function, it is assumed to be an object constructor that takes the 
+		//		value of _value as the initialization parameters.  It is serialized assuming object.toString()
+		//		serialization.  If it is an object, then it is assumed
+		//		to be an object of general form:
+		//		{
+		//			type: function, //constructor.
+		//			deserialize:	function(value) //The function that parses the value and constructs the object defined by type appropriately.
+		//			serialize:	function(object) //The function that converts the object back into the proper file format form.
+		//		}
+
+		// ItemFileWriteStore extends ItemFileReadStore to implement these additional dojo.data APIs
+		this._features['dojo.data.api.Write'] = true;
+		this._features['dojo.data.api.Notification'] = true;
+		
+		// For keeping track of changes so that we can implement isDirty and revert
+		this._pending = {
+			_newItems:{}, 
+			_modifiedItems:{}, 
+			_deletedItems:{}
+		};
+
+		if(!this._datatypeMap['Date'].serialize){
+			this._datatypeMap['Date'].serialize = function(obj){
+				return dojo.date.stamp.toISOString(obj, {zulu:true});
+			};
+		}
+		//Disable only if explicitly set to false.
+		if(keywordParameters && (keywordParameters.referenceIntegrity === false)){
+			this.referenceIntegrity = false;
+		}
+
+		// this._saveInProgress is set to true, briefly, from when save() is first called to when it completes
+		this._saveInProgress = false;
+	},
+
+	referenceIntegrity: true,  //Flag that defaultly enabled reference integrity tracking.  This way it can also be disabled pogrammatially or declaratively.
+
+	_assert: function(/* boolean */ condition){
+		if(!condition) {
+			throw new Error("assertion failed in ItemFileWriteStore");
+		}
+	},
+
+	_getIdentifierAttribute: function(){
+		var identifierAttribute = this.getFeatures()['dojo.data.api.Identity'];
+		// this._assert((identifierAttribute === Number) || (dojo.isString(identifierAttribute)));
+		return identifierAttribute;
+	},
+	
+	
+/* dojo.data.api.Write */
+
+	newItem: function(/* Object? */ keywordArgs, /* Object? */ parentInfo){
+		// summary: See dojo.data.api.Write.newItem()
+
+		this._assert(!this._saveInProgress);
+
+		if (!this._loadFinished){
+			// We need to do this here so that we'll be able to find out what
+			// identifierAttribute was specified in the data file.
+			this._forceLoad();
+		}
+
+		if(typeof keywordArgs != "object" && typeof keywordArgs != "undefined"){
+			throw new Error("newItem() was passed something other than an object");
+		}
+		var newIdentity = null;
+		var identifierAttribute = this._getIdentifierAttribute();
+		if(identifierAttribute === Number){
+			newIdentity = this._arrayOfAllItems.length;
+		}else{
+			newIdentity = keywordArgs[identifierAttribute];
+			if (typeof newIdentity === "undefined"){
+				throw new Error("newItem() was not passed an identity for the new item");
+			}
+			if (dojo.isArray(newIdentity)){
+				throw new Error("newItem() was not passed an single-valued identity");
+			}
+		}
+		
+		// make sure this identity is not already in use by another item, if identifiers were 
+		// defined in the file.  Otherwise it would be the item count, 
+		// which should always be unique in this case.
+		if(this._itemsByIdentity){
+			this._assert(typeof this._itemsByIdentity[newIdentity] === "undefined");
+		}
+		this._assert(typeof this._pending._newItems[newIdentity] === "undefined");
+		this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined");
+		
+		var newItem = {};
+		newItem[this._storeRefPropName] = this;		
+		newItem[this._itemNumPropName] = this._arrayOfAllItems.length;
+		if(this._itemsByIdentity){
+			this._itemsByIdentity[newIdentity] = newItem;
+			//We have to set the identifier now, otherwise we can't look it
+			//up at calls to setValueorValues in parentInfo handling.
+			newItem[identifierAttribute] = [newIdentity];
+		}
+		this._arrayOfAllItems.push(newItem);
+
+		//We need to construct some data for the onNew call too...
+		var pInfo = null;
+		
+		// Now we need to check to see where we want to assign this thingm if any.
+		if(parentInfo && parentInfo.parent && parentInfo.attribute){
+			pInfo = {
+				item: parentInfo.parent,
+				attribute: parentInfo.attribute,
+				oldValue: undefined
+			};
+
+			//See if it is multi-valued or not and handle appropriately
+			//Generally, all attributes are multi-valued for this store
+			//So, we only need to append if there are already values present.
+			var values = this.getValues(parentInfo.parent, parentInfo.attribute);
+			if(values && values.length > 0){
+				var tempValues = values.slice(0, values.length);
+				if(values.length === 1){
+					pInfo.oldValue = values[0];
+				}else{
+					pInfo.oldValue = values.slice(0, values.length);
+				}
+				tempValues.push(newItem);
+				this._setValueOrValues(parentInfo.parent, parentInfo.attribute, tempValues, false);
+				pInfo.newValue = this.getValues(parentInfo.parent, parentInfo.attribute);
+			}else{
+				this._setValueOrValues(parentInfo.parent, parentInfo.attribute, newItem, false);
+				pInfo.newValue = newItem;
+			}
+		}else{
+			//Toplevel item, add to both top list as well as all list.
+			newItem[this._rootItemPropName]=true;
+			this._arrayOfTopLevelItems.push(newItem);
+		}
+		
+		this._pending._newItems[newIdentity] = newItem;
+		
+		//Clone over the properties to the new item
+		for(var key in keywordArgs){
+			if(key === this._storeRefPropName || key === this._itemNumPropName){
+				// Bummer, the user is trying to do something like
+				// newItem({_S:"foo"}).  Unfortunately, our superclass,
+				// ItemFileReadStore, is already using _S in each of our items
+				// to hold private info.  To avoid a naming collision, we 
+				// need to move all our private info to some other property 
+				// of all the items/objects.  So, we need to iterate over all
+				// the items and do something like: 
+				//    item.__S = item._S;
+				//    item._S = undefined;
+				// But first we have to make sure the new "__S" variable is 
+				// not in use, which means we have to iterate over all the 
+				// items checking for that.
+				throw new Error("encountered bug in ItemFileWriteStore.newItem");
+			}
+			var value = keywordArgs[key];
+			if(!dojo.isArray(value)){
+				value = [value];
+			}
+			newItem[key] = value;
+			if(this.referenceIntegrity){
+				for(var i = 0; i < value.length; i++){
+					var val = value[i];
+					if(this.isItem(val)){
+						this._addReferenceToMap(val, newItem, key);
+					}
+				}
+			}
+		}
+		this.onNew(newItem, pInfo); // dojo.data.api.Notification call
+		return newItem; // item
+	},
+	
+	_removeArrayElement: function(/* Array */ array, /* anything */ element){
+		var index = dojo.indexOf(array, element);
+		if (index != -1){
+			array.splice(index, 1);
+			return true;
+		}
+		return false;
+	},
+	
+	deleteItem: function(/* item */ item){
+		// summary: See dojo.data.api.Write.deleteItem()
+		this._assert(!this._saveInProgress);
+		this._assertIsItem(item);
+
+		// Remove this item from the _arrayOfAllItems, but leave a null value in place
+		// of the item, so as not to change the length of the array, so that in newItem() 
+		// we can still safely do: newIdentity = this._arrayOfAllItems.length;
+		var indexInArrayOfAllItems = item[this._itemNumPropName];
+		var identity = this.getIdentity(item);
+
+		//If we have reference integrity on, we need to do reference cleanup for the deleted item
+		if(this.referenceIntegrity){
+			//First scan all the attributes of this items for references and clean them up in the map 
+			//As this item is going away, no need to track its references anymore.
+
+			//Get the attributes list before we generate the backup so it 
+			//doesn't pollute the attributes list.
+			var attributes = this.getAttributes(item);
+
+			//Backup the map, we'll have to restore it potentially, in a revert.
+			if(item[this._reverseRefMap]){
+				item["backup_" + this._reverseRefMap] = dojo.clone(item[this._reverseRefMap]);
+			}
+			
+			//TODO:  This causes a reversion problem.  This list won't be restored on revert since it is
+			//attached to the 'value'. item, not ours.  Need to back tese up somehow too.
+			//Maybe build a map of the backup of the entries and attach it to the deleted item to be restored
+			//later.  Or just record them and call _addReferenceToMap on them in revert.
+			dojo.forEach(attributes, function(attribute){
+				dojo.forEach(this.getValues(item, attribute), function(value){
+					if(this.isItem(value)){
+						//We have to back up all the references we had to others so they can be restored on a revert.
+						if(!item["backupRefs_" + this._reverseRefMap]){
+							item["backupRefs_" + this._reverseRefMap] = [];
+						}
+						item["backupRefs_" + this._reverseRefMap].push({id: this.getIdentity(value), attr: attribute});
+						this._removeReferenceFromMap(value, item, attribute);
+					}
+				}, this);
+			}, this);
+
+			//Next, see if we have references to this item, if we do, we have to clean them up too.
+			var references = item[this._reverseRefMap];
+			if(references){
+				//Look through all the items noted as references to clean them up.
+				for(var itemId in references){
+					var containingItem = null;
+					if(this._itemsByIdentity){
+						containingItem = this._itemsByIdentity[itemId];
+					}else{
+						containingItem = this._arrayOfAllItems[itemId];
+					}
+					//We have a reference to a containing item, now we have to process the
+					//attributes and clear all references to the item being deleted.
+					if(containingItem){
+						for(var attribute in references[itemId]){
+							var oldValues = this.getValues(containingItem, attribute) || [];
+							var newValues = dojo.filter(oldValues, function(possibleItem){
+							   return !(this.isItem(possibleItem) && this.getIdentity(possibleItem) == identity);
+							}, this);
+							//Remove the note of the reference to the item and set the values on the modified attribute.
+							this._removeReferenceFromMap(item, containingItem, attribute); 
+							if(newValues.length < oldValues.length){
+								this.setValues(containingItem, attribute, newValues);
+							}
+						}
+					}
+				}
+			}
+		}
+
+		this._arrayOfAllItems[indexInArrayOfAllItems] = null;
+
+		item[this._storeRefPropName] = null;
+		if(this._itemsByIdentity){
+			delete this._itemsByIdentity[identity];
+		}
+		this._pending._deletedItems[identity] = item;
+		
+		//Remove from the toplevel items, if necessary...
+		if(item[this._rootItemPropName]){
+			this._removeArrayElement(this._arrayOfTopLevelItems, item);
+		}
+		this.onDelete(item); // dojo.data.api.Notification call
+		return true;
+	},
+
+	setValue: function(/* item */ item, /* attribute-name-string */ attribute, /* almost anything */ value){
+		// summary: See dojo.data.api.Write.set()
+		return this._setValueOrValues(item, attribute, value, true); // boolean
+	},
+	
+	setValues: function(/* item */ item, /* attribute-name-string */ attribute, /* array */ values){
+		// summary: See dojo.data.api.Write.setValues()
+		return this._setValueOrValues(item, attribute, values, true); // boolean
+	},
+	
+	unsetAttribute: function(/* item */ item, /* attribute-name-string */ attribute){
+		// summary: See dojo.data.api.Write.unsetAttribute()
+		return this._setValueOrValues(item, attribute, [], true);
+	},
+	
+	_setValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute, /* anything */ newValueOrValues, /*boolean?*/ callOnSet){
+		this._assert(!this._saveInProgress);
+		
+		// Check for valid arguments
+		this._assertIsItem(item);
+		this._assert(dojo.isString(attribute));
+		this._assert(typeof newValueOrValues !== "undefined");
+
+		// Make sure the user isn't trying to change the item's identity
+		var identifierAttribute = this._getIdentifierAttribute();
+		if(attribute == identifierAttribute){
+			throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");
+		}
+
+		// To implement the Notification API, we need to make a note of what
+		// the old attribute value was, so that we can pass that info when
+		// we call the onSet method.
+		var oldValueOrValues = this._getValueOrValues(item, attribute);
+
+		var identity = this.getIdentity(item);
+		if(!this._pending._modifiedItems[identity]){
+			// Before we actually change the item, we make a copy of it to 
+			// record the original state, so that we'll be able to revert if 
+			// the revert method gets called.  If the item has already been
+			// modified then there's no need to do this now, since we already
+			// have a record of the original state.						
+			var copyOfItemState = {};
+			for(var key in item){
+				if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){
+					copyOfItemState[key] = item[key];
+				}else if(key === this._reverseRefMap){
+					copyOfItemState[key] = dojo.clone(item[key]);
+				}else{
+					copyOfItemState[key] = item[key].slice(0, item[key].length);
+				}
+			}
+			// Now mark the item as dirty, and save the copy of the original state
+			this._pending._modifiedItems[identity] = copyOfItemState;
+		}
+		
+		// Okay, now we can actually change this attribute on the item
+		var success = false;
+		
+		if(dojo.isArray(newValueOrValues) && newValueOrValues.length === 0){
+			
+			// If we were passed an empty array as the value, that counts
+			// as "unsetting" the attribute, so we need to remove this 
+			// attribute from the item.
+			success = delete item[attribute];
+			newValueOrValues = undefined; // used in the onSet Notification call below
+
+			if(this.referenceIntegrity && oldValueOrValues){
+				var oldValues = oldValueOrValues;
+				if (!dojo.isArray(oldValues)){
+					oldValues = [oldValues];
+				}
+				for(var i = 0; i < oldValues.length; i++){
+					var value = oldValues[i];
+					if(this.isItem(value)){
+						this._removeReferenceFromMap(value, item, attribute);
+					}
+				}
+			}
+		}else{
+			var newValueArray;
+			if(dojo.isArray(newValueOrValues)){
+				var newValues = newValueOrValues;
+				// Unfortunately, it's not safe to just do this:
+				//    newValueArray = newValues;
+				// Instead, we need to copy the array, which slice() does very nicely.
+				// This is so that our internal data structure won't  
+				// get corrupted if the user mucks with the values array *after*
+				// calling setValues().
+				newValueArray = newValueOrValues.slice(0, newValueOrValues.length);
+			}else{
+				newValueArray = [newValueOrValues];
+			}
+
+			//We need to handle reference integrity if this is on. 
+			//In the case of set, we need to see if references were added or removed
+			//and update the reference tracking map accordingly.
+			if(this.referenceIntegrity){
+				if(oldValueOrValues){
+					var oldValues = oldValueOrValues;
+					if(!dojo.isArray(oldValues)){
+						oldValues = [oldValues];
+					}
+					//Use an associative map to determine what was added/removed from the list.
+					//Should be O(n) performant.  First look at all the old values and make a list of them
+					//Then for any item not in the old list, we add it.  If it was already present, we remove it.
+					//Then we pass over the map and any references left it it need to be removed (IE, no match in
+					//the new values list).
+					var map = {};
+					dojo.forEach(oldValues, function(possibleItem){
+						if(this.isItem(possibleItem)){
+							var id = this.getIdentity(possibleItem);
+							map[id.toString()] = true;
+						}
+					}, this);
+					dojo.forEach(newValueArray, function(possibleItem){
+						if(this.isItem(possibleItem)){
+							var id = this.getIdentity(possibleItem);
+							if(map[id.toString()]){
+								delete map[id.toString()];
+							}else{
+								this._addReferenceToMap(possibleItem, item, attribute); 
+							}
+						}
+					}, this);
+					for(var rId in map){
+						var removedItem;
+						if(this._itemsByIdentity){
+							removedItem = this._itemsByIdentity[rId];
+						}else{
+							removedItem = this._arrayOfAllItems[rId];
+						}
+						this._removeReferenceFromMap(removedItem, item, attribute);
+					}
+				}else{
+					//Everything is new (no old values) so we have to just
+					//insert all the references, if any.
+					for(var i = 0; i < newValueArray.length; i++){
+						var value = newValueArray[i];
+						if(this.isItem(value)){
+							this._addReferenceToMap(value, item, attribute);
+						}
+					}
+				}
+			}
+			item[attribute] = newValueArray;
+			success = true;
+		}
+
+		// Now we make the dojo.data.api.Notification call
+		if(callOnSet){
+			this.onSet(item, attribute, oldValueOrValues, newValueOrValues); 
+		}
+		return success; // boolean
+	},
+
+	_addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){
+		//	summary:
+		//		Method to add an reference map entry for an item and attribute.
+		//	description:
+		//		Method to add an reference map entry for an item and attribute. 		 //
+		//	refItem:
+		//		The item that is referenced.
+		//	parentItem:
+		//		The item that holds the new reference to refItem.
+		//	attribute:
+		//		The attribute on parentItem that contains the new reference.
+		 
+		var parentId = this.getIdentity(parentItem);
+		var references = refItem[this._reverseRefMap];
+
+		if(!references){
+			references = refItem[this._reverseRefMap] = {};
+		}
+		var itemRef = references[parentId];
+		if(!itemRef){
+			itemRef = references[parentId] = {};
+		}
+		itemRef[attribute] = true;
+	},
+
+	_removeReferenceFromMap: function(/* item */ refItem, /* item */ parentItem, /*strin*/ attribute){
+		//	summary:
+		//		Method to remove an reference map entry for an item and attribute.
+		//	description:
+		//		Method to remove an reference map entry for an item and attribute.  This will
+		//		also perform cleanup on the map such that if there are no more references at all to 
+		//		the item, its reference object and entry are removed.
+		//
+		//	refItem:
+		//		The item that is referenced.
+		//	parentItem:
+		//		The item holding a reference to refItem.
+		//	attribute:
+		//		The attribute on parentItem that contains the reference.
+		var identity = this.getIdentity(parentItem);
+		var references = refItem[this._reverseRefMap];
+		var itemId;
+		if(references){
+			for(itemId in references){
+				if(itemId == identity){
+					delete references[itemId][attribute];
+					if(this._isEmpty(references[itemId])){
+						delete references[itemId];
+					}
+				}
+			}
+			if(this._isEmpty(references)){
+				delete refItem[this._reverseRefMap];
+			}
+		}
+	},
+
+	_dumpReferenceMap: function(){
+		//	summary:
+		//		Function to dump the reverse reference map of all items in the store for debug purposes.
+		//	description:
+		//		Function to dump the reverse reference map of all items in the store for debug purposes.
+		var i;
+		for(i = 0; i < this._arrayOfAllItems.length; i++){
+			var item = this._arrayOfAllItems[i];
+			if(item && item[this._reverseRefMap]){
+				console.log("Item: [" + this.getIdentity(item) + "] is referenced by: " + dojo.toJson(item[this._reverseRefMap]));
+			}
+		}
+	},
+						   
+	_getValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute){
+		var valueOrValues = undefined;
+		if(this.hasAttribute(item, attribute)){
+			var valueArray = this.getValues(item, attribute);
+			if(valueArray.length == 1){
+				valueOrValues = valueArray[0];
+			}else{
+				valueOrValues = valueArray;
+			}
+		}
+		return valueOrValues;
+	},
+	
+	_flatten: function(/* anything */ value){
+		if(this.isItem(value)){
+			var item = value;
+			// Given an item, return an serializable object that provides a 
+			// reference to the item.
+			// For example, given kermit:
+			//    var kermit = store.newItem({id:2, name:"Kermit"});
+			// we want to return
+			//    {_reference:2}
+			var identity = this.getIdentity(item);
+			var referenceObject = {_reference: identity};
+			return referenceObject;
+		}else{
+			if(typeof value === "object"){
+				for(var type in this._datatypeMap){
+					var typeMap = this._datatypeMap[type];
+					if (dojo.isObject(typeMap) && !dojo.isFunction(typeMap)){
+						if(value instanceof typeMap.type){
+							if(!typeMap.serialize){
+								throw new Error("ItemFileWriteStore:  No serializer defined for type mapping: [" + type + "]");
+							}
+							return {_type: type, _value: typeMap.serialize(value)};
+						}
+					} else if(value instanceof typeMap){
+						//SImple mapping, therefore, return as a toString serialization.
+						return {_type: type, _value: value.toString()};
+					}
+				}
+			}
+			return value;
+		}
+	},
+	
+	_getNewFileContentString: function(){
+		// summary: 
+		//		Generate a string that can be saved to a file.
+		//		The result should look similar to:
+		//		http://trac.dojotoolkit.org/browser/dojo/trunk/tests/data/countries.json
+		var serializableStructure = {};
+		
+		var identifierAttribute = this._getIdentifierAttribute();
+		if(identifierAttribute !== Number){
+			serializableStructure.identifier = identifierAttribute;
+		}
+		if(this._labelAttr){
+			serializableStructure.label = this._labelAttr;
+		}
+		serializableStructure.items = [];
+		for(var i = 0; i < this._arrayOfAllItems.length; ++i){
+			var item = this._arrayOfAllItems[i];
+			if(item !== null){
+				var serializableItem = {};
+				for(var key in item){
+					if(key !== this._storeRefPropName && key !== this._itemNumPropName){
+						var attribute = key;
+						var valueArray = this.getValues(item, attribute);
+						if(valueArray.length == 1){
+							serializableItem[attribute] = this._flatten(valueArray[0]);
+						}else{
+							var serializableArray = [];
+							for(var j = 0; j < valueArray.length; ++j){
+								serializableArray.push(this._flatten(valueArray[j]));
+								serializableItem[attribute] = serializableArray;
+							}
+						}
+					}
+				}
+				serializableStructure.items.push(serializableItem);
+			}
+		}
+		var prettyPrint = true;
+		return dojo.toJson(serializableStructure, prettyPrint);
+	},
+
+	_isEmpty: function(something){
+		//	summary: 
+		//		Function to determine if an array or object has no properties or values.
+		//	something:
+		//		The array or object to examine.
+		var empty = true;
+		if(dojo.isObject(something)){
+			var i;
+			for(i in something){
+				empty = false;
+				break;
+			}
+		}else if(dojo.isArray(something)){
+			if(something.length > 0){
+				empty = false;
+			}
+		}
+		return empty; //boolean
+	},
+	
+	save: function(/* object */ keywordArgs){
+		// summary: See dojo.data.api.Write.save()
+		this._assert(!this._saveInProgress);
+		
+		// this._saveInProgress is set to true, briefly, from when save is first called to when it completes
+		this._saveInProgress = true;
+		
+		var self = this;
+		var saveCompleteCallback = function(){
+			self._pending = {
+				_newItems:{}, 
+				_modifiedItems:{},
+				_deletedItems:{}
+			};
+
+			self._saveInProgress = false; // must come after this._pending is cleared, but before any callbacks
+			if(keywordArgs && keywordArgs.onComplete){
+				var scope = keywordArgs.scope || dojo.global;
+				keywordArgs.onComplete.call(scope);
+			}
+		};
+		var saveFailedCallback = function(){
+			self._saveInProgress = false;
+			if(keywordArgs && keywordArgs.onError){
+				var scope = keywordArgs.scope || dojo.global;
+				keywordArgs.onError.call(scope);
+			}
+		};
+		
+		if(this._saveEverything){
+			var newFileContentString = this._getNewFileContentString();
+			this._saveEverything(saveCompleteCallback, saveFailedCallback, newFileContentString);
+		}
+		if(this._saveCustom){
+			this._saveCustom(saveCompleteCallback, saveFailedCallback);
+		}
+		if(!this._saveEverything && !this._saveCustom){
+			// Looks like there is no user-defined save-handler function.
+			// That's fine, it just means the datastore is acting as a "mock-write"
+			// store -- changes get saved in memory but don't get saved to disk.
+			saveCompleteCallback();
+		}
+	},
+	
+	revert: function(){
+		// summary: See dojo.data.api.Write.revert()
+		this._assert(!this._saveInProgress);
+
+		var identity;
+		for(identity in this._pending._newItems){
+			var newItem = this._pending._newItems[identity];
+			newItem[this._storeRefPropName] = null;
+			// null out the new item, but don't change the array index so
+			// so we can keep using _arrayOfAllItems.length.
+			this._arrayOfAllItems[newItem[this._itemNumPropName]] = null;
+			if(newItem[this._rootItemPropName]){
+				this._removeArrayElement(this._arrayOfTopLevelItems, newItem);
+			}
+			if(this._itemsByIdentity){
+				delete this._itemsByIdentity[identity];
+			}
+		}
+		for(identity in this._pending._modifiedItems){
+			// find the original item and the modified item that replaced it
+			var originalItem = this._pending._modifiedItems[identity];
+			var modifiedItem = null;
+			if(this._itemsByIdentity){
+				modifiedItem = this._itemsByIdentity[identity];
+			}else{
+				modifiedItem = this._arrayOfAllItems[identity];
+			}
+			
+			// make the original item into a full-fledged item again
+			originalItem[this._storeRefPropName] = this;
+			modifiedItem[this._storeRefPropName] = null;
+
+			// replace the modified item with the original one
+			var arrayIndex = modifiedItem[this._itemNumPropName];
+			this._arrayOfAllItems[arrayIndex] = originalItem;
+			
+			if(modifiedItem[this._rootItemPropName]){
+				var i;
+				for (i = 0; i < this._arrayOfTopLevelItems.length; i++) {
+					var possibleMatch = this._arrayOfTopLevelItems[i];
+					if (this.getIdentity(possibleMatch) == identity){
+						this._arrayOfTopLevelItems[i] = originalItem;
+						break;
+					}
+				}
+			}
+			if(this._itemsByIdentity){
+				this._itemsByIdentity[identity] = originalItem;
+			}			
+		}
+		var deletedItem;
+		for(identity in this._pending._deletedItems){
+			deletedItem = this._pending._deletedItems[identity];
+			deletedItem[this._storeRefPropName] = this;
+			var index = deletedItem[this._itemNumPropName];
+
+			//Restore the reverse refererence map, if any.
+			if(deletedItem["backup_" + this._reverseRefMap]){
+				deletedItem[this._reverseRefMap] = deletedItem["backup_" + this._reverseRefMap];
+				delete deletedItem["backup_" + this._reverseRefMap];
+			}
+			this._arrayOfAllItems[index] = deletedItem;
+			if (this._itemsByIdentity) {
+				this._itemsByIdentity[identity] = deletedItem;
+			}
+			if(deletedItem[this._rootItemPropName]){
+				this._arrayOfTopLevelItems.push(deletedItem);
+			}	  
+		}
+		//We have to pass through it again and restore the reference maps after all the
+		//undeletes have occurred.
+		for(identity in this._pending._deletedItems){
+			deletedItem = this._pending._deletedItems[identity];
+			if(deletedItem["backupRefs_" + this._reverseRefMap]){
+				dojo.forEach(deletedItem["backupRefs_" + this._reverseRefMap], function(reference){
+					var refItem;
+					if(this._itemsByIdentity){
+						refItem = this._itemsByIdentity[reference.id];
+					}else{
+						refItem = this._arrayOfAllItems[reference.id];
+					}
+					this._addReferenceToMap(refItem, deletedItem, reference.attr);
+				}, this);
+				delete deletedItem["backupRefs_" + this._reverseRefMap]; 
+			}
+		}
+
+		this._pending = {
+			_newItems:{}, 
+			_modifiedItems:{}, 
+			_deletedItems:{}
+		};
+		return true; // boolean
+	},
+	
+	isDirty: function(/* item? */ item){
+		// summary: See dojo.data.api.Write.isDirty()
+		if(item){
+			// return true if the item is dirty
+			var identity = this.getIdentity(item);
+			return new Boolean(this._pending._newItems[identity] || 
+				this._pending._modifiedItems[identity] ||
+				this._pending._deletedItems[identity]); // boolean
+		}else{
+			// return true if the store is dirty -- which means return true
+			// if there are any new items, dirty items, or modified items
+			if(!this._isEmpty(this._pending._newItems) || 
+			   !this._isEmpty(this._pending._modifiedItems) ||
+			   !this._isEmpty(this._pending._deletedItems)){
+				return true;
+			}
+			return false; // boolean
+		}
+	},
+
+/* dojo.data.api.Notification */
+
+	onSet: function(/* item */ item, 
+					/*attribute-name-string*/ attribute, 
+					/*object | array*/ oldValue,
+					/*object | array*/ newValue){
+		// summary: See dojo.data.api.Notification.onSet()
+		
+		// No need to do anything. This method is here just so that the 
+		// client code can connect observers to it.
+	},
+
+	onNew: function(/* item */ newItem, /*object?*/ parentInfo){
+		// summary: See dojo.data.api.Notification.onNew()
+		
+		// No need to do anything. This method is here just so that the 
+		// client code can connect observers to it. 
+	},
+
+	onDelete: function(/* item */ deletedItem){
+		// summary: See dojo.data.api.Notification.onDelete()
+		
+		// No need to do anything. This method is here just so that the 
+		// client code can connect observers to it. 
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/api/Identity.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/api/Identity.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/api/Identity.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,107 @@
+if(!dojo._hasResource["dojo.data.api.Identity"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.api.Identity"] = true;
+dojo.provide("dojo.data.api.Identity");
+dojo.require("dojo.data.api.Read");
+
+dojo.declare("dojo.data.api.Identity", dojo.data.api.Read, {
+	//	summary:
+	//		This is an abstract API that data provider implementations conform to.
+	//		This file defines methods signatures and intentionally leaves all the
+	//		methods unimplemented.
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return {
+			 'dojo.data.api.Read': true,
+			 'dojo.data.api.Identity': true
+		};
+	},
+
+	getIdentity: function(/* item */ item){
+		//	summary:
+		//		Returns a unique identifier for an item.  The return value will be
+		//		either a string or something that has a toString() method (such as,
+		//		for example, a dojox.uuid.Uuid object).
+		//	item:
+		//		The item from the store from which to obtain its identifier.
+		//	exceptions:
+		//		Conforming implementations may throw an exception or return null if
+		//		item is not an item.
+		//	example:
+		//	|	var itemId = store.getIdentity(kermit);
+		//	|	assert(kermit === store.findByIdentity(store.getIdentity(kermit)));
+		throw new Error('Unimplemented API: dojo.data.api.Identity.getIdentity');
+		var itemIdentityString = null;
+		return itemIdentityString; // string
+	},
+
+	getIdentityAttributes: function(/* item */ item){
+		//	summary:
+		//		Returns an array of attribute names that are used to generate the identity. 
+		//		For most stores, this is a single attribute, but for some complex stores
+		//		such as RDB backed stores that use compound (multi-attribute) identifiers
+		//		it can be more than one.  If the identity is not composed of attributes
+		//		on the item, it will return null.  This function is intended to identify
+		//		the attributes that comprise the identity so that so that during a render
+		//		of all attributes, the UI can hide the the identity information if it 
+		//		chooses.
+		//	item:
+		//		The item from the store from which to obtain the array of public attributes that 
+		//		compose the identifier, if any.
+		//	example:
+		//	|	var itemId = store.getIdentity(kermit);
+		//	|	var identifiers = store.getIdentityAttributes(itemId);
+		//	|	assert(typeof identifiers === "array" || identifiers === null);
+		throw new Error('Unimplemented API: dojo.data.api.Identity.getIdentityAttributes');
+		return null; // string
+	},
+
+
+	fetchItemByIdentity: function(/* object */ keywordArgs){
+		//	summary:
+		//		Given the identity of an item, this method returns the item that has 
+		//		that identity through the onItem callback.  Conforming implementations 
+		//		should return null if there is no item with the given identity.  
+		//		Implementations of fetchItemByIdentity() may sometimes return an item 
+		//		from a local cache and may sometimes fetch an item from a remote server, 
+		//
+		// 	keywordArgs:
+		//		An anonymous object that defines the item to locate and callbacks to invoke when the 
+		//		item has been located and load has completed.  The format of the object is as follows:
+		//		{
+		//			identity: string|object,
+		//			onItem: Function,
+		//			onError: Function,
+		//			scope: object
+		//		}
+		//	The *identity* parameter.
+		//		The identity parameter is the identity of the item you wish to locate and load
+		//		This attribute is required.  It should be a string or an object that toString() 
+		//		can be called on.
+		//		
+		//	The *onItem* parameter.
+		//		Function(item)
+		//		The onItem parameter is the callback to invoke when the item has been loaded.  It takes only one
+		//		parameter, the item located, or null if none found.
+		//
+		//	The *onError* parameter.
+		//		Function(error)
+		//		The onError parameter is the callback to invoke when the item load encountered an error.  It takes only one
+		//		parameter, the error object
+		//
+		//	The *scope* parameter.
+		//		If a scope object is provided, all of the callback functions (onItem, 
+		//		onError, etc) will be invoked in the context of the scope object.
+		//		In the body of the callback function, the value of the "this"
+		//		keyword will be the scope object.   If no scope object is provided,
+		//		the callback functions will be called in the context of dojo.global.
+		//		For example, onItem.call(scope, item, request) vs. 
+		//		onItem.call(dojo.global, item, request)
+		if (!this.isItemLoaded(keywordArgs.item)) {
+			throw new Error('Unimplemented API: dojo.data.api.Identity.fetchItemByIdentity');
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/api/Notification.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/api/Notification.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/api/Notification.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,119 @@
+if(!dojo._hasResource["dojo.data.api.Notification"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.api.Notification"] = true;
+dojo.provide("dojo.data.api.Notification");
+dojo.require("dojo.data.api.Read");
+
+dojo.declare("dojo.data.api.Notification", dojo.data.api.Read, {
+	//	summary:
+	//		This is an abstract API that data provider implementations conform to.
+	//		This file defines functions signatures and intentionally leaves all the
+	//		functions unimplemented.
+	//
+	//	description:
+	//		This API defines a set of APIs that all datastores that conform to the
+	//		Notifications API must implement.  In general, most stores will implement 
+	//		these APIs as no-op functions for users who wish to monitor them to be able
+	//		to connect to then via dojo.connect().  For non-users of dojo.connect, 
+	//		they should be able to just replace the function on the store to obtain
+	//		 notifications.  Both read-only and read-write stores may implement
+	//		this feature.  In the case of a read-only store, this feature makes sense if 
+	//		the store itself does internal polling to a back-end server and periodically updates
+	//		its cache of items (deletes, adds, and updates).
+	//
+	//	example:
+	//
+	//	|	function onSet(item, attribute, oldValue, newValue) {
+	//	|		//Do something with the information...
+	//	|	};
+	//	|	var store = new some.newStore();
+	//	|	dojo.connect(store, "onSet", onSet);
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return {
+			'dojo.data.api.Read': true,
+			'dojo.data.api.Notification': true
+		};
+	},
+
+	onSet: function(/* item */ item, 
+					/* attribute-name-string */ attribute, 
+					/* object | array */ oldValue,
+					/* object | array */ newValue){
+		//	summary:
+		//		This function is called any time an item is modified via setValue, setValues, unsetAttribute, etc.  
+		//	description:
+		//		This function is called any time an item is modified via setValue, setValues, unsetAttribute, etc.  
+		//		Its purpose is to provide a hook point for those who wish to monitor actions on items in the store 
+		//		in a simple manner.  The general expected usage is to dojo.connect() to the store's 
+		//		implementation and be called after the store function is called.
+		//
+		//	item:
+		//		The item being modified.
+		//	attribute:
+		//		The attribute being changed represented as a string name.
+		//	oldValue:
+		//		The old value of the attribute.  In the case of single value calls, such as setValue, unsetAttribute, etc,
+		//		this value will be generally be an atomic value of some sort (string, int, etc, object).  In the case of 
+		//		multi-valued attributes, it will be an array.
+		//	newValue:
+		//		The new value of the attribute.  In the case of single value calls, such as setValue, this value will be 
+		//		generally be an atomic value of some sort (string, int, etc, object).  In the case of multi-valued attributes, 
+		//		it will be an array.  In the case of unsetAttribute, the new value will be 'undefined'.
+		//
+		//	returns:
+		//		Nothing.
+		throw new Error('Unimplemented API: dojo.data.api.Notification.onSet');
+	},
+
+	onNew: function(/* item */ newItem, /*object?*/ parentInfo){
+		//	summary:
+		//		This function is called any time a new item is created in the store.
+		//		It is called immediately after the store newItem processing has completed.
+		//	description:
+		//		This function is called any time a new item is created in the store.
+		//		It is called immediately after the store newItem processing has completed.
+		//
+		//	newItem:
+		//		The item created.
+		//	parentInfo:
+		//		An optional javascript object that is passed when the item created was placed in the store
+		//		hierarchy as a value f another item's attribute, instead of a root level item.  Note that if this
+		//		function is invoked with a value for parentInfo, then onSet is not invoked stating the attribute of
+		//		the parent item was modified.  This is to avoid getting two notification  events occurring when a new item
+		//		with a parent is created.  The structure passed in is as follows:
+		//		{
+		//			item: someItem,							//The parent item
+		//			attribute:	"attribute-name-string",	//The attribute the new item was assigned to.
+		//			oldValue: something	//Whatever was the previous value for the attribute.  
+		//						//If it is a single-value attribute only, then this value will be a single value.
+		//						//If it was a multi-valued attribute, then this will be an array of all the values minues the new one.
+		//			newValue: something	//The new value of the attribute.  In the case of single value calls, such as setValue, this value will be
+		//						//generally be an atomic value of some sort (string, int, etc, object).  In the case of multi-valued attributes,
+		//						//it will be an array.  
+		//		}
+		//
+		//	returns:
+		//		Nothing.
+		throw new Error('Unimplemented API: dojo.data.api.Notification.onNew');
+	},
+
+	onDelete: function(/* item */ deletedItem){
+		//	summary:
+		//		This function is called any time an item is deleted from the store.
+		//		It is called immediately after the store deleteItem processing has completed.
+		//	description:
+		//		This function is called any time an item is deleted from the store.
+		//		It is called immediately after the store deleteItem processing has completed.
+		//
+		//	deletedItem:
+		//		The item deleted.
+		//
+		//	returns:
+		//		Nothing.
+		throw new Error('Unimplemented API: dojo.data.api.Notification.onDelete');
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/api/Read.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/api/Read.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/api/Read.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,506 @@
+if(!dojo._hasResource["dojo.data.api.Read"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.api.Read"] = true;
+dojo.provide("dojo.data.api.Read");
+dojo.require("dojo.data.api.Request");
+
+dojo.declare("dojo.data.api.Read", null, {
+	//	summary:
+	//		This is an abstract API that data provider implementations conform to.  
+	//		This file defines methods signatures and intentionally leaves all the
+	//		methods unimplemented.  For more information on the dojo.data APIs, 
+	//		please visit: http://www.dojotoolkit.org/node/98
+
+	getValue: function(	/* item */ item, 
+						/* attribute-name-string */ attribute, 
+						/* value? */ defaultValue){
+		//	summary:
+		//		Returns a single attribute value.
+		//		Returns defaultValue if and only if *item* does not have a value for *attribute*.
+		//		Returns null if and only if null was explicitly set as the attribute value.
+		//		Returns undefined if and only if the item does not have a value for the
+		//		given attribute (which is the same as saying the item does not have the attribute). 
+		// description:
+		//		Saying that an "item x does not have a value for an attribute y"
+		//		is identical to saying that an "item x does not have attribute y". 
+		//		It is an oxymoron to say "that attribute is present but has no values" 
+		//		or "the item has that attribute but does not have any attribute values".
+		//		If store.hasAttribute(item, attribute) returns false, then
+		//		store.getValue(item, attribute) will return undefined.
+		//
+		//	item:
+		//		The item to access values on.
+		//	attribute:
+		//		The attribute to access represented as a string.
+		//	defaultValue:
+		//		Optional.  A default value to use for the getValue return in the attribute does not exist or has no value.
+		//
+		//	exceptions:
+		//		Throws an exception if *item* is not an item, or *attribute* is not a string
+		//	example:
+		//	|	var darthVader = store.getValue(lukeSkywalker, "father");
+		var attributeValue = null;
+		throw new Error('Unimplemented API: dojo.data.api.Read.getValue');
+		return attributeValue; // a literal, an item, null, or undefined (never an array)
+	},
+
+	getValues: function(/* item */ item,
+						/* attribute-name-string */ attribute){
+		//	summary:
+		// 		This getValues() method works just like the getValue() method, but getValues()
+		//		always returns an array rather than a single attribute value.  The array
+		//		may be empty, may contain a single attribute value, or may contain
+		//		many attribute values.
+		//		If the item does not have a value for the given attribute, then getValues()
+		//		will return an empty array: [].  (So, if store.hasAttribute(item, attribute)
+		//		has a return of false, then store.getValues(item, attribute) will return [].)
+		//
+		//	item:
+		//		The item to access values on.
+		//	attribute:
+		//		The attribute to access represented as a string.
+		//
+		//	exceptions:
+		//		Throws an exception if *item* is not an item, or *attribute* is not a string
+		//	example:
+		//	|	var friendsOfLuke = store.getValues(lukeSkywalker, "friends");
+		var array = [];
+		throw new Error('Unimplemented API: dojo.data.api.Read.getValues');
+		return array; // an array that may contain literals and items
+	},
+
+	getAttributes: function(/* item */ item){
+		//	summary:
+		//		Returns an array with all the attributes that this item has.  This
+		//		method will always return an array; if the item has no attributes
+		//		at all, getAttributes() will return an empty array: [].
+		//
+		//	item:
+		//		The item to access attributes on.
+		//
+		//	exceptions:
+		//		Throws an exception if *item* is not an item, or *attribute* is not a string
+		//	example:
+		//	|	var array = store.getAttributes(kermit);
+		var array = [];
+		throw new Error('Unimplemented API: dojo.data.api.Read.getAttributes');
+		return array; // array
+	},
+
+	hasAttribute: function(	/* item */ item,
+							/* attribute-name-string */ attribute){
+		//	summary:
+		//		Returns true if the given *item* has a value for the given *attribute*.
+		//
+		//	item:
+		//		The item to access attributes on.
+		//	attribute:
+		//		The attribute to access represented as a string.
+		//
+		//	exceptions:
+		//		Throws an exception if *item* is not an item, or *attribute* is not a string
+		//	example:
+		//	|	var trueOrFalse = store.hasAttribute(kermit, "color");
+		throw new Error('Unimplemented API: dojo.data.api.Read.hasAttribute');
+		return false; // boolean
+	},
+
+	containsValue: function(/* item */ item,
+							/* attribute-name-string */ attribute, 
+							/* anything */ value){
+		//	summary:
+		//		Returns true if the given *value* is one of the values that getValues()
+		//		would return.
+		//
+		//	item:
+		//		The item to access values on.
+		//	attribute:
+		//		The attribute to access represented as a string.
+		//	value:
+		//		The value to match as a value for the attribute.
+		//
+		//	exceptions:
+		//		Throws an exception if *item* is not an item, or *attribute* is not a string
+		//	example:
+		//	|	var trueOrFalse = store.containsValue(kermit, "color", "green");
+		throw new Error('Unimplemented API: dojo.data.api.Read.containsValue');
+		return false; // boolean
+	},
+
+	isItem: function(/* anything */ something){
+		//	summary:
+		//		Returns true if *something* is an item and came from the store instance.  
+		//		Returns false if *something* is a literal, an item from another store instance, 
+		//		or is any object other than an item.
+		//
+		//	something:
+		//		Can be anything.
+		//
+		//	example:
+		//	|	var yes = store.isItem(store.newItem());
+		//	|	var no  = store.isItem("green");
+		throw new Error('Unimplemented API: dojo.data.api.Read.isItem');
+		return false; // boolean
+	},
+
+	isItemLoaded: function(/* anything */ something) {
+		//	summary:
+		//		Returns false if isItem(something) is false.  Returns false if
+		//		if isItem(something) is true but the the item is not yet loaded
+		//		in local memory (for example, if the item has not yet been read
+		//		from the server).
+		//
+		//	something:
+		//		Can be anything.
+		//
+		//	example:
+		//	|	var yes = store.isItemLoaded(store.newItem());
+		//	|	var no  = store.isItemLoaded("green");
+		throw new Error('Unimplemented API: dojo.data.api.Read.isItemLoaded');
+		return false; // boolean
+	},
+
+	loadItem: function(/* object */ keywordArgs){
+		//	summary:
+		//		Given an item, this method loads the item so that a subsequent call
+		//		to store.isItemLoaded(item) will return true.  If a call to
+		//		isItemLoaded() returns true before loadItem() is even called,
+		//		then loadItem() need not do any work at all and will not even invoke
+		//		the callback handlers.  So, before invoking this method, check that
+		//		the item has not already been loaded.  
+		// 	keywordArgs:
+		//		An anonymous object that defines the item to load and callbacks to invoke when the 
+		//		load has completed.  The format of the object is as follows:
+		//		{
+		//			item: object,
+		//			onItem: Function,
+		//			onError: Function,
+		//			scope: object
+		//		}
+		//	The *item* parameter.
+		//		The item parameter is an object that represents the item in question that should be
+		//		contained by the store.  This attribute is required.
+		
+		//	The *onItem* parameter.
+		//		Function(item)
+		//		The onItem parameter is the callback to invoke when the item has been loaded.  It takes only one
+		//		parameter, the fully loaded item.
+		//
+		//	The *onError* parameter.
+		//		Function(error)
+		//		The onError parameter is the callback to invoke when the item load encountered an error.  It takes only one
+		//		parameter, the error object
+		//
+		//	The *scope* parameter.
+		//		If a scope object is provided, all of the callback functions (onItem, 
+		//		onError, etc) will be invoked in the context of the scope object.
+		//		In the body of the callback function, the value of the "this"
+		//		keyword will be the scope object.   If no scope object is provided,
+		//		the callback functions will be called in the context of dojo.global().
+		//		For example, onItem.call(scope, item, request) vs. 
+		//		onItem.call(dojo.global(), item, request)
+		if (!this.isItemLoaded(keywordArgs.item)) {
+			throw new Error('Unimplemented API: dojo.data.api.Read.loadItem');
+		}
+	},
+
+	fetch: function(/* Object */ keywordArgs){
+		//	summary:
+		//		Given a query and set of defined options, such as a start and count of items to return,
+		//		this method executes the query and makes the results available as data items.
+		//		The format and expectations of stores is that they operate in a generally asynchronous 
+		//		manner, therefore callbacks are always used to return items located by the fetch parameters.
+		//
+		//	description:
+		//		A Request object will always be returned and is returned immediately.
+		//		The basic request is nothing more than the keyword args passed to fetch and 
+		//		an additional function attached, abort().  The returned request object may then be used 
+		//		to cancel a fetch.  All data items returns are passed through the callbacks defined in the 
+		//		fetch parameters and are not present on the 'request' object.
+		//
+		//		This does not mean that custom stores can not add methods and properties to the request object
+		//		returned, only that the API does not require it.  For more info about the Request API, 
+		//		see dojo.data.api.Request
+		//
+		//	keywordArgs:
+		//		The keywordArgs parameter may either be an instance of 
+		//		conforming to dojo.data.api.Request or may be a simple anonymous object
+		//		that may contain any of the following:
+		//		{ 
+		//			query: query-object or query-string,
+		//			queryOptions: object,
+		//			onBegin: Function,
+		//			onItem: Function,
+		//			onComplete: Function,
+		//			onError: Function,
+		//			scope: object,
+		//			start: int
+		//			count: int
+		//			sort: array
+		//		}
+		//		All implementations should accept keywordArgs objects with any of
+		//		the 9 standard properties: query, onBegin, onItem, onComplete, onError 
+		//		scope, sort, start, and count.  Some implementations may accept additional 
+		//		properties in the keywordArgs object as valid parameters, such as 
+		//		{includeOutliers:true}.         
+		//
+		//	The *query* parameter.
+		//		The query may be optional in some data store implementations.
+		//		The dojo.data.api.Read API does not specify the syntax or semantics
+		//		of the query itself -- each different data store implementation
+		//		may have its own notion of what a query should look like.
+		//		However, as of dojo 0.9, 1.0, and 1.1, all the provided datastores in dojo.data
+		//		and dojox.data support an object structure query, where the object is a set of 
+		//		name/value parameters such as { attrFoo: valueBar, attrFoo1: valueBar1}.  Most of the
+		//		dijit widgets, such as ComboBox assume this to be the case when working with a datastore 
+		//		when they dynamically update the query.  Therefore, for maximum compatibility with dijit 
+		//		widgets the recommended query parameter is a key/value object.  That does not mean that the
+		//		the datastore may not take alternative query forms, such as a simple string, a Date, a number, 
+		//		or a mix of such.  Ultimately, The dojo.data.api.Read API is agnostic about what the query 
+		//		format.  
+		//		Further note:  In general for query objects that accept strings as attribute 
+		//		value matches, the store should also support basic filtering capability, such as * 
+		//		(match any character) and ? (match single character).  An example query that is a query object
+		//		would be like: { attrFoo: "value*"}.  Which generally means match all items where they have 
+		//		an attribute named attrFoo, with a value that starts with 'value'.
+		//
+		//	The *queryOptions* parameter
+		//		The queryOptions parameter is an optional parameter used to specify optiosn that may modify
+		//		the query in some fashion, such as doing a case insensitive search, or doing a deep search
+		//		where all items in a hierarchical representation of data are scanned instead of just the root 
+		//		items.  It currently defines two options that all datastores should attempt to honor if possible:
+		//		{
+		//			ignoreCase: boolean, //Whether or not the query should match case sensitively or not.  Default behaviour is false.
+		//			deep: boolean 	//Whether or not a fetch should do a deep search of items and all child 
+		//							//items instead of just root-level items in a datastore.  Default is false.
+		//		}
+		//
+		//	The *onBegin* parameter.
+		//		function(size, request);
+		//		If an onBegin callback function is provided, the callback function
+		//		will be called just once, before the first onItem callback is called.
+		//		The onBegin callback function will be passed two arguments, the
+		//		the total number of items identified and the Request object.  If the total number is
+		//		unknown, then size will be -1.  Note that size is not necessarily the size of the 
+		//		collection of items returned from the query, as the request may have specified to return only a 
+		//		subset of the total set of items through the use of the start and count parameters.
+		//
+		//	The *onItem* parameter.
+		//		function(item, request);
+		//		If an onItem callback function is provided, the callback function
+		//		will be called as each item in the result is received. The callback 
+		//		function will be passed two arguments: the item itself, and the
+		//		Request object.
+		//
+		//	The *onComplete* parameter.
+		//		function(items, request);
+		//
+		//		If an onComplete callback function is provided, the callback function
+		//		will be called just once, after the last onItem callback is called.
+		//		Note that if the onItem callback is not present, then onComplete will be passed
+		//		an array containing all items which matched the query and the request object.  
+		//		If the onItem callback is present, then onComplete is called as: 
+		//		onComplete(null, request).
+		//
+		//	The *onError* parameter.
+		//		function(errorData, request); 
+		//		If an onError callback function is provided, the callback function
+		//		will be called if there is any sort of error while attempting to
+		//		execute the query.
+		//		The onError callback function will be passed two arguments:
+		//		an Error object and the Request object.
+		//
+		//	The *scope* parameter.
+		//		If a scope object is provided, all of the callback functions (onItem, 
+		//		onComplete, onError, etc) will be invoked in the context of the scope
+		//		object.  In the body of the callback function, the value of the "this"
+		//		keyword will be the scope object.   If no scope object is provided,
+		//		the callback functions will be called in the context of dojo.global().  
+		//		For example, onItem.call(scope, item, request) vs. 
+		//		onItem.call(dojo.global(), item, request)
+		//
+		//	The *start* parameter.
+		//		If a start parameter is specified, this is a indication to the datastore to 
+		//		only start returning items once the start number of items have been located and
+		//		skipped.  When this parameter is paired withh 'count', the store should be able
+		//		to page across queries with millions of hits by only returning subsets of the 
+		//		hits for each query
+		//
+		//	The *count* parameter.
+		//		If a count parameter is specified, this is a indication to the datastore to 
+		//		only return up to that many items.  This allows a fetch call that may have 
+		//		millions of item matches to be paired down to something reasonable.  
+		//
+		//	The *sort* parameter.
+		//		If a sort parameter is specified, this is a indication to the datastore to 
+		//		sort the items in some manner before returning the items.  The array is an array of 
+		//		javascript objects that must conform to the following format to be applied to the
+		//		fetching of items:
+		//		{
+		//			attribute: attribute || attribute-name-string,
+		//			descending: true|false;   // Optional.  Default is false.
+		//		}
+		//		Note that when comparing attributes, if an item contains no value for the attribute
+		//		(undefined), then it the default ascending sort logic should push it to the bottom 
+		//		of the list.  In the descending order case, it such items should appear at the top of the list.
+		// 
+		//	returns:
+		//		The fetch() method will return a javascript object conforming to the API
+		//		defined in dojo.data.api.Request.  In general, it will be the keywordArgs
+		//		object returned with the required functions in Request.js attached.
+		//		Its general purpose is to provide a convenient way for a caller to abort an
+		//		ongoing fetch.  
+		// 
+		//		The Request object may also have additional properties when it is returned
+		//		such as request.store property, which is a pointer to the datastore object that 
+		//		fetch() is a method of.
+		//
+		//	exceptions:
+		//		Throws an exception if the query is not valid, or if the query
+		//		is required but was not supplied.
+		//
+		//	example:
+		//		Fetch all books identified by the query and call 'showBooks' when complete
+		//		|	var request = store.fetch({query:"all books", onComplete: showBooks});
+		//	example:
+		//		Fetch all items in the story and call 'showEverything' when complete.
+		//		|	var request = store.fetch(onComplete: showEverything);
+		//	example:
+		//		Fetch only 10 books that match the query 'all books', starting at the fifth book found during the search.
+		//		This demonstrates how paging can be done for specific queries.  
+		//		|	var request = store.fetch({query:"all books", start: 4, count: 10, onComplete: showBooks});
+		//	example:
+		//		Fetch all items that match the query, calling 'callback' each time an item is located.
+		//		|	var request = store.fetch({query:"foo/bar", onItem:callback});
+		//	example:
+		//		Fetch the first 100 books by author King, call showKing when up to 100 items have been located.
+		//		|	var request = store.fetch({query:{author:"King"}, start: 0, count:100, onComplete: showKing});
+		//	example:
+		//		Locate the books written by Author King, sort it on title and publisher, then return the first 100 items from the sorted items.
+		//		|	var request = store.fetch({query:{author:"King"}, sort: [{ attribute: "title", descending: true}, {attribute: "publisher"}], ,start: 0, count:100, onComplete: 'showKing'});
+		//	example:
+		//		Fetch the first 100 books by authors starting with the name King, then call showKing when up to 100 items have been located.
+		//		|	var request = store.fetch({query:{author:"King*"}, start: 0, count:100, onComplete: showKing});
+		//	example:
+		//		Fetch the first 100 books by authors ending with 'ing', but only have one character before it (King, Bing, Ling, Sing, etc.), then call showBooks when up to 100 items have been located.
+		//		|	var request = store.fetch({query:{author:"?ing"}, start: 0, count:100, onComplete: showBooks});
+		//	example:
+		//		Fetch the first 100 books by author King, where the name may appear as King, king, KING, kInG, and so on, then call showKing when up to 100 items have been located.
+		//		|	var request = store.fetch({query:{author:"King"}, queryOptions:(ignoreCase: true}, start: 0, count:100, onComplete: showKing});
+		//	example:
+		//		Paging
+		//		|	var store = new dojo.data.LargeRdbmsStore({url:"jdbc:odbc:foobar"});
+		//		|	var fetchArgs = {
+		//		|		query: {type:"employees", name:"Hillary *"}, // string matching
+		//		|		sort: [{attribute:"department", descending:true}],
+		//		|		start: 0,
+		//		|		count: 20,
+		//		|		scope: displayer,
+		//		|		onBegin: showThrobber,
+		//		|		onItem: displayItem,
+		//		|		onComplete: stopThrobber,
+		//		|		onError: handleFetchError,
+		//		|	};
+		//		|	store.fetch(fetchArgs);
+		//		|	...
+		//		and then when the user presses the "Next Page" button...
+		//		|	fetchArgs.start += 20;
+		//		|	store.fetch(fetchArgs);  // get the next 20 items
+		var request = null; 
+		throw new Error('Unimplemented API: dojo.data.api.Read.fetch');
+		return request; // an object conforming to the dojo.data.api.Request API
+	},
+
+	getFeatures: function(){
+		//	summary:
+		//		The getFeatures() method returns an simple keyword values object 
+		//		that specifies what interface features the datastore implements.  
+		//		A simple CsvStore may be read-only, and the only feature it 
+		//		implements will be the 'dojo.data.api.Read' interface, so the
+		//		getFeatures() method will return an object like this one:
+		//		{'dojo.data.api.Read': true}.
+		//		A more sophisticated datastore might implement a variety of
+		//		interface features, like 'dojo.data.api.Read', 'dojo.data.api.Write', 
+		//		'dojo.data.api.Identity', and 'dojo.data.api.Attribution'.
+		return {
+			'dojo.data.api.Read': true
+		};
+	},
+
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		//	summary:
+		//		The close() method is intended for instructing the store to 'close' out 
+		//		any information associated with a particular request.
+		//
+		//	description:
+		//		The close() method is intended for instructing the store to 'close' out 
+		//		any information associated with a particular request.  In general, this API
+		//		expects to recieve as a parameter a request object returned from a fetch.  
+		//		It will then close out anything associated with that request, such as 
+		//		clearing any internal datastore caches and closing any 'open' connections.
+		//		For some store implementations, this call may be a no-op.
+		//
+		//	request:
+		//		An instance of a request for the store to use to identify what to close out.
+		//		If no request is passed, then the store should clear all internal caches (if any)
+		//		and close out all 'open' connections.  It does not render the store unusable from
+		//		there on, it merely cleans out any current data and resets the store to initial 
+		//		state.
+		//
+		//	example:
+		//	|	var request = store.fetch({onComplete: doSomething});
+		//	|	...
+		//	|	store.close(request);
+		throw new Error('Unimplemented API: dojo.data.api.Read.close');
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary:
+		//		Method to inspect the item and return a user-readable 'label' for the item
+		//		that provides a general/adequate description of what the item is. 
+		//
+		//	description:
+		//		Method to inspect the item and return a user-readable 'label' for the item
+		//		that provides a general/adequate description of what the item is.  In general
+		//		most labels will be a specific attribute value or collection of the attribute
+		//		values that combine to label the item in some manner.  For example for an item
+		//		that represents a person it may return the label as:  "firstname lastlame" where
+		//		the firstname and lastname are attributes on the item.  If the store is unable 
+		//		to determine an adequate human readable label, it should return undefined.  Users that wish
+		//		to customize how a store instance labels items should replace the getLabel() function on 
+		//		their instance of the store, or extend the store and replace the function in 
+		//		the extension class.
+		//
+		//	item:
+	   	//		The item to return the label for.
+		//
+		//	returns: 
+		//		A user-readable string representing the item or undefined if no user-readable label can 
+		//		be generated.
+		throw new Error('Unimplemented API: dojo.data.api.Read.getLabel');
+		return undefined;
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary:
+		//		Method to inspect the item and return an array of what attributes of the item were used 
+		//		to generate its label, if any.
+		//
+		//	description:
+		//		Method to inspect the item and return an array of what attributes of the item were used 
+		//		to generate its label, if any.  This function is to assist UI developers in knowing what
+		//		attributes can be ignored out of the attributes an item has when displaying it, in cases
+		//		where the UI is using the label as an overall identifer should they wish to hide 
+		//		redundant information.
+		//
+		//	item:
+	   	//		The item to return the list of label attributes for.
+		//
+		//	returns: 
+		//		An array of attribute names that were used to generate the label, or null if public attributes 
+		//		were not used to generate the label.
+		throw new Error('Unimplemented API: dojo.data.api.Read.getLabelAttributes');
+		return null;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/api/Request.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/api/Request.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/api/Request.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,32 @@
+if(!dojo._hasResource["dojo.data.api.Request"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.api.Request"] = true;
+dojo.provide("dojo.data.api.Request");
+
+dojo.declare("dojo.data.api.Request", null, {
+	//	summary:
+	//		This class defines out the semantics of what a 'Request' object looks like
+	//		when returned from a fetch() method.  In general, a request object is
+	//		nothing more than the original keywordArgs from fetch with an abort function 
+	//		attached to it to allow users to abort a particular request if they so choose. 
+	//		No other functions are required on a general Request object return.  That does not
+	//		inhibit other store implementations from adding extentions to it, of course.
+	//
+	//		This is an abstract API that data provider implementations conform to.  
+	//		This file defines methods signatures and intentionally leaves all the
+	//		methods unimplemented.
+	//
+	//		For more details on fetch, see dojo.data.api.Read.fetch().
+
+	abort: function(){
+		//	summary:
+		//		This function is a hook point for stores to provide as a way for 
+		//		a fetch to be halted mid-processing.
+		//	description:
+		//		This function is a hook point for stores to provide as a way for 
+		//		a fetch to be halted mid-processing.  For more details on the fetch() api,
+		//		please see dojo.data.api.Read.fetch().
+		throw new Error('Unimplemented API: dojo.data.api.Request.abort');
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/api/Write.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/api/Write.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/api/Write.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,226 @@
+if(!dojo._hasResource["dojo.data.api.Write"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.api.Write"] = true;
+dojo.provide("dojo.data.api.Write");
+dojo.require("dojo.data.api.Read");
+
+dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
+	//	summary:
+	//		This is an abstract API that data provider implementations conform to.  
+	//		This file defines function signatures and intentionally leaves all the
+	//		functionss unimplemented.
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return {
+			'dojo.data.api.Read': true,
+			'dojo.data.api.Write': true
+		};
+	},
+
+	newItem: function(/* Object? */ keywordArgs, /*Object?*/ parentInfo){
+		//	summary:
+		//		Returns a newly created item.  Sets the attributes of the new
+		//		item based on the *keywordArgs* provided.  In general, the attribute
+		//		names in the keywords become the attributes in the new item and as for
+		//		the attribute values in keywordArgs, they become the values of the attributes
+		//		in the new item.  In addition, for stores that support hierarchical item 
+		//		creation, an optional second parameter is accepted that defines what item is the parent
+		//		of the new item and what attribute of that item should the new item be assigned to.
+		//		In general, this will assume that the attribute targetted is multi-valued and a new item
+		//		is appended onto the list of values for that attribute.  
+		//
+		//	keywordArgs:
+		//		A javascript object defining the initial content of the item as a set of JavaScript 'property name: value' pairs.
+		//	parentInfo:
+		//		An optional javascript object defining what item is the parent of this item (in a hierarchical store.  Not all stores do hierarchical items), 
+		//		and what attribute of that parent to assign the new item to.  If this is present, and the attribute specified
+		//		is a multi-valued attribute, it will append this item into the array of values for that attribute.  The structure
+		//		of the object is as follows:
+		//		{
+		//			parent: someItem,
+		//			attribute: "attribute-name-string"
+		//		}
+		//
+		//	exceptions:
+		//		Throws an exception if *keywordArgs* is a string or a number or
+		//		anything other than a simple anonymous object.  
+		//		Throws an exception if the item in parentInfo is not an item from the store
+		//		or if the attribute isn't an attribute name string.
+		//	example:
+		//	|	var kermit = store.newItem({name: "Kermit", color:[blue, green]});
+
+		var newItem;
+		throw new Error('Unimplemented API: dojo.data.api.Write.newItem');
+		return newItem; // item
+	},
+
+	deleteItem: function(/* item */ item){
+		//	summary:
+		//		Deletes an item from the store.
+		//
+		//	item: 
+		//		The item to delete.
+		//
+		//	exceptions:
+		//		Throws an exception if the argument *item* is not an item 
+		//		(if store.isItem(item) returns false).
+		//	example:
+		//	|	var success = store.deleteItem(kermit);
+		throw new Error('Unimplemented API: dojo.data.api.Write.deleteItem');
+		return false; // boolean
+	},
+
+	setValue: function(	/* item */ item, 
+						/* string */ attribute,
+						/* almost anything */ value){
+		//	summary:
+		//		Sets the value of an attribute on an item.
+		//		Replaces any previous value or values.
+		//
+		//	item:
+		//		The item to modify.
+		//	attribute:
+		//		The attribute of the item to change represented as a string name.
+		//	value:
+		//		The value to assign to the item.
+		//
+		//	exceptions:
+		//		Throws an exception if *item* is not an item, or if *attribute*
+		//		is neither an attribute object or a string.
+		//		Throws an exception if *value* is undefined.
+		//	example:
+		//	|	var success = store.set(kermit, "color", "green");
+		throw new Error('Unimplemented API: dojo.data.api.Write.setValue');
+		return false; // boolean
+	},
+
+	setValues: function(/* item */ item,
+						/* string */ attribute, 
+						/* array */ values){
+		//	summary:
+		//		Adds each value in the *values* array as a value of the given
+		//		attribute on the given item.
+		//		Replaces any previous value or values.
+		//		Calling store.setValues(x, y, []) (with *values* as an empty array) has
+		//		the same effect as calling store.unsetAttribute(x, y).
+		//
+		//	item:
+		//		The item to modify.
+		//	attribute:
+		//		The attribute of the item to change represented as a string name.
+		//	values:
+		//		An array of values to assign to the attribute..
+		//
+		//	exceptions:
+		//		Throws an exception if *values* is not an array, if *item* is not an
+		//		item, or if *attribute* is neither an attribute object or a string.
+		//	example:
+		//	|	var success = store.setValues(kermit, "color", ["green", "aqua"]);
+		//	|	success = store.setValues(kermit, "color", []);
+		//	|	if (success) {assert(!store.hasAttribute(kermit, "color"));}
+		throw new Error('Unimplemented API: dojo.data.api.Write.setValues');
+		return false; // boolean
+	},
+
+	unsetAttribute: function(	/* item */ item, 
+								/* string */ attribute){
+		//	summary:
+		//		Deletes all the values of an attribute on an item.
+		//
+		//	item:
+		//		The item to modify.
+		//	attribute:
+		//		The attribute of the item to unset represented as a string.
+		//
+		//	exceptions:
+		//		Throws an exception if *item* is not an item, or if *attribute*
+		//		is neither an attribute object or a string.
+		//	example:
+		//	|	var success = store.unsetAttribute(kermit, "color");
+		//	|	if (success) {assert(!store.hasAttribute(kermit, "color"));}
+		throw new Error('Unimplemented API: dojo.data.api.Write.clear');
+		return false; // boolean
+	},
+
+	save: function(/* object */ keywordArgs){
+		//	summary:
+		//		Saves to the server all the changes that have been made locally.
+		//		The save operation may take some time and is generally performed
+		//		in an asynchronous fashion.  The outcome of the save action is 
+		//		is passed into the set of supported callbacks for the save.
+		//   
+		//	keywordArgs:
+		//		{
+		//			onComplete: function
+		//			onError: function
+		//			scope: object
+		//		}
+		//
+		//	The *onComplete* parameter.
+		//		function();
+		//
+		//		If an onComplete callback function is provided, the callback function
+		//		will be called just once, after the save has completed.  No parameters
+		//		are generally passed to the onComplete.
+		//
+		//	The *onError* parameter.
+		//		function(errorData); 
+		//
+		//		If an onError callback function is provided, the callback function
+		//		will be called if there is any sort of error while attempting to
+		//		execute the save.  The onError function will be based one parameter, the
+		//		error.
+		//
+		//	The *scope* parameter.
+		//		If a scope object is provided, all of the callback function (
+		//		onComplete, onError, etc) will be invoked in the context of the scope
+		//		object.  In the body of the callback function, the value of the "this"
+		//		keyword will be the scope object.   If no scope object is provided,
+		//		the callback functions will be called in the context of dojo.global.  
+		//		For example, onComplete.call(scope) vs. 
+		//		onComplete.call(dojo.global)
+		//
+		//	returns:
+		//		Nothing.  Since the saves are generally asynchronous, there is 
+		//		no need to return anything.  All results are passed via callbacks.
+		//	example:
+		//	|	store.save({onComplete: onSave});
+		//	|	store.save({scope: fooObj, onComplete: onSave, onError: saveFailed});
+		throw new Error('Unimplemented API: dojo.data.api.Write.save');
+	},
+
+	revert: function(){
+		//	summary:
+		//		Discards any unsaved changes.
+		//	description:
+		//		Discards any unsaved changes.
+		//
+		//	example:
+		//	|	var success = store.revert();
+		throw new Error('Unimplemented API: dojo.data.api.Write.revert');
+		return false; // boolean
+	},
+
+	isDirty: function(/* item? */ item){
+		//	summary:
+		//		Given an item, isDirty() returns true if the item has been modified 
+		//		since the last save().  If isDirty() is called with no *item* argument,  
+		//		then this function returns true if any item has been modified since
+		//		the last save().
+		//
+		//	item:
+		//		The item to check.
+		//
+		//	exceptions:
+		//		Throws an exception if isDirty() is passed an argument and the
+		//		argument is not an item.
+		//	example:
+		//	|	var trueOrFalse = store.isDirty(kermit); // true if kermit is dirty
+		//	|	var trueOrFalse = store.isDirty();       // true if any item is dirty
+		throw new Error('Unimplemented API: dojo.data.api.Write.isDirty');
+		return false; // boolean
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/util/filter.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/util/filter.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/util/filter.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,69 @@
+if(!dojo._hasResource["dojo.data.util.filter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.util.filter"] = true;
+dojo.provide("dojo.data.util.filter");
+
+dojo.data.util.filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/ ignoreCase){
+	//	summary:  
+	//		Helper function to convert a simple pattern to a regular expression for matching.
+	//	description:
+	//		Returns a regular expression object that conforms to the defined conversion rules.
+	//		For example:  
+	//			ca*   -> /^ca.*$/
+	//			*ca*  -> /^.*ca.*$/
+	//			*c\*a*  -> /^.*c\*a.*$/
+	//			*c\*a?*  -> /^.*c\*a..*$/
+	//			and so on.
+	//
+	//	pattern: string
+	//		A simple matching pattern to convert that follows basic rules:
+	//			* Means match anything, so ca* means match anything starting with ca
+	//			? Means match single character.  So, b?b will match to bob and bab, and so on.
+	//      	\ is an escape character.  So for example, \* means do not treat * as a match, but literal character *.
+	//				To use a \ as a character in the string, it must be escaped.  So in the pattern it should be 
+	//				represented by \\ to be treated as an ordinary \ character instead of an escape.
+	//
+	//	ignoreCase:
+	//		An optional flag to indicate if the pattern matching should be treated as case-sensitive or not when comparing
+	//		By default, it is assumed case sensitive.
+
+	var rxp = "^";
+	var c = null;
+	for(var i = 0; i < pattern.length; i++){
+		c = pattern.charAt(i);
+		switch (c) {
+			case '\\':
+				rxp += c;
+				i++;
+				rxp += pattern.charAt(i);
+				break;
+			case '*':
+				rxp += ".*"; break;
+			case '?':
+				rxp += "."; break;
+			case '$':
+			case '^':
+			case '/':
+			case '+':
+			case '.':
+			case '|':
+			case '(':
+			case ')':
+			case '{':
+			case '}':
+			case '[':
+			case ']':
+				rxp += "\\"; //fallthrough
+			default:
+				rxp += c;
+		}
+	}
+	rxp += "$";
+	if(ignoreCase){
+		return new RegExp(rxp,"i"); //RegExp
+	}else{
+		return new RegExp(rxp); //RegExp
+	}
+	
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/util/simpleFetch.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/util/simpleFetch.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/util/simpleFetch.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,90 @@
+if(!dojo._hasResource["dojo.data.util.simpleFetch"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.util.simpleFetch"] = true;
+dojo.provide("dojo.data.util.simpleFetch");
+dojo.require("dojo.data.util.sorter");
+
+dojo.data.util.simpleFetch.fetch = function(/* Object? */ request){
+	//	summary:
+	//		The simpleFetch mixin is designed to serve as a set of function(s) that can
+	//		be mixed into other datastore implementations to accelerate their development.  
+	//		The simpleFetch mixin should work well for any datastore that can respond to a _fetchItems() 
+	//		call by returning an array of all the found items that matched the query.  The simpleFetch mixin
+	//		is not designed to work for datastores that respond to a fetch() call by incrementally
+	//		loading items, or sequentially loading partial batches of the result
+	//		set.  For datastores that mixin simpleFetch, simpleFetch 
+	//		implements a fetch method that automatically handles eight of the fetch()
+	//		arguments -- onBegin, onItem, onComplete, onError, start, count, sort and scope
+	//		The class mixing in simpleFetch should not implement fetch(),
+	//		but should instead implement a _fetchItems() method.  The _fetchItems() 
+	//		method takes three arguments, the keywordArgs object that was passed 
+	//		to fetch(), a callback function to be called when the result array is
+	//		available, and an error callback to be called if something goes wrong.
+	//		The _fetchItems() method should ignore any keywordArgs parameters for
+	//		start, count, onBegin, onItem, onComplete, onError, sort, and scope.  
+	//		The _fetchItems() method needs to correctly handle any other keywordArgs
+	//		parameters, including the query parameter and any optional parameters 
+	//		(such as includeChildren).  The _fetchItems() method should create an array of 
+	//		result items and pass it to the fetchHandler along with the original request object 
+	//		-- or, the _fetchItems() method may, if it wants to, create an new request object 
+	//		with other specifics about the request that are specific to the datastore and pass 
+	//		that as the request object to the handler.
+	//
+	//		For more information on this specific function, see dojo.data.api.Read.fetch()
+	request = request || {};
+	if(!request.store){
+		request.store = this;
+	}
+	var self = this;
+
+	var _errorHandler = function(errorData, requestObject){
+		if(requestObject.onError){
+			var scope = requestObject.scope || dojo.global;
+			requestObject.onError.call(scope, errorData, requestObject);
+		}
+	};
+
+	var _fetchHandler = function(items, requestObject){
+		var oldAbortFunction = requestObject.abort || null;
+		var aborted = false;
+
+		var startIndex = requestObject.start?requestObject.start:0;
+		var endIndex   = requestObject.count?(startIndex + requestObject.count):items.length;
+
+		requestObject.abort = function(){
+			aborted = true;
+			if(oldAbortFunction){
+				oldAbortFunction.call(requestObject);
+			}
+		};
+
+		var scope = requestObject.scope || dojo.global;
+		if(!requestObject.store){
+			requestObject.store = self;
+		}
+		if(requestObject.onBegin){
+			requestObject.onBegin.call(scope, items.length, requestObject);
+		}
+		if(requestObject.sort){
+			items.sort(dojo.data.util.sorter.createSortFunction(requestObject.sort, self));
+		}
+		if(requestObject.onItem){
+			for(var i = startIndex; (i < items.length) && (i < endIndex); ++i){
+				var item = items[i];
+				if(!aborted){
+					requestObject.onItem.call(scope, item, requestObject);
+				}
+			}
+		}
+		if(requestObject.onComplete && !aborted){
+			var subset = null;
+			if (!requestObject.onItem) {
+				subset = items.slice(startIndex, endIndex);
+			}
+			requestObject.onComplete.call(scope, subset, requestObject);   
+		}
+	};
+	this._fetchItems(request, _fetchHandler, _errorHandler);
+	return request;	// Object
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/data/util/sorter.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/data/util/sorter.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/data/util/sorter.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,81 @@
+if(!dojo._hasResource["dojo.data.util.sorter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.data.util.sorter"] = true;
+dojo.provide("dojo.data.util.sorter");
+
+dojo.data.util.sorter.basicComparator = function(	/*anything*/ a, 
+													/*anything*/ b){
+	//	summary:  
+	//		Basic comparision function that compares if an item is greater or less than another item
+	//	description:  
+	//		returns 1 if a > b, -1 if a < b, 0 if equal.
+	//		undefined values are treated as larger values so that they're pushed to the end of the list.
+
+	var ret = 0;
+	if(a > b || typeof a === "undefined" || a === null){
+		ret = 1;
+	}else if(a < b || typeof b === "undefined" || b === null){
+		ret = -1;
+	}
+	return ret; //int, {-1,0,1}
+};
+
+dojo.data.util.sorter.createSortFunction = function(	/* attributes array */sortSpec,
+														/*dojo.data.core.Read*/ store){
+	//	summary:  
+	//		Helper function to generate the sorting function based off the list of sort attributes.
+	//	description:  
+	//		The sort function creation will look for a property on the store called 'comparatorMap'.  If it exists
+	//		it will look in the mapping for comparisons function for the attributes.  If one is found, it will
+	//		use it instead of the basic comparator, which is typically used for strings, ints, booleans, and dates.
+	//		Returns the sorting function for this particular list of attributes and sorting directions.
+	//
+	//	sortSpec: array
+	//		A JS object that array that defines out what attribute names to sort on and whether it should be descenting or asending.
+	//		The objects should be formatted as follows:
+	//		{
+	//			attribute: "attributeName-string" || attribute,
+	//			descending: true|false;   // Default is false.
+	//		}
+	//	store: object
+	//		The datastore object to look up item values from.
+	//
+	var sortFunctions=[];   
+
+	function createSortFunction(attr, dir){
+		return function(itemA, itemB){
+			var a = store.getValue(itemA, attr);
+			var b = store.getValue(itemB, attr);
+			//See if we have a override for an attribute comparison.
+			var comparator = null;
+			if(store.comparatorMap){
+				if(typeof attr !== "string"){
+					 attr = store.getIdentity(attr);
+				}
+				comparator = store.comparatorMap[attr]||dojo.data.util.sorter.basicComparator;
+			}
+			comparator = comparator||dojo.data.util.sorter.basicComparator; 
+			return dir * comparator(a,b); //int
+		};
+	}
+
+	for(var i = 0; i < sortSpec.length; i++){
+		sortAttribute = sortSpec[i];
+		if(sortAttribute.attribute){
+			var direction = (sortAttribute.descending) ? -1 : 1;
+			sortFunctions.push(createSortFunction(sortAttribute.attribute, direction));
+		}
+	}
+
+	return function(rowA, rowB){
+		var i=0;
+		while(i < sortFunctions.length){
+			var ret = sortFunctions[i++](rowA, rowB);
+			if(ret !== 0){
+				return ret;//int
+			}
+		}
+		return 0; //int  
+	};  //  Function
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/date/locale.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/date/locale.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/date/locale.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,656 @@
+if(!dojo._hasResource["dojo.date.locale"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.date.locale"] = true;
+dojo.provide("dojo.date.locale");
+
+// Localization methods for Date.   Honor local customs using locale-dependent dojo.cldr data.
+
+dojo.require("dojo.date");
+dojo.require("dojo.cldr.supplemental");
+dojo.require("dojo.regexp");
+dojo.require("dojo.string");
+dojo.require("dojo.i18n");
+
+// Load the bundles containing localization information for
+// names and formats
+dojo.requireLocalization("dojo.cldr", "gregorian", null, "zh-cn,zh,en-ca,ko-kr,pt,pt-br,it-it,ROOT,en-gb,de,ja,en,en-au,fr,es,ko,zh-tw,it,es-es");
+
+//NOTE: Everything in this module assumes Gregorian calendars.
+// Other calendars will be implemented in separate modules.
+
+(function(){
+	// Format a pattern without literals
+	function formatPattern(dateObject, bundle, fullYear, pattern){
+		return pattern.replace(/([a-z])\1*/ig, function(match){
+			var s, pad;
+			var c = match.charAt(0);
+			var l = match.length;
+			var widthList = ["abbr", "wide", "narrow"];
+			switch(c){
+				case 'G':
+					s = bundle[(l < 4) ? "eraAbbr" : "eraNames"][dateObject.getFullYear() < 0 ? 0 : 1];
+					break;
+				case 'y':
+					s = dateObject.getFullYear();
+					switch(l){
+						case 1:
+							break;
+						case 2:
+							if(!fullYear){
+								s = String(s); s = s.substr(s.length - 2);
+								break;
+							}
+							// fallthrough
+						default:
+							pad = true;
+					}
+					break;
+				case 'Q':
+				case 'q':
+					s = Math.ceil((dateObject.getMonth()+1)/3);
+//					switch(l){
+//						case 1: case 2:
+							pad = true;
+//							break;
+//						case 3: case 4: // unimplemented
+//					}
+					break;
+				case 'M':
+				case 'L':
+					var m = dateObject.getMonth();
+					var widthM;
+					switch(l){
+						case 1: case 2:
+							s = m+1; pad = true;
+							break;
+						case 3: case 4: case 5:
+							widthM = widthList[l-3];
+							break;
+					}
+					if(widthM){
+						var typeM = (c == "L") ? "standalone" : "format";
+						var propM = ["months", typeM, widthM].join("-");
+						s = bundle[propM][m];
+					}
+					break;
+				case 'w':
+					var firstDay = 0;
+					s = dojo.date.locale._getWeekOfYear(dateObject, firstDay); pad = true;
+					break;
+				case 'd':
+					s = dateObject.getDate(); pad = true;
+					break;
+				case 'D':
+					s = dojo.date.locale._getDayOfYear(dateObject); pad = true;
+					break;
+				case 'E':
+				case 'e':
+				case 'c': // REVIEW: don't see this in the spec?
+					var d = dateObject.getDay();
+					var widthD;
+					switch(l){
+						case 1: case 2:
+							if(c == 'e'){
+								var first = dojo.cldr.supplemental.getFirstDayOfWeek(options.locale);
+								d = (d-first+7)%7;
+							}
+							if(c != 'c'){
+								s = d+1; pad = true;
+								break;
+							}
+							// else fallthrough...
+						case 3: case 4: case 5:
+							widthD = widthList[l-3];
+							break;
+					}
+					if(widthD){
+						var typeD = (c == "c") ? "standalone" : "format";
+						var propD = ["days", typeD, widthD].join("-");
+						s = bundle[propD][d];
+					}
+					break;
+				case 'a':
+					var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm';
+					s = bundle[timePeriod];
+					break;
+				case 'h':
+				case 'H':
+				case 'K':
+				case 'k':
+					var h = dateObject.getHours();
+					// strange choices in the date format make it impossible to write this succinctly
+					switch (c){
+						case 'h': // 1-12
+							s = (h % 12) || 12;
+							break;
+						case 'H': // 0-23
+							s = h;
+							break;
+						case 'K': // 0-11
+							s = (h % 12);
+							break;
+						case 'k': // 1-24
+							s = h || 24;
+							break;
+					}
+					pad = true;
+					break;
+				case 'm':
+					s = dateObject.getMinutes(); pad = true;
+					break;
+				case 's':
+					s = dateObject.getSeconds(); pad = true;
+					break;
+				case 'S':
+					s = Math.round(dateObject.getMilliseconds() * Math.pow(10, l-3)); pad = true;
+					break;
+				case 'v': // FIXME: don't know what this is. seems to be same as z?
+				case 'z':
+					// We only have one timezone to offer; the one from the browser
+					s = dojo.date.getTimezoneName(dateObject);
+					if(s){break;}
+					l=4;
+					// fallthrough... use GMT if tz not available
+				case 'Z':
+					var offset = dateObject.getTimezoneOffset();
+					var tz = [
+						(offset<=0 ? "+" : "-"),
+						dojo.string.pad(Math.floor(Math.abs(offset)/60), 2),
+						dojo.string.pad(Math.abs(offset)% 60, 2)
+					];
+					if(l==4){
+						tz.splice(0, 0, "GMT");
+						tz.splice(3, 0, ":");
+					}
+					s = tz.join("");
+					break;
+//				case 'Y': case 'u': case 'W': case 'F': case 'g': case 'A':
+//					console.debug(match+" modifier unimplemented");
+				default:
+					throw new Error("dojo.date.locale.format: invalid pattern char: "+pattern);
+			}
+			if(pad){ s = dojo.string.pad(s, l); }
+			return s;
+		});
+	}
+
+/*=====
+	dojo.date.locale.__FormatOptions = function(){
+	//	selector: String
+	//		choice of 'time','date' (default: date and time)
+	//	formatLength: String
+	//		choice of long, short, medium or full (plus any custom additions).  Defaults to 'short'
+	//	datePattern:String
+	//		override pattern with this string
+	//	timePattern:String
+	//		override pattern with this string
+	//	am: String
+	//		override strings for am in times
+	//	pm: String
+	//		override strings for pm in times
+	//	locale: String
+	//		override the locale used to determine formatting rules
+	//	fullYear: Boolean
+	//		(format only) use 4 digit years whenever 2 digit years are called for
+	//	strict: Boolean
+	//		(parse only) strict parsing, off by default
+		this.selector = selector;
+		this.formatLength = formatLength;
+		this.datePattern = datePattern;
+		this.timePattern = timePattern;
+		this.am = am;
+		this.pm = pm;
+		this.locale = locale;
+		this.fullYear = fullYear;
+		this.strict = strict;
+	}
+=====*/
+
+dojo.date.locale.format = function(/*Date*/dateObject, /*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Format a Date object as a String, using locale-specific settings.
+	//
+	// description:
+	//		Create a string from a Date object using a known localized pattern.
+	//		By default, this method formats both date and time from dateObject.
+	//		Formatting patterns are chosen appropriate to the locale.  Different
+	//		formatting lengths may be chosen, with "full" used by default.
+	//		Custom patterns may be used or registered with translations using
+	//		the dojo.date.locale.addCustomFormats method.
+	//		Formatting patterns are implemented using [the syntax described at
+	//		unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
+	//
+	// dateObject:
+	//		the date and/or time to be formatted.  If a time only is formatted,
+	//		the values in the year, month, and day fields are irrelevant.  The
+	//		opposite is true when formatting only dates.
+
+	options = options || {};
+
+	var locale = dojo.i18n.normalizeLocale(options.locale);
+	var formatLength = options.formatLength || 'short';
+	var bundle = dojo.date.locale._getGregorianBundle(locale);
+	var str = [];
+	var sauce = dojo.hitch(this, formatPattern, dateObject, bundle, options.fullYear);
+	if(options.selector == "year"){
+		// Special case as this is not yet driven by CLDR data
+		var year = dateObject.getFullYear();
+		if(locale.match(/^zh|^ja/)){
+			year += "\u5E74";
+		}
+		return year;
+	}
+	if(options.selector != "time"){
+		var datePattern = options.datePattern || bundle["dateFormat-"+formatLength];
+		if(datePattern){str.push(_processPattern(datePattern, sauce));}
+	}
+	if(options.selector != "date"){
+		var timePattern = options.timePattern || bundle["timeFormat-"+formatLength];
+		if(timePattern){str.push(_processPattern(timePattern, sauce));}
+	}
+	var result = str.join(" "); //TODO: use locale-specific pattern to assemble date + time
+	return result; // String
+};
+
+dojo.date.locale.regexp = function(/*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Builds the regular needed to parse a localized date
+
+	return dojo.date.locale._parseInfo(options).regexp; // String
+};
+
+dojo.date.locale._parseInfo = function(/*dojo.date.locale.__FormatOptions?*/options){
+	options = options || {};
+	var locale = dojo.i18n.normalizeLocale(options.locale);
+	var bundle = dojo.date.locale._getGregorianBundle(locale);
+	var formatLength = options.formatLength || 'short';
+	var datePattern = options.datePattern || bundle["dateFormat-" + formatLength];
+	var timePattern = options.timePattern || bundle["timeFormat-" + formatLength];
+	var pattern;
+	if(options.selector == 'date'){
+		pattern = datePattern;
+	}else if(options.selector == 'time'){
+		pattern = timePattern;
+	}else{
+		pattern = datePattern + ' ' + timePattern; //TODO: use locale-specific pattern to assemble date + time
+	}
+
+	var tokens = [];
+	var re = _processPattern(pattern, dojo.hitch(this, _buildDateTimeRE, tokens, bundle, options));
+	return {regexp: re, tokens: tokens, bundle: bundle};
+};
+
+dojo.date.locale.parse = function(/*String*/value, /*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Convert a properly formatted string to a primitive Date object,
+	//		using locale-specific settings.
+	//
+	// description:
+	//		Create a Date object from a string using a known localized pattern.
+	//		By default, this method parses looking for both date and time in the string.
+	//		Formatting patterns are chosen appropriate to the locale.  Different
+	//		formatting lengths may be chosen, with "full" used by default.
+	//		Custom patterns may be used or registered with translations using
+	//		the dojo.date.locale.addCustomFormats method.
+	//	
+	//		Formatting patterns are implemented using [the syntax described at
+	//		unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
+	//		When two digit years are used, a century is chosen according to a sliding 
+	//		window of 80 years before and 20 years after present year, for both `yy` and `yyyy` patterns.
+	//		year < 100CE requires strict mode.
+	//
+	// value:
+	//		A string representation of a date
+
+	var info = dojo.date.locale._parseInfo(options);
+	var tokens = info.tokens, bundle = info.bundle;
+	var re = new RegExp("^" + info.regexp + "$");
+	var match = re.exec(value);
+	if(!match){ return null; } // null
+
+	var widthList = ['abbr', 'wide', 'narrow'];
+	var result = [1970,0,1,0,0,0,0]; // will get converted to a Date at the end
+	var amPm = "";
+	var valid = dojo.every(match, function(v, i){
+		if(!i){return true;}
+		var token=tokens[i-1];
+		var l=token.length;
+		switch(token.charAt(0)){
+			case 'y':
+				if(l != 2 && options.strict){
+					//interpret year literally, so '5' would be 5 A.D.
+					result[0] = v;
+				}else{
+					if(v<100){
+						v = Number(v);
+						//choose century to apply, according to a sliding window
+						//of 80 years before and 20 years after present year
+						var year = '' + new Date().getFullYear();
+						var century = year.substring(0, 2) * 100;
+						var cutoff = Math.min(Number(year.substring(2, 4)) + 20, 99);
+						var num = (v < cutoff) ? century + v : century - 100 + v;
+						result[0] = num;
+					}else{
+						//we expected 2 digits and got more...
+						if(options.strict){
+							return false;
+						}
+						//interpret literally, so '150' would be 150 A.D.
+						//also tolerate '1950', if 'yyyy' input passed to 'yy' format
+						result[0] = v;
+					}
+				}
+				break;
+			case 'M':
+				if(l>2){
+					var months = bundle['months-format-' + widthList[l-3]].concat();
+					if(!options.strict){
+						//Tolerate abbreviating period in month part
+						//Case-insensitive comparison
+						v = v.replace(".","").toLowerCase();
+						months = dojo.map(months, function(s){ return s.replace(".","").toLowerCase(); } );
+					}
+					v = dojo.indexOf(months, v);
+					if(v == -1){
+//						console.debug("dojo.date.locale.parse: Could not parse month name: '" + v + "'.");
+						return false;
+					}
+				}else{
+					v--;
+				}
+				result[1] = v;
+				break;
+			case 'E':
+			case 'e':
+				var days = bundle['days-format-' + widthList[l-3]].concat();
+				if(!options.strict){
+					//Case-insensitive comparison
+					v = v.toLowerCase();
+					days = dojo.map(days, function(d){return d.toLowerCase();});
+				}
+				v = dojo.indexOf(days, v);
+				if(v == -1){
+//					console.debug("dojo.date.locale.parse: Could not parse weekday name: '" + v + "'.");
+					return false;
+				}
+
+				//TODO: not sure what to actually do with this input,
+				//in terms of setting something on the Date obj...?
+				//without more context, can't affect the actual date
+				//TODO: just validate?
+				break;
+			case 'D':
+				result[1] = 0;
+				// fallthrough...
+			case 'd':
+				result[2] = v;
+				break;
+			case 'a': //am/pm
+				var am = options.am || bundle.am;
+				var pm = options.pm || bundle.pm;
+				if(!options.strict){
+					var period = /\./g;
+					v = v.replace(period,'').toLowerCase();
+					am = am.replace(period,'').toLowerCase();
+					pm = pm.replace(period,'').toLowerCase();
+				}
+				if(options.strict && v != am && v != pm){
+//					console.debug("dojo.date.locale.parse: Could not parse am/pm part.");
+					return false;
+				}
+
+				// we might not have seen the hours field yet, so store the state and apply hour change later
+				amPm = (v == pm) ? 'p' : (v == am) ? 'a' : '';
+				break;
+			case 'K': //hour (1-24)
+				if(v == 24){ v = 0; }
+				// fallthrough...
+			case 'h': //hour (1-12)
+			case 'H': //hour (0-23)
+			case 'k': //hour (0-11)
+				//TODO: strict bounds checking, padding
+				if(v > 23){
+//					console.debug("dojo.date.locale.parse: Illegal hours value");
+					return false;
+				}
+
+				//in the 12-hour case, adjusting for am/pm requires the 'a' part
+				//which could come before or after the hour, so we will adjust later
+				result[3] = v;
+				break;
+			case 'm': //minutes
+				result[4] = v;
+				break;
+			case 's': //seconds
+				result[5] = v;
+				break;
+			case 'S': //milliseconds
+				result[6] = v;
+//				break;
+//			case 'w':
+//TODO				var firstDay = 0;
+//			default:
+//TODO: throw?
+//				console.debug("dojo.date.locale.parse: unsupported pattern char=" + token.charAt(0));
+		}
+		return true;
+	});
+
+	var hours = +result[3];
+	if(amPm === 'p' && hours < 12){
+		result[3] = hours + 12; //e.g., 3pm -> 15
+	}else if(amPm === 'a' && hours == 12){
+		result[3] = 0; //12am -> 0
+	}
+
+	//TODO: implement a getWeekday() method in order to test 
+	//validity of input strings containing 'EEE' or 'EEEE'...
+
+	var dateObject = new Date(result[0], result[1], result[2], result[3], result[4], result[5], result[6]); // Date
+	if(options.strict){
+		dateObject.setFullYear(result[0]);
+	}
+
+	// Check for overflow.  The Date() constructor normalizes things like April 32nd...
+	//TODO: why isn't this done for times as well?
+	var allTokens = tokens.join("");
+	if(!valid ||
+		(allTokens.indexOf('M') != -1 && dateObject.getMonth() != result[1]) ||
+		(allTokens.indexOf('d') != -1 && dateObject.getDate() != result[2])){
+		return null;
+	}
+
+	return dateObject; // Date
+};
+
+function _processPattern(pattern, applyPattern, applyLiteral, applyAll){
+	//summary: Process a pattern with literals in it
+
+	// Break up on single quotes, treat every other one as a literal, except '' which becomes '
+	var identity = function(x){return x;};
+	applyPattern = applyPattern || identity;
+	applyLiteral = applyLiteral || identity;
+	applyAll = applyAll || identity;
+
+	//split on single quotes (which escape literals in date format strings) 
+	//but preserve escaped single quotes (e.g., o''clock)
+	var chunks = pattern.match(/(''|[^'])+/g); 
+	var literal = false;
+
+	dojo.forEach(chunks, function(chunk, i){
+		if(!chunk){
+			chunks[i]='';
+		}else{
+			chunks[i]=(literal ? applyLiteral : applyPattern)(chunk);
+			literal = !literal;
+		}
+	});
+	return applyAll(chunks.join(''));
+}
+
+function _buildDateTimeRE(tokens, bundle, options, pattern){
+	pattern = dojo.regexp.escapeString(pattern);
+	if(!options.strict){ pattern = pattern.replace(" a", " ?a"); } // kludge to tolerate no space before am/pm
+	return pattern.replace(/([a-z])\1*/ig, function(match){
+		// Build a simple regexp.  Avoid captures, which would ruin the tokens list
+		var s;
+		var c = match.charAt(0);
+		var l = match.length;
+		var p2 = '', p3 = '';
+		if(options.strict){
+			if(l > 1){ p2 = '0' + '{'+(l-1)+'}'; }
+			if(l > 2){ p3 = '0' + '{'+(l-2)+'}'; }
+		}else{
+			p2 = '0?'; p3 = '0{0,2}';
+		}
+		switch(c){
+			case 'y':
+				s = '\\d{2,4}';
+				break;
+			case 'M':
+				s = (l>2) ? '\\S+' : p2+'[1-9]|1[0-2]';
+				break;
+			case 'D':
+				s = p2+'[1-9]|'+p3+'[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]';
+				break;
+			case 'd':
+				s = p2+'[1-9]|[12]\\d|3[01]';
+				break;
+			case 'w':
+				s = p2+'[1-9]|[1-4][0-9]|5[0-3]';
+				break;
+		    case 'E':
+				s = '\\S+';
+				break;
+			case 'h': //hour (1-12)
+				s = p2+'[1-9]|1[0-2]';
+				break;
+			case 'k': //hour (0-11)
+				s = p2+'\\d|1[01]';
+				break;
+			case 'H': //hour (0-23)
+				s = p2+'\\d|1\\d|2[0-3]';
+				break;
+			case 'K': //hour (1-24)
+				s = p2+'[1-9]|1\\d|2[0-4]';
+				break;
+			case 'm':
+			case 's':
+				s = '[0-5]\\d';
+				break;
+			case 'S':
+				s = '\\d{'+l+'}';
+				break;
+			case 'a':
+				var am = options.am || bundle.am || 'AM';
+				var pm = options.pm || bundle.pm || 'PM';
+				if(options.strict){
+					s = am + '|' + pm;
+				}else{
+					s = am + '|' + pm;
+					if(am != am.toLowerCase()){ s += '|' + am.toLowerCase(); }
+					if(pm != pm.toLowerCase()){ s += '|' + pm.toLowerCase(); }
+				}
+				break;
+			default:
+			// case 'v':
+			// case 'z':
+			// case 'Z':
+				s = ".*";
+//				console.debug("parse of date format, pattern=" + pattern);
+		}
+
+		if(tokens){ tokens.push(match); }
+
+		return "(" + s + ")"; // add capture
+	}).replace(/[\xa0 ]/g, "[\\s\\xa0]"); // normalize whitespace.  Need explicit handling of \xa0 for IE.
+}
+})();
+
+(function(){
+var _customFormats = [];
+dojo.date.locale.addCustomFormats = function(/*String*/packageName, /*String*/bundleName){
+	// summary:
+	//		Add a reference to a bundle containing localized custom formats to be
+	//		used by date/time formatting and parsing routines.
+	//
+	// description:
+	//		The user may add custom localized formats where the bundle has properties following the
+	//		same naming convention used by dojo.cldr: `dateFormat-xxxx` / `timeFormat-xxxx`
+	//		The pattern string should match the format used by the CLDR.
+	//		See dojo.date.locale.format() for details.
+	//		The resources must be loaded by dojo.requireLocalization() prior to use
+
+	_customFormats.push({pkg:packageName,name:bundleName});
+};
+
+dojo.date.locale._getGregorianBundle = function(/*String*/locale){
+	var gregorian = {};
+	dojo.forEach(_customFormats, function(desc){
+		var bundle = dojo.i18n.getLocalization(desc.pkg, desc.name, locale);
+		gregorian = dojo.mixin(gregorian, bundle);
+	}, this);
+	return gregorian; /*Object*/
+};
+})();
+
+dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");
+
+dojo.date.locale.getNames = function(/*String*/item, /*String*/type, /*String?*/use, /*String?*/locale){
+	// summary:
+	//		Used to get localized strings from dojo.cldr for day or month names.
+	//
+	// item:
+	//	'months' || 'days'
+	// type:
+	//	'wide' || 'narrow' || 'abbr' (e.g. "Monday", "Mon", or "M" respectively, in English)
+	// use:
+	//	'standAlone' || 'format' (default)
+	// locale:
+	//	override locale used to find the names
+
+	var label;
+	var lookup = dojo.date.locale._getGregorianBundle(locale);
+	var props = [item, use, type];
+	if(use == 'standAlone'){
+		label = lookup[props.join('-')];
+	}
+	props[1] = 'format';
+
+	// return by copy so changes won't be made accidentally to the in-memory model
+	return (label || lookup[props.join('-')]).concat(); /*Array*/
+};
+
+dojo.date.locale.isWeekend = function(/*Date?*/dateObject, /*String?*/locale){
+	// summary:
+	//	Determines if the date falls on a weekend, according to local custom.
+
+	var weekend = dojo.cldr.supplemental.getWeekend(locale);
+	var day = (dateObject || new Date()).getDay();
+	if(weekend.end < weekend.start){
+		weekend.end += 7;
+		if(day < weekend.start){ day += 7; }
+	}
+	return day >= weekend.start && day <= weekend.end; // Boolean
+};
+
+// These are used only by format and strftime.  Do they need to be public?  Which module should they go in?
+
+dojo.date.locale._getDayOfYear = function(/*Date*/dateObject){
+	// summary: gets the day of the year as represented by dateObject
+	return dojo.date.difference(new Date(dateObject.getFullYear(), 0, 1), dateObject) + 1; // Number
+};
+
+dojo.date.locale._getWeekOfYear = function(/*Date*/dateObject, /*Number*/firstDayOfWeek){
+	if(arguments.length == 1){ firstDayOfWeek = 0; } // Sunday
+
+	var firstDayOfYear = new Date(dateObject.getFullYear(), 0, 1).getDay();
+	var adj = (firstDayOfYear - firstDayOfWeek + 7) % 7;
+	var week = Math.floor((dojo.date.locale._getDayOfYear(dateObject) + adj - 1) / 7);
+
+	// if year starts on the specified day, start counting weeks at 1
+	if(firstDayOfYear == firstDayOfWeek){ week++; }
+
+	return week; // Number
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/date/stamp.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/date/stamp.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/date/stamp.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,141 @@
+if(!dojo._hasResource["dojo.date.stamp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.date.stamp"] = true;
+dojo.provide("dojo.date.stamp");
+
+// Methods to convert dates to or from a wire (string) format using well-known conventions
+
+dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/defaultTime){
+	//	summary:
+	//		Returns a Date object given a string formatted according to a subset of the ISO-8601 standard.
+	//
+	//	description:
+	//		Accepts a string formatted according to a profile of ISO8601 as defined by
+	//		[RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed.
+	//		Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime)
+	//		The following combinations are valid:
+	//
+	//			* dates only
+	//			|	* yyyy
+	//			|	* yyyy-MM
+	//			|	* yyyy-MM-dd
+	// 			* times only, with an optional time zone appended
+	//			|	* THH:mm
+	//			|	* THH:mm:ss
+	//			|	* THH:mm:ss.SSS
+	// 			* and "datetimes" which could be any combination of the above
+	//
+	//		timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm
+	//		Assumes the local time zone if not specified.  Does not validate.  Improperly formatted
+	//		input may return null.  Arguments which are out of bounds will be handled
+	// 		by the Date constructor (e.g. January 32nd typically gets resolved to February 1st)
+	//		Only years between 100 and 9999 are supported.
+	//
+  	//	formattedString:
+	//		A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00
+	//
+	//	defaultTime:
+	//		Used for defaults for fields omitted in the formattedString.
+	//		Uses 1970-01-01T00:00:00.0Z by default.
+
+	if(!dojo.date.stamp._isoRegExp){
+		dojo.date.stamp._isoRegExp =
+//TODO: could be more restrictive and check for 00-59, etc.
+			/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;
+	}
+
+	var match = dojo.date.stamp._isoRegExp.exec(formattedString);
+	var result = null;
+
+	if(match){
+		match.shift();
+		if(match[1]){match[1]--;} // Javascript Date months are 0-based
+		if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds
+
+		if(defaultTime){
+			// mix in defaultTime.  Relatively expensive, so use || operators for the fast path of defaultTime === 0
+			defaultTime = new Date(defaultTime);
+			dojo.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){
+				return defaultTime["get" + prop]();
+			}).forEach(function(value, index){
+				if(match[index] === undefined){
+					match[index] = value;
+				}
+			});
+		}
+		result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0);
+//		result.setFullYear(match[0]||1970); // for year < 100
+
+		var offset = 0;
+		var zoneSign = match[7] && match[7].charAt(0);
+		if(zoneSign != 'Z'){
+			offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
+			if(zoneSign != '-'){ offset *= -1; }
+		}
+		if(zoneSign){
+			offset -= result.getTimezoneOffset();
+		}
+		if(offset){
+			result.setTime(result.getTime() + offset * 60000);
+		}
+	}
+
+	return result; // Date or null
+}
+
+/*=====
+	dojo.date.stamp.__Options = function(){
+		//	selector: String
+		//		"date" or "time" for partial formatting of the Date object.
+		//		Both date and time will be formatted by default.
+		//	zulu: Boolean
+		//		if true, UTC/GMT is used for a timezone
+		//	milliseconds: Boolean
+		//		if true, output milliseconds
+		this.selector = selector;
+		this.zulu = zulu;
+		this.milliseconds = milliseconds;
+	}
+=====*/
+
+dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__Options?*/options){
+	//	summary:
+	//		Format a Date object as a string according a subset of the ISO-8601 standard
+	//
+	//	description:
+	//		When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt)
+	//		The local time zone is included as an offset from GMT, except when selector=='time' (time without a date)
+	//		Does not check bounds.  Only years between 100 and 9999 are supported.
+	//
+	//	dateObject:
+	//		A Date object
+
+	var _ = function(n){ return (n < 10) ? "0" + n : n; };
+	options = options || {};
+	var formattedDate = [];
+	var getter = options.zulu ? "getUTC" : "get";
+	var date = "";
+	if(options.selector != "time"){
+		var year = dateObject[getter+"FullYear"]();
+		date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
+	}
+	formattedDate.push(date);
+	if(options.selector != "date"){
+		var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':');
+		var millis = dateObject[getter+"Milliseconds"]();
+		if(options.milliseconds){
+			time += "."+ (millis < 100 ? "0" : "") + _(millis);
+		}
+		if(options.zulu){
+			time += "Z";
+		}else if(options.selector != "time"){
+			var timezoneOffset = dateObject.getTimezoneOffset();
+			var absOffset = Math.abs(timezoneOffset);
+			time += (timezoneOffset > 0 ? "-" : "+") + 
+				_(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
+		}
+		formattedDate.push(time);
+	}
+	return formattedDate.join('T'); // String
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/date.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/date.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/date.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,343 @@
+if(!dojo._hasResource["dojo.date"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.date"] = true;
+dojo.provide("dojo.date");
+
+/*=====
+dojo.date = {
+	// summary: Date manipulation utilities
+}
+=====*/
+
+dojo.date.getDaysInMonth = function(/*Date*/dateObject){
+	//	summary:
+	//		Returns the number of days in the month used by dateObject
+	var month = dateObject.getMonth();
+	var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+	if(month == 1 && dojo.date.isLeapYear(dateObject)){ return 29; } // Number
+	return days[month]; // Number
+}
+
+dojo.date.isLeapYear = function(/*Date*/dateObject){
+	//	summary:
+	//		Determines if the year of the dateObject is a leap year
+	//	description:
+	//		Leap years are years with an additional day YYYY-02-29, where the
+	//		year number is a multiple of four with the following exception: If
+	//		a year is a multiple of 100, then it is only a leap year if it is
+	//		also a multiple of 400. For example, 1900 was not a leap year, but
+	//		2000 is one.
+
+	var year = dateObject.getFullYear();
+	return !(year%400) || (!(year%4) && !!(year%100)); // Boolean
+}
+
+// FIXME: This is not localized
+dojo.date.getTimezoneName = function(/*Date*/dateObject){
+	//	summary:
+	//		Get the user's time zone as provided by the browser
+	// dateObject:
+	//		Needed because the timezone may vary with time (daylight savings)
+	//	description:
+	//		Try to get time zone info from toString or toLocaleString method of
+	//		the Date object -- UTC offset is not a time zone.  See
+	//		http://www.twinsun.com/tz/tz-link.htm Note: results may be
+	//		inconsistent across browsers.
+
+	var str = dateObject.toString(); // Start looking in toString
+	var tz = ''; // The result -- return empty string if nothing found
+	var match;
+
+	// First look for something in parentheses -- fast lookup, no regex
+	var pos = str.indexOf('(');
+	if(pos > -1){
+		tz = str.substring(++pos, str.indexOf(')'));
+	}else{
+		// If at first you don't succeed ...
+		// If IE knows about the TZ, it appears before the year
+		// Capital letters or slash before a 4-digit year 
+		// at the end of string
+		var pat = /([A-Z\/]+) \d{4}$/;
+		if((match = str.match(pat))){
+			tz = match[1];
+		}else{
+		// Some browsers (e.g. Safari) glue the TZ on the end
+		// of toLocaleString instead of putting it in toString
+			str = dateObject.toLocaleString();
+			// Capital letters or slash -- end of string, 
+			// after space
+			pat = / ([A-Z\/]+)$/;
+			if((match = str.match(pat))){
+				tz = match[1];
+			}
+		}
+	}
+
+	// Make sure it doesn't somehow end up return AM or PM
+	return (tz == 'AM' || tz == 'PM') ? '' : tz; // String
+}
+
+// Utility methods to do arithmetic calculations with Dates
+
+dojo.date.compare = function(/*Date*/date1, /*Date?*/date2, /*String?*/portion){
+	//	summary:
+	//		Compare two date objects by date, time, or both.
+	//	description:
+	//  	Returns 0 if equal, positive if a > b, else negative.
+	//	date1:
+	//		Date object
+	//	date2:
+	//		Date object.  If not specified, the current Date is used.
+	//	portion:
+	//		A string indicating the "date" or "time" portion of a Date object.
+	//		Compares both "date" and "time" by default.  One of the following:
+	//		"date", "time", "datetime"
+
+	// Extra step required in copy for IE - see #3112
+	date1 = new Date(Number(date1));
+	date2 = new Date(Number(date2 || new Date()));
+
+	if(portion !== "undefined"){
+		if(portion == "date"){
+			// Ignore times and compare dates.
+			date1.setHours(0, 0, 0, 0);
+			date2.setHours(0, 0, 0, 0);
+		}else if(portion == "time"){
+			// Ignore dates and compare times.
+			date1.setFullYear(0, 0, 0);
+			date2.setFullYear(0, 0, 0);
+		}
+	}
+	
+	if(date1 > date2){ return 1; } // int
+	if(date1 < date2){ return -1; } // int
+	return 0; // int
+};
+
+dojo.date.add = function(/*Date*/date, /*String*/interval, /*int*/amount){
+	//	summary:
+	//		Add to a Date in intervals of different size, from milliseconds to years
+	//	date: Date
+	//		Date object to start with
+	//	interval:
+	//		A string representing the interval.  One of the following:
+	//			"year", "month", "day", "hour", "minute", "second",
+	//			"millisecond", "quarter", "week", "weekday"
+	//	amount:
+	//		How much to add to the date.
+
+	var sum = new Date(Number(date)); // convert to Number before copying to accomodate IE (#3112)
+	var fixOvershoot = false;
+	var property = "Date";
+
+	switch(interval){
+		case "day":
+			break;
+		case "weekday":
+			//i18n FIXME: assumes Saturday/Sunday weekend, but this is not always true.  see dojo.cldr.supplemental
+
+			// Divide the increment time span into weekspans plus leftover days
+			// e.g., 8 days is one 5-day weekspan / and two leftover days
+			// Can't have zero leftover days, so numbers divisible by 5 get
+			// a days value of 5, and the remaining days make up the number of weeks
+			var days, weeks;
+			var mod = amount % 5;
+			if(!mod){
+				days = (amount > 0) ? 5 : -5;
+				weeks = (amount > 0) ? ((amount-5)/5) : ((amount+5)/5);
+			}else{
+				days = mod;
+				weeks = parseInt(amount/5);
+			}
+			// Get weekday value for orig date param
+			var strt = date.getDay();
+			// Orig date is Sat / positive incrementer
+			// Jump over Sun
+			var adj = 0;
+			if(strt == 6 && amount > 0){
+				adj = 1;
+			}else if(strt == 0 && amount < 0){
+			// Orig date is Sun / negative incrementer
+			// Jump back over Sat
+				adj = -1;
+			}
+			// Get weekday val for the new date
+			var trgt = strt + days;
+			// New date is on Sat or Sun
+			if(trgt == 0 || trgt == 6){
+				adj = (amount > 0) ? 2 : -2;
+			}
+			// Increment by number of weeks plus leftover days plus
+			// weekend adjustments
+			amount = (7 * weeks) + days + adj;
+			break;
+		case "year":
+			property = "FullYear";
+			// Keep increment/decrement from 2/29 out of March
+			fixOvershoot = true;
+			break;
+		case "week":
+			amount *= 7;
+			break;
+		case "quarter":
+			// Naive quarter is just three months
+			amount *= 3;
+			// fallthrough...
+		case "month":
+			// Reset to last day of month if you overshoot
+			fixOvershoot = true;
+			property = "Month";
+			break;
+		case "hour":
+		case "minute":
+		case "second":
+		case "millisecond":
+			property = "UTC"+interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
+	}
+
+	if(property){
+		sum["set"+property](sum["get"+property]()+amount);
+	}
+
+	if(fixOvershoot && (sum.getDate() < date.getDate())){
+		sum.setDate(0);
+	}
+
+	return sum; // Date
+};
+
+dojo.date.difference = function(/*Date*/date1, /*Date?*/date2, /*String?*/interval){
+	//	summary:
+	//		Get the difference in a specific unit of time (e.g., number of
+	//		months, weeks, days, etc.) between two dates, rounded to the
+	//		nearest integer.
+	//	date1:
+	//		Date object
+	//	date2:
+	//		Date object.  If not specified, the current Date is used.
+	//	interval:
+	//		A string representing the interval.  One of the following:
+	//			"year", "month", "day", "hour", "minute", "second",
+	//			"millisecond", "quarter", "week", "weekday"
+	//		Defaults to "day".
+
+	date2 = date2 || new Date();
+	interval = interval || "day";
+	var yearDiff = date2.getFullYear() - date1.getFullYear();
+	var delta = 1; // Integer return value
+
+	switch(interval){
+		case "quarter":
+			var m1 = date1.getMonth();
+			var m2 = date2.getMonth();
+			// Figure out which quarter the months are in
+			var q1 = Math.floor(m1/3) + 1;
+			var q2 = Math.floor(m2/3) + 1;
+			// Add quarters for any year difference between the dates
+			q2 += (yearDiff * 4);
+			delta = q2 - q1;
+			break;
+		case "weekday":
+			var days = Math.round(dojo.date.difference(date1, date2, "day"));
+			var weeks = parseInt(dojo.date.difference(date1, date2, "week"));
+			var mod = days % 7;
+
+			// Even number of weeks
+			if(mod == 0){
+				days = weeks*5;
+			}else{
+				// Weeks plus spare change (< 7 days)
+				var adj = 0;
+				var aDay = date1.getDay();
+				var bDay = date2.getDay();
+
+				weeks = parseInt(days/7);
+				mod = days % 7;
+				// Mark the date advanced by the number of
+				// round weeks (may be zero)
+				var dtMark = new Date(date1);
+				dtMark.setDate(dtMark.getDate()+(weeks*7));
+				var dayMark = dtMark.getDay();
+
+				// Spare change days -- 6 or less
+				if(days > 0){
+					switch(true){
+						// Range starts on Sat
+						case aDay == 6:
+							adj = -1;
+							break;
+						// Range starts on Sun
+						case aDay == 0:
+							adj = 0;
+							break;
+						// Range ends on Sat
+						case bDay == 6:
+							adj = -1;
+							break;
+						// Range ends on Sun
+						case bDay == 0:
+							adj = -2;
+							break;
+						// Range contains weekend
+						case (dayMark + mod) > 5:
+							adj = -2;
+					}
+				}else if(days < 0){
+					switch(true){
+						// Range starts on Sat
+						case aDay == 6:
+							adj = 0;
+							break;
+						// Range starts on Sun
+						case aDay == 0:
+							adj = 1;
+							break;
+						// Range ends on Sat
+						case bDay == 6:
+							adj = 2;
+							break;
+						// Range ends on Sun
+						case bDay == 0:
+							adj = 1;
+							break;
+						// Range contains weekend
+						case (dayMark + mod) < 0:
+							adj = 2;
+					}
+				}
+				days += adj;
+				days -= (weeks*2);
+			}
+			delta = days;
+			break;
+		case "year":
+			delta = yearDiff;
+			break;
+		case "month":
+			delta = (date2.getMonth() - date1.getMonth()) + (yearDiff * 12);
+			break;
+		case "week":
+			// Truncate instead of rounding
+			// Don't use Math.floor -- value may be negative
+			delta = parseInt(dojo.date.difference(date1, date2, "day")/7);
+			break;
+		case "day":
+			delta /= 24;
+			// fallthrough
+		case "hour":
+			delta /= 60;
+			// fallthrough
+		case "minute":
+			delta /= 60;
+			// fallthrough
+		case "second":
+			delta /= 1000;
+			// fallthrough
+		case "millisecond":
+			delta *= date2.getTime() - date1.getTime();
+	}
+
+	// Round for fractional values and DST leaps
+	return Math.round(delta); // Number (integer)
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/Avatar.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/Avatar.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/Avatar.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,82 @@
+if(!dojo._hasResource["dojo.dnd.Avatar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Avatar"] = true;
+dojo.provide("dojo.dnd.Avatar");
+
+dojo.require("dojo.dnd.common");
+
+dojo.declare("dojo.dnd.Avatar", null, {
+	// summary: an object, which represents transferred DnD items visually
+	// manager: Object: a DnD manager object
+
+	constructor: function(manager){
+		this.manager = manager;
+		this.construct();
+	},
+
+	// methods
+	construct: function(){
+		// summary: a constructor function;
+		//	it is separate so it can be (dynamically) overwritten in case of need
+		var a = dojo.doc.createElement("table");
+		a.className = "dojoDndAvatar";
+		a.style.position = "absolute";
+		a.style.zIndex = 1999;
+		a.style.margin = "0px"; // to avoid dojo.marginBox() problems with table's margins
+		var b = dojo.doc.createElement("tbody");
+		var tr = dojo.doc.createElement("tr");
+		tr.className = "dojoDndAvatarHeader";
+		var td = dojo.doc.createElement("td");
+		td.innerHTML = this._generateText();
+		tr.appendChild(td);
+		dojo.style(tr, "opacity", 0.9);
+		b.appendChild(tr);
+		var k = Math.min(5, this.manager.nodes.length);
+		var source = this.manager.source;
+		for(var i = 0; i < k; ++i){
+			tr = dojo.doc.createElement("tr");
+			tr.className = "dojoDndAvatarItem";
+			td = dojo.doc.createElement("td");
+			if(source.creator){
+				// create an avatar representation of the node
+				node = source._normalizedCreator(source.getItem(this.manager.nodes[i].id).data, "avatar").node;
+			}else{
+				// or just clone the node and hope it works
+				node = this.manager.nodes[i].cloneNode(true);
+				if(node.tagName.toLowerCase() == "tr"){
+					// insert extra table nodes
+					var table = dojo.doc.createElement("table"),
+						tbody = dojo.doc.createElement("tbody");
+					tbody.appendChild(node);
+					table.appendChild(tbody);
+					node = table;
+				}
+			}
+			node.id = "";
+			td.appendChild(node);
+			tr.appendChild(td);
+			dojo.style(tr, "opacity", (9 - i) / 10);
+			b.appendChild(tr);
+		}
+		a.appendChild(b);
+		this.node = a;
+	},
+	destroy: function(){
+		// summary: a desctructor for the avatar, called to remove all references so it can be garbage-collected
+		dojo._destroyElement(this.node);
+		this.node = false;
+	},
+	update: function(){
+		// summary: updates the avatar to reflect the current DnD state
+		dojo[(this.manager.canDropFlag ? "add" : "remove") + "Class"](this.node, "dojoDndAvatarCanDrop");
+		// replace text
+		dojo.query("tr.dojoDndAvatarHeader td").forEach(function(node){
+			node.innerHTML = this._generateText();
+		}, this);
+	},
+	_generateText: function(){
+		// summary: generates a proper text to reflect copying or moving of items
+		return this.manager.nodes.length.toString();
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/Container.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/Container.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/Container.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,311 @@
+if(!dojo._hasResource["dojo.dnd.Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Container"] = true;
+dojo.provide("dojo.dnd.Container");
+
+dojo.require("dojo.dnd.common");
+dojo.require("dojo.parser");
+
+/*
+	Container states:
+		""		- normal state
+		"Over"	- mouse over a container
+	Container item states:
+		""		- normal state
+		"Over"	- mouse over a container item
+*/
+
+dojo.declare("dojo.dnd.Container", null, {
+	// summary: a Container object, which knows when mouse hovers over it, 
+	//	and know over which element it hovers
+	
+	// object attributes (for markup)
+	skipForm: false,
+	
+	constructor: function(node, params){
+		// summary: a constructor of the Container
+		// node: Node: node or node's id to build the container on
+		// params: Object: a dict of parameters, recognized parameters are:
+		//	creator: Function: a creator function, which takes a data item, and returns an object like that:
+		//		{node: newNode, data: usedData, type: arrayOfStrings}
+		//	skipForm: Boolean: don't start the drag operation, if clicked on form elements
+		//	_skipStartup: Boolean: skip startup(), which collects children, for deferred initialization
+		//		(this is used in the markup mode)
+		this.node = dojo.byId(node);
+		if(!params){ params = {}; }
+		this.creator = params.creator || null;
+		this.skipForm = params.skipForm;
+		this.defaultCreator = dojo.dnd._defaultCreator(this.node);
+
+		// class-specific variables
+		this.map = {};
+		this.current = null;
+
+		// states
+		this.containerState = "";
+		dojo.addClass(this.node, "dojoDndContainer");
+		
+		// mark up children
+		if(!(params && params._skipStartup)){
+			this.startup();
+		}
+
+		// set up events
+		this.events = [
+			dojo.connect(this.node, "onmouseover", this, "onMouseOver"),
+			dojo.connect(this.node, "onmouseout",  this, "onMouseOut"),
+			// cancel text selection and text dragging
+			dojo.connect(this.node, "ondragstart",   this, "onSelectStart"),
+			dojo.connect(this.node, "onselectstart", this, "onSelectStart")
+		];
+	},
+	
+	// object attributes (for markup)
+	creator: function(){},	// creator function, dummy at the moment
+	
+	// abstract access to the map
+	getItem: function(/*String*/ key){
+		// summary: returns a data item by its key (id)
+		return this.map[key];	// Object
+	},
+	setItem: function(/*String*/ key, /*Object*/ data){
+		// summary: associates a data item with its key (id)
+		this.map[key] = data;
+	},
+	delItem: function(/*String*/ key){
+		// summary: removes a data item from the map by its key (id)
+		delete this.map[key];
+	},
+	forInItems: function(/*Function*/ f, /*Object?*/ o){
+		// summary: iterates over a data map skipping members, which 
+		//	are present in the empty object (IE and/or 3rd-party libraries).
+		o = o || dojo.global;
+		var m = this.map, e = dojo.dnd._empty;
+		for(var i in this.map){
+			if(i in e){ continue; }
+			f.call(o, m[i], i, m);
+		}
+	},
+	clearItems: function(){
+		// summary: removes all data items from the map
+		this.map = {};
+	},
+	
+	// methods
+	getAllNodes: function(){
+		// summary: returns a list (an array) of all valid child nodes
+		return dojo.query("> .dojoDndItem", this.parent);	// NodeList
+	},
+	insertNodes: function(data, before, anchor){
+		// summary: inserts an array of new nodes before/after an anchor node
+		// data: Array: a list of data items, which should be processed by the creator function
+		// before: Boolean: insert before the anchor, if true, and after the anchor otherwise
+		// anchor: Node: the anchor node to be used as a point of insertion
+		if(!this.parent.firstChild){
+			anchor = null;
+		}else if(before){
+			if(!anchor){
+				anchor = this.parent.firstChild;
+			}
+		}else{
+			if(anchor){
+				anchor = anchor.nextSibling;
+			}
+		}
+		if(anchor){
+			for(var i = 0; i < data.length; ++i){
+				var t = this._normalizedCreator(data[i]);
+				this.setItem(t.node.id, {data: t.data, type: t.type});
+				this.parent.insertBefore(t.node, anchor);
+			}
+		}else{
+			for(var i = 0; i < data.length; ++i){
+				var t = this._normalizedCreator(data[i]);
+				this.setItem(t.node.id, {data: t.data, type: t.type});
+				this.parent.appendChild(t.node);
+			}
+		}
+		return this;	// self
+	},
+	destroy: function(){
+		// summary: prepares the object to be garbage-collected
+		dojo.forEach(this.events, dojo.disconnect);
+		this.clearItems();
+		this.node = this.parent = this.current;
+	},
+
+	// markup methods
+	markupFactory: function(params, node){
+		params._skipStartup = true;
+		return new dojo.dnd.Container(node, params);
+	},
+	startup: function(){
+		// summary: collects valid child items and populate the map
+		
+		// set up the real parent node
+		this.parent = this.node;
+		if(this.parent.tagName.toLowerCase() == "table"){
+			var c = this.parent.getElementsByTagName("tbody");
+			if(c && c.length){ this.parent = c[0]; }
+		}
+
+		// process specially marked children
+		this.getAllNodes().forEach(function(node){
+			if(!node.id){ node.id = dojo.dnd.getUniqueId(); }
+			var type = node.getAttribute("dndType"),
+				data = node.getAttribute("dndData");
+			this.setItem(node.id, {
+				data: data ? data : node.innerHTML,
+				type: type ? type.split(/\s*,\s*/) : ["text"]
+			});
+		}, this);
+	},
+
+	// mouse events
+	onMouseOver: function(e){
+		// summary: event processor for onmouseover
+		// e: Event: mouse event
+		var n = e.relatedTarget;
+		while(n){
+			if(n == this.node){ break; }
+			try{
+				n = n.parentNode;
+			}catch(x){
+				n = null;
+			}
+		}
+		if(!n){
+			this._changeState("Container", "Over");
+			this.onOverEvent();
+		}
+		n = this._getChildByEvent(e);
+		if(this.current == n){ return; }
+		if(this.current){ this._removeItemClass(this.current, "Over"); }
+		if(n){ this._addItemClass(n, "Over"); }
+		this.current = n;
+	},
+	onMouseOut: function(e){
+		// summary: event processor for onmouseout
+		// e: Event: mouse event
+		for(var n = e.relatedTarget; n;){
+			if(n == this.node){ return; }
+			try{
+				n = n.parentNode;
+			}catch(x){
+				n = null;
+			}
+		}
+		if(this.current){
+			this._removeItemClass(this.current, "Over");
+			this.current = null;
+		}
+		this._changeState("Container", "");
+		this.onOutEvent();
+	},
+	onSelectStart: function(e){
+		// summary: event processor for onselectevent and ondragevent
+		// e: Event: mouse event
+		if(!this.skipForm || !dojo.dnd.isFormElement(e)){
+			dojo.stopEvent(e);
+		}
+	},
+	
+	// utilities
+	onOverEvent: function(){
+		// summary: this function is called once, when mouse is over our container
+	},
+	onOutEvent: function(){
+		// summary: this function is called once, when mouse is out of our container
+	},
+	_changeState: function(type, newState){
+		// summary: changes a named state to new state value
+		// type: String: a name of the state to change
+		// newState: String: new state
+		var prefix = "dojoDnd" + type;
+		var state  = type.toLowerCase() + "State";
+		//dojo.replaceClass(this.node, prefix + newState, prefix + this[state]);
+		dojo.removeClass(this.node, prefix + this[state]);
+		dojo.addClass(this.node, prefix + newState);
+		this[state] = newState;
+	},
+	_addItemClass: function(node, type){
+		// summary: adds a class with prefix "dojoDndItem"
+		// node: Node: a node
+		// type: String: a variable suffix for a class name
+		dojo.addClass(node, "dojoDndItem" + type);
+	},
+	_removeItemClass: function(node, type){
+		// summary: removes a class with prefix "dojoDndItem"
+		// node: Node: a node
+		// type: String: a variable suffix for a class name
+		dojo.removeClass(node, "dojoDndItem" + type);
+	},
+	_getChildByEvent: function(e){
+		// summary: gets a child, which is under the mouse at the moment, or null
+		// e: Event: a mouse event
+		var node = e.target;
+		if(node){
+			for(var parent = node.parentNode; parent; node = parent, parent = node.parentNode){
+				if(parent == this.parent && dojo.hasClass(node, "dojoDndItem")){ return node; }
+			}
+		}
+		return null;
+	},
+	_normalizedCreator: function(item, hint){
+		// summary: adds all necessary data to the output of the user-supplied creator function
+		var t = (this.creator ? this.creator : this.defaultCreator)(item, hint);
+		if(!dojo.isArray(t.type)){ t.type = ["text"]; }
+		if(!t.node.id){ t.node.id = dojo.dnd.getUniqueId(); }
+		dojo.addClass(t.node, "dojoDndItem");
+		return t;
+	}
+});
+
+dojo.dnd._createNode = function(tag){
+	// summary: returns a function, which creates an element of given tag 
+	//	(SPAN by default) and sets its innerHTML to given text
+	// tag: String: a tag name or empty for SPAN
+	if(!tag){ return dojo.dnd._createSpan; }
+	return function(text){	// Function
+		var n = dojo.doc.createElement(tag);
+		n.innerHTML = text;
+		return n;
+	};
+};
+
+dojo.dnd._createTrTd = function(text){
+	// summary: creates a TR/TD structure with given text as an innerHTML of TD
+	// text: String: a text for TD
+	var tr = dojo.doc.createElement("tr");
+	var td = dojo.doc.createElement("td");
+	td.innerHTML = text;
+	tr.appendChild(td);
+	return tr;	// Node
+};
+
+dojo.dnd._createSpan = function(text){
+	// summary: creates a SPAN element with given text as its innerHTML
+	// text: String: a text for SPAN
+	var n = dojo.doc.createElement("span");
+	n.innerHTML = text;
+	return n;	// Node
+};
+
+// dojo.dnd._defaultCreatorNodes: Object: a dicitionary, which maps container tag names to child tag names
+dojo.dnd._defaultCreatorNodes = {ul: "li", ol: "li", div: "div", p: "div"};
+
+dojo.dnd._defaultCreator = function(node){
+	// summary: takes a container node, and returns an appropriate creator function
+	// node: Node: a container node
+	var tag = node.tagName.toLowerCase();
+	var c = tag == "table" ? dojo.dnd._createTrTd : dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);
+	return function(item, hint){	// Function
+		var isObj = dojo.isObject(item) && item;
+		var data = (isObj && item.data) ? item.data : item;
+		var type = (isObj && item.type) ? item.type : ["text"];
+		var t = String(data), n = (hint == "avatar" ? dojo.dnd._createSpan : c)(t);
+		n.id = dojo.dnd.getUniqueId();
+		return {node: n, data: data, type: type};
+	};
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/Manager.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/Manager.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/Manager.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,180 @@
+if(!dojo._hasResource["dojo.dnd.Manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Manager"] = true;
+dojo.provide("dojo.dnd.Manager");
+
+dojo.require("dojo.dnd.common");
+dojo.require("dojo.dnd.autoscroll");
+dojo.require("dojo.dnd.Avatar");
+
+dojo.declare("dojo.dnd.Manager", null, {
+	// summary: the manager of DnD operations (usually a singleton)
+	constructor: function(){
+		this.avatar  = null;
+		this.source = null;
+		this.nodes = [];
+		this.copy  = true;
+		this.target = null;
+		this.canDropFlag = false;
+		this.events = [];
+	},
+
+	// avatar's offset from the mouse
+	OFFSET_X: 16,
+	OFFSET_Y: 16,
+	
+	// methods
+	overSource: function(source){
+		// summary: called when a source detected a mouse-over conditiion
+		// source: Object: the reporter
+		if(this.avatar){
+			this.target = (source && source.targetState != "Disabled") ? source : null;
+			this.avatar.update();
+		}
+		dojo.publish("/dnd/source/over", [source]);
+	},
+	outSource: function(source){
+		// summary: called when a source detected a mouse-out conditiion
+		// source: Object: the reporter
+		if(this.avatar){
+			if(this.target == source){
+				this.target = null;
+				this.canDropFlag = false;
+				this.avatar.update();
+				dojo.publish("/dnd/source/over", [null]);
+			}
+		}else{
+			dojo.publish("/dnd/source/over", [null]);
+		}
+	},
+	startDrag: function(source, nodes, copy){
+		// summary: called to initiate the DnD operation
+		// source: Object: the source which provides items
+		// nodes: Array: the list of transferred items
+		// copy: Boolean: copy items, if true, move items otherwise
+		this.source = source;
+		this.nodes  = nodes;
+		this.copy   = Boolean(copy); // normalizing to true boolean
+		this.avatar = this.makeAvatar();
+		dojo.body().appendChild(this.avatar.node);
+		dojo.publish("/dnd/start", [source, nodes, this.copy]);
+		this.events = [
+			dojo.connect(dojo.doc, "onmousemove", this, "onMouseMove"),
+			dojo.connect(dojo.doc, "onmouseup",   this, "onMouseUp"),
+			dojo.connect(dojo.doc, "onkeydown",   this, "onKeyDown"),
+			dojo.connect(dojo.doc, "onkeyup",     this, "onKeyUp")
+		];
+		var c = "dojoDnd" + (copy ? "Copy" : "Move");
+		dojo.addClass(dojo.body(), c); 
+	},
+	canDrop: function(flag){
+		// summary: called to notify if the current target can accept items
+		var canDropFlag = Boolean(this.target && flag);
+		if(this.canDropFlag != canDropFlag){
+			this.canDropFlag = canDropFlag;
+			this.avatar.update();
+		}
+	},
+	stopDrag: function(){
+		// summary: stop the DnD in progress
+		dojo.removeClass(dojo.body(), "dojoDndCopy");
+		dojo.removeClass(dojo.body(), "dojoDndMove");
+		dojo.forEach(this.events, dojo.disconnect);
+		this.events = [];
+		this.avatar.destroy();
+		this.avatar = null;
+		this.source = null;
+		this.nodes = [];
+	},
+	makeAvatar: function(){
+		// summary: makes the avatar, it is separate to be overwritten dynamically, if needed
+		return new dojo.dnd.Avatar(this);
+	},
+	updateAvatar: function(){
+		// summary: updates the avatar, it is separate to be overwritten dynamically, if needed
+		this.avatar.update();
+	},
+	// mouse event processors
+	onMouseMove: function(e){
+		// summary: event processor for onmousemove
+		// e: Event: mouse event
+		var a = this.avatar;
+		if(a){
+			//dojo.dnd.autoScrollNodes(e);
+			dojo.dnd.autoScroll(e);
+			var s = a.node.style;
+			s.left = (e.pageX + this.OFFSET_X) + "px";
+			s.top  = (e.pageY + this.OFFSET_Y) + "px";
+			var copy = Boolean(this.source.copyState(dojo.dnd.getCopyKeyState(e)));
+			if(this.copy != copy){ 
+				this._setCopyStatus(copy);
+			}
+		}
+	},
+	onMouseUp: function(e){
+		// summary: event processor for onmouseup
+		// e: Event: mouse event
+		if(this.avatar && (!("mouseButton" in this.source) || this.source.mouseButton == e.button)){
+			if(this.target && this.canDropFlag){
+				var params = [this.source, this.nodes, Boolean(this.source.copyState(dojo.dnd.getCopyKeyState(e))), this.target];
+				dojo.publish("/dnd/drop/before", params);
+				dojo.publish("/dnd/drop", params);
+			}else{
+				dojo.publish("/dnd/cancel");
+			}
+			this.stopDrag();
+		}
+	},
+	// keyboard event processors
+	onKeyDown: function(e){
+		// summary: event processor for onkeydown:
+		//	watching for CTRL for copy/move status, watching for ESCAPE to cancel the drag
+		// e: Event: keyboard event
+		if(this.avatar){
+			switch(e.keyCode){
+				case dojo.keys.CTRL:
+					var copy = Boolean(this.source.copyState(true));
+					if(this.copy != copy){ 
+						this._setCopyStatus(copy);
+					}
+					break;
+				case dojo.keys.ESCAPE:
+					dojo.publish("/dnd/cancel");
+					this.stopDrag();
+					break;
+			}
+		}
+	},
+	onKeyUp: function(e){
+		// summary: event processor for onkeyup, watching for CTRL for copy/move status
+		// e: Event: keyboard event
+		if(this.avatar && e.keyCode == dojo.keys.CTRL){
+			var copy = Boolean(this.source.copyState(false));
+			if(this.copy != copy){ 
+				this._setCopyStatus(copy);
+			}
+		}
+	},
+	// utilities
+	_setCopyStatus: function(copy){
+		// summary: changes the copy status
+		// copy: Boolean: the copy status
+		this.copy = copy;
+		this.source._markDndStatus(this.copy);
+		this.updateAvatar();
+		dojo.removeClass(dojo.body(), "dojoDnd" + (this.copy ? "Move" : "Copy"));
+		dojo.addClass(dojo.body(), "dojoDnd" + (this.copy ? "Copy" : "Move"));
+	}
+});
+
+// summary: the manager singleton variable, can be overwritten, if needed
+dojo.dnd._manager = null;
+
+dojo.dnd.manager = function(){
+	// summary: returns the current DnD manager, creates one if it is not created yet
+	if(!dojo.dnd._manager){
+		dojo.dnd._manager = new dojo.dnd.Manager();
+	}
+	return dojo.dnd._manager;	// Object
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/Moveable.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/Moveable.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/Moveable.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,130 @@
+if(!dojo._hasResource["dojo.dnd.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Moveable"] = true;
+dojo.provide("dojo.dnd.Moveable");
+
+dojo.require("dojo.dnd.Mover");
+
+dojo.declare("dojo.dnd.Moveable", null, {
+	// object attributes (for markup)
+	handle: "",
+	delay: 0,
+	skip: false,
+	
+	constructor: function(node, params){
+		// summary: an object, which makes a node moveable
+		// node: Node: a node (or node's id) to be moved
+		// params: Object: an optional object with additional parameters;
+		//	following parameters are recognized:
+		//		handle: Node: a node (or node's id), which is used as a mouse handle
+		//			if omitted, the node itself is used as a handle
+		//		delay: Number: delay move by this number of pixels
+		//		skip: Boolean: skip move of form elements
+		//		mover: Object: a constructor of custom Mover
+		this.node = dojo.byId(node);
+		if(!params){ params = {}; }
+		this.handle = params.handle ? dojo.byId(params.handle) : null;
+		if(!this.handle){ this.handle = this.node; }
+		this.delay = params.delay > 0 ? params.delay : 0;
+		this.skip  = params.skip;
+		this.mover = params.mover ? params.mover : dojo.dnd.Mover;
+		this.events = [
+			dojo.connect(this.handle, "onmousedown", this, "onMouseDown"),
+			// cancel text selection and text dragging
+			dojo.connect(this.handle, "ondragstart",   this, "onSelectStart"),
+			dojo.connect(this.handle, "onselectstart", this, "onSelectStart")
+		];
+	},
+
+	// markup methods
+	markupFactory: function(params, node){
+		return new dojo.dnd.Moveable(node, params);
+	},
+
+	// methods
+	destroy: function(){
+		// summary: stops watching for possible move, deletes all references, so the object can be garbage-collected
+		dojo.forEach(this.events, dojo.disconnect);
+		this.events = this.node = this.handle = null;
+	},
+	
+	// mouse event processors
+	onMouseDown: function(e){
+		// summary: event processor for onmousedown, creates a Mover for the node
+		// e: Event: mouse event
+		if(this.skip && dojo.dnd.isFormElement(e)){ return; }
+		if(this.delay){
+			this.events.push(dojo.connect(this.handle, "onmousemove", this, "onMouseMove"));
+			this.events.push(dojo.connect(this.handle, "onmouseup", this, "onMouseUp"));
+			this._lastX = e.pageX;
+			this._lastY = e.pageY;
+		}else{
+			new this.mover(this.node, e, this);
+		}
+		dojo.stopEvent(e);
+	},
+	onMouseMove: function(e){
+		// summary: event processor for onmousemove, used only for delayed drags
+		// e: Event: mouse event
+		if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
+			this.onMouseUp(e);
+			new this.mover(this.node, e, this);
+		}
+		dojo.stopEvent(e);
+	},
+	onMouseUp: function(e){
+		// summary: event processor for onmouseup, used only for delayed delayed drags
+		// e: Event: mouse event
+		dojo.disconnect(this.events.pop());
+		dojo.disconnect(this.events.pop());
+	},
+	onSelectStart: function(e){
+		// summary: event processor for onselectevent and ondragevent
+		// e: Event: mouse event
+		if(!this.skip || !dojo.dnd.isFormElement(e)){
+			dojo.stopEvent(e);
+		}
+	},
+	
+	// local events
+	onMoveStart: function(/* dojo.dnd.Mover */ mover){
+		// summary: called before every move operation
+		dojo.publish("/dnd/move/start", [mover]);
+		dojo.addClass(dojo.body(), "dojoMove"); 
+		dojo.addClass(this.node, "dojoMoveItem"); 
+	},
+	onMoveStop: function(/* dojo.dnd.Mover */ mover){
+		// summary: called after every move operation
+		dojo.publish("/dnd/move/stop", [mover]);
+		dojo.removeClass(dojo.body(), "dojoMove");
+		dojo.removeClass(this.node, "dojoMoveItem");
+	},
+	onFirstMove: function(/* dojo.dnd.Mover */ mover){
+		// summary: called during the very first move notification,
+		//	can be used to initialize coordinates, can be overwritten.
+		
+		// default implementation does nothing
+	},
+	onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+		// summary: called during every move notification,
+		//	should actually move the node, can be overwritten.
+		this.onMoving(mover, leftTop);
+		var s = mover.node.style;
+		s.left = leftTop.l + "px";
+		s.top  = leftTop.t + "px";
+		this.onMoved(mover, leftTop);
+	},
+	onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+		// summary: called before every incremental move,
+		//	can be overwritten.
+		
+		// default implementation does nothing
+	},
+	onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+		// summary: called after every incremental move,
+		//	can be overwritten.
+		
+		// default implementation does nothing
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/Mover.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/Mover.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/Mover.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,84 @@
+if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Mover"] = true;
+dojo.provide("dojo.dnd.Mover");
+
+dojo.require("dojo.dnd.common");
+dojo.require("dojo.dnd.autoscroll");
+
+dojo.declare("dojo.dnd.Mover", null, {
+	constructor: function(node, e, host){
+		// summary: an object, which makes a node follow the mouse, 
+		//	used as a default mover, and as a base class for custom movers
+		// node: Node: a node (or node's id) to be moved
+		// e: Event: a mouse event, which started the move;
+		//	only pageX and pageY properties are used
+		// host: Object?: object which implements the functionality of the move,
+		//	 and defines proper events (onMoveStart and onMoveStop)
+		this.node = dojo.byId(node);
+		this.marginBox = {l: e.pageX, t: e.pageY};
+		this.mouseButton = e.button;
+		var h = this.host = host, d = node.ownerDocument, 
+			firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
+		this.events = [
+			dojo.connect(d, "onmousemove", this, "onMouseMove"),
+			dojo.connect(d, "onmouseup",   this, "onMouseUp"),
+			// cancel text selection and text dragging
+			dojo.connect(d, "ondragstart",   dojo, "stopEvent"),
+			dojo.connect(d, "onselectstart", dojo, "stopEvent"),
+			firstEvent
+		];
+		// notify that the move has started
+		if(h && h.onMoveStart){
+			h.onMoveStart(this);
+		}
+	},
+	// mouse event processors
+	onMouseMove: function(e){
+		// summary: event processor for onmousemove
+		// e: Event: mouse event
+		dojo.dnd.autoScroll(e);
+		var m = this.marginBox;
+		this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY});
+	},
+	onMouseUp: function(e){
+		if(this.mouseButton == e.button){
+			this.destroy();
+		}
+	},
+	// utilities
+	onFirstMove: function(){
+		// summary: makes the node absolute; it is meant to be called only once
+		var s = this.node.style, l, t;
+		switch(s.position){
+			case "relative":
+			case "absolute":
+				// assume that left and top values are in pixels already
+				l = Math.round(parseFloat(s.left));
+				t = Math.round(parseFloat(s.top));
+				break;
+			default:
+				s.position = "absolute";	// enforcing the absolute mode
+				var m = dojo.marginBox(this.node);
+				l = m.l;
+				t = m.t;
+				break;
+		}
+		this.marginBox.l = l - this.marginBox.l;
+		this.marginBox.t = t - this.marginBox.t;
+		this.host.onFirstMove(this);
+		dojo.disconnect(this.events.pop());
+	},
+	destroy: function(){
+		// summary: stops the move, deletes all references, so the object can be garbage-collected
+		dojo.forEach(this.events, dojo.disconnect);
+		// undo global settings
+		var h = this.host;
+		if(h && h.onMoveStop){
+			h.onMoveStop(this);
+		}
+		// destroy objects
+		this.events = this.node = null;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/Selector.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/Selector.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/Selector.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,244 @@
+if(!dojo._hasResource["dojo.dnd.Selector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Selector"] = true;
+dojo.provide("dojo.dnd.Selector");
+
+dojo.require("dojo.dnd.common");
+dojo.require("dojo.dnd.Container");
+
+/*
+	Container item states:
+		""			- an item is not selected
+		"Selected"	- an item is selected
+		"Anchor"	- an item is selected, and is an anchor for a "shift" selection
+*/
+
+dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
+	// summary: a Selector object, which knows how to select its children
+	
+	constructor: function(node, params){
+		// summary: a constructor of the Selector
+		// node: Node: node or node's id to build the selector on
+		// params: Object: a dict of parameters, recognized parameters are:
+		//	singular: Boolean: allows selection of only one element, if true
+		//	the rest of parameters are passed to the container
+		if(!params){ params = {}; }
+		this.singular = params.singular;
+		// class-specific variables
+		this.selection = {};
+		this.anchor = null;
+		this.simpleSelection = false;
+		// set up events
+		this.events.push(
+			dojo.connect(this.node, "onmousedown", this, "onMouseDown"),
+			dojo.connect(this.node, "onmouseup",   this, "onMouseUp"));
+	},
+	
+	// object attributes (for markup)
+	singular: false,	// is singular property
+	
+	// methods
+	getSelectedNodes: function(){
+		// summary: returns a list (an array) of selected nodes
+		var t = new dojo.NodeList();
+		var e = dojo.dnd._empty;
+		for(var i in this.selection){
+			if(i in e){ continue; }
+			t.push(dojo.byId(i));
+		}
+		return t;	// Array
+	},
+	selectNone: function(){
+		// summary: unselects all items
+		return this._removeSelection()._removeAnchor();	// self
+	},
+	selectAll: function(){
+		// summary: selects all items
+		this.forInItems(function(data, id){
+			this._addItemClass(dojo.byId(id), "Selected");
+			this.selection[id] = 1;
+		}, this);
+		return this._removeAnchor();	// self
+	},
+	deleteSelectedNodes: function(){
+		// summary: deletes all selected items
+		var e = dojo.dnd._empty;
+		for(var i in this.selection){
+			if(i in e){ continue; }
+			var n = dojo.byId(i);
+			this.delItem(i);
+			dojo._destroyElement(n);
+		}
+		this.anchor = null;
+		this.selection = {};
+		return this;	// self
+	},
+	insertNodes: function(addSelected, data, before, anchor){
+		// summary: inserts new data items (see Container's insertNodes method for details)
+		// addSelected: Boolean: all new nodes will be added to selected items, if true, no selection change otherwise
+		// data: Array: a list of data items, which should be processed by the creator function
+		// before: Boolean: insert before the anchor, if true, and after the anchor otherwise
+		// anchor: Node: the anchor node to be used as a point of insertion
+		var oldCreator = this._normalizedCreator;
+		this._normalizedCreator = function(item, hint){
+			var t = oldCreator.call(this, item, hint);
+			if(addSelected){
+				if(!this.anchor){
+					this.anchor = t.node;
+					this._removeItemClass(t.node, "Selected");
+					this._addItemClass(this.anchor, "Anchor");
+				}else if(this.anchor != t.node){
+					this._removeItemClass(t.node, "Anchor");
+					this._addItemClass(t.node, "Selected");
+				}
+				this.selection[t.node.id] = 1;
+			}else{
+				this._removeItemClass(t.node, "Selected");
+				this._removeItemClass(t.node, "Anchor");
+			}
+			return t;
+		};
+		dojo.dnd.Selector.superclass.insertNodes.call(this, data, before, anchor);
+		this._normalizedCreator = oldCreator;
+		return this;	// self
+	},
+	destroy: function(){
+		// summary: prepares the object to be garbage-collected
+		dojo.dnd.Selector.superclass.destroy.call(this);
+		this.selection = this.anchor = null;
+	},
+
+	// markup methods
+	markupFactory: function(params, node){
+		params._skipStartup = true;
+		return new dojo.dnd.Selector(node, params);
+	},
+
+	// mouse events
+	onMouseDown: function(e){
+		// summary: event processor for onmousedown
+		// e: Event: mouse event
+		if(!this.current){ return; }
+		if(!this.singular && !dojo.dnd.getCopyKeyState(e) && !e.shiftKey && (this.current.id in this.selection)){
+			this.simpleSelection = true;
+			dojo.stopEvent(e);
+			return;
+		}
+		if(!this.singular && e.shiftKey){
+			if(!dojo.dnd.getCopyKeyState(e)){
+				this._removeSelection();
+			}
+			var c = this.getAllNodes();
+			if(c.length){
+				if(!this.anchor){
+					this.anchor = c[0];
+					this._addItemClass(this.anchor, "Anchor");
+				}
+				this.selection[this.anchor.id] = 1;
+				if(this.anchor != this.current){
+					var i = 0;
+					for(; i < c.length; ++i){
+						var node = c[i];
+						if(node == this.anchor || node == this.current){ break; }
+					}
+					for(++i; i < c.length; ++i){
+						var node = c[i];
+						if(node == this.anchor || node == this.current){ break; }
+						this._addItemClass(node, "Selected");
+						this.selection[node.id] = 1;
+					}
+					this._addItemClass(this.current, "Selected");
+					this.selection[this.current.id] = 1;
+				}
+			}
+		}else{
+			if(this.singular){
+				if(this.anchor == this.current){
+					if(dojo.dnd.getCopyKeyState(e)){
+						this.selectNone();
+					}
+				}else{
+					this.selectNone();
+					this.anchor = this.current;
+					this._addItemClass(this.anchor, "Anchor");
+					this.selection[this.current.id] = 1;
+				}
+			}else{
+				if(dojo.dnd.getCopyKeyState(e)){
+					if(this.anchor == this.current){
+						delete this.selection[this.anchor.id];
+						this._removeAnchor();
+					}else{
+						if(this.current.id in this.selection){
+							this._removeItemClass(this.current, "Selected");
+							delete this.selection[this.current.id];
+						}else{
+							if(this.anchor){
+								this._removeItemClass(this.anchor, "Anchor");
+								this._addItemClass(this.anchor, "Selected");
+							}
+							this.anchor = this.current;
+							this._addItemClass(this.current, "Anchor");
+							this.selection[this.current.id] = 1;
+						}
+					}
+				}else{
+					if(!(this.current.id in this.selection)){
+						this.selectNone();
+						this.anchor = this.current;
+						this._addItemClass(this.current, "Anchor");
+						this.selection[this.current.id] = 1;
+					}
+				}
+			}
+		}
+		dojo.stopEvent(e);
+	},
+	onMouseUp: function(e){
+		// summary: event processor for onmouseup
+		// e: Event: mouse event
+		if(!this.simpleSelection){ return; }
+		this.simpleSelection = false;
+		this.selectNone();
+		if(this.current){
+			this.anchor = this.current;
+			this._addItemClass(this.anchor, "Anchor");
+			this.selection[this.current.id] = 1;
+		}
+	},
+	onMouseMove: function(e){
+		// summary: event processor for onmousemove
+		// e: Event: mouse event
+		this.simpleSelection = false;
+	},
+	
+	// utilities
+	onOverEvent: function(){
+		// summary: this function is called once, when mouse is over our container
+		this.onmousemoveEvent = dojo.connect(this.node, "onmousemove", this, "onMouseMove");
+	},
+	onOutEvent: function(){
+		// summary: this function is called once, when mouse is out of our container
+		dojo.disconnect(this.onmousemoveEvent);
+		delete this.onmousemoveEvent;
+	},
+	_removeSelection: function(){
+		// summary: unselects all items
+		var e = dojo.dnd._empty;
+		for(var i in this.selection){
+			if(i in e){ continue; }
+			var node = dojo.byId(i);
+			if(node){ this._removeItemClass(node, "Selected"); }
+		}
+		this.selection = {};
+		return this;	// self
+	},
+	_removeAnchor: function(){
+		if(this.anchor){
+			this._removeItemClass(this.anchor, "Anchor");
+			this.anchor = null;
+		}
+		return this;	// self
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/Source.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/Source.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/Source.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,393 @@
+if(!dojo._hasResource["dojo.dnd.Source"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.Source"] = true;
+dojo.provide("dojo.dnd.Source");
+
+dojo.require("dojo.dnd.Selector");
+dojo.require("dojo.dnd.Manager");
+
+/*
+	Container property:
+		"Horizontal"- if this is the horizontal container
+	Source states:
+		""			- normal state
+		"Moved"		- this source is being moved
+		"Copied"	- this source is being copied
+	Target states:
+		""			- normal state
+		"Disabled"	- the target cannot accept an avatar
+	Target anchor state:
+		""			- item is not selected
+		"Before"	- insert point is before the anchor
+		"After"		- insert point is after the anchor
+*/
+
+/*=====
+dojo.dnd.__SourceArgs = function(){
+	//	summary:
+	//		a dict of parameters for DnD Source configuration. Note that any
+	//		property on Source elements may be configured, but this is the
+	//		short-list
+	//	isSource: Boolean?
+	//		can be used as a DnD source. Defaults to true.
+	//	accept: Array?
+	//		list of accepted types (text strings) for a target; defaults to
+	//		["text"]
+	//	horizontal: Boolean?
+	//		a horizontal container, if true, vertical otherwise or when omitted
+	//	copyOnly: Boolean?
+	//		always copy items, if true, use a state of Ctrl key otherwise
+	//	withHandles: Boolean?
+	//		allows dragging only by handles
+	this.isSource = isSource;
+	this.accept = accept;
+	this.horizontal = horizontal;
+	this.copyOnly = copyOnly;
+	this.withHandles = withHandles;
+}
+=====*/
+
+dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
+	// summary: a Source object, which can be used as a DnD source, or a DnD target
+	
+	// object attributes (for markup)
+	isSource: true,
+	horizontal: false,
+	copyOnly: false,
+	skipForm: false,
+	withHandles: false,
+	accept: ["text"],
+	
+	constructor: function(/*DOMNode|String*/node, /*dojo.dnd.__SourceArgs?*/params){
+		// summary: 
+		//		a constructor of the Source
+		// node:
+		//		node or node's id to build the source on
+		// params: 
+		//		any property of this class may be configured via the params
+		//		object which is mixed-in to the `dojo.dnd.Source` instance
+		dojo.mixin(this, dojo.mixin({}, params));
+		var type = this.accept;
+		if(type.length){
+			this.accept = {};
+			for(var i = 0; i < type.length; ++i){
+				this.accept[type[i]] = 1;
+			}
+		}
+		// class-specific variables
+		this.isDragging = false;
+		this.mouseDown = false;
+		this.targetAnchor = null;
+		this.targetBox = null;
+		this.before = true;
+		// states
+		this.sourceState  = "";
+		if(this.isSource){
+			dojo.addClass(this.node, "dojoDndSource");
+		}
+		this.targetState  = "";
+		if(this.accept){
+			dojo.addClass(this.node, "dojoDndTarget");
+		}
+		if(this.horizontal){
+			dojo.addClass(this.node, "dojoDndHorizontal");
+		}
+		// set up events
+		this.topics = [
+			dojo.subscribe("/dnd/source/over", this, "onDndSourceOver"),
+			dojo.subscribe("/dnd/start",  this, "onDndStart"),
+			dojo.subscribe("/dnd/drop",   this, "onDndDrop"),
+			dojo.subscribe("/dnd/cancel", this, "onDndCancel")
+		];
+	},
+	
+	// methods
+	checkAcceptance: function(source, nodes){
+		// summary: checks, if the target can accept nodes from this source
+		// source: Object: the source which provides items
+		// nodes: Array: the list of transferred items
+		if(this == source){ return true; }
+		for(var i = 0; i < nodes.length; ++i){
+			var type = source.getItem(nodes[i].id).type;
+			// type instanceof Array
+			var flag = false;
+			for(var j = 0; j < type.length; ++j){
+				if(type[j] in this.accept){
+					flag = true;
+					break;
+				}
+			}
+			if(!flag){
+				return false;	// Boolean
+			}
+		}
+		return true;	// Boolean
+	},
+	copyState: function(keyPressed){
+		// summary: Returns true, if we need to copy items, false to move.
+		//		It is separated to be overwritten dynamically, if needed.
+		// keyPressed: Boolean: the "copy" was pressed
+		return this.copyOnly || keyPressed;	// Boolean
+	},
+	destroy: function(){
+		// summary: prepares the object to be garbage-collected
+		dojo.dnd.Source.superclass.destroy.call(this);
+		dojo.forEach(this.topics, dojo.unsubscribe);
+		this.targetAnchor = null;
+	},
+
+	// markup methods
+	markupFactory: function(params, node){
+		params._skipStartup = true;
+		return new dojo.dnd.Source(node, params);
+	},
+
+	// mouse event processors
+	onMouseMove: function(e){
+		// summary: event processor for onmousemove
+		// e: Event: mouse event
+		if(this.isDragging && this.targetState == "Disabled"){ return; }
+		dojo.dnd.Source.superclass.onMouseMove.call(this, e);
+		var m = dojo.dnd.manager();
+		if(this.isDragging){
+			// calculate before/after
+			var before = false;
+			if(this.current){
+				if(!this.targetBox || this.targetAnchor != this.current){
+					this.targetBox = {
+						xy: dojo.coords(this.current, true),
+						w: this.current.offsetWidth,
+						h: this.current.offsetHeight
+					};
+				}
+				if(this.horizontal){
+					before = (e.pageX - this.targetBox.xy.x) < (this.targetBox.w / 2);
+				}else{
+					before = (e.pageY - this.targetBox.xy.y) < (this.targetBox.h / 2);
+				}
+			}
+			if(this.current != this.targetAnchor || before != this.before){
+				this._markTargetAnchor(before);
+				m.canDrop(!this.current || m.source != this || !(this.current.id in this.selection));
+			}
+		}else{
+			if(this.mouseDown && this.isSource){
+				var nodes = this.getSelectedNodes();
+				if(nodes.length){
+					m.startDrag(this, nodes, this.copyState(dojo.dnd.getCopyKeyState(e)));
+				}
+			}
+		}
+	},
+	onMouseDown: function(e){
+		// summary: event processor for onmousedown
+		// e: Event: mouse event
+		if(this._legalMouseDown(e) && (!this.skipForm || !dojo.dnd.isFormElement(e))){
+			this.mouseDown = true;
+			this.mouseButton = e.button;
+			dojo.dnd.Source.superclass.onMouseDown.call(this, e);
+		}
+	},
+	onMouseUp: function(e){
+		// summary: event processor for onmouseup
+		// e: Event: mouse event
+		if(this.mouseDown){
+			this.mouseDown = false;
+			dojo.dnd.Source.superclass.onMouseUp.call(this, e);
+		}
+	},
+	
+	// topic event processors
+	onDndSourceOver: function(source){
+		// summary: topic event processor for /dnd/source/over, called when detected a current source
+		// source: Object: the source which has the mouse over it
+		if(this != source){
+			this.mouseDown = false;
+			if(this.targetAnchor){
+				this._unmarkTargetAnchor();
+			}
+		}else if(this.isDragging){
+			var m = dojo.dnd.manager();
+			m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(this.current.id in this.selection)));
+		}
+	},
+	onDndStart: function(source, nodes, copy){
+		// summary: topic event processor for /dnd/start, called to initiate the DnD operation
+		// source: Object: the source which provides items
+		// nodes: Array: the list of transferred items
+		// copy: Boolean: copy items, if true, move items otherwise
+		if(this.isSource){
+			this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
+		}
+		var accepted = this.accept && this.checkAcceptance(source, nodes);
+		this._changeState("Target", accepted ? "" : "Disabled");
+		if(accepted && this == source){
+			dojo.dnd.manager().overSource(this);
+		}
+		this.isDragging = true;
+	},
+	onDndDrop: function(source, nodes, copy){
+		// summary: topic event processor for /dnd/drop, called to finish the DnD operation
+		// source: Object: the source which provides items
+		// nodes: Array: the list of transferred items
+		// copy: Boolean: copy items, if true, move items otherwise
+		do{ //break box
+			if(this.containerState != "Over"){ break; }
+			var oldCreator = this._normalizedCreator;
+			if(this != source){
+				// transferring nodes from the source to the target
+				if(this.creator){
+					// use defined creator
+					this._normalizedCreator = function(node, hint){
+						return oldCreator.call(this, source.getItem(node.id).data, hint);
+					};
+				}else{
+					// we have no creator defined => move/clone nodes
+					if(copy){
+						// clone nodes
+						this._normalizedCreator = function(node, hint){
+							var t = source.getItem(node.id);
+							var n = node.cloneNode(true);
+							n.id = dojo.dnd.getUniqueId();
+							return {node: n, data: t.data, type: t.type};
+						};
+					}else{
+						// move nodes
+						this._normalizedCreator = function(node, hint){
+							var t = source.getItem(node.id);
+							source.delItem(node.id);
+							return {node: node, data: t.data, type: t.type};
+						};
+					}
+				}
+			}else{
+				// transferring nodes within the single source
+				if(this.current && this.current.id in this.selection){ break; }
+				if(this.creator){
+					// use defined creator
+					if(copy){
+						// create new copies of data items
+						this._normalizedCreator = function(node, hint){
+							return oldCreator.call(this, source.getItem(node.id).data, hint);
+						};
+					}else{
+						// move nodes
+						if(!this.current){ break; }
+						this._normalizedCreator = function(node, hint){
+							var t = source.getItem(node.id);
+							return {node: node, data: t.data, type: t.type};
+						};
+					}
+				}else{
+					// we have no creator defined => move/clone nodes
+					if(copy){
+						// clone nodes
+						this._normalizedCreator = function(node, hint){
+							var t = source.getItem(node.id);
+							var n = node.cloneNode(true);
+							n.id = dojo.dnd.getUniqueId();
+							return {node: n, data: t.data, type: t.type};
+						};
+					}else{
+						// move nodes
+						if(!this.current){ break; }
+						this._normalizedCreator = function(node, hint){
+							var t = source.getItem(node.id);
+							return {node: node, data: t.data, type: t.type};
+						};
+					}
+				}
+			}
+			this._removeSelection();
+			if(this != source){
+				this._removeAnchor();
+			}
+			if(this != source && !copy && !this.creator){
+				source.selectNone();
+			}
+			this.insertNodes(true, nodes, this.before, this.current);
+			if(this != source && !copy && this.creator){
+				source.deleteSelectedNodes();
+			}
+			this._normalizedCreator = oldCreator;
+		}while(false);
+		this.onDndCancel();
+	},
+	onDndCancel: function(){
+		// summary: topic event processor for /dnd/cancel, called to cancel the DnD operation
+		if(this.targetAnchor){
+			this._unmarkTargetAnchor();
+			this.targetAnchor = null;
+		}
+		this.before = true;
+		this.isDragging = false;
+		this.mouseDown = false;
+		delete this.mouseButton;
+		this._changeState("Source", "");
+		this._changeState("Target", "");
+	},
+	
+	// utilities
+	onOverEvent: function(){
+		// summary: this function is called once, when mouse is over our container
+		dojo.dnd.Source.superclass.onOverEvent.call(this);
+		dojo.dnd.manager().overSource(this);
+	},
+	onOutEvent: function(){
+		// summary: this function is called once, when mouse is out of our container
+		dojo.dnd.Source.superclass.onOutEvent.call(this);
+		dojo.dnd.manager().outSource(this);
+	},
+	_markTargetAnchor: function(before){
+		// summary: assigns a class to the current target anchor based on "before" status
+		// before: Boolean: insert before, if true, after otherwise
+		if(this.current == this.targetAnchor && this.before == before){ return; }
+		if(this.targetAnchor){
+			this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
+		}
+		this.targetAnchor = this.current;
+		this.targetBox = null;
+		this.before = before;
+		if(this.targetAnchor){
+			this._addItemClass(this.targetAnchor, this.before ? "Before" : "After");
+		}
+	},
+	_unmarkTargetAnchor: function(){
+		// summary: removes a class of the current target anchor based on "before" status
+		if(!this.targetAnchor){ return; }
+		this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
+		this.targetAnchor = null;
+		this.targetBox = null;
+		this.before = true;
+	},
+	_markDndStatus: function(copy){
+		// summary: changes source's state based on "copy" status
+		this._changeState("Source", copy ? "Copied" : "Moved");
+	},
+	_legalMouseDown: function(e){
+		// summary: checks if user clicked on "approved" items
+		// e: Event: mouse event
+		if(!this.withHandles){ return true; }
+		for(var node = e.target; node && !dojo.hasClass(node, "dojoDndItem"); node = node.parentNode){
+			if(dojo.hasClass(node, "dojoDndHandle")){ return true; }
+		}
+		return false;	// Boolean
+	}
+});
+
+dojo.declare("dojo.dnd.Target", dojo.dnd.Source, {
+	// summary: a Target object, which can be used as a DnD target
+	
+	constructor: function(node, params){
+		// summary: a constructor of the Target --- see the Source constructor for details
+		this.isSource = false;
+		dojo.removeClass(this.node, "dojoDndSource");
+	},
+
+	// markup methods
+	markupFactory: function(params, node){
+		params._skipStartup = true;
+		return new dojo.dnd.Target(node, params);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/TimedMoveable.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/TimedMoveable.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/TimedMoveable.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,66 @@
+if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.TimedMoveable"] = true;
+dojo.provide("dojo.dnd.TimedMoveable");
+
+dojo.require("dojo.dnd.Moveable");
+
+(function(){
+	// precalculate long expressions
+	var oldOnMove = dojo.dnd.Moveable.prototype.onMove;
+		
+	dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, {
+		// summary:
+		//	A specialized version of Moveable to support an FPS throttling.
+		//	This class puts an upper restriction on FPS, which may reduce 
+		//	the CPU load. The additional parameter "timeout" regulates
+		//	the delay before actually moving the moveable object.
+		
+		// object attributes (for markup)
+		timeout: 40,	// in ms, 40ms corresponds to 25 fps
+	
+		constructor: function(node, params){
+			// summary: an object, which makes a node moveable with a timer
+			// node: Node: a node (or node's id) to be moved
+			// params: Object: an optional object with additional parameters.
+			//	See dojo.dnd.Moveable for details on general parameters.
+			//	Following parameters are specific for this class:
+			//		timeout: Number: delay move by this number of ms
+			//			accumulating position changes during the timeout
+			
+			// sanitize parameters
+			if(!params){ params = {}; }
+			if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){
+				this.timeout = params.timeout;
+			}
+		},
+	
+		// markup methods
+		markupFactory: function(params, node){
+			return new dojo.dnd.TimedMoveable(node, params);
+		},
+	
+		onMoveStop: function(/* dojo.dnd.Mover */ mover){
+			if(mover._timer){
+				// stop timer
+				clearTimeout(mover._timer)
+				// reflect the last received position
+				oldOnMove.call(this, mover, mover._leftTop)
+			}
+			dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments);
+		},
+		onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+			mover._leftTop = leftTop;
+			if(!mover._timer){
+				var _t = this;	// to avoid using dojo.hitch()
+				mover._timer = setTimeout(function(){
+					// we don't have any pending requests
+					mover._timer = null;
+					// reflect the last received position
+					oldOnMove.call(_t, mover, mover._leftTop);
+				}, this.timeout);
+			}
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/autoscroll.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/autoscroll.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/autoscroll.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,103 @@
+if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.autoscroll"] = true;
+dojo.provide("dojo.dnd.autoscroll");
+
+dojo.dnd.getViewport = function(){
+	// summary: returns a viewport size (visible part of the window)
+
+	// FIXME: need more docs!!
+	var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
+	if(dojo.isMozilla){
+		return {w: dd.clientWidth, h: w.innerHeight};	// Object
+	}else if(!dojo.isOpera && w.innerWidth){
+		return {w: w.innerWidth, h: w.innerHeight};		// Object
+	}else if (!dojo.isOpera && dd && dd.clientWidth){
+		return {w: dd.clientWidth, h: dd.clientHeight};	// Object
+	}else if (b.clientWidth){
+		return {w: b.clientWidth, h: b.clientHeight};	// Object
+	}
+	return null;	// Object
+};
+
+dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
+dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
+
+dojo.dnd.V_AUTOSCROLL_VALUE = 16;
+dojo.dnd.H_AUTOSCROLL_VALUE = 16;
+
+dojo.dnd.autoScroll = function(e){
+	// summary:
+	//		a handler for onmousemove event, which scrolls the window, if
+	//		necesary
+	// e: Event:
+	//		onmousemove event
+
+	// FIXME: needs more docs!
+	var v = dojo.dnd.getViewport(), dx = 0, dy = 0;
+	if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
+		dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
+	}else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
+		dx = dojo.dnd.H_AUTOSCROLL_VALUE;
+	}
+	if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
+		dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
+	}else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
+		dy = dojo.dnd.V_AUTOSCROLL_VALUE;
+	}
+	window.scrollBy(dx, dy);
+};
+
+dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
+dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
+
+dojo.dnd.autoScrollNodes = function(e){
+	// summary:
+	//		a handler for onmousemove event, which scrolls the first avaialble
+	//		Dom element, it falls back to dojo.dnd.autoScroll()
+	// e: Event:
+	//		onmousemove event
+
+	// FIXME: needs more docs!
+	for(var n = e.target; n;){
+		if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
+			var s = dojo.getComputedStyle(n);
+			if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){
+				var b = dojo._getContentBox(n, s), t = dojo._abs(n, true);
+				// console.debug(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
+				b.l += t.x + n.scrollLeft;
+				b.t += t.y + n.scrollTop;
+				var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2), 
+					h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
+					rx = e.pageX - b.l, ry = e.pageY - b.t, dx = 0, dy = 0;
+				if(rx > 0 && rx < b.w){
+					if(rx < w){
+						dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
+					}else if(rx > b.w - w){
+						dx = dojo.dnd.H_AUTOSCROLL_VALUE;
+					}
+				}
+				//console.debug("ry =", ry, "b.h =", b.h, "h =", h);
+				if(ry > 0 && ry < b.h){
+					if(ry < h){
+						dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
+					}else if(ry > b.h - h){
+						dy = dojo.dnd.V_AUTOSCROLL_VALUE;
+					}
+				}
+				var oldLeft = n.scrollLeft, oldTop = n.scrollTop;
+				n.scrollLeft = n.scrollLeft + dx;
+				n.scrollTop  = n.scrollTop  + dy;
+				// if(dx || dy){ console.debug(oldLeft + ", " + oldTop + "\n" + dx + ", " + dy + "\n" + n.scrollLeft + ", " + n.scrollTop); }
+				if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; }
+			}
+		}
+		try{
+			n = n.parentNode;
+		}catch(x){
+			n = null;
+		}
+	}
+	dojo.dnd.autoScroll(e);
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,35 @@
+if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.common"] = true;
+dojo.provide("dojo.dnd.common");
+
+dojo.dnd._copyKey = navigator.appVersion.indexOf("Macintosh") < 0 ? "ctrlKey" : "metaKey";
+
+dojo.dnd.getCopyKeyState = function(e) {
+	// summary: abstracts away the difference between selection on Mac and PC,
+	//	and returns the state of the "copy" key to be pressed.
+	// e: Event: mouse event
+	return e[dojo.dnd._copyKey];	// Boolean
+};
+
+dojo.dnd._uniqueId = 0;
+dojo.dnd.getUniqueId = function(){
+	// summary: returns a unique string for use with any DOM element
+	var id;
+	do{
+		id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
+	}while(dojo.byId(id));
+	return id;
+};
+
+dojo.dnd._empty = {};
+
+dojo.dnd.isFormElement = function(/*Event*/ e){
+	// summary: returns true, if user clicked on a form element
+	var t = e.target;
+	if(t.nodeType == 3 /*TEXT_NODE*/){
+		t = t.parentNode;
+	}
+	return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0;	// Boolean
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dnd/move.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dnd/move.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dnd/move.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,202 @@
+if(!dojo._hasResource["dojo.dnd.move"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.dnd.move"] = true;
+dojo.provide("dojo.dnd.move");
+
+dojo.require("dojo.dnd.Mover");
+dojo.require("dojo.dnd.Moveable");
+
+dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
+	// object attributes (for markup)
+	constraints: function(){},
+	within: false,
+	
+	// markup methods
+	markupFactory: function(params, node){
+		return new dojo.dnd.move.constrainedMoveable(node, params);
+	},
+
+	constructor: function(node, params){
+		// summary: an object, which makes a node moveable
+		// node: Node: a node (or node's id) to be moved
+		// params: Object: an optional object with additional parameters;
+		//	following parameters are recognized:
+		//		constraints: Function: a function, which calculates a constraint box,
+		//			it is called in a context of the moveable object.
+		//		within: Boolean: restrict move within boundaries.
+		//	the rest is passed to the base class
+		if(!params){ params = {}; }
+		this.constraints = params.constraints;
+		this.within = params.within;
+	},
+	onFirstMove: function(/* dojo.dnd.Mover */ mover){
+		// summary: called during the very first move notification,
+		//	can be used to initialize coordinates, can be overwritten.
+		var c = this.constraintBox = this.constraints.call(this, mover);
+		c.r = c.l + c.w;
+		c.b = c.t + c.h;
+		if(this.within){
+			var mb = dojo.marginBox(mover.node);
+			c.r -= mb.w;
+			c.b -= mb.h;
+		}
+	},
+	onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+		// summary: called during every move notification,
+		//	should actually move the node, can be overwritten.
+		var c = this.constraintBox, s = mover.node.style;
+		s.left = (leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l) + "px";
+		s.top  = (leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t) + "px";
+	}
+});
+
+dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
+	// object attributes (for markup)
+	box: {},
+	
+	// markup methods
+	markupFactory: function(params, node){
+		return new dojo.dnd.move.boxConstrainedMoveable(node, params);
+	},
+
+	constructor: function(node, params){
+		// summary: an object, which makes a node moveable
+		// node: Node: a node (or node's id) to be moved
+		// params: Object: an optional object with additional parameters;
+		//	following parameters are recognized:
+		//		box: Object: a constraint box
+		//	the rest is passed to the base class
+		var box = params && params.box;
+		this.constraints = function(){ return box; };
+	}
+});
+
+dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
+	// object attributes (for markup)
+	area: "content",
+
+	// markup methods
+	markupFactory: function(params, node){
+		return new dojo.dnd.move.parentConstrainedMoveable(node, params);
+	},
+
+	constructor: function(node, params){
+		// summary: an object, which makes a node moveable
+		// node: Node: a node (or node's id) to be moved
+		// params: Object: an optional object with additional parameters;
+		//	following parameters are recognized:
+		//		area: String: a parent's area to restrict the move,
+		//			can be "margin", "border", "padding", or "content".
+		//	the rest is passed to the base class
+		var area = params && params.area;
+		this.constraints = function(){
+			var n = this.node.parentNode, 
+				s = dojo.getComputedStyle(n), 
+				mb = dojo._getMarginBox(n, s);
+			if(area == "margin"){
+				return mb;	// Object
+			}
+			var t = dojo._getMarginExtents(n, s);
+			mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+			if(area == "border"){
+				return mb;	// Object
+			}
+			t = dojo._getBorderExtents(n, s);
+			mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+			if(area == "padding"){
+				return mb;	// Object
+			}
+			t = dojo._getPadExtents(n, s);
+			mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+			return mb;	// Object
+		};
+	}
+});
+
+// WARNING: below are obsolete objects, instead of custom movers use custom moveables (above)
+
+dojo.dnd.move.constrainedMover = function(fun, within){
+	// summary: returns a constrained version of dojo.dnd.Mover
+	// description: this function produces n object, which will put a constraint on 
+	//	the margin box of dragged object in absolute coordinates
+	// fun: Function: called on drag, and returns a constraint box
+	// within: Boolean: if true, constraints the whole dragged object withtin the rectangle, 
+	//	otherwise the constraint is applied to the left-top corner
+	dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");
+	var mover = function(node, e, notifier){
+		dojo.dnd.Mover.call(this, node, e, notifier);
+	};
+	dojo.extend(mover, dojo.dnd.Mover.prototype);
+	dojo.extend(mover, {
+		onMouseMove: function(e){
+			// summary: event processor for onmousemove
+			// e: Event: mouse event
+			dojo.dnd.autoScroll(e);
+			var m = this.marginBox, c = this.constraintBox,
+				l = m.l + e.pageX, t = m.t + e.pageY;
+			l = l < c.l ? c.l : c.r < l ? c.r : l;
+			t = t < c.t ? c.t : c.b < t ? c.b : t;
+			this.host.onMove(this, {l: l, t: t});
+		},
+		onFirstMove: function(){
+			// summary: called once to initialize things; it is meant to be called only once
+			dojo.dnd.Mover.prototype.onFirstMove.call(this);
+			var c = this.constraintBox = fun.call(this);
+			c.r = c.l + c.w;
+			c.b = c.t + c.h;
+			if(within){
+				var mb = dojo.marginBox(this.node);
+				c.r -= mb.w;
+				c.b -= mb.h;
+			}
+		}
+	});
+	return mover;	// Object
+};
+
+dojo.dnd.move.boxConstrainedMover = function(box, within){
+	// summary: a specialization of dojo.dnd.constrainedMover, which constrains to the specified box
+	// box: Object: a constraint box (l, t, w, h)
+	// within: Boolean: if true, constraints the whole dragged object withtin the rectangle, 
+	//	otherwise the constraint is applied to the left-top corner
+	dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");
+	return dojo.dnd.move.constrainedMover(function(){ return box; }, within);	// Object
+};
+
+dojo.dnd.move.parentConstrainedMover = function(area, within){
+	// summary: a specialization of dojo.dnd.constrainedMover, which constrains to the parent node
+	// area: String: "margin" to constrain within the parent's margin box, "border" for the border box,
+	//	"padding" for the padding box, and "content" for the content box; "content" is the default value.
+	// within: Boolean: if true, constraints the whole dragged object withtin the rectangle, 
+	//	otherwise the constraint is applied to the left-top corner
+	dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");
+	var fun = function(){
+		var n = this.node.parentNode, 
+			s = dojo.getComputedStyle(n), 
+			mb = dojo._getMarginBox(n, s);
+		if(area == "margin"){
+			return mb;	// Object
+		}
+		var t = dojo._getMarginExtents(n, s);
+		mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+		if(area == "border"){
+			return mb;	// Object
+		}
+		t = dojo._getBorderExtents(n, s);
+		mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+		if(area == "padding"){
+			return mb;	// Object
+		}
+		t = dojo._getPadExtents(n, s);
+		mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+		return mb;	// Object
+	};
+	return dojo.dnd.move.constrainedMover(fun, within);	// Object
+};
+
+// patching functions one level up for compatibility
+
+dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover;
+dojo.dnd.boxConstrainedMover = dojo.dnd.move.boxConstrainedMover;
+dojo.dnd.parentConstrainedMover = dojo.dnd.move.parentConstrainedMover;
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/dojo.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dojo.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dojo.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.
+*/
+
+(function(){var _1=null;if((_1||(typeof djConfig!="undefined"&&djConfig.scopeMap))&&(typeof window!="undefined")){var _2="",_3="",_4="",_5={},_6={};_1=_1||djConfig.scopeMap;for(var i=0;i<_1.length;i++){var _8=_1[i];_2+="var "+_8[0]+" = {}; "+_8[1]+" = "+_8[0]+";"+_8[1]+"._scopeName = '"+_8[1]+"';";_3+=(i==0?"":",")+_8[0];_4+=(i==0?"":",")+_8[1];_5[_8[0]]=_8[1];_6[_8[1]]=_8[0];}eval(_2+"dojo._scopeArgs = ["+_4+"];");dojo._scopePrefixArgs=_3;dojo._scopePrefix="(function("+_3+"){";dojo._scopeSuffix="})("+_4+")";dojo._scopeMap=_5;dojo._scopeMapRev=_6;}(function(){if(!this["console"]){this.console={log:function(){}};}var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];var i=0,tn;while((tn=cn[i++])){if(!console[tn]){(function(){var _c=tn+"";console[_c]=function(){var a=Array.apply({},arguments);a.unshift(_c+":");console.log(a.join(" "));};})();}}if(typeof dojo=="undefined"){this.dojo={_scopeName:"dojo",_scopePrefix:"",_scopePrefixArgs:"",_scopeSuffix:"",_scopeMap:{},_scopeMapRev:{}};}var d=dojo;if(typeof dijit=="undefined"){this.dijit={_scopeName:"dijit"};}if(typeof dojox=="undefined"){this.dojox={_scopeName:"dojox"};}if(!d._scopeArgs){d._scopeArgs=[dojo,dijit,dojox];}d.global=this;d.config={isDebug:false,debugAtAllCosts:false};if(typeof djConfig!="undefined"){for(var _f in djConfig){d.config[_f]=djConfig[_f];}}var _10=["Browser","Rhino","Spidermonkey","Mobile"];var t;while((t=_10.shift())){d["is"+t]=false;}dojo.locale=d.config.locale;var rev="$Rev: 13707 $".match(/\d+/);dojo.version={major:1,minor:1,patch:1,flag:"",revision:rev?+rev[0]:999999,toString:function(){with(d.version){return major+"."+minor+"."+patch+flag+" ("+revision+")";}}};if(typeof OpenAjax!="undefined"){OpenAjax.hub.registerLibrary(dojo._scopeName,"http://dojotoolkit.org",d.version.toString());}dojo._mixin=function(obj,_14){var _15={};for(var x in _14){if(_15[x]===undefined||_15[x]!=_14[x]){obj[x]=_14[x];}}if(d["isIE"]&&_14){var p=_14.toString;if(typeof p=="function"&&p!=obj.toString&&p!=_15.toString&&p!="\nfunction toString() {\n    [native code]\n}\n"){obj.toString=_14.toString;}}return obj;};dojo.mixin=function(obj,_19){for(var i=1,l=arguments.length;i<l;i++){d._mixin(obj,arguments[i]);}return obj;};dojo._getProp=function(_1c,_1d,_1e){var obj=_1e||d.global;for(var i=0,p;obj&&(p=_1c[i]);i++){if(i==0&&this._scopeMap[p]){p=this._scopeMap[p];}obj=(p in obj?obj[p]:(_1d?obj[p]={}:undefined));}return obj;};dojo.setObject=function(_22,_23,_24){var _25=_22.split("."),p=_25.pop(),obj=d._getProp(_25,true,_24);return obj&&p?(obj[p]=_23):undefined;};dojo.getObject=function(_28,_29,_2a){return d._getProp(_28.split("."),_29,_2a);};dojo.exists=function(_2b,obj){return !!d.getObject(_2b,false,obj);};dojo["eval"]=function(_2d){return d.global.eval?d.global.eval(_2d):eval(_2d);};d.deprecated=d.experimental=function(){};})();(function(){var d=dojo;d.mixin(d,{_loadedModules:{},_inFlightCount:0,_hasResource:{},_modulePrefixes:{dojo:{name:"dojo",value:"."},doh:{name:"doh",value:"../util/doh"},tests:{name:"tests",value:"tests"}},_moduleHasPrefix:function(_2f){var mp=this._modulePrefixes;return !!(mp[_2f]&&mp[_2f].value);},_getModulePrefix:function(_31){var mp=this._modulePrefixes;if(this._moduleHasPrefix(_31)){return mp[_31].value;}return _31;},_loadedUrls:[],_postLoad:false,_loaders:[],_unloaders:[],_loadNotifying:false});dojo._loadPath=function(_33,_34,cb){var uri=((_33.charAt(0)=="/"||_33.match(/^\w+:/))?"":this.baseUrl)+_33;try{return !_34?this._loadUri(uri,cb):this._loadUriAndCheck(uri,_34,cb);}catch(e){console.error(e);return false;}};dojo._loadUri=function(uri,cb){if(this._loadedUrls[uri]){return true;}var _39=this._getText(uri,true);if(!_39){return false;}this._loadedUrls[uri]=true;this._loadedUrls.push(uri);if(cb){_39="("+_39+")";}else{_39=this._scopePrefix+_39+this._scopeSuffix;}if(d.isMoz){_39+="\r\n//@ sourceURL="+uri;}var _3a=d["eval"](_39);if(cb){cb(_3a);}return true;};dojo._loadUriAndCheck=function(uri,_3c,cb){var ok=false;try{ok=this._loadUri(uri,cb);}catch(e){console.error("failed loading "+uri+" with error: "+e);}return !!(ok&&this._loadedModules[_3c]);};dojo.loaded=function(){this._loadNotifying=true;this._postLoad=true;var mll=d._loaders;this._loaders=[];for(var x=0;x<mll.length;x++){try{mll[x]();}catch(e){throw e;console.error("dojo.addOnLoad callback failed: "+e,e);}}this._loadNotifying=false;if(d._postLoad&&d._inFlightCount==0&&mll.length){d._callLoaded();}};dojo.unloaded=function(){var mll=this._unloaders;while(mll.length){(mll.pop())();}};var _42=function(arr,obj,fn){if(!fn){arr.push(obj);}else{if(fn){var _46=(typeof fn=="string")?obj[fn]:fn;arr.push(function(){_46.call(obj);});}}};dojo.addOnLoad=function(obj,_48){_42(d._loaders,obj,_48);if(d._postLoad&&d._inFlightCount==0&&!d._loadNotifying){d._callLoaded();}};dojo.addOnUnload=function(obj,_4a){_42(d._unloaders,obj,_4a);};dojo._modulesLoaded=function(){if(d._postLoad){return;}if(d._inFlightCount>0){console.warn("files still in flight!");return;}d._callLoaded();};dojo._callLoaded=function(){if(typeof setTimeout=="object"||(dojo.config.useXDomain&&d.isOpera)){if(dojo.isAIR){setTimeout(function(){dojo.loaded();},0);}else{setTimeout(dojo._scopeName+".loaded();",0);}}else{d.loaded();}};dojo._getModuleSymbols=function(_4b){var _4c=_4b.split(".");for(var i=_4c.length;i>0;i--){var _4e=_4c.slice(0,i).join(".");if((i==1)&&!this._moduleHasPrefix(_4e)){_4c[0]="../"+_4c[0];}else{var _4f=this._getModulePrefix(_4e);if(_4f!=_4e){_4c.splice(0,i,_4f);break;}}}return _4c;};dojo._global_omit_module_check=false;dojo._loadModule=dojo.require=function(_50,_51){_51=this._global_omit_module_check||_51;var _52=this._loadedModules[_50];if(_52){return _52;}var _53=this._getModuleSymbols(_50).join("/")+".js";var _54=(!_51)?_50:null;var ok=this._loadPath(_53,_54);if(!ok&&!_51){throw new Error("Could not load '"+_50+"'; last tried '"+_53+"'");}if(!_51&&!this._isXDomain){_52=this._loadedModules[_50];if(!_52){throw new Error("symbol '"+_50+"' is not defined after loading '"+_53+"'");}}return _52;};dojo.provide=function(_56){_56=_56+"";return (d._loadedModules[_56]=d.getObject(_56,true));};dojo.platformRequire=function(_57){var _58=_57.common||[];var _59=_58.concat(_57[d._name]||_57["default"]||[]);for(var x=0;x<_59.length;x++){var _5b=_59[x];if(_5b.constructor==Array){d._loadModule.apply(d,_5b);}else{d._loadModule(_5b);}}};dojo.requireIf=function(_5c,_5d){if(_5c===true){var _5e=[];for(var i=1;i<arguments.length;i++){_5e.push(arguments[i]);}d.require.apply(d,_5e);}};dojo.requireAfterIf=d.requireIf;dojo.registerModulePath=function(_60,_61){d._modulePrefixes[_60]={name:_60,value:_61};};dojo.requireLocalization=function(_62,_63,_64,_65){d.require("dojo.i18n");d.i18n._requireLocalization.apply(d.hostenv,arguments);};var ore=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$");var ire=new RegExp("^((([^:]+:)?([^@]+))@)?([^:]*)(:([0-9]+))?$");dojo._Url=function(){var n=null;var _a=arguments;var uri=[_a[0]];for(var i=1;i<_a.length;i++){if(!_a[i]){continue;}var _6c=new d._Url(_a[i]+"");var _6d=new d._Url(uri[0]+"");if(_6c.path==""&&!_6c.scheme&&!_6c.authority&&!_6c.query){if(_6c.fragment!=n){_6d.fragment=_6c.fragment;}_6c=_6d;}else{if(!_6c.scheme){_6c.scheme=_6d.scheme;if(!_6c.authority){_6c.authority=_6d.authority;if(_6c.path.charAt(0)!="/"){var _6e=_6d.path.substring(0,_6d.path.lastIndexOf("/")+1)+_6c.path;var _6f=_6e.split("/");for(var j=0;j<_6f.length;j++){if(_6f[j]=="."){if(j==_6f.length-1){_6f[j]="";}else{_6f.splice(j,1);j--;}}else{if(j>0&&!(j==1&&_6f[0]=="")&&_6f[j]==".."&&_6f[j-1]!=".."){if(j==(_6f.length-1)){_6f.splice(j,1);_6f[j-1]="";}else{_6f.splice(j-1,2);j-=2;}}}}_6c.path=_6f.join("/");}}}}uri=[];if(_6c.scheme){uri.push(_6c.scheme,":");}if(_6c.authority){uri.push("//",_6c.authority);}uri.push(_6c.path);if(_6c.query){uri.push("?",_6c.query);}if(_6c.fragment){uri.push("#",_6c.fragment);}}this.uri=uri.join("");var r=this.uri.match(ore);this.scheme=r[2]||(r[1]?"":n);this.authority=r[4]||(r[3]?"":n);this.path=r[5];this.query=r[7]||(r[6]?"":n);this.fragment=r[9]||(r[8]?"":n);if(this.authority!=n){r=this.authority.match(ire);this.user=r[3]||n;this.password=r[4]||n;this.host=r[5];this.port=r[7]||n;}};dojo._Url.prototype.toString=function(){return this.uri;};dojo.moduleUrl=function(_72,url){var loc=d._getModuleSymbols(_72).join("/");if(!loc){return null;}if(loc.lastIndexOf("/")!=loc.length-1){loc+="/";}var _75=loc.indexOf(":");if(loc.charAt(0)!="/"&&(_75==-1||_75>loc.indexOf("/"))){loc=d.baseUrl+loc;}return new d._Url(loc,url);};})();if(typeof window!="undefined"){dojo.isBrowser=true;dojo._name="browser";(function(){var d=dojo;if(document&&document.getElementsByTagName){var _77=document.getElementsByTagName("script");var _78=/dojo(\.xd)?\.js(\W|$)/i;for(var i=0;i<_77.length;i++){var src=_77[i].getAttribute("src");if(!src){continue;}var m=src.match(_78);if(m){if(!d.config.baseUrl){d.config.baseUrl=src.substring(0,m.index);}var cfg=_77[i].getAttribute("djConfig");if(cfg){var _7d=eval("({ "+cfg+" })");for(var x in _7d){dojo.config[x]=_7d[x];}}break;}}}d.baseUrl=d.config.baseUrl;var n=navigator;var dua=n.userAgent;var dav=n.appVersion;var tv=parseFloat(dav);d.isOpera=(dua.indexOf("Opera")>=0)?tv:0;var idx=Math.max(dav.indexOf("WebKit"),dav.indexOf("Safari"),0);if(idx){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;}if(dojo.isIE&&window.location.protocol==="file:"){dojo.config.ieForceActiveXXhr=true;}var cm=document.compatMode;d.isQuirks=cm=="BackCompat"||cm=="QuirksMode"||d.isIE<6;d.locale=dojo.config.locale||(d.isIE?n.userLanguage:n.language).toLowerCase();d._XMLHTTP_PROGIDS=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];d._xhrObj=function(){var _85=null;var _86=null;if(!dojo.isIE||!dojo.config.ieForceActiveXXhr){try{_85=new XMLHttpRequest();}catch(e){}}if(!_85){for(var i=0;i<3;++i){var _88=d._XMLHTTP_PROGIDS[i];try{_85=new ActiveXObject(_88);}catch(e){_86=e;}if(_85){d._XMLHTTP_PROGIDS=[_88];break;}}}if(!_85){throw new Error("XMLHTTP not available: "+_86);}return _85;};d._isDocumentOk=function(_89){var _8a=_89.status||0;return (_8a>=200&&_8a<300)||_8a==304||_8a==1223||(!_8a&&(location.protocol=="file:"||location.protocol=="chrome:"));};var _8b=window.location+"";var _8c=document.getElementsByTagName("base");var _8d=(_8c&&_8c.length>0);d._getText=function(uri,_8f){var _90=this._xhrObj();if(!_8d&&dojo._Url){uri=(new dojo._Url(_8b,uri)).toString();}if(d.config.cacheBust){uri+=(uri.indexOf("?")==-1?"?":"&")+String(d.config.cacheBust).replace(/\W+/g,"");}_90.open("GET",uri,false);try{_90.send(null);if(!d._isDocumentOk(_90)){var err=Error("Unable to load "+uri+" status:"+_90.status);err.status=_90.status;err.responseText=_90.responseText;throw err;}}catch(e){if(_8f){return null;}throw e;}return _90.responseText;};})();dojo._initFired=false;dojo._loadInit=function(e){dojo._initFired=true;var _93=(e&&e.type)?e.type.toLowerCase():"load";if(arguments.callee.initialized||(_93!="domcontentloaded"&&_93!="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){if(document.addEventListener){if(dojo.isOpera||dojo.isFF>=3||(dojo.isMoz&&dojo.config.enableMozDomContentLoaded===true)){document.addEventListener("DOMContentLoaded",dojo._loadInit,null);}window.addEventListener("load",dojo._loadInit,null);}if(dojo.isAIR){window.addEventListener("load",dojo._loadInit,null);}else{if(/(WebKit|khtml)/i.test(navigator.userAgent)){dojo._khtmlTimer=setInterval(function(){if(/loaded|complete/.test(document.readyState)){dojo._loadInit();}},10);}}}(function(){var _w=window;var _95=function(_96,fp){var _98=_w[_96]||function(){};_w[_96]=function(){fp.apply(_w,arguments);_98.apply(_w,arguments);};};if(dojo.isIE){if(!dojo.config.afterOnLoad){document.write("<scr"+"ipt defer src=\"//:\" "+"onreadystatechange=\"if(this.readyState=='complete'){"+dojo._scopeName+"._loadInit();}\">"+"</scr"+"ipt>");}var _99=true;_95("onbeforeunload",function(){_w.setTimeout(function(){_99=false;},0);});_95("onunload",function(){if(_99){dojo.unloaded();}});try{document.namespaces.add("v","urn:schemas-microsoft-com:vml");document.createStyleSheet().addRule("v\\:*","behavior:url(#default#VML)");}catch(e){}}else{_95("onbeforeunload",function(){dojo.unloaded();});}})();}(function(){var mp=dojo.config["modulePaths"];if(mp){for(var _9b in mp){dojo.registerModulePath(_9b,mp[_9b]);}}})();if(dojo.config.isDebug){dojo.require("dojo._firebug.firebug");}if(dojo.config.debugAtAllCosts){dojo.config.useXDomain=true;dojo.require("dojo._base._loader.loader_xd");dojo.require("dojo._base._loader.loader_debug");dojo.require("dojo.i18n");}if(!dojo._hasResource["dojo._base.lang"]){dojo._hasResource["dojo._base.lang"]=true;dojo.provide("dojo._base.lang");dojo.isString=function(it){return !!arguments.length&&it!=null&&(typeof it=="string"||it instanceof String);};dojo.isArray=function(it){return it&&(it instanceof Array||typeof it=="array");};dojo.isFunction=(function(){var _9e=function(it){return it&&(typeof it=="function"||it instanceof Function);};return dojo.isSafari?function(it){if(typeof it=="function"&&it=="[object NodeList]"){return false;}return _9e(it);}:_9e;})();dojo.isObject=function(it){return it!==undefined&&(it===null||typeof it=="object"||dojo.isArray(it)||dojo.isFunction(it));};dojo.isArrayLike=function(it){var d=dojo;return it&&it!==undefined&&!d.isString(it)&&!d.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(d.isArray(it)||isFinite(it.length));};dojo.isAlien=function(it){return it&&!dojo.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));};dojo.extend=function(_a5,_a6){for(var i=1,l=arguments.length;i<l;i++){dojo._mixin(_a5.prototype,arguments[i]);}return _a5;};dojo._hitchArgs=function(_a9,_aa){var pre=dojo._toArray(arguments,2);var _ac=dojo.isString(_aa);return function(){var _ad=dojo._toArray(arguments);var f=_ac?(_a9||dojo.global)[_aa]:_aa;return f&&f.apply(_a9||this,pre.concat(_ad));};};dojo.hitch=function(_af,_b0){if(arguments.length>2){return dojo._hitchArgs.apply(dojo,arguments);}if(!_b0){_b0=_af;_af=null;}if(dojo.isString(_b0)){_af=_af||dojo.global;if(!_af[_b0]){throw (["dojo.hitch: scope[\"",_b0,"\"] is null (scope=\"",_af,"\")"].join(""));}return function(){return _af[_b0].apply(_af,arguments||[]);};}return !_af?_b0:function(){return _b0.apply(_af,arguments||[]);};};dojo.delegate=dojo._delegate=function(obj,_b2){function TMP(){};TMP.prototype=obj;var tmp=new TMP();if(_b2){dojo.mixin(tmp,_b2);}return tmp;};dojo.partial=function(_b4){var arr=[null];return dojo.hitch.apply(dojo,arr.concat(dojo._toArray(arguments)));};dojo._toArray=function(obj,_b7,_b8){var arr=_b8||[];for(var x=_b7||0;x<obj.length;x++){arr.push(obj[x]);}return arr;};dojo.clone=function(o){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;}if(!dojo.isObject(o)){return o;}if(o.nodeType&&o.cloneNode){return o.cloneNode(true);}if(o instanceof Date){return new Date(o.getTime());}var r=new o.constructor();for(var i in o){if(!(i in r)||r[i]!=o[i]){r[i]=dojo.clone(o[i]);}}return r;};dojo.trim=function(str){return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");};}if(!dojo._hasResource["dojo._base.declare"]){dojo._hasResource["dojo._base.declare"]=true;dojo.provide("dojo._base.declare");dojo.declare=function(_bf,_c0,_c1){var dd=arguments.callee,_c3;if(dojo.isArray(_c0)){_c3=_c0;_c0=_c3.shift();}if(_c3){dojo.forEach(_c3,function(m){if(!m){throw (_bf+": mixin #"+i+" is null");}_c0=dd._delegate(_c0,m);});}var _c5=(_c1||0).constructor,_c6=dd._delegate(_c0),fn;for(var i in _c1){if(dojo.isFunction(fn=_c1[i])&&!0[i]){fn.nom=i;}}dojo.extend(_c6,{declaredClass:_bf,_constructor:_c5,preamble:null},_c1||0);_c6.prototype.constructor=_c6;return dojo.setObject(_bf,_c6);};dojo.mixin(dojo.declare,{_delegate:function(_c9,_ca){var bp=(_c9||0).prototype,mp=(_ca||0).prototype;var _cd=dojo.declare._makeCtor();dojo.mixin(_cd,{superclass:bp,mixin:mp,extend:dojo.declare._extend});if(_c9){_cd.prototype=dojo._delegate(bp);}dojo.extend(_cd,dojo.declare._core,mp||0,{_constructor:null,preamble:null});_cd.prototype.constructor=_cd;_cd.prototype.declaredClass=(bp||0).declaredClass+"_"+(mp||0).declaredClass;return _cd;},_extend:function(_ce){for(var i in _ce){if(dojo.isFunction(fn=_ce[i])&&!0[i]){fn.nom=i;}}dojo.extend(this,_ce);},_makeCtor:function(){return function(){this._construct(arguments);};},_core:{_construct:function(_d0){var c=_d0.callee,s=c.superclass,ct=s&&s.constructor,m=c.mixin,mct=m&&m.constructor,a=_d0,ii,fn;if(a[0]){if(((fn=a[0].preamble))){a=fn.apply(this,a)||a;}}if((fn=c.prototype.preamble)){a=fn.apply(this,a)||a;}if(ct&&ct.apply){ct.apply(this,a);}if(mct&&mct.apply){mct.apply(this,a);}if((ii=c.prototype._constructor)){ii.apply(this,_d0);}if(this.constructor.prototype==c.prototype&&(ct=this.postscript)){ct.apply(this,_d0);}},_findMixin:function(_d9){var c=this.constructor,p,m;while(c){p=c.superclass;m=c.mixin;if(m==_d9||(m instanceof _d9.constructor)){return p;}if(m&&(m=m._findMixin(_d9))){return m;}c=p&&p.constructor;}},_findMethod:function(_dd,_de,_df,has){var p=_df,c,m,f;do{c=p.constructor;m=c.mixin;if(m&&(m=this._findMethod(_dd,_de,m,has))){return m;}if((f=p[_dd])&&(has==(f==_de))){return p;}p=c.superclass;}while(p);return !has&&(p=this._findMixin(_df))&&this._findMethod(_dd,_de,p,has);},inherited:function(_e5,_e6,_e7){var a=arguments;if(!dojo.isString(a[0])){_e7=_e6;_e6=_e5;_e5=_e6.callee.nom;}a=_e7||_e6;var c=_e6.callee,p=this.constructor.prototype,fn,mp;if(this[_e5]!=c||p[_e5]==c){mp=this._findMethod(_e5,c,p,true);if(!mp){throw (this.declaredClass+": inherited method \""+_e5+"\" mismatch");}p=this._findMethod(_e5,c,mp,false);}fn=p&&p[_e5];if(!fn){throw (mp.declaredClass+": inherited method \""+_e5+"\" not found");}return fn.apply(this,a);}}});}if(!dojo._hasResource["dojo._base.connect"]){dojo._hasResource["dojo._base.connect"]=true;dojo.provide("dojo._base.connect");dojo._listener={getDispatcher:function(){return function(){var ap=Array.prototype,c=arguments.callee,ls=c._listeners,t=c.target;var r=t&&t.apply(this,arguments);for(var i in ls){if(!(i in ap)){ls[i].apply(this,arguments);}}return r;};},add:function(_f3,_f4,_f5){_f3=_f3||dojo.global;var f=_f3[_f4];if(!f||!f._listeners){var d=dojo._listener.getDispatcher();d.target=f;d._listeners=[];f=_f3[_f4]=d;}return f._listeners.push(_f5);},remove:function(_f8,_f9,_fa){var f=(_f8||dojo.global)[_f9];if(f&&f._listeners&&_fa--){delete f._listeners[_fa];}}};dojo.connect=function(obj,_fd,_fe,_ff,_100){var a=arguments,args=[],i=0;args.push(dojo.isString(a[0])?null:a[i++],a[i++]);var a1=a[i+1];args.push(dojo.isString(a1)||dojo.isFunction(a1)?a[i++]:null,a[i++]);for(var l=a.length;i<l;i++){args.push(a[i]);}return dojo._connect.apply(this,args);};dojo._connect=function(obj,_106,_107,_108){var l=dojo._listener,h=l.add(obj,_106,dojo.hitch(_107,_108));return [obj,_106,h,l];};dojo.disconnect=function(_10b){if(_10b&&_10b[0]!==undefined){dojo._disconnect.apply(this,_10b);delete _10b[0];}};dojo._disconnect=function(obj,_10d,_10e,_10f){_10f.remove(obj,_10d,_10e);};dojo._topics={};dojo.subscribe=function(_110,_111,_112){return [_110,dojo._listener.add(dojo._topics,_110,dojo.hitch(_111,_112))];};dojo.unsubscribe=function(_113){if(_113){dojo._listener.remove(dojo._topics,_113[0],_113[1]);}};dojo.publish=function(_114,args){var f=dojo._topics[_114];if(f){f.apply(this,args||[]);}};dojo.connectPublisher=function(_117,obj,_119){var pf=function(){dojo.publish(_117,arguments);};return (_119)?dojo.connect(obj,_119,pf):dojo.connect(obj,pf);};}if(!dojo._hasResource["dojo._base.Deferred"]){dojo._hasResource["dojo._base.Deferred"]=true;dojo.provide("dojo._base.Deferred");dojo.Deferred=function(_11b){this.chain=[];this.id=this._nextId();this.fired=-1;this.paused=0;this.results=[null,null];this.canceller=_11b;this.silentlyCancelled=false;};dojo.extend(dojo.Deferred,{_nextId:(function(){var n=1;return function(){return n++;};})(),cancel:function(){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){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 _124=dojo.hitch.apply(dojo,arguments);return this.addCallbacks(_124,_124);},addCallback:function(cb,cbfn){return this.addCallbacks(dojo.hitch.apply(dojo,arguments));},addErrback:function(cb,cbfn){return this.addCallbacks(null,dojo.hitch.apply(dojo,arguments));},addCallbacks:function(cb,eb){this.chain.push([cb,eb]);if(this.fired>=0){this._fire();}return this;},_fire:function(){var _12b=this.chain;var _12c=this.fired;var res=this.results[_12c];var self=this;var cb=null;while((_12b.length>0)&&(this.paused==0)){var f=_12b.shift()[_12c];if(!f){continue;}try{res=f(res);_12c=((res instanceof Error)?1:0);if(res instanceof dojo.Deferred){cb=function(res){self._resback(res);self.paused--;if((self.paused==0)&&(self.fired>=0)){self._fire();}};this.paused++;}}catch(err){console.debug(err);_12c=1;res=err;}}this.fired=_12c;this.results[_12c]=res;if((cb)&&(this.paused)){res.addBoth(cb);}}});}if(!dojo._hasResource["dojo._base.json"]){dojo._hasResource["dojo._base.json"]=true;dojo.provide("dojo._base.json");dojo.fromJson=function(json){return eval("("+json+")");};dojo._escapeString=function(str){return ("\""+str.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};dojo.toJsonIndentStr="\t";dojo.toJson=function(it,_135,_136){if(it===undefined){return "undefined";}var _137=typeof it;if(_137=="number"||_137=="boolean"){return it+"";}if(it===null){return "null";}if(dojo.isString(it)){return dojo._escapeString(it);}if(it.nodeType&&it.cloneNode){return "";}var _138=arguments.callee;var _139;_136=_136||"";var _13a=_135?_136+dojo.toJsonIndentStr:"";if(typeof it.__json__=="function"){_139=it.__json__();if(it!==_139){return _138(_139,_135,_13a);}}if(typeof it.json=="function"){_139=it.json();if(it!==_139){return _138(_139,_135,_13a);}}var sep=_135?" ":"";var _13c=_135?"\n":"";if(dojo.isArray(it)){var res=dojo.map(it,function(obj){var val=_138(obj,_135,_13a);if(typeof val!="string"){val="undefined";}return _13c+_13a+val;});return "["+res.join(","+sep)+_13c+_136+"]";}if(_137=="function"){return null;}var _140=[];for(var key in it){var _142;if(typeof key=="number"){_142="\""+key+"\"";}else{if(typeof key=="string"){_142=dojo._escapeString(key);}else{continue;}}val=_138(it[key],_135,_13a);if(typeof val!="string"){continue;}_140.push(_13c+_13a+_142+":"+sep+val);}return "{"+_140.join(","+sep)+_13c+_136+"}";};}if(!dojo._hasResource["dojo._base.array"]){dojo._hasResource["dojo._base.array"]=true;dojo.provide("dojo._base.array");(function(){var _143=function(arr,obj,cb){return [dojo.isString(arr)?arr.split(""):arr,obj||dojo.global,dojo.isString(cb)?new Function("item","index","array",cb):cb];};dojo.mixin(dojo,{indexOf:function(_147,_148,_149,_14a){var step=1,end=_147.length||0,i=0;if(_14a){i=end-1;step=end=-1;}if(_149!=undefined){i=_149;}if((_14a&&i>end)||i<end){for(;i!=end;i+=step){if(_147[i]==_148){return i;}}}return -1;},lastIndexOf:function(_14d,_14e,_14f){return dojo.indexOf(_14d,_14e,_14f,true);},forEach:function(arr,_151,_152){if(!arr||!arr.length){return;}var _p=_143(arr,_152,_151);arr=_p[0];for(var i=0,l=_p[0].length;i<l;i++){_p[2].call(_p[1],arr[i],i,arr);}},_everyOrSome:function(_156,arr,_158,_159){var _p=_143(arr,_159,_158);arr=_p[0];for(var i=0,l=arr.length;i<l;i++){var _15d=!!_p[2].call(_p[1],arr[i],i,arr);if(_156^_15d){return _15d;}}return _156;},every:function(arr,_15f,_160){return this._everyOrSome(true,arr,_15f,_160);},some:function(arr,_162,_163){return this._everyOrSome(false,arr,_162,_163);},map:function(arr,_165,_166){var _p=_143(arr,_166,_165);arr=_p[0];var _168=(arguments[3]?(new arguments[3]()):[]);for(var i=0;i<arr.length;++i){_168.push(_p[2].call(_p[1],arr[i],i,arr));}return _168;},filter:function(arr,_16b,_16c){var _p=_143(arr,_16c,_16b);arr=_p[0];var _16e=[];for(var i=0;i<arr.length;i++){if(_p[2].call(_p[1],arr[i],i,arr)){_16e.push(arr[i]);}}return _16e;}});})();}if(!dojo._hasResource["dojo._base.Color"]){dojo._hasResource["dojo._base.Color"]=true;dojo.provide("dojo._base.Color");dojo.Color=function(_170){if(_170){this.setColor(_170);}};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(_176){var d=dojo;if(d.isString(_176)){d.colorFromString(_176,this);}else{if(d.isArray(_176)){d.colorFromArray(_176,this);}else{this._set(_176.r,_176.g,_176.b,_176.a);if(!(_176 instanceof d.Color)){this.sanitize();}}}return this;},sanitize:function(){return this;},toRgb:function(){var t=this;return [t.r,t.g,t.b];},toRgba:function(){var t=this;return [t.r,t.g,t.b,t.a];},toHex:function(){var arr=dojo.map(["r","g","b"],function(x){var s=this[x].toString(16);return s.length<2?"0"+s:s;},this);return "#"+arr.join("");},toCss:function(_17d){var t=this,rgb=t.r+", "+t.g+", "+t.b;return (_17d?"rgba("+rgb+", "+t.a:"rgb("+rgb)+")";},toString:function(){return this.toCss(true);}});dojo.blendColors=function(_180,end,_182,obj){var d=dojo,t=obj||new dojo.Color();d.forEach(["r","g","b","a"],function(x){t[x]=_180[x]+(end[x]-_180[x])*_182;if(x!="a"){t[x]=Math.round(t[x]);}});return t.sanitize();};dojo.colorFromRgb=function(_187,obj){var m=_187.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);return m&&dojo.colorFromArray(m[1].split(/\s*,\s*/),obj);};dojo.colorFromHex=function(_18a,obj){var d=dojo,t=obj||new d.Color(),bits=(_18a.length==4)?4:8,mask=(1<<bits)-1;_18a=Number("0x"+_18a.substr(1));if(isNaN(_18a)){return null;}d.forEach(["b","g","r"],function(x){var c=_18a&mask;_18a>>=bits;t[x]=bits==4?17*c:c;});t.a=1;return t;};dojo.colorFromArray=function(a,obj){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.colorFromString=function(str,obj){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"]){dojo._hasResource["dojo._base"]=true;dojo.provide("dojo._base");}if(!dojo._hasResource["dojo._base.window"]){dojo._hasResource["dojo._base.window"]=true;dojo.provide("dojo._base.window");dojo._gearsObject=function(){var _198;var _199;var _19a=dojo.getObject("google.gears");if(_19a){return _19a;}if(typeof GearsFactory!="undefined"){_198=new GearsFactory();}else{if(dojo.isIE){try{_198=new ActiveXObject("Gears.Factory");}catch(e){}}else{if(navigator.mimeTypes["application/x-googlegears"]){_198=document.createElement("object");_198.setAttribute("type","application/x-googlegears");_198.setAttribute("width",0);_198.setAttribute("height",0);_198.style.display="none";document.documentElement.appendChild(_198);}}}if(!_198){return null;}dojo.setObject("google.gears.factory",_198);return dojo.getObject("google.gears");};dojo.isGears=(!!dojo._gearsObject())||0;dojo.doc=window["document"]||null;dojo.body=function(){return dojo.doc.body||dojo.doc.getElementsByTagName("body")[0];};dojo.setContext=function(_19b,_19c){dojo.global=_19b;dojo.doc=_19c;};dojo._fireCallback=function(_19d,_19e,_19f){if(_19e&&dojo.isString(_19d)){_19d=_19e[_19d];}return _19d.apply(_19e,_19f||[]);};dojo.withGlobal=function(_1a0,_1a1,_1a2,_1a3){var rval;var _1a5=dojo.global;var _1a6=dojo.doc;try{dojo.setContext(_1a0,_1a0.document);rval=dojo._fireCallback(_1a1,_1a2,_1a3);}finally{dojo.setContext(_1a5,_1a6);}return rval;};dojo.withDoc=function(_1a7,_1a8,_1a9,_1aa){var rval;var _1ac=dojo.doc;try{dojo.doc=_1a7;rval=dojo._fireCallback(_1a8,_1a9,_1aa);}finally{dojo.doc=_1ac;}return rval;};}if(!dojo._hasResource["dojo._base.event"]){dojo._hasResource["dojo._base.event"]=true;dojo.provide("dojo._base.event");(function(){var del=(dojo._event_listener={add:function(node,name,fp){if(!node){return;}name=del._normalizeEventName(name);fp=del._fixCallback(name,fp);var _1b1=name;if(!dojo.isIE&&(name=="mouseenter"||name=="mouseleave")){var ofp=fp;name=(name=="mouseenter")?"mouseover":"mouseout";fp=function(e){if(!dojo.isDescendant(e.relatedTarget,node)){return ofp.call(this,e);}};}node.addEventListener(name,fp,false);return fp;},remove:function(node,_1b5,_1b6){if(node){node.removeEventListener(del._normalizeEventName(_1b5),_1b6,false);}},_normalizeEventName:function(name){return name.slice(0,2)=="on"?name.slice(2):name;},_fixCallback:function(name,fp){return name!="keypress"?fp:function(e){return fp.call(this,del._fixEvent(e,this));};},_fixEvent:function(evt,_1bc){switch(evt.type){case "keypress":del._setKeyChar(evt);break;}return evt;},_setKeyChar:function(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";}});dojo.fixEvent=function(evt,_1bf){return del._fixEvent(evt,_1bf);};dojo.stopEvent=function(evt){evt.preventDefault();evt.stopPropagation();};var _1c1=dojo._listener;dojo._connect=function(obj,_1c3,_1c4,_1c5,_1c6){var _1c7=obj&&(obj.nodeType||obj.attachEvent||obj.addEventListener);var lid=!_1c7?0:(!_1c6?1:2),l=[dojo._listener,del,_1c1][lid];var h=l.add(obj,_1c3,dojo.hitch(_1c4,_1c5));return [obj,_1c3,h,lid];};dojo._disconnect=function(obj,_1cc,_1cd,_1ce){([dojo._listener,del,_1c1][_1ce]).remove(obj,_1cc,_1cd);};dojo.keys={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};if(dojo.isIE){var _1cf=function(e,code){try{return (e.keyCode=code);}catch(e){return 0;}};var iel=dojo._listener;if(!dojo.config._allow_leaks){_1c1=iel=dojo._ie_listener={handlers:[],add:function(_1d3,_1d4,_1d5){_1d3=_1d3||dojo.global;var f=_1d3[_1d4];if(!f||!f._listeners){var d=dojo._getIeDispatcher();d.target=f&&(ieh.push(f)-1);d._listeners=[];f=_1d3[_1d4]=d;}return f._listeners.push(ieh.push(_1d5)-1);},remove:function(_1d9,_1da,_1db){var f=(_1d9||dojo.global)[_1da],l=f&&f._listeners;if(f&&l&&_1db--){delete ieh[l[_1db]];delete l[_1db];}}};var ieh=iel.handlers;}dojo.mixin(del,{add:function(node,_1df,fp){if(!node){return;}_1df=del._normalizeEventName(_1df);if(_1df=="onkeypress"){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,_1df,del._fixCallback(fp));},remove:function(node,_1e4,_1e5){_1e4=del._normalizeEventName(_1e4);iel.remove(node,_1e4,_1e5);if(_1e4=="onkeypress"){var kd=node.onkeydown;if(--kd._stealthKeydownRefs<=0){iel.remove(node,"onkeydown",kd._stealthKeydownHandle);delete kd._stealthKeydownHandle;}}},_normalizeEventName:function(_1e7){return _1e7.slice(0,2)!="on"?"on"+_1e7:_1e7;},_nop:function(){},_fixEvent:function(evt,_1e9){if(!evt){var w=_1e9&&(_1e9.ownerDocument||_1e9.document||_1e9).parentWindow||window;evt=w.event;}if(!evt){return (evt);}evt.target=evt.srcElement;evt.currentTarget=(_1e9||evt.srcElement);evt.layerX=evt.offsetX;evt.layerY=evt.offsetY;var se=evt.srcElement,doc=(se&&se.ownerDocument)||document;var _1ed=((dojo.isIE<6)||(doc["compatMode"]=="BackCompat"))?doc.body:doc.documentElement;var _1ee=dojo._getIeDocumentElementOffset();evt.pageX=evt.clientX+dojo._fixIeBiDiScrollLeft(_1ed.scrollLeft||0)-_1ee.x;evt.pageY=evt.clientY+(_1ed.scrollTop||0)-_1ee.y;if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}evt.stopPropagation=del._stopPropagation;evt.preventDefault=del._preventDefault;return del._fixKeys(evt);},_fixKeys:function(evt){switch(evt.type){case "keypress":var c=("charCode" in evt?evt.charCode:evt.keyCode);if(c==10){c=0;evt.keyCode=13;}else{if(c==13||c==27){c=0;}else{if(c==3){c=99;}}}evt.charCode=c;del._setKeyChar(evt);break;}return evt;},_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){var kp=evt.currentTarget.onkeypress;if(!kp||!kp._listeners){return;}var k=evt.keyCode;var _1f4=(k!=13)&&(k!=32)&&(k!=27)&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);if(_1f4||evt.ctrlKey){var c=_1f4?0:k;if(evt.ctrlKey){if(k==3||k==13){return;}else{if(c>95&&c<106){c-=48;}else{if((!evt.shiftKey)&&(c>=65&&c<=90)){c+=32;}else{c=del._punctMap[c]||c;}}}}var faux=del._synthesizeEvent(evt,{type:"keypress",faux:true,charCode:c});kp.call(evt.currentTarget,faux);evt.cancelBubble=faux.cancelBubble;evt.returnValue=faux.returnValue;_1cf(evt,faux.keyCode);}},_stopPropagation:function(){this.cancelBubble=true;},_preventDefault:function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){_1cf(this,0);}this.returnValue=false;}});dojo.stopEvent=function(evt){evt=evt||window.event;del._stopPropagation.call(evt);del._preventDefault.call(evt);};}del._synthesizeEvent=function(evt,_1f9){var faux=dojo.mixin({},evt,_1f9);del._setKeyChar(faux);faux.preventDefault=function(){evt.preventDefault();};faux.stopPropagation=function(){evt.stopPropagation();};return faux;};if(dojo.isOpera){dojo.mixin(del,{_fixEvent:function(evt,_1fc){switch(evt.type){case "keypress":var c=evt.which;if(c==3){c=99;}c=((c<41)&&(!evt.shiftKey)?0:c);if((evt.ctrlKey)&&(!evt.shiftKey)&&(c>=65)&&(c<=90)){c+=32;}return del._synthesizeEvent(evt,{charCode:c});}return evt;}});}if(dojo.isSafari){dojo.mixin(del,{_fixEvent:function(evt,_1ff){switch(evt.type){case "keypress":var c=evt.charCode,s=evt.shiftKey,k=evt.keyCode;k=k||_203[evt.keyIdentifier]||0;if(evt.keyIdentifier=="Enter"){c=0;}else{if((evt.ctrlKey)&&(c>0)&&(c<27)){c+=96;}else{if(c==dojo.keys.SHIFT_TAB){c=dojo.keys.TAB;s=true;}else{c=(c>=32&&c<63232?c:0);}}}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,_203={"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){dojo._ieDispatcher=function(args,_206){var ap=Array.prototype,h=dojo._ie_listener.handlers,c=args.callee,ls=c._listeners,t=h[c.target];var r=t&&t.apply(_206,args);for(var i in ls){if(!(i in ap)){h[ls[i]].apply(_206,args);}}return r;};dojo._getIeDispatcher=function(){return new Function(dojo._scopeName+"._ieDispatcher(arguments, this)");};dojo._event_listener._fixCallback=function(fp){var f=dojo._event_listener._fixEvent;return function(e){return fp.call(this,f(e,this));};};}}if(!dojo._hasResource["dojo._base.html"]){dojo._hasResource["dojo._base.html"]=true;dojo.provide("dojo._base.html");try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}if(dojo.isIE||dojo.isOpera){dojo.byId=function(id,doc){if(dojo.isString(id)){var _d=doc||dojo.doc;var te=_d.getElementById(id);if(te&&te.attributes.id.value==id){return te;}else{var eles=_d.all[id];if(!eles||!eles.length){return eles;}var i=0;while((te=eles[i++])){if(te.attributes.id.value==id){return te;}}}}else{return id;}};}else{dojo.byId=function(id,doc){return dojo.isString(id)?(doc||dojo.doc).getElementById(id):id;};}(function(){var d=dojo;var _21a=null;dojo.addOnUnload(function(){_21a=null;});dojo._destroyElement=function(node){node=d.byId(node);try{if(!_21a){_21a=document.createElement("div");}_21a.appendChild(node.parentNode?node.parentNode.removeChild(node):node);_21a.innerHTML="";}catch(e){}};dojo.isDescendant=function(node,_21d){try{node=d.byId(node);_21d=d.byId(_21d);while(node){if(node===_21d){return true;}node=node.parentNode;}}catch(e){}return false;};dojo.setSelectable=function(node,_21f){node=d.byId(node);if(d.isMozilla){node.style.MozUserSelect=_21f?"":"none";}else{if(d.isKhtml){node.style.KhtmlUserSelect=_21f?"auto":"none";}else{if(d.isIE){node.unselectable=_21f?"":"on";d.query("*",node).forEach(function(_220){_220.unselectable=_21f?"":"on";});}}}};var _221=function(node,ref){ref.parentNode.insertBefore(node,ref);return true;};var _224=function(node,ref){var pn=ref.parentNode;if(ref==pn.lastChild){pn.appendChild(node);}else{return _221(node,ref.nextSibling);}return true;};dojo.place=function(node,_229,_22a){if(!node||!_229||_22a===undefined){return false;}node=d.byId(node);_229=d.byId(_229);if(typeof _22a=="number"){var cn=_229.childNodes;if((_22a==0&&cn.length==0)||cn.length==_22a){_229.appendChild(node);return true;}if(_22a==0){return _221(node,_229.firstChild);}return _224(node,cn[_22a-1]);}switch(_22a.toLowerCase()){case "before":return _221(node,_229);case "after":return _224(node,_229);case "first":if(_229.firstChild){return _221(node,_229.firstChild);}default:_229.appendChild(node);return true;}};dojo.boxModel="content-box";if(d.isIE){var _dcm=document.compatMode;d.boxModel=_dcm=="BackCompat"||_dcm=="QuirksMode"||d.isIE<6?"border-box":"content-box";}var gcs,dv=document.defaultView;if(d.isSafari){gcs=function(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(_233,_234){return parseFloat(_234)||0;};}else{dojo._toPixelValue=function(_235,_236){if(!_236){return 0;}if(_236=="medium"){return 4;}if(_236.slice&&(_236.slice(-2)=="px")){return parseFloat(_236);}with(_235){var _237=style.left;var _238=runtimeStyle.left;runtimeStyle.left=currentStyle.left;try{style.left=_236;_236=style.pixelLeft;}catch(e){_236=0;}style.left=_237;runtimeStyle.left=_238;}return _236;};}var px=d._toPixelValue;dojo._getOpacity=d.isIE?function(node){try{return node.filters.alpha.opacity/100;}catch(e){return 1;}}:function(node){return gcs(node).opacity;};dojo._setOpacity=d.isIE?function(node,_23d){if(_23d==1){var _23e=/FILTER:[^;]*;?/i;node.style.cssText=node.style.cssText.replace(_23e,"");if(node.nodeName.toLowerCase()=="tr"){d.query("> td",node).forEach(function(i){i.style.cssText=i.style.cssText.replace(_23e,"");});}}else{var o="Alpha(Opacity="+_23d*100+")";node.style.filter=o;}if(node.nodeName.toLowerCase()=="tr"){d.query("> td",node).forEach(function(i){i.style.filter=o;});}return _23d;}:function(node,_243){return node.style.opacity=_243;};var _244={left:true,top:true};var _245=/margin|padding|width|height|max|min|offset/;var _246=function(node,type,_249){type=type.toLowerCase();if(d.isIE&&_249=="auto"){if(type=="height"){return node.offsetHeight;}if(type=="width"){return node.offsetWidth;}}if(!(type in _244)){_244[type]=_245.test(type);}return _244[type]?px(node,_249):_249;};var _24a=d.isIE?"styleFloat":"cssFloat";var _24b={"cssFloat":_24a,"styleFloat":_24a,"float":_24a};dojo.style=function(node,_24d,_24e){var n=d.byId(node),args=arguments.length,op=(_24d=="opacity");_24d=_24b[_24d]||_24d;if(args==3){return op?d._setOpacity(n,_24e):n.style[_24d]=_24e;}if(args==2&&op){return d._getOpacity(n);}var s=gcs(n);if(args==2&&!d.isString(_24d)){for(var x in _24d){d.style(node,x,_24d[x]);}return s;}return (args==1)?s:_246(n,_24d,s[_24d]);};dojo._getPadExtents=function(n,_255){var s=_255||gcs(n),l=px(n,s.paddingLeft),t=px(n,s.paddingTop);return {l:l,t:t,w:l+px(n,s.paddingRight),h:t+px(n,s.paddingBottom)};};dojo._getBorderExtents=function(n,_25a){var ne="none",s=_25a||gcs(n),bl=(s.borderLeftStyle!=ne?px(n,s.borderLeftWidth):0),bt=(s.borderTopStyle!=ne?px(n,s.borderTopWidth):0);return {l:bl,t:bt,w:bl+(s.borderRightStyle!=ne?px(n,s.borderRightWidth):0),h:bt+(s.borderBottomStyle!=ne?px(n,s.borderBottomWidth):0)};};dojo._getPadBorderExtents=function(n,_260){var s=_260||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,_265){var s=_265||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")){r=l;}return {l:l,t:t,w:l+r,h:t+b};};dojo._getMarginBox=function(node,_26c){var s=_26c||gcs(node),me=d._getMarginExtents(node,s);var l=node.offsetLeft-me.l,t=node.offsetTop-me.t;if(d.isMoz){var sl=parseFloat(s.left),st=parseFloat(s.top);if(!isNaN(sl)&&!isNaN(st)){l=sl,t=st;}else{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){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,_277){var s=_277||gcs(node),pe=d._getPadExtents(node,s),be=d._getBorderExtents(node,s),w=node.clientWidth,h;if(!w){w=node.offsetWidth,h=node.offsetHeight;}else{h=node.clientHeight,be.w=be.h=0;}if(d.isOpera){pe.l+=be.l;pe.t+=be.t;}return {l:pe.l,t:pe.t,w:w-pe.w-be.w,h:h-pe.h-be.h};};dojo._getBorderBox=function(node,_27e){var s=_27e||gcs(node),pe=d._getPadExtents(node,s),cb=d._getContentBox(node,s);return {l:cb.l-pe.l,t:cb.t-pe.t,w:cb.w+pe.w,h:cb.h+pe.h};};dojo._setBox=function(node,l,t,w,h,u){u=u||"px";var s=node.style;if(!isNaN(l)){s.left=l+u;}if(!isNaN(t)){s.top=t+u;}if(w>=0){s.width=w+u;}if(h>=0){s.height=h+u;}};dojo._usesBorderBox=function(node){var n=node.tagName;return d.boxModel=="border-box"||n=="TABLE"||n=="BUTTON";};dojo._setContentSize=function(node,_28c,_28d,_28e){if(d._usesBorderBox(node)){var pb=d._getPadBorderExtents(node,_28e);if(_28c>=0){_28c+=pb.w;}if(_28d>=0){_28d+=pb.h;}}d._setBox(node,NaN,NaN,_28c,_28d);};dojo._setMarginBox=function(node,_291,_292,_293,_294,_295){var s=_295||gcs(node);var bb=d._usesBorderBox(node),pb=bb?_299:d._getPadBorderExtents(node,s),mb=d._getMarginExtents(node,s);if(_293>=0){_293=Math.max(_293-pb.w-mb.w,0);}if(_294>=0){_294=Math.max(_294-pb.h-mb.h,0);}d._setBox(node,_291,_292,_293,_294);};var _299={l:0,t:0,w:0,h:0};dojo.marginBox=function(node,box){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);};dojo.contentBox=function(node,box){var n=dojo.byId(node),s=gcs(n),b=box;return !b?d._getContentBox(n,s):d._setContentSize(n,b.w,b.h,s);};var _2a5=function(node,prop){if(!(node=(node||0).parentNode)){return 0;}var val,_2a9=0,_b=d.body();while(node&&node.style){if(gcs(node).position=="fixed"){return 0;}val=node[prop];if(val){_2a9+=val-0;if(node==_b){break;}}node=node.parentNode;}return _2a9;};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(){return !("_bodyLtr" in d)?d._bodyLtr=gcs(d.body()).direction=="ltr":d._bodyLtr;};dojo._getIeDocumentElementOffset=function(){var de=d.doc.documentElement;return (d.isIE>=7)?{x:de.getBoundingClientRect().left,y:de.getBoundingClientRect().top}:{x:d._isBodyLtr()||window.parent==window?de.clientLeft:de.offsetWidth-de.clientWidth-de.clientLeft,y:de.clientTop};};dojo._fixIeBiDiScrollLeft=function(_2af){var dd=d.doc;if(d.isIE&&!dojo._isBodyLtr()){var de=dd.compatMode=="BackCompat"?dd.body:dd.documentElement;return _2af+de.clientWidth-de.scrollWidth;}return _2af;};dojo._abs=function(node,_2b3){var _2b4=node.ownerDocument;var ret={x:0,y:0};var db=d.body();if(d.isIE||(d.isFF>=3)){var _2b7=node.getBoundingClientRect();var _2b8=(d.isIE)?d._getIeDocumentElementOffset():{x:0,y:0};ret.x=_2b7.left-_2b8.x;ret.y=_2b7.top-_2b8.y;}else{if(_2b4["getBoxObjectFor"]){var bo=_2b4.getBoxObjectFor(node),b=d._getBorderExtents(node);ret.x=bo.x-b.l-_2a5(node,"scrollLeft");ret.y=bo.y-b.t-_2a5(node,"scrollTop");}else{if(node["offsetParent"]){var _2bb;if(d.isSafari&&(gcs(node).position=="absolute")&&(node.parentNode==db)){_2bb=db;}else{_2bb=db.parentNode;}if(node.parentNode!=db){var nd=node;if(d.isOpera){nd=db;}ret.x-=_2a5(nd,"scrollLeft");ret.y-=_2a5(nd,"scrollTop");}var _2bd=node;do{var n=_2bd.offsetLeft;if(!d.isOpera||n>0){ret.x+=isNaN(n)?0:n;}var t=_2bd.offsetTop;ret.y+=isNaN(t)?0:t;if(d.isSafari&&_2bd!=node){var cs=gcs(_2bd);ret.x+=px(_2bd,cs.borderLeftWidth);ret.y+=px(_2bd,cs.borderTopWidth);}_2bd=_2bd.offsetParent;}while((_2bd!=_2bb)&&_2bd);}else{if(node.x&&node.y){ret.x+=isNaN(node.x)?0:node.x;ret.y+=isNaN(node.y)?0:node.y;}}}}if(_2b3){var _2c1=d._docScroll();ret.y+=_2c1.y;ret.x+=_2c1.x;}return ret;};dojo.coords=function(node,_2c3){var n=d.byId(node),s=gcs(n),mb=d._getMarginBox(n,s);var abs=d._abs(n,_2c3);mb.x=abs.x;mb.y=abs.y;return mb;};var _2c8=function(name){switch(name.toLowerCase()){case "tabindex":return (d.isIE&&d.isIE<8)?"tabIndex":"tabindex";default:return name;}};var _2ca={colspan:"colSpan",enctype:"enctype",frameborder:"frameborder",method:"method",rowspan:"rowSpan",scrolling:"scrolling",shape:"shape",span:"span",type:"type",valuetype:"valueType"};dojo.hasAttr=function(node,name){var attr=d.byId(node).getAttributeNode(_2c8(name));return attr?attr.specified:false;};var _2ce={};var _ctr=0;var _2d0=dojo._scopeName+"attrid";dojo.attr=function(node,name,_2d3){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=_2c8(name);if(args==3){if(d.isFunction(_2d3)){var _2d6=d.attr(node,_2d0);if(!_2d6){_2d6=_ctr++;d.attr(node,_2d0,_2d6);}if(!_2ce[_2d6]){_2ce[_2d6]={};}var h=_2ce[_2d6][name];if(h){d.disconnect(h);}else{try{delete node[name];}catch(e){}}_2ce[_2d6][name]=d.connect(node,name,_2d3);}else{if(typeof _2d3=="boolean"){node[name]=_2d3;}else{node.setAttribute(name,_2d3);}}return;}else{var prop=_2ca[name.toLowerCase()];if(prop){return node[prop];}else{var _2d3=node[name];return (typeof _2d3=="boolean"||typeof _2d3=="function")?_2d3:(d.hasAttr(node,name)?node.getAttribute(name):null);}}};dojo.removeAttr=function(node,name){d.byId(node).removeAttribute(_2c8(name));};})();dojo.hasClass=function(node,_2dc){return ((" "+dojo.byId(node).className+" ").indexOf(" "+_2dc+" ")>=0);};dojo.addClass=function(node,_2de){node=dojo.byId(node);var cls=node.className;if((" "+cls+" ").indexOf(" "+_2de+" ")<0){node.className=cls+(cls?" ":"")+_2de;}};dojo.removeClass=function(node,_2e1){node=dojo.byId(node);var t=dojo.trim((" "+node.className+" ").replace(" "+_2e1+" "," "));if(node.className!=t){node.className=t;}};dojo.toggleClass=function(node,_2e4,_2e5){if(_2e5===undefined){_2e5=!dojo.hasClass(node,_2e4);}dojo[_2e5?"addClass":"removeClass"](node,_2e4);};}if(!dojo._hasResource["dojo._base.NodeList"]){dojo._hasResource["dojo._base.NodeList"]=true;dojo.provide("dojo._base.NodeList");(function(){var d=dojo;var tnl=function(arr){arr.constructor=dojo.NodeList;dojo._mixin(arr,dojo.NodeList.prototype);return arr;};var _2e9=function(func,_2eb){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 (_2eb||((_a.length>1)||!d.isString(_a[0])))?this:s;};};dojo.NodeList=function(){return tnl(Array.apply(null,arguments));};dojo.NodeList._wrap=tnl;dojo.extend(dojo.NodeList,{slice:function(){var a=dojo._toArray(arguments);return tnl(a.slice.apply(this,a));},splice:function(){var a=dojo._toArray(arguments);return tnl(a.splice.apply(this,a));},concat:function(){var a=dojo._toArray(arguments,0,[this]);return tnl(a.concat.apply([],a));},indexOf:function(_2f3,_2f4){return d.indexOf(this,_2f3,_2f4);},lastIndexOf:function(){return d.lastIndexOf.apply(d,d._toArray(arguments,0,[this]));},every:function(_2f5,_2f6){return d.every(this,_2f5,_2f6);},some:function(_2f7,_2f8){return d.some(this,_2f7,_2f8);},map:function(func,obj){return d.map(this,func,obj,d.NodeList);},forEach:function(_2fb,_2fc){d.forEach(this,_2fb,_2fc);return this;},coords:function(){return d.map(this,d.coords);},attr:_2e9("attr"),style:_2e9("style"),addClass:_2e9("addClass",true),removeClass:_2e9("removeClass",true),toggleClass:_2e9("toggleClass",true),connect:_2e9("connect",true),place:function(_2fd,_2fe){var item=d.query(_2fd)[0];return this.forEach(function(i){d.place(i,item,(_2fe||"last"));});},orphan:function(_301){var _302=_301?d._filterQueryResult(this,_301):this;_302.forEach(function(item){if(item.parentNode){item.parentNode.removeChild(item);}});return _302;},adopt:function(_304,_305){var item=this[0];return d.query(_304).forEach(function(ai){d.place(ai,item,_305||"last");});},query:function(_308){if(!_308){return this;}var ret=d.NodeList();this.forEach(function(item){d.query(_308,item).forEach(function(_30b){if(_30b!==undefined){ret.push(_30b);}});});return ret;},filter:function(_30c){var _30d=this;var _a=arguments;var r=d.NodeList();var rp=function(t){if(t!==undefined){r.push(t);}};if(d.isString(_30c)){_30d=d._filterQueryResult(this,_a[0]);if(_a.length==1){return _30d;}_a.shift();}d.forEach(d.filter(_30d,_a[0],_a[1]),rp);return r;},addContent:function(_312,_313){var ta=d.doc.createElement("span");if(d.isString(_312)){ta.innerHTML=_312;}else{ta.appendChild(_312);}if(_313===undefined){_313="last";}var ct=(_313=="first"||_313=="after")?"lastChild":"firstChild";this.forEach(function(item){var tn=ta.cloneNode(true);while(tn[ct]){d.place(tn[ct],item,_313);}});return this;},empty:function(){return this.forEach("item.innerHTML='';");},instantiate:function(_318,_319){var c=d.isFunction(_318)?_318:d.getObject(_318);return this.forEach(function(i){new c(_319||{},i);});}});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);};});})();}if(!dojo._hasResource["dojo._base.query"]){dojo._hasResource["dojo._base.query"]=true;dojo.provide("dojo._base.query");(function(){var d=dojo;var _321=dojo.isIE?"children":"childNodes";var _322=false;var _323=function(_324){if(">~+".indexOf(_324.charAt(_324.length-1))>=0){_324+=" *";}_324+=" ";var ts=function(s,e){return d.trim(_324.slice(s,e));};var _328=[];var _329=-1;var _32a=-1;var _32b=-1;var _32c=-1;var _32d=-1;var inId=-1;var _32f=-1;var lc="";var cc="";var _332;var x=0;var ql=_324.length;var _335=null;var _cp=null;var _337=function(){if(_32f>=0){var tv=(_32f==x)?null:ts(_32f,x).toLowerCase();_335[(">~+".indexOf(tv)<0)?"tag":"oper"]=tv;_32f=-1;}};var _339=function(){if(inId>=0){_335.id=ts(inId,x).replace(/\\/g,"");inId=-1;}};var _33a=function(){if(_32d>=0){_335.classes.push(ts(_32d+1,x).replace(/\\/g,""));_32d=-1;}};var _33b=function(){_339();_337();_33a();};for(;lc=cc,cc=_324.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_335){_332=x;_335={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null};_32f=x;}if(_329>=0){if(cc=="]"){if(!_cp.attr){_cp.attr=ts(_329+1,x);}else{_cp.matchFor=ts((_32b||_329+1),x);}var cmf=_cp.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_cp.matchFor=cmf.substring(1,cmf.length-1);}}_335.attrs.push(_cp);_cp=null;_329=_32b=-1;}else{if(cc=="="){var _33d=("|~^$*".indexOf(lc)>=0)?lc:"";_cp.type=_33d+cc;_cp.attr=ts(_329+1,x-_33d.length);_32b=x+1;}}}else{if(_32a>=0){if(cc==")"){if(_32c>=0){_cp.value=ts(_32a+1,x);}_32c=_32a=-1;}}else{if(cc=="#"){_33b();inId=x+1;}else{if(cc=="."){_33b();_32d=x;}else{if(cc==":"){_33b();_32c=x;}else{if(cc=="["){_33b();_329=x;_cp={};}else{if(cc=="("){if(_32c>=0){_cp={name:ts(_32c+1,x),value:null};_335.pseudos.push(_cp);}_32a=x;}else{if(cc==" "&&lc!=cc){_33b();if(_32c>=0){_335.pseudos.push({name:ts(_32c+1,x)});}_335.hasLoops=(_335.pseudos.length||_335.attrs.length||_335.classes.length);_335.query=ts(_332,x);_335.tag=(_335["oper"])?null:(_335.tag||"*");_328.push(_335);_335=null;}}}}}}}}}return _328;};var _33e={"*=":function(attr,_340){return "[contains(@"+attr+", '"+_340+"')]";},"^=":function(attr,_342){return "[starts-with(@"+attr+", '"+_342+"')]";},"$=":function(attr,_344){return "[substring(@"+attr+", string-length(@"+attr+")-"+(_344.length-1)+")='"+_344+"']";},"~=":function(attr,_346){return "[contains(concat(' ',@"+attr+",' '), ' "+_346+" ')]";},"|=":function(attr,_348){return "[contains(concat(' ',@"+attr+",' '), ' "+_348+"-')]";},"=":function(attr,_34a){return "[@"+attr+"='"+_34a+"']";}};var _34b=function(_34c,_34d,_34e,_34f){d.forEach(_34d.attrs,function(attr){var _351;if(attr.type&&_34c[attr.type]){_351=_34c[attr.type](attr.attr,attr.matchFor);}else{if(attr.attr.length){_351=_34e(attr.attr);}}if(_351){_34f(_351);}});};var _352=function(_353){var _354=".";var _355=_323(d.trim(_353));while(_355.length){var tqp=_355.shift();var _357;var _358="";if(tqp.oper==">"){_357="/";tqp=_355.shift();}else{if(tqp.oper=="~"){_357="/following-sibling::";tqp=_355.shift();}else{if(tqp.oper=="+"){_357="/following-sibling::";_358="[position()=1]";tqp=_355.shift();}else{_357="//";}}}_354+=_357+tqp.tag+_358;if(tqp.id){_354+="[@id='"+tqp.id+"'][1]";}d.forEach(tqp.classes,function(cn){var cnl=cn.length;var _35b=" ";if(cn.charAt(cnl-1)=="*"){_35b="";cn=cn.substr(0,cnl-1);}_354+="[contains(concat(' ',@class,' '), ' "+cn+_35b+"')]";});_34b(_33e,tqp,function(_35c){return "[@"+_35c+"]";},function(_35d){_354+=_35d;});}return _354;};var _35e={};var _35f=function(path){if(_35e[path]){return _35e[path];}var doc=d.doc;var _362=_352(path);var tf=function(_364){var ret=[];var _366;try{_366=doc.evaluate(_362,_364,null,XPathResult.ANY_TYPE,null);}catch(e){console.debug("failure in exprssion:",_362,"under:",_364);console.debug(e);}var _367=_366.iterateNext();while(_367){ret.push(_367);_367=_366.iterateNext();}return ret;};return _35e[path]=tf;};var _368={};var _369={};var _36a=function(_36b,_36c){if(!_36b){return _36c;}if(!_36c){return _36b;}return function(){return _36b.apply(window,arguments)&&_36c.apply(window,arguments);};};var _36d=function(root){var ret=[];var te,x=0,tret=root[_321];while(te=tret[x++]){if(te.nodeType==1){ret.push(te);}}return ret;};var _373=function(root,_375){var ret=[];var te=root;while(te=te.nextSibling){if(te.nodeType==1){ret.push(te);if(_375){break;}}}return ret;};var _378=function(_379,_37a,_37b,idx){var nidx=idx+1;var _37e=(_37a.length==nidx);var tqp=_37a[idx];if(tqp.oper){var ecn=(tqp.oper==">")?_36d(_379):_373(_379,(tqp.oper=="+"));if(!ecn||!ecn.length){return;}nidx++;_37e=(_37a.length==nidx);var tf=_382(_37a[idx+1]);for(var x=0,ecnl=ecn.length,te;x<ecnl,te=ecn[x];x++){if(tf(te)){if(_37e){_37b.push(te);}else{_378(te,_37a,_37b,nidx);}}}}var _386=_387(tqp)(_379);if(_37e){while(_386.length){_37b.push(_386.shift());}}else{while(_386.length){_378(_386.shift(),_37a,_37b,nidx);}}};var _388=function(_389,_38a){var ret=[];var x=_389.length-1,te;while(te=_389[x--]){_378(te,_38a,ret,0);}return ret;};var _382=function(q){if(_368[q.query]){return _368[q.query];}var ff=null;if(q.tag){if(q.tag=="*"){ff=_36a(ff,function(elem){return (elem.nodeType==1);});}else{ff=_36a(ff,function(elem){return ((elem.nodeType==1)&&(q.tag==elem.tagName.toLowerCase()));});}}if(q.id){ff=_36a(ff,function(elem){return ((elem.nodeType==1)&&(elem.id==q.id));});}if(q.hasLoops){ff=_36a(ff,_393(q));}return _368[q.query]=ff;};var _394=function(node){var pn=node.parentNode;var pnc=pn.childNodes;var nidx=-1;var _399=pn.firstChild;if(!_399){return nidx;}var ci=node["__cachedIndex"];var cl=pn["__cachedLength"];if(((typeof cl=="number")&&(cl!=pnc.length))||(typeof ci!="number")){pn["__cachedLength"]=pnc.length;var idx=1;do{if(_399===node){nidx=idx;}if(_399.nodeType==1){_399["__cachedIndex"]=idx;idx++;}_399=_399.nextSibling;}while(_399);}else{nidx=ci;}return nidx;};var _39d=0;var _39e="";var _39f=function(elem,attr){if(attr=="class"){return elem.className||_39e;}if(attr=="for"){return elem.htmlFor||_39e;}return elem.getAttribute(attr,2)||_39e;};var _3a2={"*=":function(attr,_3a4){return function(elem){return (_39f(elem,attr).indexOf(_3a4)>=0);};},"^=":function(attr,_3a7){return function(elem){return (_39f(elem,attr).indexOf(_3a7)==0);};},"$=":function(attr,_3aa){var tval=" "+_3aa;return function(elem){var ea=" "+_39f(elem,attr);return (ea.lastIndexOf(_3aa)==(ea.length-_3aa.length));};},"~=":function(attr,_3af){var tval=" "+_3af+" ";return function(elem){var ea=" "+_39f(elem,attr)+" ";return (ea.indexOf(tval)>=0);};},"|=":function(attr,_3b4){var _3b5=" "+_3b4+"-";return function(elem){var ea=" "+(elem.getAttribute(attr,2)||"");return ((ea==_3b4)||(ea.indexOf(_3b5)==0));};},"=":function(attr,_3b9){return function(elem){return (_39f(elem,attr)==_3b9);};}};var _3bb={"first-child":function(name,_3bd){return function(elem){if(elem.nodeType!=1){return false;}var fc=elem.previousSibling;while(fc&&(fc.nodeType!=1)){fc=fc.previousSibling;}return (!fc);};},"last-child":function(name,_3c1){return function(elem){if(elem.nodeType!=1){return false;}var nc=elem.nextSibling;while(nc&&(nc.nodeType!=1)){nc=nc.nextSibling;}return (!nc);};},"empty":function(name,_3c5){return function(elem){var cn=elem.childNodes;var cnl=elem.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt==1)||(nt==3)){return false;}}return true;};},"contains":function(name,_3cc){return function(elem){return (elem.innerHTML.indexOf(_3cc)>=0);};},"not":function(name,_3cf){var ntf=_382(_323(_3cf)[0]);return function(elem){return (!ntf(elem));};},"nth-child":function(name,_3d3){var pi=parseInt;if(_3d3=="odd"){return function(elem){return (((_394(elem))%2)==1);};}else{if((_3d3=="2n")||(_3d3=="even")){return function(elem){return ((_394(elem)%2)==0);};}else{if(_3d3.indexOf("0n+")==0){var _3d7=pi(_3d3.substr(3));return function(elem){return (elem.parentNode[_321][_3d7-1]===elem);};}else{if((_3d3.indexOf("n+")>0)&&(_3d3.length>3)){var _3d9=_3d3.split("n+",2);var pred=pi(_3d9[0]);var idx=pi(_3d9[1]);return function(elem){return ((_394(elem)%pred)==idx);};}else{if(_3d3.indexOf("n")==-1){var _3d7=pi(_3d3);return function(elem){return (_394(elem)==_3d7);};}}}}}}};var _3de=(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 _393=function(_3e4){var _3e5=(_369[_3e4.query]||_368[_3e4.query]);if(_3e5){return _3e5;}var ff=null;if(_3e4.id){if(_3e4.tag!="*"){ff=_36a(ff,function(elem){return (elem.tagName.toLowerCase()==_3e4.tag);});}}d.forEach(_3e4.classes,function(_3e8,idx,arr){var _3eb=_3e8.charAt(_3e8.length-1)=="*";if(_3eb){_3e8=_3e8.substr(0,_3e8.length-1);}var re=new RegExp("(?:^|\\s)"+_3e8+(_3eb?".*":"")+"(?:\\s|$)");ff=_36a(ff,function(elem){return re.test(elem.className);});ff.count=idx;});d.forEach(_3e4.pseudos,function(_3ee){if(_3bb[_3ee.name]){ff=_36a(ff,_3bb[_3ee.name](_3ee.name,_3ee.value));}});_34b(_3a2,_3e4,_3de,function(_3ef){ff=_36a(ff,_3ef);});if(!ff){ff=function(){return true;};}return _369[_3e4.query]=ff;};var _3f0={};var _387=function(_3f1,root){var fHit=_3f0[_3f1.query];if(fHit){return fHit;}if(_3f1.id&&!_3f1.hasLoops&&!_3f1.tag){return _3f0[_3f1.query]=function(root){return [d.byId(_3f1.id)];};}var _3f5=_393(_3f1);var _3f6;if(_3f1.tag&&_3f1.id&&!_3f1.hasLoops){_3f6=function(root){var te=d.byId(_3f1.id);if(_3f5(te)){return [te];}};}else{var tret;if(!_3f1.hasLoops){_3f6=function(root){var ret=[];var te,x=0,tret=root.getElementsByTagName(_3f1.tag);while(te=tret[x++]){ret.push(te);}return ret;};}else{_3f6=function(root){var ret=[];var te,x=0,tret=root.getElementsByTagName(_3f1.tag);while(te=tret[x++]){if(_3f5(te)){ret.push(te);}}return ret;};}}return _3f0[_3f1.query]=_3f6;};var _402={};var _403={"*":d.isIE?function(root){return root.all;}:function(root){return root.getElementsByTagName("*");},"~":_373,"+":function(root){return _373(root,true);},">":_36d};var _407=function(_408){var _409=_323(d.trim(_408));if(_409.length==1){var tt=_387(_409[0]);tt.nozip=true;return tt;}var sqf=function(root){var _40d=_409.slice(0);var _40e;if(_40d[0].oper==">"){_40e=[root];}else{_40e=_387(_40d.shift())(root);}return _388(_40e,_40d);};return sqf;};var _40f=((document["evaluate"]&&!d.isSafari)?function(_410){var _411=_410.split(" ");if((document["evaluate"])&&(_410.indexOf(":")==-1)&&(_410.indexOf("+")==-1)){if(((_411.length>2)&&(_410.indexOf(">")==-1))||(_411.length>3)||(_410.indexOf("[")>=0)||((1==_411.length)&&(0<=_410.indexOf(".")))){return _35f(_410);}}return _407(_410);}:_407);var _412=function(_413){var qcz=_413.charAt(0);if(d.doc["querySelectorAll"]&&((!d.isSafari)||(d.isSafari>3.1))&&(">+~".indexOf(qcz)==-1)){return function(root){var r=root.querySelectorAll(_413);r.nozip=true;return r;};}if(_403[_413]){return _403[_413];}if(0>_413.indexOf(",")){return _403[_413]=_40f(_413);}else{var _417=_413.split(/\s*,\s*/);var tf=function(root){var _41a=0;var ret=[];var tp;while(tp=_417[_41a++]){ret=ret.concat(_40f(tp,tp.indexOf(" "))(root));}return ret;};return _403[_413]=tf;}};var _41d=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;}_41d++;arr[0]["_zipIdx"]=_41d;for(var x=1,te;te=arr[x];x++){if(arr[x]["_zipIdx"]!=_41d){ret.push(te);}te["_zipIdx"]=_41d;}return ret;};d.query=function(_423,root){if(_423.constructor==d.NodeList){return _423;}if(!d.isString(_423)){return new d.NodeList(_423);}if(d.isString(root)){root=d.byId(root);}return _zip(_412(_423)(root||d.doc));};d.query.pseudos=_3bb;d._filterQueryResult=function(_425,_426){var tnl=new d.NodeList();var ff=(_426)?_382(_323(_426)[0]):function(){return true;};for(var x=0,te;te=_425[x];x++){if(ff(te)){tnl.push(te);}}return tnl;};})();}if(!dojo._hasResource["dojo._base.xhr"]){dojo._hasResource["dojo._base.xhr"]=true;dojo.provide("dojo._base.xhr");(function(){var _d=dojo;function setValue(obj,name,_42e){var val=obj[name];if(_d.isString(val)){obj[name]=[val,_42e];}else{if(_d.isArray(val)){val.push(_42e);}else{obj[name]=_42e;}}};dojo.formToObject=function(_430){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,_430).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;};dojo.objectToQuery=function(map){var enc=encodeURIComponent;var _43a=[];var _43b={};for(var name in map){var _43d=map[name];if(_43d!=_43b[name]){var _43e=enc(name)+"=";if(_d.isArray(_43d)){for(var i=0;i<_43d.length;i++){_43a.push(_43e+enc(_43d[i]));}}else{_43a.push(_43e+enc(_43d));}}}return _43a.join("&");};dojo.formToQuery=function(_440){return _d.objectToQuery(_d.formToObject(_440));};dojo.formToJson=function(_441,_442){return _d.toJson(_d.formToObject(_441),_442);};dojo.queryToObject=function(str){var ret={};var qp=str.split("&");var dec=decodeURIComponent;_d.forEach(qp,function(item){if(item.length){var _448=item.split("=");var name=dec(_448.shift());var val=dec(_448.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;};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){var _44e=xhr.responseText;var _44f=_44e.indexOf("/*");var _450=_44e.lastIndexOf("*/");if(_44f==-1||_450==-1){throw new Error("JSON was not comment filtered");}return (xhr.status==204)?undefined:_d.fromJson(_44e.substring(_44f+2,_450));},"javascript":function(xhr){return _d.eval(xhr.responseText);},"xml":function(xhr){var _453=xhr.responseXML;if(_d.isIE&&(!_453||window.location.protocol=="file:")){_d.forEach(["MSXML2","Microsoft","MSXML","MSXML3"],function(_454){try{var dom=new ActiveXObject(_454+".XMLDOM");dom.async=false;dom.loadXML(xhr.responseText);_453=dom;}catch(e){}});}return _453;}};dojo._contentHandlers["json-comment-optional"]=function(xhr){var _457=_d._contentHandlers;try{return _457["json-comment-filtered"](xhr);}catch(e){return _457["json"](xhr);}};dojo._ioSetArgs=function(args,_459,_45a,_45b){var _45c={args:args,url:args.url};var _45d=null;if(args.form){var form=_d.byId(args.form);var _45f=form.getAttributeNode("action");_45c.url=_45c.url||(_45f?_45f.value:null);_45d=_d.formToObject(form);}var _460=[{}];if(_45d){_460.push(_45d);}if(args.content){_460.push(args.content);}if(args.preventCache){_460.push({"dojo.preventCache":new Date().valueOf()});}_45c.query=_d.objectToQuery(_d.mixin.apply(null,_460));_45c.handleAs=args.handleAs||"text";var d=new _d.Deferred(_459);d.addCallbacks(_45a,function(_462){return _45b(_462,d);});var ld=args.load;if(ld&&_d.isFunction(ld)){d.addCallback(function(_464){return ld.call(args,_464,_45c);});}var err=args.error;if(err&&_d.isFunction(err)){d.addErrback(function(_466){return err.call(args,_466,_45c);});}var _467=args.handle;if(_467&&_d.isFunction(_467)){d.addBoth(function(_468){return _467.call(args,_468,_45c);});}d.ioArgs=_45c;return d;};var _469=function(dfd){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 _46e=function(dfd){return _d._contentHandlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);};var _470=function(_471,dfd){console.debug(_471);return _471;};var _473=function(args){var dfd=_d._ioSetArgs(args,_469,_46e,_470);dfd.ioArgs.xhr=_d._xhrObj(dfd.ioArgs.args);return dfd;};var _476=null;var _477=[];var _478=function(){var now=(new Date()).getTime();if(!_d._blockAsync){for(var i=0,tif;i<_477.length&&(tif=_477[i]);i++){var dfd=tif.dfd;try{if(!dfd||dfd.canceled||!tif.validCheck(dfd)){_477.splice(i--,1);}else{if(tif.ioCheck(dfd)){_477.splice(i--,1);tif.resHandle(dfd);}else{if(dfd.startTime){if(dfd.startTime+(dfd.ioArgs.args.timeout||0)<now){_477.splice(i--,1);var err=new Error("timeout exceeded");err.dojoType="timeout";dfd.errback(err);dfd.cancel();}}}}}catch(e){console.debug(e);dfd.errback(new Error("_watchInFlightError!"));}}}if(!_477.length){clearInterval(_476);_476=null;return;}};dojo._ioCancelAll=function(){try{_d.forEach(_477,function(i){i.dfd.cancel();});}catch(e){}};if(_d.isIE){_d.addOnUnload(_d._ioCancelAll);}_d._ioWatch=function(dfd,_480,_481,_482){if(dfd.ioArgs.args.timeout){dfd.startTime=(new Date()).getTime();}_477.push({dfd:dfd,validCheck:_480,ioCheck:_481,resHandle:_482});if(!_476){_476=setInterval(_478,50);}_478();};var _483="application/x-www-form-urlencoded";var _484=function(dfd){return dfd.ioArgs.xhr.readyState;};var _486=function(dfd){return 4==dfd.ioArgs.xhr.readyState;};var _488=function(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 _48c=function(type,dfd){var _48f=dfd.ioArgs;var args=_48f.args;var xhr=_48f.xhr;xhr.open(type,_48f.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]);}}}xhr.setRequestHeader("Content-Type",args.contentType||_483);if(!args.headers||!args.headers["X-Requested-With"]){xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");}try{xhr.send(_48f.query);}catch(e){dfd.cancel();}_d._ioWatch(dfd,_484,_486,_488);xhr=null;return dfd;};dojo._ioAddQueryToUrl=function(_493){if(_493.query.length){_493.url+=(_493.url.indexOf("?")==-1?"?":"&")+_493.query;_493.query=null;}};dojo.xhr=function(_494,args,_496){var dfd=_473(args);if(!_496){_d._ioAddQueryToUrl(dfd.ioArgs);}return _48c(_494,dfd);};dojo.xhrGet=function(args){return _d.xhr("GET",args);};dojo.xhrPost=function(args){return _d.xhr("POST",args,true);};dojo.rawXhrPost=function(args){var dfd=_473(args);dfd.ioArgs.query=args.postData;return _48c("POST",dfd);};dojo.xhrPut=function(args){return _d.xhr("PUT",args,true);};dojo.rawXhrPut=function(args){var dfd=_473(args);var _49f=dfd.ioArgs;if(args.putData){_49f.query=args.putData;args.putData=null;}return _48c("PUT",dfd);};dojo.xhrDelete=function(args){return _d.xhr("DELETE",args);};})();}if(!dojo._hasResource["dojo._base.fx"]){dojo._hasResource["dojo._base.fx"]=true;dojo.provide("dojo._base.fx");(function(){var d=dojo;dojo._Line=function(_4a2,end){this.start=_4a2;this.end=end;this.getValue=function(n){return ((this.end-this.start)*n)+this.start;};};d.declare("dojo._Animation",null,{constructor:function(args){d.mixin(this,args);if(d.isArray(this.curve)){this.curve=new d._Line(this.curve[0],this.curve[1]);}},duration:350,repeat:0,rate:10,_percent:0,_startRepeatCount:0,_fire:function(evt,args){try{if(this[evt]){this[evt].apply(this,args||[]);}}catch(e){console.error("exception in animation handler for:",evt);console.error(e);}return this;},play:function(_4a8,_4a9){var _t=this;if(_4a9){_t._stopTimer();_t._active=_t._paused=false;_t._percent=0;}else{if(_t._active&&!_t._paused){return _t;}}_t._fire("beforeBegin");var de=_4a8||_t.delay;var _p=dojo.hitch(_t,"_play",_4a9);if(de>0){setTimeout(_p,de);return _t;}_p();return _t;},_play:function(_4ad){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 _4af=_t.curve.getValue(_t._percent);if(!_t._percent){if(!_t._startRepeatCount){_t._startRepeatCount=_t.repeat;}_t._fire("onBegin",[_4af]);}_t._fire("onPlay",[_4af]);_t._cycle();return _t;},pause:function(){this._stopTimer();if(!this._active){return this;}this._paused=true;this._fire("onPause",[this.curve.getValue(this._percent)]);return this;},gotoPercent:function(_4b0,_4b1){this._stopTimer();this._active=this._paused=true;this._percent=_4b0;if(_4b1){this.play();}return this;},stop:function(_4b2){if(!this._timer){return this;}this._stopTimer();if(_4b2){this._percent=1;}this._fire("onStop",[this.curve.getValue(this._percent)]);this._active=this._paused=false;return this;},status:function(){if(this._active){return this._paused?"paused":"playing";}return "stopped";},_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;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;}});var ctr=0;var _4b7=[];var _4b8={run:function(){}};var _4b9=null;dojo._Animation.prototype._startTimer=function(){if(!this._timer){this._timer=d.connect(_4b8,"run",this,"_cycle");ctr++;}if(!_4b9){_4b9=setInterval(d.hitch(_4b8,"run"),this.rate);}};dojo._Animation.prototype._stopTimer=function(){if(this._timer){d.disconnect(this._timer);this._timer=null;ctr--;}if(ctr<=0){clearInterval(_4b9);_4b9=null;ctr=0;}};var _4ba=(d.isIE)?function(node){var ns=node.style;if(!ns.zoom.length&&d.style(node,"zoom")=="normal"){ns.zoom="1";}if(!ns.width.length&&d.style(node,"width")=="auto"){ns.width="auto";}}:function(){};dojo._fade=function(args){args.node=d.byId(args.node);var _4be=d.mixin({properties:{}},args);var _4bf=(_4be.properties.opacity={});_4bf.start=!("start" in _4be)?function(){return Number(d.style(_4be.node,"opacity"));}:_4be.start;_4bf.end=_4be.end;var anim=d.animateProperty(_4be);d.connect(anim,"beforeBegin",d.partial(_4ba,_4be.node));return anim;};dojo.fadeIn=function(args){return d._fade(d.mixin({end:1},args));};dojo.fadeOut=function(args){return d._fade(d.mixin({end:0},args));};dojo._defaultEasing=function(n){return 0.5+((Math.sin((n+1.5)*Math.PI))/2);};var _4c4=function(_4c5){this._properties=_4c5;for(var p in _4c5){var prop=_4c5[p];if(prop.start instanceof d.Color){prop.tempColor=new d.Color();}}this.getValue=function(r){var ret={};for(var p in this._properties){var prop=this._properties[p];var _4cc=prop.start;if(_4cc instanceof d.Color){ret[p]=d.blendColors(_4cc,prop.end,r,prop.tempColor).toCss();}else{if(!d.isArray(_4cc)){ret[p]=((prop.end-_4cc)*r)+_4cc+(p!="opacity"?prop.units||"px":"");}}}return ret;};};dojo.animateProperty=function(args){args.node=d.byId(args.node);if(!args.easing){args.easing=d._defaultEasing;}var anim=new d._Animation(args);d.connect(anim,"beforeBegin",anim,function(){var pm={};for(var p in this.properties){if(p=="width"||p=="height"){this.node.display="block";}var prop=this.properties[p];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 _4d2=(p.toLowerCase().indexOf("color")>=0);function getStyle(node,p){var v=({height:node.offsetHeight,width:node.offsetWidth})[p];if(v!==undefined){return v;}v=d.style(node,p);return (p=="opacity")?Number(v):(_4d2?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(_4d2){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 _4c4(pm);});d.connect(anim,"onAnimate",anim,function(_4d6){for(var s in _4d6){d.style(this.node,s,_4d6[s]);}});return anim;};dojo.anim=function(node,_4d9,_4da,_4db,_4dc,_4dd){return d.animateProperty({node:node,duration:_4da||d._Animation.prototype.duration,properties:_4d9,easing:_4db,onEnd:_4dc}).play(_4dd||0);};})();}if(!dojo._hasResource["dojo._base.browser"]){dojo._hasResource["dojo._base.browser"]=true;dojo.provide("dojo._base.browser");if(dojo.config.require){dojo.forEach(dojo.config.require,"dojo['require'](item);");}}if(dojo.config.afterOnLoad&&dojo.isBrowser){window.setTimeout(dojo._fakeLoadInit,1000);}})();

Added: branches/vhffs-design/vhffs-panel/js/dojo/dojo.js.uncompressed.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/dojo.js.uncompressed.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/dojo.js.uncompressed.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,8165 @@
+/*
+	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.
+*/
+
+;(function(){
+
+	/*
+	dojo, dijit, and dojox must always be the first three, and in that order.
+	djConfig.scopeMap = [
+		["dojo", "fojo"],
+		["dijit", "fijit"],
+		["dojox", "fojox"]
+	
+	]
+	*/
+
+	/**Build will replace this comment with a scoped djConfig **/
+
+	//The null below can be relaced by a build-time value used instead of djConfig.scopeMap.
+	var sMap = null;
+
+	//See if new scopes need to be defined.
+	if((sMap || (typeof djConfig != "undefined" && djConfig.scopeMap)) && (typeof window != "undefined")){
+		var scopeDef = "", scopePrefix = "", scopeSuffix = "", scopeMap = {}, scopeMapRev = {};
+		sMap = sMap || djConfig.scopeMap;
+		for(var i = 0; i < sMap.length; i++){
+			//Make local variables, then global variables that use the locals.
+			var newScope = sMap[i];
+			scopeDef += "var " + newScope[0] + " = {}; " + newScope[1] + " = " + newScope[0] + ";" + newScope[1] + "._scopeName = '" + newScope[1] + "';";
+			scopePrefix += (i == 0 ? "" : ",") + newScope[0];
+			scopeSuffix += (i == 0 ? "" : ",") + newScope[1];
+			scopeMap[newScope[0]] = newScope[1];
+			scopeMapRev[newScope[1]] = newScope[0];
+		}
+
+		eval(scopeDef + "dojo._scopeArgs = [" + scopeSuffix + "];");
+
+		dojo._scopePrefixArgs = scopePrefix;
+		dojo._scopePrefix = "(function(" + scopePrefix + "){";
+		dojo._scopeSuffix = "})(" + scopeSuffix + ")";
+		dojo._scopeMap = scopeMap;
+		dojo._scopeMapRev = scopeMapRev;
+	}
+
+/*=====
+// 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
+	//		`<script>` tag inclusion. This may double-request resources and
+	//		cause problems with scripts which expect `dojo.require()` to
+	//		preform synchronously. `debugAtAllCosts` can be an invaluable
+	//		debugging aid, but when using it, ensure that all code which
+	//		depends on Dojo modules is wrapped in `dojo.addOnLoad()` handlers.
+	//		Due to the somewhat unpredictable side-effects of using
+	//		`debugAtAllCosts`, it is strongly recommended that you enable this
+	//		flag as a last resort. `debugAtAllCosts` has no effect when loading
+	//		resources across domains. For usage information, see the
+	//		[Dojo Book](http://dojotoolkit.org/book/book-dojo/part-4-meta-dojo-making-your-dojo-code-run-faster-and-better/debugging-facilities/deb)
+	debugAtAllCosts: false,
+	// locale: String
+	//		The locale to assume for loading localized resources in this page,
+	//		specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
+	//		Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
+	//		See the documentation for `dojo.i18n` and `dojo.requireLocalization`
+	//		for details on loading localized resources. If no locale is specified,
+	//		Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
+	//		or `navigator.language` properties.
+	locale: undefined,
+	// extraLocale: Array
+	//		No default value. Specifies additional locales whose
+	//		resources should also be loaded alongside the default locale when
+	//		calls to `dojo.requireLocalization()` are processed.
+	extraLocale: undefined,
+	// baseUrl: String
+	//		The directory in which `dojo.js` is located. Under normal
+	//		conditions, Dojo auto-detects the correct location from which it
+	//		was loaded. You may need to manually configure `baseUrl` in cases
+	//		where you have renamed `dojo.js` or in which `<base>` tags confuse
+	//		some browsers (e.g., IE 6). The variable `dojo.baseUrl` is assigned
+	//		either the value of `djConfig.baseUrl` if one is provided or the
+	//		auto-detected root if not. Other modules are located relative to
+	//		this path.
+	baseUrl: undefined,
+	// modulePaths: Object
+	//		A map of module names to paths relative to `dojo.baseUrl`. The
+	//		key/value pairs correspond directly to the arguments which
+	//		`dojo.registerModulePath` accepts. Specifiying
+	//		`djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
+	//		of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
+	//		modules may be configured via `djConfig.modulePaths`.
+	modulePaths: {},
+}
+=====*/
+
+(function(){
+	// firebug stubs
+
+	// if((!this["console"])||(!console["firebug"])){
+
+	if(!this["console"]){
+		this.console = {
+			log: function(){} // no-op
+		};
+	}
+
+	var cn = [
+		"assert", "count", "debug", "dir", "dirxml", "error", "group",
+		"groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
+		"trace", "warn", "log" 
+	];
+	var i=0, tn;
+	while((tn=cn[i++])){
+		if(!console[tn]){
+			(function(){
+				var tcn = tn+"";
+				console[tcn] = function(){ 
+					var a = Array.apply({}, arguments);
+					a.unshift(tcn+":");
+					console.log(a.join(" "));
+				}
+			})();
+		}
+	}
+
+	//TODOC:  HOW TO DOC THIS?
+	// dojo is the root variable of (almost all) our public symbols -- make sure it is defined.
+	if(typeof dojo == "undefined"){
+		this.dojo = {
+			_scopeName: "dojo",
+			_scopePrefix: "",
+			_scopePrefixArgs: "",
+			_scopeSuffix: "",
+			_scopeMap: {},
+			_scopeMapRev: {}
+		};
+	}
+
+	var d = dojo;
+
+	//Need placeholders for dijit and dojox for scoping code.
+	if(typeof dijit == "undefined"){
+		this.dijit = {_scopeName: "dijit"};
+	}
+	if(typeof dojox == "undefined"){
+		this.dojox = {_scopeName: "dojox"};
+	}
+	
+	if(!d._scopeArgs){
+		d._scopeArgs = [dojo, dijit, dojox];
+	}
+
+/*=====
+dojo.global = {
+	//	summary:
+	//		Alias for the global scope
+	//		(e.g. the window object in a browser).
+	//	description:
+	//		Refer to 'dojo.global' rather than referring to window to ensure your
+	//		code runs correctly in contexts other than web browsers (e.g. Rhino on a server).
+}
+=====*/
+	d.global = this;
+
+	d.config =/*===== djConfig = =====*/{
+		isDebug: false,
+		debugAtAllCosts: false
+	};
+
+	if(typeof djConfig != "undefined"){
+		for(var opt in djConfig){
+			d.config[opt] = djConfig[opt];
+		}
+	}
+
+	var _platforms = ["Browser", "Rhino", "Spidermonkey", "Mobile"];
+	var t;
+	while((t=_platforms.shift())){
+		d["is"+t] = false;
+	}
+
+/*=====
+	// Override locale setting, if specified
+	dojo.locale = {
+		// summary: the locale as defined by Dojo (read-only)
+	};
+=====*/
+	dojo.locale = d.config.locale;
+	
+	var rev = "$Rev: 13707 $".match(/\d+/);
+
+	dojo.version = {
+		// summary: 
+		//		version number of dojo
+		//	major: Integer
+		//		Major version. If total version is "1.2.0beta1", will be 1
+		//	minor: Integer
+		//		Minor version. If total version is "1.2.0beta1", will be 2
+		//	patch: Integer
+		//		Patch version. If total version is "1.2.0beta1", will be 0
+		//	flag: String
+		//		Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
+		//	revision: Number
+		//		The SVN rev from which dojo was pulled
+		major: 1, minor: 1, patch: 1, flag: "",
+		revision: rev ? +rev[0] : 999999, //FIXME: use NaN?
+		toString: function(){
+			with(d.version){
+				return major + "." + minor + "." + patch + flag + " (" + revision + ")";	// String
+			}
+		}
+	}
+
+	// Register with the OpenAjax hub
+	if(typeof OpenAjax != "undefined"){
+		OpenAjax.hub.registerLibrary(dojo._scopeName, "http://dojotoolkit.org";, d.version.toString());
+	}
+
+	dojo._mixin = function(/*Object*/ obj, /*Object*/ props){
+		// summary:
+		//		Adds all properties and methods of props to obj. This addition
+		//		is "prototype extension safe", so that instances of objects
+		//		will not pass along prototype defaults.
+		var tobj = {};
+		for(var x in props){
+			// the "tobj" condition avoid copying properties in "props"
+			// inherited from Object.prototype.  For example, if obj has a custom
+			// toString() method, don't overwrite it with the toString() method
+			// that props inherited from Object.prototype
+			if(tobj[x] === undefined || tobj[x] != props[x]){
+				obj[x] = props[x];
+			}
+		}
+		// IE doesn't recognize custom toStrings in for..in
+		if(d["isIE"] && props){
+			var p = props.toString;
+			if(typeof p == "function" && p != obj.toString && p != tobj.toString &&
+				p != "\nfunction toString() {\n    [native code]\n}\n"){
+					obj.toString = props.toString;
+			}
+		}
+		return obj; // Object
+	}
+
+	dojo.mixin = function(/*Object*/obj, /*Object...*/props){
+		// summary:	
+		//		Adds all properties and methods of props to obj and returns the
+		//		(now modified) obj.
+		//	description:
+		//		`dojo.mixin` can mix multiple source objects into a
+		//		destionation object which is then returned. Unlike regular
+		//		`for...in` iteration, `dojo.mixin` is also smart about avoiding
+		//		extensions which other toolkits may unwisely add to the root
+		//		object prototype
+		//	obj:
+		//		The object to mix properties into. Also the return value.
+		//	props:
+		//		One or more objects whose values are successively copied into
+		//		obj. If more than one of these objects contain the same value,
+		//		the one specified last in the function call will "win".
+		//	example:
+		//		make a shallow copy of an object
+		//	|	var copy = dojo.mixin({}, source);
+		//	example:
+		//		many class constructors often take an object which specifies
+		//		values to be configured on the object. In this case, it is
+		//		often simplest to call `dojo.mixin` on the `this` object:
+		//	|	dojo.declare("acme.Base", null, {
+		//	|		constructor: function(properties){
+		//	|			// property configuration:
+		//	|			dojo.mixin(this, properties);
+		//	|	
+		//	|			console.debug(this.quip);
+		//	|			//  ...
+		//	|		},
+		//	|		quip: "I wasn't born yesterday, you know - I've seen movies.",
+		//	|		// ...
+		//	|	});
+		//	|
+		//	|	// create an instance of the class and configure it
+		//	|	var b = new acme.Base({quip: "That's what it does!" });
+		//	example:
+		//		copy in properties from multiple objects
+		//	|	var flattened = dojo.mixin(
+		//	|		{
+		//	|			name: "Frylock",
+		//	|			braces: true,
+		//	|		}
+		//	|		{
+		//	|			name: "Carl Brutanananadilewski"
+		//	|		}
+		//	|	);
+		//	|	
+		//	|	// will print "Carl Brutanananadilewski"
+		//	|	console.debug(flattened.name);
+		//	|	// will print "true"
+		//	|	console.debug(flattened.braces);
+		for(var i=1, l=arguments.length; i<l; i++){
+			d._mixin(obj, arguments[i]);
+		}
+		return obj; // Object
+	}
+
+	dojo._getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){
+		var obj=context || d.global;
+		for(var i=0, p; obj && (p=parts[i]); i++){
+			if(i == 0 && this._scopeMap[p]){
+				p = this._scopeMap[p];
+			}
+			obj = (p in obj ? obj[p] : (create ? obj[p]={} : undefined));
+		}
+		return obj; // mixed
+	}
+
+	dojo.setObject = function(/*String*/name, /*Object*/value, /*Object?*/context){
+		// summary: 
+		//		Set a property from a dot-separated string, such as "A.B.C"
+		//	description: 
+		//		Useful for longer api chains where you have to test each object in
+		//		the chain, or when you have an object reference in string format.
+		//		Objects are created as needed along `path`. Returns the passed
+		//		value if setting is successful or `undefined` if not.
+		//	name: 	
+		//		Path to a property, in the form "A.B.C".
+		//	context:
+		//		Optional. Object to use as root of path. Defaults to
+		//		`dojo.global`.
+		//	example:
+		//		set the value of `foo.bar.baz`, regardless of whether
+		//		intermediate objects already exist:
+		//	|	dojo.setObject("foo.bar.baz", value);
+		//	example:
+		//		without `dojo.setObject`, we often see code like this:
+		//	|	// ensure that intermediate objects are available
+		//	|	if(!obj["parent"]){ obj.parent = {}; }
+		//	|	if(!obj.parent["child"]){ obj.parent.child= {}; }
+		//	|	// now we can safely set the property
+		//	|	obj.parent.child.prop = "some value";
+		//		wheras with `dojo.setObject`, we can shorten that to:
+		//	|	dojo.setObject("parent.child.prop", "some value", obj);
+		var parts=name.split("."), p=parts.pop(), obj=d._getProp(parts, true, context);
+		return obj && p ? (obj[p]=value) : undefined; // Object
+	}
+
+	dojo.getObject = function(/*String*/name, /*Boolean*/create, /*Object*/context){
+		// summary: 
+		//		Get a property from a dot-separated string, such as "A.B.C"
+		//	description: 
+		//		Useful for longer api chains where you have to test each object in
+		//		the chain, or when you have an object reference in string format.
+		//	name: 	
+		//		Path to an property, in the form "A.B.C".
+		//	context:
+		//		Optional. Object to use as root of path. Defaults to
+		//		'dojo.global'. Null may be passed.
+		//	create: 
+		//		Optional. Defaults to `false`. If `true`, Objects will be
+		//		created at any point along the 'path' that is undefined.
+		return d._getProp(name.split("."), create, context); // Object
+	}
+
+	dojo.exists = function(/*String*/name, /*Object?*/obj){
+		//	summary: 
+		//		determine if an object supports a given method
+		//	description: 
+		//		useful for longer api chains where you have to test each object in
+		//		the chain
+		//	name: 	
+		//		Path to an object, in the form "A.B.C".
+		//	obj:
+		//		Object to use as root of path. Defaults to
+		//		'dojo.global'. Null may be passed.
+		//	example:
+		//	|	// define an object
+		//	|	var foo = {
+		//	|		bar: { }
+		//	|	};
+		//	|
+		//	|	// search the global scope
+		//	|	dojo.exists("foo.bar"); // true
+		//	|	dojo.exists("foo.bar.baz"); // false
+		//	|
+		//	|	// search from a particular scope
+		//	|	dojo.exists("bar", foo); // true
+		//	|	dojo.exists("bar.baz", foo); // false
+		return !!d.getObject(name, false, obj); // Boolean
+	}
+
+
+	dojo["eval"] = function(/*String*/ scriptFragment){
+		//	summary: 
+		//		Perform an evaluation in the global scope. Use this rather than
+		//		calling 'eval()' directly.
+		//	description: 
+		//		Placed in a separate function to minimize size of trapped
+		//		exceptions. Calling eval() directly from some other scope may
+		//		complicate tracebacks on some platforms.
+		//	return:
+		//		The result of the evaluation. Often `undefined`
+
+
+		// note:
+		//	 - JSC eval() takes an optional second argument which can be 'unsafe'.
+		//	 - Mozilla/SpiderMonkey eval() takes an optional second argument which is the
+		//  	 scope object for new symbols.
+
+		// FIXME: investigate Joseph Smarr's technique for IE:
+		//		http://josephsmarr.com/2007/01/31/fixing-eval-to-use-global-scope-in-ie/
+		//	see also:
+		// 		http://trac.dojotoolkit.org/ticket/744
+		return d.global.eval ? d.global.eval(scriptFragment) : eval(scriptFragment); 	// Object
+	}
+
+	/*=====
+		dojo.deprecated = function(behaviour, extra, removal){
+			//	summary: 
+			//		Log a debug message to indicate that a behavior has been
+			//		deprecated.
+			//	behaviour: String
+			//		The API or behavior being deprecated. Usually in the form
+			//		of "myApp.someFunction()".
+			//	extra: String?
+			//		Text to append to the message. Often provides advice on a
+			//		new function or facility to achieve the same goal during
+			//		the deprecation period.
+			//	removal: String?
+			//		Text to indicate when in the future the behavior will be
+			//		removed. Usually a version number.
+			//	example:
+			//	|	dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0");
+		}
+
+		dojo.experimental = function(moduleName, extra){
+			//	summary: Marks code as experimental.
+			//	description: 
+			//	 	This can be used to mark a function, file, or module as
+			//	 	experimental.  Experimental code is not ready to be used, and the
+			//	 	APIs are subject to change without notice.  Experimental code may be
+			//	 	completed deleted without going through the normal deprecation
+			//	 	process.
+			//	moduleName: String
+			//	 	The name of a module, or the name of a module file or a specific
+			//	 	function
+			//	extra: String?
+			//	 	some additional message for the user
+			//	example:
+			//	|	dojo.experimental("dojo.data.Result");
+			//	example:
+			//	|	dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
+		}
+	=====*/
+
+	//Real functions declared in dojo._firebug.firebug.
+	d.deprecated = d.experimental = function(){};
+
+})();
+// vim:ai:ts=4:noet
+
+/*
+ * loader.js - A bootstrap module.  Runs before the hostenv_*.js file. Contains
+ * all of the package loading methods.
+ */
+
+(function(){
+	var d = dojo;
+
+	d.mixin(d, {
+		_loadedModules: {},
+		_inFlightCount: 0,
+		_hasResource: {},
+
+		_modulePrefixes: {
+			dojo: 	{	name: "dojo", value: "." },
+			// dojox: 	{	name: "dojox", value: "../dojox" },
+			// dijit: 	{	name: "dijit", value: "../dijit" },
+			doh: 	{	name: "doh", value: "../util/doh" },
+			tests: 	{	name: "tests", value: "tests" }
+		},
+
+		_moduleHasPrefix: function(/*String*/module){
+			// summary: checks to see if module has been established
+			var mp = this._modulePrefixes;
+			return !!(mp[module] && mp[module].value); // Boolean
+		},
+
+		_getModulePrefix: function(/*String*/module){
+			// summary: gets the prefix associated with module
+			var mp = this._modulePrefixes;
+			if(this._moduleHasPrefix(module)){
+				return mp[module].value; // String
+			}
+			return module; // String
+		},
+
+		_loadedUrls: [],
+
+		//WARNING: 
+		//		This variable is referenced by packages outside of bootstrap:
+		//		FloatingPane.js and undo/browser.js
+		_postLoad: false,
+		
+		//Egad! Lots of test files push on this directly instead of using dojo.addOnLoad.
+		_loaders: [],
+		_unloaders: [],
+		_loadNotifying: false
+	});
+
+
+		dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){
+		// 	summary:
+		//		Load a Javascript module given a relative path
+		//
+		//	description:
+		//		Loads and interprets the script located at relpath, which is
+		//		relative to the script root directory.  If the script is found but
+		//		its interpretation causes a runtime exception, that exception is
+		//		not caught by us, so the caller will see it.  We return a true
+		//		value if and only if the script is found.
+		//
+		// relpath: 
+		//		A relative path to a script (no leading '/', and typically ending
+		//		in '.js').
+		// module: 
+		//		A module whose existance to check for after loading a path.  Can be
+		//		used to determine success or failure of the load.
+		// cb: 
+		//		a callback function to pass the result of evaluating the script
+
+		var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : this.baseUrl) + relpath;
+		try{
+			return !module ? this._loadUri(uri, cb) : this._loadUriAndCheck(uri, module, cb); // Boolean
+		}catch(e){
+			console.error(e);
+			return false; // Boolean
+		}
+	}
+
+	dojo._loadUri = function(/*String*/uri, /*Function?*/cb){
+		//	summary:
+		//		Loads JavaScript from a URI
+		//	description:
+		//		Reads the contents of the URI, and evaluates the contents.  This is
+		//		used to load modules as well as resource bundles. Returns true if
+		//		it succeeded. Returns false if the URI reading failed.  Throws if
+		//		the evaluation throws.
+		//	uri: a uri which points at the script to be loaded
+		//	cb: 
+		//		a callback function to process the result of evaluating the script
+		//		as an expression, typically used by the resource bundle loader to
+		//		load JSON-style resources
+
+		if(this._loadedUrls[uri]){
+			return true; // Boolean
+		}
+		var contents = this._getText(uri, true);
+		if(!contents){ return false; } // Boolean
+		this._loadedUrls[uri] = true;
+		this._loadedUrls.push(uri);
+		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;
+		}
+		if(d.isMoz){ contents += "\r\n//@ sourceURL=" + uri; } // debugging assist for Firebug
+		var value = d["eval"](contents);
+		if(cb){ cb(value); }
+		return true; // Boolean
+	}
+	
+	// FIXME: probably need to add logging to this method
+	dojo._loadUriAndCheck = function(/*String*/uri, /*String*/moduleName, /*Function?*/cb){
+		// summary: calls loadUri then findModule and returns true if both succeed
+		var ok = false;
+		try{
+			ok = this._loadUri(uri, cb);
+		}catch(e){
+			console.error("failed loading " + uri + " with error: " + e);
+		}
+		return !!(ok && this._loadedModules[moduleName]); // Boolean
+	}
+
+	dojo.loaded = function(){
+		// summary:
+		//		signal fired when initial environment and package loading is
+		//		complete. You may use dojo.addOnLoad() or dojo.connect() to
+		//		this method in order to handle initialization tasks that
+		//		require the environment to be initialized. In a browser host,
+		//		declarative widgets will be constructed when this function
+		//		finishes runing.
+		this._loadNotifying = true;
+		this._postLoad = true;
+		var mll = d._loaders;
+		
+		//Clear listeners so new ones can be added
+		//For other xdomain package loads after the initial load.
+		this._loaders = [];
+
+		for(var x = 0; x < mll.length; x++){
+			try{
+				mll[x]();
+			}catch(e){
+				throw e;
+				console.error("dojo.addOnLoad callback failed: " + e, e); /* let other load events fire, like the parser, but report the error */
+			}
+		}
+
+		this._loadNotifying = false;
+		
+		//Make sure nothing else got added to the onload queue
+		//after this first run. If something did, and we are not waiting for any
+		//more inflight resources, run again.
+		if(d._postLoad && d._inFlightCount == 0 && mll.length){
+			d._callLoaded();
+		}
+	}
+
+	dojo.unloaded = function(){
+		// summary:
+		//		signal fired by impending environment destruction. You may use
+		//		dojo.addOnUnload() or dojo.connect() to this method to perform
+		//		page/application cleanup methods.
+		var mll = this._unloaders;
+		while(mll.length){
+			(mll.pop())();
+		}
+	}
+
+	var onto = function(arr, obj, fn){
+		if(!fn){
+			arr.push(obj);
+		}else if(fn){
+			var func = (typeof fn == "string") ? obj[fn] : fn;
+			arr.push(function(){ func.call(obj); });
+		}
+	}
+
+	dojo.addOnLoad = function(/*Object?*/obj, /*String|Function*/functionName){
+		// summary:
+		//		Registers a function to be triggered after the DOM has finished
+		//		loading and widgets declared in markup have been instantiated.
+		//		Images and CSS files may or may not have finished downloading when
+		//		the specified function is called.  (Note that widgets' CSS and HTML
+		//		code is guaranteed to be downloaded before said widgets are
+		//		instantiated.)
+		// example:
+		//	|	dojo.addOnLoad(functionPointer);
+		//	|	dojo.addOnLoad(object, "functionName");
+		//	|	dojo.addOnLoad(object, function(){ /* ... */});
+
+		onto(d._loaders, obj, functionName);
+
+		//Added for xdomain loading. dojo.addOnLoad is used to
+		//indicate callbacks after doing some dojo.require() statements.
+		//In the xdomain case, if all the requires are loaded (after initial
+		//page load), then immediately call any listeners.
+		if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){
+			d._callLoaded();
+		}
+	}
+
+	dojo.addOnUnload = function(/*Object?*/obj, /*String|Function?*/functionName){
+		// summary:
+		//		registers a function to be triggered when the page unloads
+		// example:
+		//	|	dojo.addOnUnload(functionPointer)
+		//	|	dojo.addOnUnload(object, "functionName")
+		//	|	dojo.addOnUnload(object, function(){ /* ... */});
+
+		onto(d._unloaders, obj, functionName);
+	}
+
+	dojo._modulesLoaded = function(){
+		if(d._postLoad){ return; }
+		if(d._inFlightCount > 0){ 
+			console.warn("files still in flight!");
+			return;
+		}
+		d._callLoaded();
+	}
+
+	dojo._callLoaded = function(){
+
+		// The "object" check is for IE, and the other opera check fixes an
+		// issue in Opera where it could not find the body element in some
+		// widget test cases.  For 0.9, maybe route all browsers through the
+		// setTimeout (need protection still for non-browser environments
+		// though). This might also help the issue with FF 2.0 and freezing
+		// issues where we try to do sync xhr while background css images are
+		// being loaded (trac #2572)? Consider for 0.9.
+		if(typeof setTimeout == "object" || (dojo.config.useXDomain && d.isOpera)){
+			if(dojo.isAIR){
+				setTimeout(function(){dojo.loaded();}, 0);
+			}else{
+				setTimeout(dojo._scopeName + ".loaded();", 0);
+			}
+		}else{
+			d.loaded();
+		}
+	}
+
+	dojo._getModuleSymbols = function(/*String*/modulename){
+		// summary:
+		//		Converts a module name in dotted JS notation to an array
+		//		representing the path in the source tree
+		var syms = modulename.split(".");
+		for(var i = syms.length; i>0; i--){
+			var parentModule = syms.slice(0, i).join(".");
+			if((i==1) && !this._moduleHasPrefix(parentModule)){		
+				// Support default module directory (sibling of dojo) for top-level modules 
+				syms[0] = "../" + syms[0];
+			}else{
+				var parentModulePath = this._getModulePrefix(parentModule);
+				if(parentModulePath != parentModule){
+					syms.splice(0, i, parentModulePath);
+					break;
+				}
+			}
+		}
+		// console.debug(syms);
+		return syms; // Array
+	}
+
+	dojo._global_omit_module_check = false;
+
+	dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){
+		//	summary:
+		//		loads a Javascript module from the appropriate URI
+		//	moduleName:
+		//		module name to load. Module paths are de-referenced by dojo's
+		//		internal mapping of locations to names and are disambiguated by
+		//		longest prefix. See `dojo.registerModulePath()` for details on
+		//		registering new modules.
+		//	omitModuleCheck:
+		//		if `true`, omitModuleCheck skips the step of ensuring that the
+		//		loaded file actually defines the symbol it is referenced by.
+		//		For example if it called as `dojo._loadModule("a.b.c")` and the
+		//		file located at `a/b/c.js` does not define an object `a.b.c`,
+		//		and exception will be throws whereas no exception is raised
+		//		when called as `dojo._loadModule("a.b.c", true)`
+		//	description:
+		//		`dojo._loadModule("A.B")` first checks to see if symbol A.B is
+		//		defined. If it is, it is simply returned (nothing to do).
+		//	
+		//		If it is not defined, it will look for `A/B.js` in the script root
+		//		directory.
+		//	
+		//		`dojo._loadModule` throws an excpetion if it cannot find a file
+		//		to load, or if the symbol `A.B` is not defined after loading.
+		//	
+		//		It returns the object `A.B`.
+		//	
+		//		`dojo._loadModule()` does nothing about importing symbols into
+		//		the current namespace.  It is presumed that the caller will
+		//		take care of that. For example, to import all symbols into a
+		//		local block, you might write:
+		//	
+		//		|	with (dojo._loadModule("A.B")) {
+		//		|		...
+		//		|	}
+		//	
+		//		And to import just the leaf symbol to a local variable:
+		//	
+		//		|	var B = dojo._loadModule("A.B");
+		//	   	|	...
+		//	returns: the required namespace object
+		omitModuleCheck = this._global_omit_module_check || omitModuleCheck;
+
+		//Check if it is already loaded.
+		var module = this._loadedModules[moduleName];
+		if(module){
+			return module;
+		}
+
+		// convert periods to slashes
+		var relpath = this._getModuleSymbols(moduleName).join("/") + '.js';
+
+		var modArg = (!omitModuleCheck) ? moduleName : null;
+		var ok = this._loadPath(relpath, modArg);
+
+		if(!ok && !omitModuleCheck){
+			throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'");
+		}
+
+		// check that the symbol was defined
+		// Don't bother if we're doing xdomain (asynchronous) loading.
+		if(!omitModuleCheck && !this._isXDomain){
+			// pass in false so we can give better error
+			module = this._loadedModules[moduleName];
+			if(!module){
+				throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'"); 
+			}
+		}
+
+		return module;
+	}
+
+	dojo.provide = function(/*String*/ resourceName){
+		//	summary:
+		//		Each javascript source file must have at least one
+		//		`dojo.provide()` call at the top of the file, corresponding to
+		//		the file name.  For example, `js/dojo/foo.js` must have
+		//		`dojo.provide("dojo.foo");` before any calls to
+		//		`dojo.require()` are made.
+		//	description:
+		//		Each javascript source file is called a resource.  When a
+		//		resource is loaded by the browser, `dojo.provide()` registers
+		//		that it has been loaded.
+		//	
+		//		For backwards compatibility reasons, in addition to registering
+		//		the resource, `dojo.provide()` also ensures that the javascript
+		//		object for the module exists.  For example,
+		//		`dojo.provide("dojox.data.FlickrStore")`, in addition to
+		//		registering that `FlickrStore.js` is a resource for the
+		//		`dojox.data` module, will ensure that the `dojox.data`
+		//		javascript object exists, so that calls like 
+		//		`dojo.data.foo = function(){ ... }` don't fail.
+		//
+		//		In the case of a build where multiple javascript source files
+		//		are combined into one bigger file (similar to a .lib or .jar
+		//		file), that file may contain multiple dojo.provide() calls, to
+		//		note that it includes multiple resources.
+
+		//Make sure we have a string.
+		resourceName = resourceName + "";
+		return (d._loadedModules[resourceName] = d.getObject(resourceName, true)); // Object
+	}
+
+	//Start of old bootstrap2:
+
+	dojo.platformRequire = function(/*Object*/modMap){
+		//	summary:
+		//		require one or more modules based on which host environment
+		//		Dojo is currently operating in
+		//	description:
+		//		This method takes a "map" of arrays which one can use to
+		//		optionally load dojo modules. The map is indexed by the
+		//		possible dojo.name_ values, with two additional values:
+		//		"default" and "common". The items in the "default" array will
+		//		be loaded if none of the other items have been choosen based on
+		//		dojo.name_, set by your host environment. The items in the
+		//		"common" array will *always* be loaded, regardless of which
+		//		list is chosen.
+		//	example:
+		//		|	dojo.platformRequire({
+		//		|		browser: [
+		//		|			"foo.sample", // simple module
+		//		|			"foo.test",
+		//		|			["foo.bar.baz", true] // skip object check in _loadModule
+		//		|		],
+		//		|		default: [ "foo.sample._base" ],
+		//		|		common: [ "important.module.common" ]
+		//		|	});
+
+		var common = modMap.common || [];
+		var result = common.concat(modMap[d._name] || modMap["default"] || []);
+
+		for(var x=0; x<result.length; x++){
+			var curr = result[x];
+			if(curr.constructor == Array){
+				d._loadModule.apply(d, curr);
+			}else{
+				d._loadModule(curr);
+			}
+		}
+	}
+
+	dojo.requireIf = function(/*Boolean*/ condition, /*String*/ resourceName){
+		// summary:
+		//		If the condition is true then call dojo.require() for the specified
+		//		resource
+		if(condition === true){
+			// FIXME: why do we support chained require()'s here? does the build system?
+			var args = [];
+			for(var i = 1; i < arguments.length; i++){ 
+				args.push(arguments[i]);
+			}
+			d.require.apply(d, args);
+		}
+	}
+
+	dojo.requireAfterIf = d.requireIf;
+
+	dojo.registerModulePath = function(/*String*/module, /*String*/prefix){
+		//	summary: 
+		//		maps a module name to a path
+		//	description: 
+		//		An unregistered module is given the default path of ../[module],
+		//		relative to Dojo root. For example, module acme is mapped to
+		//		../acme.  If you want to use a different module name, use
+		//		dojo.registerModulePath. 
+		//	example:
+		//		If your dojo.js is located at this location in the web root:
+		//	|	/myapp/js/dojo/dojo/dojo.js
+		//		and your modules are located at:
+		//	|	/myapp/js/foo/bar.js
+		//	|	/myapp/js/foo/baz.js
+		//	|	/myapp/js/foo/thud/xyzzy.js
+		//		Your application can tell Dojo to locate the "foo" namespace by calling:
+		//	|	dojo.registerModulePath("foo", "../../foo");
+		//		At which point you can then use dojo.require() to load the
+		//		modules (assuming they provide() the same things which are
+		//		required). The full code might be:
+		//	|	<script type="text/javascript" 
+		//	|		src="/myapp/js/dojo/dojo/dojo.js"></script>
+		//	|	<script type="text/javascript">
+		//	|		dojo.registerModulePath("foo", "../../foo");
+		//	|		dojo.require("foo.bar");
+		//	|		dojo.require("foo.baz");
+		//	|		dojo.require("foo.thud.xyzzy");
+		//	|	</script>
+		d._modulePrefixes[module] = { name: module, value: prefix };
+	}
+
+	dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
+		// summary:
+		//		Declares translated resources and loads them if necessary, in the
+		//		same style as dojo.require.  Contents of the resource bundle are
+		//		typically strings, but may be any name/value pair, represented in
+		//		JSON format.  See also dojo.i18n.getLocalization.
+		// 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('<scr'+'ipt defer src="//:" '
+					+ 'onreadystatechange="if(this.readyState==\'complete\'){' + dojo._scopeName + '._loadInit();}">'
+					+ '</scr'+'ipt>'
+				);
+			}
+
+			// 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<l; i++){
+		dojo._mixin(constructor.prototype, arguments[i]);
+	}
+	return constructor; // Object
+}
+
+dojo._hitchArgs = function(scope, method /*,...*/){
+	var pre = dojo._toArray(arguments, 2);
+	var named = dojo.isString(method);
+	return function(){
+		// arrayify arguments
+		var args = dojo._toArray(arguments);
+		// locate our method
+		var f = named ? (scope||dojo.global)[method] : method;
+		// invoke with collected args
+		return f && f.apply(scope || this, pre.concat(args)); // mixed
+ 	} // Function
+}
+
+dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){
+	//	summary: 
+	//		Returns a function that will only ever execute in the a given scope. 
+	//		This allows for easy use of object member functions
+	//		in callbacks and other places in which the "this" keyword may
+	//		otherwise not reference the expected scope. 
+	//		Any number of default positional arguments may be passed as parameters 
+	//		beyond "method".
+	//		Each of these values will be used to "placehold" (similar to curry)
+	//		for the hitched function. 
+	//	scope: 
+	//		The scope to use when method executes. If method is a string, 
+	//		scope is also the object containing method.
+	//	method:
+	//		A function to be hitched to scope, or the name of the method in
+	//		scope to be hitched.
+	//	example:
+	//	|	dojo.hitch(foo, "bar")(); 
+	//		runs foo.bar() in the scope of foo
+	//	example:
+	//	|	dojo.hitch(foo, myFunction);
+	//		returns a function that runs myFunction in the scope of foo
+	if(arguments.length > 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<l; i++){	args.push(a[i]); }
+	// do the actual work
+	return dojo._connect.apply(this, args); /*Handle*/
+}
+
+// used by non-browser hostenvs. always overriden by event.js
+dojo._connect = function(obj, event, context, method){
+	var l=dojo._listener, h=l.add(obj, event, dojo.hitch(context, method)); 
+	return [obj, event, h, l]; // Handle
+}
+
+dojo.disconnect = function(/*Handle*/ handle){
+	// summary:
+	//		Remove a link created by dojo.connect.
+	// description:
+	//		Removes the connection between event and the method referenced by handle.
+	// handle:
+	//		the return value of the dojo.connect call that created the connection.
+	if(handle && handle[0] !== undefined){
+		dojo._disconnect.apply(this, handle);
+		// let's not keep this reference
+		delete handle[0];
+	}
+}
+
+dojo._disconnect = function(obj, event, handle, listener){
+	listener.remove(obj, event, handle);
+}
+
+// topic publish/subscribe
+
+dojo._topics = {};
+
+dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Function*/ method){
+	//	summary:
+	//		Attach a listener to a named topic. The listener function is invoked whenever the
+	//		named topic is published (see: dojo.publish).
+	//		Returns a handle which is needed to unsubscribe this listener.
+	//	context:
+	//		Scope in which method will be invoked, or null for default scope.
+	//	method:
+	//		The name of a function in context, or a function reference. This is the function that
+	//		is invoked when topic is published.
+	//	example:
+	//	|	dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+	//	|	dojo.publish("alerts", [ "read this", "hello world" ]);																	
+
+	// support for 2 argument invocation (omitting context) depends on hitch
+	return [topic, dojo._listener.add(dojo._topics, topic, dojo.hitch(context, method))]; /*Handle*/
+}
+
+dojo.unsubscribe = function(/*Handle*/ handle){
+	//	summary:
+	//	 	Remove a topic listener. 
+	//	handle:
+	//	 	The handle returned from a call to subscribe.
+	//	example:
+	//	|	var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+	//	|	...
+	//	|	dojo.unsubscribe(alerter);
+	if(handle){
+		dojo._listener.remove(dojo._topics, handle[0], handle[1]);
+	}
+}
+
+dojo.publish = function(/*String*/ topic, /*Array*/ args){
+	//	summary:
+	//	 	Invoke all listener method subscribed to topic.
+	//	topic:
+	//	 	The name of the topic to publish.
+	//	args:
+	//	 	An array of arguments. The arguments will be applied 
+	//	 	to each topic subscriber (as first class parameters, via apply).
+	//	example:
+	//	|	dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+	//	|	dojo.publish("alerts", [ "read this", "hello world" ]);	
+
+	// Note that args is an array, which is more efficient vs variable length
+	// argument list.  Ideally, var args would be implemented via Array
+	// throughout the APIs.
+	var f = dojo._topics[topic];
+	if(f){
+		f.apply(this, args||[]);
+	}
+}
+
+dojo.connectPublisher = function(	/*String*/ topic, 
+									/*Object|null*/ obj, 
+									/*String*/ event){
+	//	summary:
+	//	 	Ensure that everytime obj.event() is called, a message is published
+	//	 	on the topic. Returns a handle which can be passed to
+	//	 	dojo.disconnect() to disable subsequent automatic publication on
+	//	 	the topic.
+	//	topic:
+	//	 	The name of the topic to publish.
+	//	obj: 
+	//	 	The source object for the event function. Defaults to dojo.global
+	//	 	if null.
+	//	event:
+	//	 	The name of the event function in obj. 
+	//	 	I.e. identifies a property obj[event].
+	//	example:
+	//	|	dojo.connectPublisher("/ajax/start", dojo, "xhrGet"};
+	var pf = function(){ dojo.publish(topic, arguments); }
+	return (event) ? dojo.connect(obj, event, pf) : dojo.connect(obj, pf); //Handle
+};
+
+}
+
+if(!dojo._hasResource["dojo._base.Deferred"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo._base.Deferred"] = true;
+dojo.provide("dojo._base.Deferred");
+
+
+dojo.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 <http://twistedmatrix.com>.
+	// 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:
+			// 			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf>
+
+			var step = 1, end = array.length || 0, i = 0;
+			if(findLast){
+				i = end - 1;
+				step = end = -1;
+			}
+			if(fromIndex != undefined){ i = fromIndex; }
+			if((findLast && i > end) || i < end){
+				for(; i != end; i += step){
+					if(array[i] == value){ return i; }
+				}
+			}
+			return -1;	// Number
+		},
+
+		lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){
+			// summary:
+			//		locates the last index of the provided value in the passed array. 
+			//		If the value is not found, -1 is returned.
+			// description:
+			//		For details on this method, see:
+			// 			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf>
+			return dojo.indexOf(array, value, fromIndex, true); // Number
+		},
+
+		forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		for every item in arr, callback is invoked.  Return values are ignored.
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:forEach>
+
+			// 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<l; i++){ 
+				_p[2].call(_p[1], arr[i], i, arr);
+			}
+		},
+
+		_everyOrSome: function(/*Boolean*/every, /*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			var _p = _getParts(arr, thisObject, callback); arr = _p[0];
+			for(var i = 0, l = arr.length; i < l; i++){
+				var result = !!_p[2].call(_p[1], arr[i], i, arr);
+				if(every ^ result){
+					return result; // Boolean
+				}
+			}
+			return every; // Boolean
+		},
+
+		every: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		Determines whether or not every item in arr satisfies the
+			//		condition implemented by callback.
+			// arr: the array to iterate on.  If a string, operates on individual characters.
+			// callback: a function is invoked with three arguments: item, index, and array and returns true
+			//		if the condition is met.
+			// thisObject: may be used to scope the call to callback
+			// description:
+			//		This function corresponds to the JavaScript 1.6 Array.every() method.
+			//		In environments that support JavaScript 1.6, this function is a passthrough to the built-in method.
+			//		For more details, see:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every>
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some>
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:map>
+			// 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<arr.length;++i){
+				outArr.push(_p[2].call(_p[1], arr[i], i, arr));
+			}
+			return outArr; // Array
+		},
+
+		filter: function(/*Array*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		Returns a new Array with those items from arr that match the
+			//		condition implemented by callback.
+			// arr: the array to iterate 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.filter() method.
+			//		In environments that support JavaScript 1.6, this function is a passthrough to the built-in method.
+			//		For more details, see:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:filter>
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice>
+			// 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat>
+			// item: Object...?
+			//		Any number of optional parameters may be passed in to be
+			//		spliced into the NodeList
+			// returns:
+			//		dojo.NodeList
+			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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf>
+			//	returns:
+			//		Positive Integer or 0 for a match, -1 of not found.
+			return d.indexOf(this, value, fromIndex); // Integer
+		},
+
+		lastIndexOf: function(/*===== value, fromIndex =====*/){
+			// summary:
+			//		see dojo.lastIndexOf(). The primary difference is that the
+			//		acted-on array is implicitly this NodeList
+			//	description:
+			//		For more details on the behavior of lastIndexOf, see:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf>
+			// value: Object
+			//		The value to search for.
+			// fromIndex: Integer?
+			//		The 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:
+			//			<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every>
+			//		Takes the same structure of arguments and returns as
+			//		dojo.every() with the caveat that the passed array is
+			//		implicitly this NodeList
+			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("<h4>NOTE:</h4>", "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<ql; x++){
+			if(lc == "\\"){ continue; }
+			if(!currentPart){
+				// NOTE: I hate all this alloc, but it's shorter than writing tons of if's
+				pStart = x;
+				currentPart = {
+					query: null,
+					pseudos: [],
+					attrs: [],
+					classes: [],
+					tag: null,
+					oper: null,
+					id: null
+				};
+				inTag = x;
+			}
+
+			if(inBrackets >= 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<ecnl, te=ecn[x]; x++){
+				if(tf(te)){
+					if(isFinal){
+						matchArr.push(te);
+					}else{
+						_filterDown(te, queryParts, matchArr, nidx);
+					}
+				}
+				/*
+				if(x==0){
+					break;
+				}
+				*/
+			}
+		}
+
+		// otherwise, keep going down, unless we'er at the end
+		var candidates = getElementsFunc(tqp)(element);
+		if(isFinal){
+			while(candidates.length){
+				matchArr.push(candidates.shift());
+			}
+			/*
+			candidates.unshift(0, matchArr.length-1);
+			matchArr.splice.apply(matchArr, candidates);
+			*/
+		}else{
+			// if we're not yet at the bottom, keep going!
+			while(candidates.length){
+				_filterDown(candidates.shift(), queryParts, matchArr, nidx);
+			}
+		}
+	}
+
+	var filterDown = function(elements, queryParts){
+		var ret = [];
+
+		// for every root, get the elements that match the descendant selector
+		// for(var x=elements.length-1, 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 <http://www.w3.org/TR/css3-selectors/#selectors>
+		//	root:
+		//		A DOMNode (or node id) to scope the search from. Optional.
+		//	returns: dojo.NodeList
+		//		An instance of `dojo.NodeList`. Many methods are available on
+		//		NodeLists for searching, iterating, manipulating, and handling
+		//		events on the matched nodes in the returned list.
+		//	example:
+		//		search the entire document for elements with the class "foo":
+		//	|	dojo.query(".foo");
+		//		these elements will match:
+		//	|	<span class="foo"></span>
+		//	|	<span class="foo bar"></span>
+		//	|	<p class="thud foo"></p>
+		//	example:
+		//		search the entire document for elements with the classes "foo" *and* "bar":
+		//	|	dojo.query(".foo.bar");
+		//		these elements will match:
+		//	|	<span class="foo bar"></span>
+		//		while these will not:
+		//	|	<span class="foo"></span>
+		//	|	<p class="thud foo"></p>
+		//	example:
+		//		find `<span>` elements which are descendants of paragraphs and
+		//		which have a "highlighted" class:
+		//	|	dojo.query("p span.highlighted");
+		//		the innermost span in this fragment matches:
+		//	|	<p class="foo">
+		//	|		<span>...
+		//	|			<span class="highlighted foo bar">...</span>
+		//	|		</span>
+		//	|	</p>
+		//	example:
+		//		set an "odd" class on all odd table rows inside of the table
+		//		`#tabular_data`, using the `>` (direct child) selector to avoid
+		//		affecting any nested tables:
+		//	|	dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd");
+		//	example:
+		//		remove all elements with the class "error" from the document
+		//		and store them in a list:
+		//	|	var errors = dojo.query(".error").orphan();
+		//	example:
+		//		add an onclick handler to every submit button in the document
+		//		which causes the form to be sent via Ajax instead:
+		//	|	dojo.query("input[type='submit']").onclick(function(e){
+		//	|		dojo.stopEvent(e); // prevent sending the form
+		//	|		var btn = e.target;
+		//	|		dojo.xhrPost({
+		//	|			form: btn.form,
+		//	|			load: function(data){
+		//	|				// replace the form with the response
+		//	|				var div = dojo.doc.createElement("div");
+		//	|				dojo.place(div, btn.form, "after");
+		//	|				div.innerHTML = data;
+		//	|				dojo.style(btn.form, "display", "none");
+		//	|			}
+		//	|		});
+		//	|	});
+
+
+		// 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:
+		//
+		//		|	<form id="test_form">
+		//		|		<input type="text" name="blah" value="blah">
+		//		|		<input type="text" name="no_value" value="blah" disabled>
+		//		|		<input type="button" name="no_value2" value="blah">
+		//		|		<select type="select" multiple name="multi" size="5">
+		//		|			<option value="blah">blah</option>
+		//		|			<option value="thud" selected>thud</option>
+		//		|			<option value="thonk" selected>thonk</option>
+		//		|		</select>
+		//		|	</form>
+		//
+		//		yields this object structure as the result of a call to
+		//		formToObject():
+		//
+		//		|	{ 
+		//		|		blah: "blah",
+		//		|		multi: [
+		//		|			"thud",
+		//		|			"thonk"
+		//		|		]
+		//		|	};
+	
+		var ret = {};
+		var 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);
+	}
+
+})();
+

Added: branches/vhffs-design/vhffs-panel/js/dojo/fx.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/fx.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/fx.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/i18n.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/i18n.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/i18n.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<extra.length; i++){
+				req(m,b,extra[i], availableFlatLocales);
+			}
+		};
+	}
+})();
+
+dojo.i18n._searchLocalePath = function(/*String*/locale, /*Boolean*/down, /*Function*/searchFunc){
+	//	summary:
+	//		A helper method to assist in searching for locale-based resources.
+	//		Will iterate through the variants of a particular locale, either up
+	//		or down, executing a callback function.  For example, "en-us" and
+	//		true will try "en-us" followed by "en" and finally "ROOT".
+
+	locale = dojo.i18n.normalizeLocale(locale);
+
+	var elements = locale.split('-');
+	var searchlist = [];
+	for(var i = elements.length; i > 0; i--){
+		searchlist.push(elements.slice(0, i).join('-'));
+	}
+	searchlist.push(false);
+	if(down){searchlist.reverse();}
+
+	for(var j = searchlist.length - 1; j >= 0; j--){
+		var loc = searchlist[j] || "ROOT";
+		var stop = searchFunc(loc);
+		if(stop){ break; }
+	}
+};
+
+dojo.i18n._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated){
+	//	summary:
+	//		Load built, flattened resource bundles, if available for all
+	//		locales used in the page. Only called by built layer files.
+
+	function preload(locale){
+		locale = dojo.i18n.normalizeLocale(locale);
+		dojo.i18n._searchLocalePath(locale, true, function(loc){
+			for(var i=0; i<localesGenerated.length;i++){
+				if(localesGenerated[i] == loc){
+					dojo["require"](bundlePrefix+"_"+loc);
+					return true; // Boolean
+				}
+			}
+			return false; // Boolean
+		});
+	}
+	preload();
+	var extra = dojo.config.extraLocale||[];
+	for(var i=0; i<extra.length; i++){
+		preload(extra[i]);
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/io/iframe.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/io/iframe.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/io/iframe.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,358 @@
+if(!dojo._hasResource["dojo.io.iframe"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.io.iframe"] = true;
+dojo.provide("dojo.io.iframe");
+
+dojo.io.iframe = {
+	create: function(/*String*/fname, /*String*/onloadstr, /*String?*/uri){
+		//	summary:
+		//		Creates a hidden iframe in the page. Used mostly for IO
+		//		transports.  You do not need to call this to start a
+		//		dojo.io.iframe request. Just call send().
+		//	fname: String
+		//		The name of the iframe. Used for the name attribute on the
+		//		iframe.
+		//	onloadstr: String
+		//		A string of JavaScript that will be executed when the content
+		//		in the iframe loads.
+		//	uri: String
+		//		The value of the src attribute on the iframe element. If a
+		//		value is not given, then dojo/resources/blank.html will be
+		//		used.
+		if(window[fname]){ return window[fname]; }
+		if(window.frames[fname]){ return window.frames[fname]; }
+		var cframe = null;
+		var turi = uri;
+		if(!turi){
+			if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){
+				console.debug("dojo.io.iframe.create: When using cross-domain Dojo builds,"
+					+ " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"
+					+ " to the path on your domain to blank.html");
+			}
+			turi = (dojo.config["dojoBlankHtmlUrl"]||dojo.moduleUrl("dojo", "resources/blank.html"));
+		}
+		var ifrstr = dojo.isIE ? '<iframe name="'+fname+'" src="'+turi+'" onload="'+onloadstr+'">' : 'iframe';
+		cframe = dojo.doc.createElement(ifrstr);
+		with(cframe){
+			name = fname;
+			setAttribute("name", fname);
+			id = fname;
+		}
+		dojo.body().appendChild(cframe);
+		window[fname] = cframe;
+	
+		with(cframe.style){
+			if(dojo.isSafari < 3){
+				//We can't change the src in Safari 2.0.3 if absolute position. Bizarro.
+				position = "absolute";
+			}
+			left = top = "1px";
+			height = width = "1px";
+			visibility = "hidden";
+		}
+
+		if(!dojo.isIE){
+			this.setSrc(cframe, turi, true);
+			cframe.onload = new Function(onloadstr);
+		}
+
+		return cframe;
+	},
+
+	setSrc: function(/*DOMNode*/iframe, /*String*/src, /*Boolean*/replace){
+		//summary:
+		//		Sets the URL that is loaded in an IFrame. The replace parameter
+		//		indicates whether location.replace() should be used when
+		//		changing the location of the iframe.
+		try{
+			if(!replace){
+				if(dojo.isSafari){
+					iframe.location = src;
+				}else{
+					frames[iframe.name].location = src;
+				}
+			}else{
+				// Fun with DOM 0 incompatibilities!
+				var idoc;
+				if(dojo.isIE || dojo.isSafari > 2){
+					idoc = iframe.contentWindow.document;
+				}else if(dojo.isSafari){
+					idoc = iframe.document;
+				}else{ //  if(d.isMozilla){
+					idoc = iframe.contentWindow;
+				}
+	
+				//For Safari (at least 2.0.3) and Opera, if the iframe
+				//has just been created but it doesn't have content
+				//yet, then iframe.document may be null. In that case,
+				//use iframe.location and return.
+				if(!idoc){
+					iframe.location = src;
+					return;
+				}else{
+					idoc.location.replace(src);
+				}
+			}
+		}catch(e){ 
+			console.debug("dojo.io.iframe.setSrc: ", e); 
+		}
+	},
+
+	doc: function(/*DOMNode*/iframeNode){
+		//summary: Returns the document object associated with the iframe DOM Node argument.
+		var doc = iframeNode.contentDocument || // W3
+			(
+				(
+					(iframeNode.name) && (iframeNode.document) && 
+					(document.getElementsByTagName("iframe")[iframeNode.name].contentWindow) &&
+					(document.getElementsByTagName("iframe")[iframeNode.name].contentWindow.document)
+				)
+			) ||  // IE
+			(
+				(iframeNode.name)&&(document.frames[iframeNode.name])&&
+				(document.frames[iframeNode.name].document)
+			) || null;
+		return doc;
+	},
+
+	/*=====
+	dojo.io.iframe.__ioArgs = function(kwArgs){
+		//	summary:
+		//		All the properties described in the dojo.__ioArgs type, apply
+		//		to this type. The following additional properties are allowed
+		//		for dojo.io.iframe.send():
+		//	method: String?
+		//		The HTTP method to use. "GET" or "POST" are the only supported
+		//		values.  It will try to read the value from the form node's
+		//		method, then try this argument. If neither one exists, then it
+		//		defaults to POST.
+		//	handleAs: String?
+		//		Specifies what format the result data should be given to the
+		//		load/handle callback. Valid values are: text, html, javascript,
+		//		json. IMPORTANT: For all values EXCEPT html, The server
+		//		response should be an HTML file with a textarea element. The
+		//		response data should be inside the textarea element. Using an
+		//		HTML document the only reliable, cross-browser way this
+		//		transport can know when the response has loaded. For the html
+		//		handleAs value, just return a normal HTML document.  NOTE: xml
+		//		or any other XML type is NOT supported by this transport.
+		//	content: Object?
+		//		If "form" is one of the other args properties, then the content
+		//		object properties become hidden form form elements. For
+		//		instance, a content object of {name1 : "value1"} is converted
+		//		to a hidden form element with a name of "name1" and a value of
+		//		"value1". If there is not a "form" property, then the content
+		//		object is converted into a name=value&name=value string, by
+		//		using dojo.objectToQuery().
+	}
+	=====*/
+
+	send: function(/*dojo.io.iframe.__ioArgs*/args){
+		//summary: function that sends the request to the server.
+		//This transport can only process one send() request at a time, so if send() is called
+		//multiple times, it will queue up the calls and only process one at a time.
+		if(!this["_frame"]){
+			this._frame = this.create(this._iframeName, dojo._scopeName + ".io.iframe._iframeOnload();");
+		}
+
+		//Set up the deferred.
+		var dfd = dojo._ioSetArgs(
+			args,
+			function(/*Deferred*/dfd){
+				//summary: canceller function for dojo._ioSetArgs call.
+				dfd.canceled = true;
+				dfd.ioArgs._callNext();
+			},
+			function(/*Deferred*/dfd){
+				//summary: okHandler function for dojo._ioSetArgs call.
+				var value = null;
+				try{
+					var ioArgs = dfd.ioArgs;
+					var dii = dojo.io.iframe;
+					var ifd = dii.doc(dii._frame);
+					var handleAs = ioArgs.handleAs;
+
+					//Assign correct value based on handleAs value.
+					value = ifd; //html
+					if(handleAs != "html"){
+						value = ifd.getElementsByTagName("textarea")[0].value; //text
+						if(handleAs == "json"){
+							value = dojo.fromJson(value); //json
+						}else if(handleAs == "javascript"){
+							value = dojo.eval(value); //javascript
+						}
+					}
+				}catch(e){
+					value = e;
+				}finally{
+					ioArgs._callNext();				
+				}
+				return value;
+			},
+			function(/*Error*/error, /*Deferred*/dfd){
+				//summary: errHandler function for dojo._ioSetArgs call.
+				dfd.ioArgs._hasError = true;
+				dfd.ioArgs._callNext();
+				return error;
+			}
+		);
+
+		//Set up a function that will fire the next iframe request. Make sure it only
+		//happens once per deferred.
+		dfd.ioArgs._callNext = function(){
+			if(!this["_calledNext"]){
+				this._calledNext = true;
+				dojo.io.iframe._currentDfd = null;
+				dojo.io.iframe._fireNextRequest();
+			}
+		}
+
+		this._dfdQueue.push(dfd);
+		this._fireNextRequest();
+		
+		//Add it the IO watch queue, to get things like timeout support.
+		dojo._ioWatch(
+			dfd,
+			function(/*Deferred*/dfd){
+				//validCheck
+				return !dfd.ioArgs["_hasError"];
+			},
+			function(dfd){
+				//ioCheck
+				return (!!dfd.ioArgs["_finished"]);
+			},
+			function(dfd){
+				//resHandle
+				if(dfd.ioArgs._finished){
+					dfd.callback(dfd);
+				}else{
+					dfd.errback(new Error("Invalid dojo.io.iframe request state"));
+				}
+			}
+		);
+
+		return dfd;
+	},
+
+	_currentDfd: null,
+	_dfdQueue: [],
+	_iframeName: dojo._scopeName + "IoIframe",
+
+	_fireNextRequest: function(){
+		//summary: Internal method used to fire the next request in the bind queue.
+		try{
+			if((this._currentDfd)||(this._dfdQueue.length == 0)){ return; }
+			var dfd = this._currentDfd = this._dfdQueue.shift();
+			var ioArgs = dfd.ioArgs;
+			var args = ioArgs.args;
+
+			ioArgs._contentToClean = [];
+			var fn = dojo.byId(args["form"]);
+			var content = args["content"] || {};
+			if(fn){
+				if(content){
+					// if we have things in content, we need to add them to the form
+					// before submission
+					for(var x in content){
+						if(!fn[x]){
+							var tn;
+							if(dojo.isIE){
+								tn = dojo.doc.createElement("<input type='hidden' name='"+x+"'>");
+							}else{
+								tn = dojo.doc.createElement("input");
+								tn.type = "hidden";
+								tn.name = x;
+							}
+							tn.value = content[x];
+							fn.appendChild(tn);
+							ioArgs._contentToClean.push(x);
+						}else{
+							fn[x].value = content[x];
+						}
+					}
+				}
+				//IE requires going through getAttributeNode instead of just getAttribute in some form cases, 
+				//so use it for all.  See #2844
+				var actnNode = fn.getAttributeNode("action");
+				var mthdNode = fn.getAttributeNode("method");
+				var trgtNode = fn.getAttributeNode("target");
+				if(args["url"]){
+					ioArgs._originalAction = actnNode ? actnNode.value : null;
+					if(actnNode){
+						actnNode.value = args.url;
+					}else{
+						fn.setAttribute("action",args.url);
+					}
+				}
+				if(!mthdNode || !mthdNode.value){
+					if(mthdNode){
+						mthdNode.value= (args["method"]) ? args["method"] : "post";
+					}else{
+						fn.setAttribute("method", (args["method"]) ? args["method"] : "post");
+					}
+				}
+				ioArgs._originalTarget = trgtNode ? trgtNode.value: null;
+				if(trgtNode){
+					trgtNode.value = this._iframeName;
+				}else{
+					fn.setAttribute("target", this._iframeName);
+				}
+				fn.target = this._iframeName;
+				fn.submit();
+			}else{
+				// otherwise we post a GET string by changing URL location for the
+				// iframe
+				var tmpUrl = args.url + (args.url.indexOf("?") > -1 ? "&" : "?") + ioArgs.query;
+				this.setSrc(this._frame, tmpUrl, true);
+			}
+		}catch(e){
+			dfd.errback(e);
+		}
+	},
+
+	_iframeOnload: function(){
+		var dfd = this._currentDfd;
+		if(!dfd){
+			this._fireNextRequest();
+			return;
+		}
+
+		var ioArgs = dfd.ioArgs;
+		var args = ioArgs.args;
+		var fNode = dojo.byId(args.form);
+	
+		if(fNode){
+			// remove all the hidden content inputs
+			var toClean = ioArgs._contentToClean;
+			for(var i = 0; i < toClean.length; i++) {
+				var key = toClean[i];
+				if(dojo.isSafari < 3){
+					//In Safari (at least 2.0.3), can't use form[key] syntax to find the node,
+					//for nodes that were dynamically added.
+					for(var j = 0; j < fNode.childNodes.length; j++){
+						var chNode = fNode.childNodes[j];
+						if(chNode.name == key){
+							dojo._destroyElement(chNode);
+							break;
+						}
+					}
+				}else{
+					dojo._destroyElement(fNode[key]);
+					fNode[key] = null;
+				}
+			}
+	
+			// restore original action + target
+			if(ioArgs["_originalAction"]){
+				fNode.setAttribute("action", ioArgs._originalAction);
+			}
+			if(ioArgs["_originalTarget"]){
+				fNode.setAttribute("target", ioArgs._originalTarget);
+				fNode.target = ioArgs._originalTarget;
+			}
+		}
+
+		ioArgs._finished = true;
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/io/script.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/io/script.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/io/script.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,211 @@
+if(!dojo._hasResource["dojo.io.script"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.io.script"] = true;
+dojo.provide("dojo.io.script");
+
+/*=====
+dojo.io.script.__ioArgs = function(kwArgs){
+	//	summary:
+	//		All the properties described in the dojo.__ioArgs type, apply to this
+	//		type as well, EXCEPT "handleAs". It is not applicable to
+	//		dojo.io.script.get() calls, since it is implied by the usage of
+	//		"callbackParamName" (response will be a JSONP call returning JSON)
+	//		or "checkString" (response is pure JavaScript defined in
+	//		the body of the script that was attached). The following additional
+	//		properties are allowed for dojo.io.script.get():
+	//	callbackParamName: String
+	//		The URL parameter name that indicates the JSONP callback string.
+	//		For instance, when using Yahoo JSONP calls it is normally, 
+	//		callbackParamName: "callback". For AOL JSONP calls it is normally 
+	//		callbackParamName: "c".
+	//	checkString: String
+	//		A string of JavaScript that when evaluated like so: 
+	//		"typeof(" + checkString + ") != 'undefined'"
+	//		being true means that the script fetched has been loaded. 
+	//		Do not use this if doing a JSONP type of call (use callbackParamName instead).
+	//	frameDoc: Document.
+	//		The Document object for a child iframe. If this is passed in, the script
+	//		will be attached to that document. This can be helpful in some comet long-polling
+	//		scenarios with Firefox and Opera.
+}
+=====*/
+
+dojo.io.script = {
+	get: function(/*dojo.io.script.__ioArgs*/args){
+		//	summary:
+		//		sends a get request using a dynamically created script tag.
+		var dfd = this._makeScriptDeferred(args);
+		var ioArgs = dfd.ioArgs;
+		dojo._ioAddQueryToUrl(ioArgs);
+
+		this.attach(ioArgs.id, ioArgs.url, args.frameDoc);
+		dojo._ioWatch(dfd, this._validCheck, this._ioCheck, this._resHandle);
+		return dfd;
+	},
+
+	attach: function(/*String*/id, /*String*/url, /*Document?*/frameDocument){
+		//	summary:
+		//		creates a new <script> tag pointing to the specified URL and
+		//		adds it to the document.
+		//	description:
+		//		Attaches the script element to the DOM.  Use this method if you
+		//		just want to attach a script to the DOM and do not care when or
+		//		if it loads.
+		var doc = (frameDocument || dojo.doc);
+		var element = doc.createElement("script");
+		element.type = "text/javascript";
+		element.src = url;
+		element.id = id;
+		doc.getElementsByTagName("head")[0].appendChild(element);
+	},
+
+	remove: function(/*String*/id){
+		//summary: removes the script element with the given id.
+		dojo._destroyElement(dojo.byId(id));
+		
+		//Remove the jsonp callback on dojo.io.script, if it exists.
+		if(this["jsonp_" + id]){
+			delete this["jsonp_" + id];
+		}
+	},
+
+	_makeScriptDeferred: function(/*Object*/args){
+		//summary: 
+		//		sets up a Deferred object for an IO request.
+		var dfd = dojo._ioSetArgs(args, this._deferredCancel, this._deferredOk, this._deferredError);
+
+		var ioArgs = dfd.ioArgs;
+		ioArgs.id = dojo._scopeName + "IoScript" + (this._counter++);
+		ioArgs.canDelete = false;
+
+		//Special setup for jsonp case
+		if(args.callbackParamName){
+			//Add the jsonp parameter.
+			ioArgs.query = ioArgs.query || "";
+			if(ioArgs.query.length > 0){
+				ioArgs.query += "&";
+			}
+			ioArgs.query += args.callbackParamName
+				+ "="
+				+ (args.frameDoc ? "parent." : "")
+				+ "dojo.io.script.jsonp_" + ioArgs.id + "._jsonpCallback";
+
+			//Setup the Deferred to have the jsonp callback.
+			ioArgs.canDelete = true;
+			dfd._jsonpCallback = this._jsonpCallback;
+			this["jsonp_" + ioArgs.id] = dfd;
+		}
+		return dfd; // dojo.Deferred
+	},
+	
+	_deferredCancel: function(/*Deferred*/dfd){
+		//summary: canceller function for dojo._ioSetArgs call.
+
+		//DO NOT use "this" and expect it to be dojo.io.script.
+		dfd.canceled = true;
+		if(dfd.ioArgs.canDelete){
+			dojo.io.script._deadScripts.push(dfd.ioArgs.id);
+		}
+	},
+
+	_deferredOk: function(/*Deferred*/dfd){
+		//summary: okHandler function for dojo._ioSetArgs call.
+
+		//DO NOT use "this" and expect it to be dojo.io.script.
+
+		//Add script to list of things that can be removed.		
+		if(dfd.ioArgs.canDelete){
+			dojo.io.script._deadScripts.push(dfd.ioArgs.id);
+		}
+
+		if(dfd.ioArgs.json){
+			//Make sure to *not* remove the json property from the
+			//Deferred, so that the Deferred can still function correctly
+			//after the response is received.
+			return dfd.ioArgs.json;
+		}else{
+			//FIXME: cannot return the dfd here, otherwise that stops
+			//the callback chain in Deferred. So return the ioArgs instead.
+			//This doesn't feel right.
+			return dfd.ioArgs;
+		}
+	},
+	
+	_deferredError: function(/*Error*/error, /*Deferred*/dfd){
+		//summary: errHandler function for dojo._ioSetArgs call.
+
+		if(dfd.ioArgs.canDelete){
+			//DO NOT use "this" and expect it to be dojo.io.script.
+			if(error.dojoType == "timeout"){
+				//For timeouts, remove the script element immediately to
+				//avoid a response from it coming back later and causing trouble.
+				dojo.io.script.remove(dfd.ioArgs.id);
+			}else{
+				dojo.io.script._deadScripts.push(dfd.ioArgs.id);
+			}
+		}
+		console.debug("dojo.io.script error", error);
+		return error;
+	},
+
+	_deadScripts: [],
+	_counter: 1,
+
+	_validCheck: function(/*Deferred*/dfd){
+		//summary: inflight check function to see if dfd is still valid.
+
+		//Do script cleanup here. We wait for one inflight pass
+		//to make sure we don't get any weird things by trying to remove a script
+		//tag that is part of the call chain (IE 6 has been known to
+		//crash in that case).
+		var _self = dojo.io.script;
+		var deadScripts = _self._deadScripts;
+		if(deadScripts && deadScripts.length > 0){
+			for(var i = 0; i < deadScripts.length; i++){
+				//Remove the script tag
+				_self.remove(deadScripts[i]);
+			}
+			dojo.io.script._deadScripts = [];
+		}
+
+		return true;
+	},
+
+	_ioCheck: function(/*Deferred*/dfd){
+		//summary: inflight check function to see if IO finished.
+
+		//Check for finished jsonp
+		if(dfd.ioArgs.json){
+			return true;
+		}
+
+		//Check for finished "checkString" case.
+		var checkString = dfd.ioArgs.args.checkString;
+		if(checkString && eval("typeof(" + checkString + ") != 'undefined'")){
+			return true;
+		}
+
+		return false;
+	},
+
+	_resHandle: function(/*Deferred*/dfd){
+		//summary: inflight function to handle a completed response.
+		if(dojo.io.script._ioCheck(dfd)){
+			dfd.callback(dfd);
+		}else{
+			//This path should never happen since the only way we can get
+			//to _resHandle is if _ioCheck is true.
+			dfd.errback(new Error("inconceivable dojo.io.script._resHandle error"));
+		}
+	},
+
+	_jsonpCallback: function(/*JSON Object*/json){
+		//summary: 
+		//		generic handler for jsonp callback. A pointer to this function
+		//		is used for all jsonp callbacks.  NOTE: the "this" in this
+		//		function will be the Deferred object that represents the script
+		//		request.
+		this.ioArgs.json = json;
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/jaxer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/jaxer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/jaxer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,15 @@
+if(!dojo._hasResource["dojo.jaxer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.jaxer"] = true;
+dojo.provide("dojo.jaxer");
+
+if(typeof print == "function"){
+	console.debug = Jaxer.Log.debug;
+	console.warn = Jaxer.Log.warn;
+	console.error = Jaxer.Log.error;
+	console.info = Jaxer.Log.info;
+	console.log = Jaxer.Log.warn;
+}
+
+onserverload = dojo._loadInit;
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/ar/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/ar/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/ar/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي ","midnightblue":"أزرق بحري ","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح ","slategrey":"رمادي اردوازي ","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط ","salmon":"برتقالي وردي شاحب ","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي ","lightsalmon":"فضي فاتح","silver":"فضي ","dimgrey":"رمادي شاحب","orange":"برتقالي ","white":"أبيض ","navajowhite":"أبيض ملاحي ","royalblue":"أزرق ملكي ","deeppink":"أحمر وردي غامق","lime":"ليموني ","oldlace":"برتقالي مائل للأصفر شاحب ","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر ","linen":"كتاني ","olive":"أخضر زيتوني داكن ","gold":"ذهبي","lawngreen":"أخضر بلون العشب ","lightyellow":"أصفر فاتح ","tan":"خمري ","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق ","mintcream":"أصفر شاحب مائل للأخضر الزرعي ","rosybrown":"بني وردي ","mediumslateblue":"أزرق اردوازي متوسط ","magenta":"أحمر قرمزي ","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح ","darkgoldenrod":"أصفر ذهبي داكن ","slateblue":"أزرق اردوازي ","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط ","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط ","maroon":"أحمر داكن ","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط ","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط ","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة ","pink":"وردي ","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي ","darkorchid":"أرجواني داكن","turquoise":"تركواز ","chocolate":"بني غامق","springgreen":"أخضر ربيعي ","moccasin":"نحاسي أحمر ","navy":"أزرق داكن ","lemonchiffon":"أصفر شفاف ","teal":"بترولي ","floralwhite":"أبيض زهري ","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب ","purple":"ارجواني ","gainsboro":"رمادي مائل للأزرق فاتح ","plum":"أرجواني داكن ","red":"أحمر ","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات ","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر ","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب ","mediumpurple":"قرمزي متوسط ","saddlebrown":"بني فاتح ","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب ","whitesmoke":"دخان أبيض ","wheat":"أخضر قمحي ","violet":"بنفسجي ","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي ","mediumblue":"أزرق متوسط ","skyblue":"أزرق سماوي ","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي ","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي ","palegoldenrod":"أصفر ذهبي شاحب ","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد) ","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر ","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح ","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني ","tomato":"أحمر مائل للأصفر ","lightpink":"وردي فاتح","limegreen":"أخضر ليموني ","indianred":"أحمر هندي","papayawhip":"خوخي فاتح ","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط ","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق ","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب ","azure":"أزرق سماوي ","peachpuff":"خوخي مائل للأصفر ","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر "})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/cs/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/cs/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/cs/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/da/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/da/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/da/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/de/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/de/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/de/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/el/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/el/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/el/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/es/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/es/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/es/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/fi/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/fi/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/fi/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/fr/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/fr/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/fr/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'oeuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/he/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/he/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/he/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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":"ירוק צהוב"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/hu/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/hu/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/hu/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/it/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/it/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/it/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"blu acciao chiaro","orangered":"vermiglio","midnightblue":"blu melanzana scuro","cadetblue":"verde acqua","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"bianco antico","mediumspringgreen":"verde primavera medio","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"giallo verde","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"grigio 25%","dimgrey":"grigio 80%","orange":"arancione","white":"bianco","navajowhite":"pesca chiaro","royalblue":"blu reale","deeppink":"ciclamino","lime":"verde fluorescente","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"ciano scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde prato","lightyellow":"giallo chiaro","tan":"grigio bruno","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"kaki scuro","green":"verde","deepskyblue":"azzurro cielo scuro","aqua":"acqua","sienna":"cuoio","mintcream":"bianco nuvola","rosybrown":"marrone rosato","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde mare chiaro","cyan":"ciano","olivedrab":"marrone oliva","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde mare medio","maroon":"scarlatto","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"vinaccia","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"marrone sabbia","pink":"rosa","firebrick":"rosso mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde primavera","moccasin":"mocassino","navy":"blu notte","lemonchiffon":"caffelatte chiaro","teal":"verde turchese","floralwhite":"bianco giglio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"porpora","gainsboro":"grigio 10%","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde foresta","darkgreen":"verde scuro","honeydew":"bianco germoglio","darkseagreen":"verde mare scuro","lightcoral":"rosa corallo","palevioletred":"vinaccia chiaro","mediumpurple":"porpora medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"sabbia","violet":"viola","lightskyblue":"azzurro cielo chiaro","goldenrod":"ocra gialla","mediumblue":"blu medio","skyblue":"azzurro cielo","crimson":"cremisi","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"marrone terra bruciata","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo tenue","blanchedalmond":"mandorla chiaro","aliceblue":"blu alice","bisque":"incarnato","slategray":"grigio ardesia","palegoldenrod":"giallo zolfo chiaro","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"tabacco","dodgerblue":"blu d'oriente","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"blu violetto","orchid":"orchidea","dimgray":"grigio 80%","beige":"beige","fuchsia":"fucsia","lavenderblush":"bianco rosato","hotpink":"rosa acceso","steelblue":"blu acciao","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"cipria","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde mare","darkslateblue":"blu ardesia scuro","khaki":"kaki","lightblue":"azzurro","palegreen":"verde pallido","azure":"azzurro ghiaccio","peachpuff":"pesca","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/ja/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/ja/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/ja/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"ライト・スチール・ブルー","orangered":"オレンジ・レッド","midnightblue":"ミッドナイト・ブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレート・グレイ","coral":"珊瑚","darkturquoise":"ダーク・ターコイズ","antiquewhite":"アンティーク・ホワイト","mediumspringgreen":"ミディアム・スプリング・グリーン","salmon":"サーモン","darkgrey":"ダーク・グレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティ・ローズ","lightsalmon":"ライト・サーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホ・ホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールド・レイス","chartreuse":"淡黄緑","darkcyan":"ダーク・シアン・ブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローン・グリーン","lightyellow":"ライト・イエロー","tan":"茶褐色","darkviolet":"ダーク・バイオレット","lightslategrey":"ライト・スレート・グレイ","grey":"グレイ","darkkhaki":"ダーク・カーキー","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミント・クリーム","rosybrown":"ロージー・ブラウン","mediumslateblue":"ミディアム・スレート・ブルー","magenta":"赤紫","lightseagreen":"ライト・シー・グリーン","cyan":"シアン・ブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダーク・ゴールデン・ロッド","slateblue":"スレート・ブルー","mediumaquamarine":"ミディアム・アクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアム・シー・グリーン","maroon":"えび茶","darkslategray":"ダーク・スレート・グレイ","mediumturquoise":"ミディアム・ターコイズ","ghostwhite":"ゴースト・ホワイト","darkblue":"ダーク・ブルー","mediumvioletred":"ミディアム・バイオレット・レッド","brown":"茶","lightgray":"ライト・グレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダーク・オーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリング・グリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモン・シフォン","teal":"ティール","floralwhite":"フローラル・ホワイト","cornflowerblue":"コーンフラワー・ブルー","paleturquoise":"ペイル・ターコイズ","purple":"紫","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレスト・グリーン","darkgreen":"ダーク・グリーン","honeydew":"ハニーデュー","darkseagreen":"ダーク・シー・グリーン","lightcoral":"ライト・コーラル","palevioletred":"ペイル・バイオレット・レッド","mediumpurple":"ミディアム・パープル","saddlebrown":"サドル・ブラウン","darkmagenta":"ダーク・マジェンタ","thistle":"シスル","whitesmoke":"ホワイト・スモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライト・スカイ・ブルー","goldenrod":"ゴールデン・ロッド","mediumblue":"ミディアム・ブルー","skyblue":"スカイ・ブルー","crimson":"深紅","darksalmon":"ダーク・サーモン","darkred":"ダーク・レッド","darkslategrey":"ダーク・スレート・グレイ","peru":"ペルー","lightgrey":"ライト・グレイ","lightgoldenrodyellow":"ライト・ゴールデン・ロッド・イエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリス・ブルー","bisque":"ビスク","slategray":"スレート・グレイ","palegoldenrod":"ペイル・ゴールデン・ロッド","darkorange":"ダーク・オレンジ","aquamarine":"碧緑","lightgreen":"ライト・グリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャー・ブルー","darkgray":"ダーク・グレイ","lightcyan":"ライト・シアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダー・ブラッシ","hotpink":"ホット・ピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライト・ピンク","limegreen":"ライム・グリーン","indianred":"インディアン・レッド","papayawhip":"パパイア・ホイップ","lightslategray":"ライト・スレート・グレイ","gray":"グレイ","mediumorchid":"ミディアム・オーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シー・グリーン","darkslateblue":"ダーク・スレート・ブルー","khaki":"カーキー","lightblue":"ライト・ブルー","palegreen":"ペイル・グリーン","azure":"薄い空色","peachpuff":"ピーチ・パフ","darkolivegreen":"ダーク・オリーブ・グリーン","yellowgreen":"黄緑"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/ko/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/ko/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/ko/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"론 그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/nb/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/nb/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/nb/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"lys stålblå","orangered":"rødoransje","midnightblue":"midnattsblå","cadetblue":"mørk grønnblå","seashell":"skjellhvit","slategrey":"skifergrå","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vårgrønn","salmon":"lakserosa","darkgrey":"mørk grå","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrå","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblå","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblå","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblå","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blå","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grå","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vårgrønn","moccasin":"lys gulbrun","navy":"marineblå","lemonchiffon":"ferskenfarget","teal":"mørk grønnblå","floralwhite":"blomsterhvit","cornflowerblue":"kornblå","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grå","plum":"plommefarget","red":"rød","blue":"blå","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grålilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellomblå","skyblue":"himmelblå","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrå","peru":"lys nøttebrun","lightgrey":"lys grå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blåhvit","bisque":"gulrosa","slategray":"skifergrå","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblå","darkgray":"mørk grå","lightcyan":"lys cyan","powderblue":"lys grønnblå","blueviolet":"blåfiolett","orchid":"orkide","dimgray":"mørk mørkegrå","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stålblå","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lys blå","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/nl/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/nl/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/nl/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/pl/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/pl/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/pl/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"jasny stalowoniebieski","orangered":"pomarańczowoczerwony","midnightblue":"ciemnogranatowy","cadetblue":"niebieskoszary","seashell":"muszla","slategrey":"łupkowy szary","coral":"koralowy","darkturquoise":"ciemnoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"bladoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przytłumiony szary","orange":"pomarańczowy","white":"biały","navajowhite":"piaskowy","royalblue":"błękit królewski","deeppink":"głęboki różowy","lime":"limetkowy","oldlace":"bladopomarańczowy","chartreuse":"jaskrawozielony","darkcyan":"ciemny cyjan","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"kawowy","darkviolet":"ciemnofioletowy","lightslategrey":"jasny łupkowy szary","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"wodny","sienna":"siena","mintcream":"jasnomiętowy","rosybrown":"różowobrązowy","mediumslateblue":"średni łupkowy niebieski","magenta":"magenta","lightseagreen":"jasna morska zieleń","cyan":"cyjan","olivedrab":"oliwkowa zieleń","darkgoldenrod":"ciemnogliniany","slateblue":"łupkowy niebieski","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia morska zieleń","maroon":"bordowy","darkslategray":"ciemny łupkowy szary","mediumturquoise":"średni turkusowy","ghostwhite":"bladobiały","darkblue":"ciemnoniebieski","mediumvioletred":"średni fioletowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowy brąz","pink":"różowy","firebrick":"ceglasty","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"cytrynowy","teal":"cyrankowy","floralwhite":"kwiatowa biel","cornflowerblue":"chabrowy","paleturquoise":"bladoturkusowy","purple":"purpurowy","gainsboro":"bladoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"melon","darkseagreen":"ciemna morska zieleń","lightcoral":"jasnokoralowy","palevioletred":"blady fioletowoczerwony","mediumpurple":"średnia purpura","saddlebrown":"skórzany brązowy","darkmagenta":"ciemna magenta","thistle":"bladofioletowy","whitesmoke":"przydymiony biały","wheat":"pszeniczny","violet":"fioletowy","lightskyblue":"jasny błękit nieba","goldenrod":"gliniany","mediumblue":"średni niebieski","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny łupkowy szary","peru":"jasnobrązowy","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasnogliniana żółć","blanchedalmond":"migdałowy","aliceblue":"bladoniebieski","bisque":"biszkoptowy","slategray":"łupkowy szary","palegoldenrod":"bladogliniany","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"kolor drewna","dodgerblue":"błękit Dodgers","darkgray":"ciemnoszary","lightcyan":"jasny cyjan","powderblue":"pudrowy niebieski","blueviolet":"niebieskofioletowy","orchid":"orchidea","dimgray":"przytłumiony szary","beige":"beżowy","fuchsia":"fuksja","lavenderblush":"lawendoworóżowy","hotpink":"intensywny różowy","steelblue":"stalowy niebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"limetkowozielony","indianred":"kasztanowy","papayawhip":"papaja","lightslategray":"jasny łupkowy szary","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"kukurydziany","black":"czarny","seagreen":"morska zieleń","darkslateblue":"ciemny łupkowy niebieski","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazur","peachpuff":"brzoskwiniowy","darkolivegreen":"ciemnooliwkowy","yellowgreen":"żółtozielony"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/pt/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/pt/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/pt/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/pt-pt/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/pt-pt/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/pt-pt/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento escuro","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento escuro","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/ru/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/ru/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/ru/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/sv/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/sv/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/sv/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"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"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/tr/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/tr/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/tr/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/zh/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/zh/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/zh/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"浅钢蓝色","orangered":"橙红色","midnightblue":"深蓝色","cadetblue":"灰蓝色","seashell":"海贝色","slategrey":"灰石色","coral":"珊瑚色","darkturquoise":"深粉蓝","antiquewhite":"古董白","mediumspringgreen":"间春绿色","salmon":"橙红","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"浅玫瑰色","lightsalmon":"淡橙色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"纳瓦白","royalblue":"品蓝","deeppink":"深粉红色","lime":"淡黄绿色","oldlace":"老白色","chartreuse":"黄绿色","darkcyan":"深青绿","yellow":"黄色","linen":"亚麻色","olive":"橄榄绿","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"棕褐色","darkviolet":"深紫色","lightslategrey":"浅青灰","grey":"灰色","darkkhaki":"深卡其色","green":"绿色","deepskyblue":"深天蓝色","aqua":"浅绿色","sienna":"赭色","mintcream":"薄荷色","rosybrown":"褐玫瑰红","mediumslateblue":"间暗蓝色","magenta":"洋红色","lightseagreen":"浅海藻绿","cyan":"青蓝色","olivedrab":"草绿色","darkgoldenrod":"深金黄","slateblue":"石蓝色","mediumaquamarine":"间绿色","lavender":"淡紫色","mediumseagreen":"间海蓝色","maroon":"栗色","darkslategray":"深青灰","mediumturquoise":"间绿宝石色","ghostwhite":"苍白","darkblue":"深蓝","mediumvioletred":"间紫罗兰色","brown":"棕色","lightgray":"浅灰色","sandybrown":"沙褐色","pink":"粉红色","firebrick":"砖红","indigo":"靛青","snow":"雪白色","darkorchid":"深紫色","turquoise":"绿宝石色","chocolate":"巧克力色","springgreen":"春绿色","moccasin":"鹿皮色","navy":"深蓝色","lemonchiffon":"柠檬绸色","teal":"水鸭色","floralwhite":"花白色","cornflowerblue":"浅蓝色","paleturquoise":"苍绿色","purple":"紫色","gainsboro":"淡灰色","plum":"杨李色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜汁色","darkseagreen":"深海藻绿","lightcoral":"浅珊瑚色","palevioletred":"苍紫罗兰色","mediumpurple":"间紫色","saddlebrown":"重褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"浅黄色","violet":"紫色","lightskyblue":"浅天蓝色","goldenrod":"金麒麟色","mediumblue":"间蓝色","skyblue":"天蓝色","crimson":"深红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深青灰","peru":"秘鲁色","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"白杏色","aliceblue":"爱丽丝蓝","bisque":"桔黄色","slategray":"灰石色","palegoldenrod":"淡金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"实木色","dodgerblue":"闪蓝色","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"铁蓝","blueviolet":"紫罗兰色","orchid":"紫色","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红","hotpink":"深粉红","steelblue":"钢蓝色","tomato":"西红柿色","lightpink":"浅粉红色","limegreen":"橙绿色","indianred":"印度红","papayawhip":"木瓜色","lightslategray":"浅青灰","gray":"灰色","mediumorchid":"间紫色","cornsilk":"米绸色","black":"黑色","seagreen":"海绿色","darkslateblue":"深青蓝","khaki":"卡其色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"天蓝色","peachpuff":"桃色","darkolivegreen":"深橄榄绿","yellowgreen":"黄绿色"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/nls/zh-tw/colors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/nls/zh-tw/colors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/nls/zh-tw/colors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojo/number.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/number.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/number.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,551 @@
+if(!dojo._hasResource["dojo.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.number"] = true;
+dojo.provide("dojo.number");
+
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojo.cldr", "number", null, "zh-cn,zh,ko-kr,pt,en-us,en-gb,de,ja,ja-jp,en,ROOT,en-au,fr,es,ko,zh-tw,it,es-es,de-de");
+dojo.require("dojo.string");
+dojo.require("dojo.regexp");
+
+
+/*=====
+dojo.number = {
+	// summary: localized formatting and parsing routines for Number
+}
+
+dojo.number.__FormatOptions = function(){
+	//	pattern: String?
+	//		override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+	//		with this string
+	//	type: String?
+	//		choose a format type based on the locale from the following:
+	//		decimal, scientific, percent, currency. decimal by default.
+	//	places: Number?
+	//		fixed number of decimal places to show.  This overrides any
+	//		information in the provided pattern.
+	//	round: Number?
+	//		5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
+	//		means don't round.
+	//	currency: String?
+	//		an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+	//	symbol: String?
+	//		localized currency symbol
+	//	locale: String?
+	//		override the locale used to determine formatting rules
+	this.pattern = pattern;
+	this.type = type;
+	this.places = places;
+	this.round = round;
+	this.currency = currency;
+	this.symbol = symbol;
+	this.locale = locale;
+}
+=====*/
+
+dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
+	// summary:
+	//		Format a Number as a String, using locale-specific settings
+	// description:
+	//		Create a string from a Number using a known localized pattern.
+	//		Formatting patterns appropriate to the locale are chosen from the
+	//		[CLDR](http://unicode.org/cldr) as well as the appropriate symbols and
+	//		delimiters.  See <http://www.unicode.org/reports/tr35/#Number_Elements>
+	// value:
+	//		the number to be formatted.  If not a valid JavaScript number,
+	//		return null.
+
+	options = dojo.mixin({}, options || {});
+	var locale = dojo.i18n.normalizeLocale(options.locale);
+	var bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
+	options.customs = bundle;
+	var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
+	if(isNaN(value)){ return null; } // null
+	return dojo.number._applyPattern(value, pattern, options); // String
+};
+
+//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough
+dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough
+
+dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){
+	// summary:
+	//		Apply pattern to format value as a string using options. Gives no
+	//		consideration to local customs.
+	// value:
+	//		the number to be formatted.
+	// pattern:
+	//		a pattern string as described by
+	//		[unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+	// options: dojo.number.__FormatOptions?
+	//		_applyPattern is usually called via `dojo.number.format()` which
+	//		populates an extra property in the options parameter, "customs".
+	//		The customs object specifies group and decimal parameters if set.
+
+	//TODO: support escapes
+	options = options || {};
+	var group = options.customs.group;
+	var decimal = options.customs.decimal;
+
+	var patternList = pattern.split(';');
+	var positivePattern = patternList[0];
+	pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern);
+
+	//TODO: only test against unescaped
+	if(pattern.indexOf('%') != -1){
+		value *= 100;
+	}else if(pattern.indexOf('\u2030') != -1){
+		value *= 1000; // per mille
+	}else if(pattern.indexOf('\u00a4') != -1){
+		group = options.customs.currencyGroup || group;//mixins instead?
+		decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead?
+		pattern = pattern.replace(/\u00a4{1,3}/, function(match){
+			var prop = ["symbol", "currency", "displayName"][match.length-1];
+			return options[prop] || options.currency || "";
+		});
+	}else if(pattern.indexOf('E') != -1){
+		throw new Error("exponential notation not supported");
+	}
+	
+	//TODO: support @ sig figs?
+	var numberPatternRE = dojo.number._numberPatternRE;
+	var numberPattern = positivePattern.match(numberPatternRE);
+	if(!numberPattern){
+		throw new Error("unable to find a number expression in pattern: "+pattern);
+	}
+	return pattern.replace(numberPatternRE,
+		dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places}));
+}
+
+dojo.number.round = function(/*Number*/value, /*Number*/places, /*Number?*/multiple){
+	//	summary:
+	//		Rounds the number at the given number of places
+	//	value:
+	//		the number to round
+	//	places:
+	//		the number of decimal places where rounding takes place
+	//	multiple:
+	//		rounds next place to nearest multiple
+
+	var pieces = String(value).split(".");
+	var length = (pieces[1] && pieces[1].length) || 0;
+	if(length > places){
+		var factor = Math.pow(10, places);
+		if(multiple > 0){factor *= 10/multiple;places++;} //FIXME
+		value = Math.round(value * factor)/factor;
+
+		// truncate to remove any residual floating point values
+		pieces = String(value).split(".");
+		length = (pieces[1] && pieces[1].length) || 0;
+		if(length > places){
+			pieces[1] = pieces[1].substr(0, places);
+			value = Number(pieces.join("."));
+		}
+	}
+	return value; //Number
+}
+
+/*=====
+dojo.number.__FormatAbsoluteOptions = function(){
+	//	decimal: String?
+	//		the decimal separator
+	//	group: String?
+	//		the group separator
+	//	places: Integer?
+	//		number of decimal places
+	//	round: Number?
+	//		5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
+	//		means don't round.
+	this.decimal = decimal;
+	this.group = group;
+	this.places = places;
+	this.round = round;
+}
+=====*/
+
+dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
+	// summary: 
+	//		Apply numeric pattern to absolute value using options. Gives no
+	//		consideration to local customs.
+	// value:
+	//		the number to be formatted, ignores sign
+	// pattern:
+	//		the number portion of a pattern (e.g. `#,##0.00`)
+	options = options || {};
+	if(options.places === true){options.places=0;}
+	if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit
+
+	var patternParts = pattern.split(".");
+	var maxPlaces = (options.places >= 0) ? options.places : (patternParts[1] && patternParts[1].length) || 0;
+	if(!(options.round < 0)){
+		value = dojo.number.round(value, maxPlaces, options.round);
+	}
+
+	var valueParts = String(Math.abs(value)).split(".");
+	var fractional = valueParts[1] || "";
+	if(options.places){
+		valueParts[1] = dojo.string.pad(fractional.substr(0, options.places), options.places, '0', true);
+	}else if(patternParts[1] && options.places !== 0){
+		// Pad fractional with trailing zeros
+		var pad = patternParts[1].lastIndexOf("0") + 1;
+		if(pad > fractional.length){
+			valueParts[1] = dojo.string.pad(fractional, pad, '0', true);
+		}
+
+		// Truncate fractional
+		var places = patternParts[1].length;
+		if(places < fractional.length){
+			valueParts[1] = fractional.substr(0, places);
+		}
+	}else{
+		if(valueParts[1]){ valueParts.pop(); }
+	}
+
+	// Pad whole with leading zeros
+	var patternDigits = patternParts[0].replace(',', '');
+	pad = patternDigits.indexOf("0");
+	if(pad != -1){
+		pad = patternDigits.length - pad;
+		if(pad > valueParts[0].length){
+			valueParts[0] = dojo.string.pad(valueParts[0], pad);
+		}
+
+		// Truncate whole
+		if(patternDigits.indexOf("#") == -1){
+			valueParts[0] = valueParts[0].substr(valueParts[0].length - pad);
+		}
+	}
+
+	// Add group separators
+	var index = patternParts[0].lastIndexOf(',');
+	var groupSize, groupSize2;
+	if(index != -1){
+		groupSize = patternParts[0].length - index - 1;
+		var remainder = patternParts[0].substr(0, index);
+		index = remainder.lastIndexOf(',');
+		if(index != -1){
+			groupSize2 = remainder.length - index - 1;
+		}
+	}
+	var pieces = [];
+	for(var whole = valueParts[0]; whole;){
+		var off = whole.length - groupSize;
+		pieces.push((off > 0) ? whole.substr(off) : whole);
+		whole = (off > 0) ? whole.slice(0, off) : "";
+		if(groupSize2){
+			groupSize = groupSize2;
+			delete groupSize2;
+		}
+	}
+	valueParts[0] = pieces.reverse().join(options.group || ",");
+
+	return valueParts.join(options.decimal || ".");
+};
+
+/*=====
+dojo.number.__RegexpOptions = function(){
+	//	pattern: String?
+	//		override pattern with this string.  Default is provided based on
+	//		locale.
+	//	type: String?
+	//		choose a format type based on the locale from the following:
+	//		decimal, scientific, percent, currency. decimal by default.
+	//	locale: String?
+	//		override the locale used to determine formatting rules
+	//	strict: Boolean?
+	//		strict parsing, false by default
+	//	places: Number|String?
+	//		number of decimal places to accept: Infinity, a positive number, or
+	//		a range "n,m".  By default, defined by pattern.
+	this.pattern = pattern;
+	this.type = type;
+	this.locale = locale;
+	this.strict = strict;
+	this.places = places;
+}
+=====*/
+dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
+	//	summary:
+	//		Builds the regular needed to parse a number
+	//	description:
+	//		Returns regular expression with positive and negative match, group
+	//		and decimal separators
+	return dojo.number._parseInfo(options).regexp; // String
+}
+
+dojo.number._parseInfo = function(/*Object?*/options){
+	options = options || {};
+	var locale = dojo.i18n.normalizeLocale(options.locale);
+	var bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
+	var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
+//TODO: memoize?
+	var group = bundle.group;
+	var decimal = bundle.decimal;
+	var factor = 1;
+
+	if(pattern.indexOf('%') != -1){
+		factor /= 100;
+	}else if(pattern.indexOf('\u2030') != -1){
+		factor /= 1000; // per mille
+	}else{
+		var isCurrency = pattern.indexOf('\u00a4') != -1;
+		if(isCurrency){
+			group = bundle.currencyGroup || group;
+			decimal = bundle.currencyDecimal || decimal;
+		}
+	}
+
+	//TODO: handle quoted escapes
+	var patternList = pattern.split(';');
+	if(patternList.length == 1){
+		patternList.push("-" + patternList[0]);
+	}
+
+	var re = dojo.regexp.buildGroupRE(patternList, function(pattern){
+		pattern = "(?:"+dojo.regexp.escapeString(pattern, '.')+")";
+		return pattern.replace(dojo.number._numberPatternRE, function(format){
+			var flags = {
+				signed: false,
+				separator: options.strict ? group : [group,""],
+				fractional: options.fractional,
+				decimal: decimal,
+				exponent: false};
+			var parts = format.split('.');
+			var places = options.places;
+			if(parts.length == 1 || places === 0){flags.fractional = false;}
+			else{
+				if(places === undefined){ places = parts[1].lastIndexOf('0')+1; }
+				if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified
+				if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; }
+				flags.places = places;
+			}
+			var groups = parts[0].split(',');
+			if(groups.length>1){
+				flags.groupSize = groups.pop().length;
+				if(groups.length>1){
+					flags.groupSize2 = groups.pop().length;
+				}
+			}
+			return "("+dojo.number._realNumberRegexp(flags)+")";
+		});
+	}, true);
+
+	if(isCurrency){
+		// substitute the currency symbol for the placeholder in the pattern
+		re = re.replace(/(\s*)(\u00a4{1,3})(\s*)/g, function(match, before, target, after){
+			var prop = ["symbol", "currency", "displayName"][target.length-1];
+			var symbol = dojo.regexp.escapeString(options[prop] || options.currency || "");
+			before = before ? "\\s" : "";
+			after = after ? "\\s" : "";
+			if(!options.strict){
+				if(before){before += "*";}
+				if(after){after += "*";}
+				return "(?:"+before+symbol+after+")?";
+			}
+			return before+symbol+after;
+		});
+	}
+
+//TODO: substitute localized sign/percent/permille/etc.?
+
+	// normalize whitespace and return
+	return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
+}
+
+/*=====
+dojo.number.__ParseOptions = function(){
+	//	pattern: String
+	//		override pattern with this string.  Default is provided based on
+	//		locale.
+	//	type: String?
+	//		choose a format type based on the locale from the following:
+	//		decimal, scientific, percent, currency. decimal by default.
+	//	locale: String
+	//		override the locale used to determine formatting rules
+	//	strict: Boolean?
+	//		strict parsing, false by default
+	//	currency: Object
+	//		object with currency information
+	this.pattern = pattern;
+	this.type = type;
+	this.locale = locale;
+	this.strict = strict;
+	this.currency = currency;
+}
+=====*/
+dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){
+	// summary:
+	//		Convert a properly formatted string to a primitive Number, using
+	//		locale-specific settings.
+	// description:
+	//		Create a Number from a string using a known localized pattern.
+	//		Formatting patterns are chosen appropriate to the locale
+	//		and follow the syntax described by
+	//		[unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+	// expression:
+	//		A string representation of a Number
+	var info = dojo.number._parseInfo(options);
+	var results = (new RegExp("^"+info.regexp+"$")).exec(expression);
+	if(!results){
+		return NaN; //NaN
+	}
+	var absoluteMatch = results[1]; // match for the positive expression
+	if(!results[1]){
+		if(!results[2]){
+			return NaN; //NaN
+		}
+		// matched the negative pattern
+		absoluteMatch =results[2];
+		info.factor *= -1;
+	}
+
+	// Transform it to something Javascript can parse as a number.  Normalize
+	// decimal point and strip out group separators or alternate forms of whitespace
+	absoluteMatch = absoluteMatch.
+		replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), "").
+		replace(info.decimal, ".");
+	// Adjust for negative sign, percent, etc. as necessary
+	return Number(absoluteMatch) * info.factor; //Number
+};
+
+/*=====
+dojo.number.__RealNumberRegexpFlags = function(){
+	//	places: Number?
+	//		The integer number of decimal places or a range given as "n,m".  If
+	//		not given, the decimal part is optional and the number of places is
+	//		unlimited.
+	//	decimal: String?
+	//		A string for the character used as the decimal point.  Default
+	//		is ".".
+	//	fractional: Boolean|Array?
+	//		Whether decimal places are allowed.  Can be true, false, or [true,
+	//		false].  Default is [true, false]
+	//	exponent: Boolean|Array?
+	//		Express in exponential notation.  Can be true, false, or [true,
+	//		false]. Default is [true, false], (i.e. will match if the
+	//		exponential part is present are not).
+	//	eSigned: Boolean|Array?
+	//		The leading plus-or-minus sign on the exponent.  Can be true,
+	//		false, or [true, false].  Default is [true, false], (i.e. will
+	//		match if it is signed or unsigned).  flags in regexp.integer can be
+	//		applied.
+	this.places = places;
+	this.decimal = decimal;
+	this.fractional = fractional;
+	this.exponent = exponent;
+	this.eSigned = eSigned;
+}
+=====*/
+
+dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){
+	// summary:
+	//		Builds a regular expression to match a real number in exponential
+	//		notation
+
+	// assign default values to missing paramters
+	flags = flags || {};
+	//TODO: use mixin instead?
+	if(!("places" in flags)){ flags.places = Infinity; }
+	if(typeof flags.decimal != "string"){ flags.decimal = "."; }
+	if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; }
+	if(!("exponent" in flags)){ flags.exponent = [true, false]; }
+	if(!("eSigned" in flags)){ flags.eSigned = [true, false]; }
+
+	// integer RE
+	var integerRE = dojo.number._integerRegexp(flags);
+
+	// decimal RE
+	var decimalRE = dojo.regexp.buildGroupRE(flags.fractional,
+		function(q){
+			var re = "";
+			if(q && (flags.places!==0)){
+				re = "\\" + flags.decimal;
+				if(flags.places == Infinity){ 
+					re = "(?:" + re + "\\d+)?"; 
+				}else{
+					re += "\\d{" + flags.places + "}"; 
+				}
+			}
+			return re;
+		},
+		true
+	);
+
+	// exponent RE
+	var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
+		function(q){ 
+			if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
+			return ""; 
+		}
+	);
+
+	// real number RE
+	var realRE = integerRE + decimalRE;
+	// allow for decimals without integers, e.g. .25
+	if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";}
+	return realRE + exponentRE; // String
+};
+
+/*=====
+dojo.number.__IntegerRegexpFlags = function(){
+	//	signed: Boolean?
+	//		The leading plus-or-minus sign. Can be true, false, or `[true,false]`.
+	//		Default is `[true, false]`, (i.e. will match if it is signed
+	//		or unsigned).
+	//	separator: String?
+	//		The character used as the thousands separator. Default is no
+	//		separator. For more than one symbol use an array, e.g. `[",", ""]`,
+	//		makes ',' optional.
+	//	groupSize: Number?
+	//		group size between separators
+	//	groupSize2: Number?
+	//		second grouping, where separators 2..n have a different interval than the first separator (for India)
+	this.signed = signed;
+	this.separator = separator;
+	this.groupSize = groupSize;
+	this.groupSize2 = groupSize2;
+}
+=====*/
+
+dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
+	// summary: 
+	//		Builds a regular expression that matches an integer
+
+	// assign default values to missing paramters
+	flags = flags || {};
+	if(!("signed" in flags)){ flags.signed = [true, false]; }
+	if(!("separator" in flags)){
+		flags.separator = "";
+	}else if(!("groupSize" in flags)){
+		flags.groupSize = 3;
+	}
+	// build sign RE
+	var signRE = dojo.regexp.buildGroupRE(flags.signed,
+		function(q) { return q ? "[-+]" : ""; },
+		true
+	);
+
+	// number RE
+	var numberRE = dojo.regexp.buildGroupRE(flags.separator,
+		function(sep){
+			if(!sep){
+				return "(?:0|[1-9]\\d*)";
+			}
+
+			sep = dojo.regexp.escapeString(sep);
+			if(sep == " "){ sep = "\\s"; }
+			else if(sep == "\xa0"){ sep = "\\s\\xa0"; }
+
+			var grp = flags.groupSize, grp2 = flags.groupSize2;
+			if(grp2){
+				var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})";
+				return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE;
+			}
+			return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)";
+		},
+		true
+	);
+
+	// integer RE
+	return signRE + numberRE; // String
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/parser.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/parser.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/parser.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,277 @@
+if(!dojo._hasResource["dojo.parser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.parser"] = true;
+dojo.provide("dojo.parser");
+dojo.require("dojo.date.stamp");
+
+dojo.parser = new function(){
+	// summary: The Dom/Widget parsing package
+
+	var d = dojo;
+	var dtName = d._scopeName + "Type";
+	var qry = "[" + dtName + "]";
+
+	function val2type(/*Object*/ value){
+		// summary:
+		//		Returns name of type of given value.
+
+		if(d.isString(value)){ return "string"; }
+		if(typeof value == "number"){ return "number"; }
+		if(typeof value == "boolean"){ return "boolean"; }
+		if(d.isFunction(value)){ return "function"; }
+		if(d.isArray(value)){ return "array"; } // typeof [] == "object"
+		if(value instanceof Date) { return "date"; } // assume timestamp
+		if(value instanceof d._Url){ return "url"; }
+		return "object";
+	}
+
+	function str2obj(/*String*/ value, /*String*/ type){
+		// summary:
+		//		Convert given string value to given type
+		switch(type){
+			case "string":
+				return value;
+			case "number":
+				return value.length ? Number(value) : NaN;
+			case "boolean":
+				// for checked/disabled value might be "" or "checked".  interpret as true.
+				return typeof value == "boolean" ? value : !(value.toLowerCase()=="false");
+			case "function":
+				if(d.isFunction(value)){
+					// IE gives us a function, even when we say something like onClick="foo"
+					// (in which case it gives us an invalid function "function(){ foo }"). 
+					//  Therefore, convert to string
+					value=value.toString();
+					value=d.trim(value.substring(value.indexOf('{')+1, value.length-1));
+				}
+				try{
+					if(value.search(/[^\w\.]+/i) != -1){
+						// TODO: "this" here won't work
+						value = d.parser._nameAnonFunc(new Function(value), this);
+					}
+					return d.getObject(value, false);
+				}catch(e){ return new Function(); }
+			case "array":
+				return value.split(/\s*,\s*/);
+			case "date":
+				switch(value){
+					case "": return new Date("");	// the NaN of dates
+					case "now": return new Date();	// current date
+					default: return d.date.stamp.fromISOString(value);
+				}
+			case "url":
+				return d.baseUrl + value;
+			default:
+				return d.fromJson(value);
+		}
+	}
+
+	var instanceClasses = {
+		// map from fully qualified name (like "dijit.Button") to structure like
+		// { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
+	};
+	
+	function getClassInfo(/*String*/ className){
+		// className:
+		//		fully qualified name (like "dijit.Button")
+		// returns:
+		//		structure like
+		//			{ 
+		//				cls: dijit.Button, 
+		//				params: { label: "string", disabled: "boolean"}
+		//			}
+
+		if(!instanceClasses[className]){
+			// get pointer to widget class
+			var cls = d.getObject(className);
+			if(!d.isFunction(cls)){
+				throw new Error("Could not load class '" + className +
+					"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");
+			}
+			var proto = cls.prototype;
+	
+			// get table of parameter names & types
+			var params={};
+			for(var name in proto){
+				if(name.charAt(0)=="_"){ continue; } 	// skip internal properties
+				var defVal = proto[name];
+				params[name]=val2type(defVal);
+			}
+
+			instanceClasses[className] = { cls: cls, params: params };
+		}
+		return instanceClasses[className];
+	}
+
+	this._functionFromScript = function(script){
+		var preamble = "";
+		var suffix = "";
+		var argsStr = script.getAttribute("args");
+		if(argsStr){
+			d.forEach(argsStr.split(/\s*,\s*/), function(part, idx){
+				preamble += "var "+part+" = arguments["+idx+"]; ";
+			});
+		}
+		var withStr = script.getAttribute("with");
+		if(withStr && withStr.length){
+			d.forEach(withStr.split(/\s*,\s*/), function(part){
+				preamble += "with("+part+"){";
+				suffix += "}";
+			});
+		}
+		return new Function(preamble+script.innerHTML+suffix);
+	}
+
+	this.instantiate = function(/* Array */nodes){
+		// summary:
+		//		Takes array of nodes, and turns them into class instances and
+		//		potentially calls a layout method to allow them to connect with
+		//		any children		
+		var thelist = [];
+		d.forEach(nodes, function(node){
+			if(!node){ return; }
+			var type = node.getAttribute(dtName);
+			if((!type)||(!type.length)){ return; }
+			var clsInfo = getClassInfo(type);
+			var clazz = clsInfo.cls;
+			var ps = clazz._noScript||clazz.prototype._noScript;
+
+			// read parameters (ie, attributes).
+			// clsInfo.params lists expected params like {"checked": "boolean", "n": "number"}
+			var params = {};
+			var attributes = node.attributes;
+			for(var name in clsInfo.params){
+				var item = attributes.getNamedItem(name);
+				if(!item || (!item.specified && (!dojo.isIE || name.toLowerCase()!="value"))){ continue; }
+				var value = item.value;
+				// Deal with IE quirks for 'class' and 'style'
+				switch(name){
+				case "class":
+					value = node.className;
+					break;
+				case "style":
+					value = node.style && node.style.cssText; // FIXME: Opera?
+				}
+				var _type = clsInfo.params[name];
+				params[name] = str2obj(value, _type);
+			}
+
+			// Process <script type="dojo/*"> script tags
+			// <script type="dojo/method" event="foo"> tags are added to params, and passed to
+			// the widget on instantiation.
+			// <script type="dojo/method"> tags (with no event) are executed after instantiation
+			// <script type="dojo/connect" event="foo"> tags are dojo.connected after instantiation
+			// note: dojo/* script tags cannot exist in self closing widgets, like <input />
+			if(!ps){
+				var connects = [],	// functions to connect after instantiation
+					calls = [];		// functions to call after instantiation
+
+				d.query("> script[type^='dojo/']", node).orphan().forEach(function(script){
+					var event = script.getAttribute("event"),
+						type = script.getAttribute("type"),
+						nf = d.parser._functionFromScript(script);
+					if(event){
+						if(type == "dojo/connect"){
+							connects.push({event: event, func: nf});
+						}else{
+							params[event] = nf;
+						}
+					}else{
+						calls.push(nf);
+					}
+				});
+			}
+
+			var markupFactory = clazz["markupFactory"];
+			if(!markupFactory && clazz["prototype"]){
+				markupFactory = clazz.prototype["markupFactory"];
+			}
+			// create the instance
+			var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node);
+			thelist.push(instance);
+
+			// map it to the JS namespace if that makes sense
+			var jsname = node.getAttribute("jsId");
+			if(jsname){
+				d.setObject(jsname, instance);
+			}
+
+			// process connections and startup functions
+			if(!ps){
+				d.forEach(connects, function(connect){
+					d.connect(instance, connect.event, null, connect.func);
+				});
+				d.forEach(calls, function(func){
+					func.call(instance);
+				});
+			}
+		});
+
+		// Call startup on each top level instance if it makes sense (as for
+		// widgets).  Parent widgets will recursively call startup on their
+		// (non-top level) children
+		d.forEach(thelist, function(instance){
+			if(	instance  && 
+				instance.startup &&
+				!instance._started && 
+				(!instance.getParent || !instance.getParent())
+			){
+				instance.startup();
+			}
+		});
+		return thelist;
+	};
+
+	this.parse = function(/*DomNode?*/ rootNode){
+		// summary:
+		//		Search specified node (or root node) recursively for class instances,
+		//		and instantiate them Searches for
+		//		dojoType="qualified.class.name"
+		var list = d.query(qry, rootNode);
+		// go build the object instances
+		var instances = this.instantiate(list);
+		return instances;
+	};
+}();
+
+//Register the parser callback. It should be the first callback
+//after the a11y test.
+
+(function(){
+	var parseRunner = function(){ 
+		if(dojo.config["parseOnLoad"] == true){
+			dojo.parser.parse(); 
+		}
+	};
+
+	// FIXME: need to clobber cross-dependency!!
+	if(dojo.exists("dijit.wai.onload") && (dijit.wai.onload === dojo._loaders[0])){
+		dojo._loaders.splice(1, 0, parseRunner);
+	}else{
+		dojo._loaders.unshift(parseRunner);
+	}
+})();
+
+//TODO: ported from 0.4.x Dojo.  Can we reduce this?
+dojo.parser._anonCtr = 0;
+dojo.parser._anon = {}; // why is this property required?
+dojo.parser._nameAnonFunc = function(/*Function*/anonFuncPtr, /*Object*/thisObj){
+	// summary:
+	//		Creates a reference to anonFuncPtr in thisObj with a completely
+	//		unique name. The new name is returned as a String. 
+	var jpn = "$joinpoint";
+	var nso = (thisObj|| dojo.parser._anon);
+	if(dojo.isIE){
+		var cn = anonFuncPtr["__dojoNameCache"];
+		if(cn && nso[cn] === anonFuncPtr){
+			return anonFuncPtr["__dojoNameCache"];
+		}
+	}
+	var ret = "__"+dojo.parser._anonCtr++;
+	while(typeof nso[ret] != "undefined"){
+		ret = "__"+dojo.parser._anonCtr++;
+	}
+	nso[ret] = anonFuncPtr;
+	return ret; // String
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/regexp.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/regexp.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/regexp.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,69 @@
+if(!dojo._hasResource["dojo.regexp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.regexp"] = true;
+dojo.provide("dojo.regexp");
+
+/*=====
+dojo.regexp = {
+	// summary: Regular expressions and Builder resources
+};
+=====*/
+
+dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){
+	//	summary:
+	//		Adds escape sequences for special characters in regular expressions
+	// except:
+	//		a String with special characters to be left unescaped
+
+//	return str.replace(/([\f\b\n\t\r[\^$|?*+(){}])/gm, "\\$1"); // string
+	return str.replace(/([\.$?*!=:|{}\(\)\[\]\\\/^])/g, function(ch){
+		if(except && except.indexOf(ch) != -1){
+			return ch;
+		}
+		return "\\" + ch;
+	}); // String
+}
+
+dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){
+	//	summary:
+	//		Builds a regular expression that groups subexpressions
+	//	description:
+	//		A utility function used by some of the RE generators. The
+	//		subexpressions are constructed by the function, re, in the second
+	//		parameter.  re builds one subexpression for each elem in the array
+	//		a, in the first parameter. Returns a string for a regular
+	//		expression that groups all the subexpressions.
+	// arr:
+	//		A single value or an array of values.
+	// re:
+	//		A function. Takes one parameter and converts it to a regular
+	//		expression. 
+	// nonCapture:
+	//		If true, uses non-capturing match, otherwise matches are retained
+	//		by regular expression. Defaults to false
+
+	// case 1: a is a single value.
+	if(!(arr instanceof Array)){
+		return re(arr); // String
+	}
+
+	// case 2: a is an array
+	var b = [];
+	for(var i = 0; i < arr.length; i++){
+		// convert each elem to a RE
+		b.push(re(arr[i]));
+	}
+
+	 // join the REs as alternatives in a RE group.
+	return dojo.regexp.group(b.join("|"), nonCapture); // String
+}
+
+dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){
+	// summary:
+	//		adds group match to expression
+	// nonCapture:
+	//		If true, uses non-capturing match, otherwise matches are retained
+	//		by regular expression. 
+	return "(" + (nonCapture ? "?:":"") + expression + ")"; // String
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/resources/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/resources/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,30 @@
+License Disclaimer:
+
+All contents of this directory are Copyright (c) the Dojo Foundation, with the
+following exceptions:
+-------------------------------------------------------------------------------
+
+dojo.css:
+	* parts Copyright (c) 2007, Yahoo! Inc. All rights reserved.
+	  Distributed under the terms of the BSD License
+
+The Program includes all or portions of the following software which was obtained under the terms and conditions of the BSD License.
+
+http://developer.yahoo.com/yui/license.html
+
+Copyright (c) 2007, Yahoo! Inc.
+ All rights reserved.
+ Redistribution and use of this software 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 Yahoo! Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without 
+specific prior written permission of Yahoo! Inc. 
+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. 

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/_modules.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/resources/_modules.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/resources/_modules.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,36 @@
+/*=====
+// Supplemental summaries for those hard-to-doc places your conventional doc parser can't reach.
+// Where possible, these summaries should appear inline in the code.
+//
+// this is "package level documentation"
+
+dojo.cldr = {
+	// summary: transformation of relevant pieces of the Unicode.org Common Locale Data Repository
+	// (see http://unicode.org/cldr) to JSON from the original XML with associated utility classes
+};
+
+dojo.data = {
+	// summary: A uniform data access layer
+};
+
+dojo.dnd = {
+	// summary: Drag and Drop resources
+};
+
+dojo.io = {
+	// summary: Additional I/O transports (Ajax)
+};
+
+dojo.rpc = {
+	// summary: Dojo remote-procedure-call resources
+};
+
+// "variables"
+
+dojo.baseUrl = {
+	// summary: The root relative path to dojo.js (as a string)
+	// example: 
+	//	if(typeof dojo != "undefined"){ console.log(dojo.baseUrl); }
+};
+
+=====*/

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/blank.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojo/resources/blank.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/blank.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/resources/blank.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/resources/blank.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+<html><head><script>isLoaded = true;</script></head><body></body></html>

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/dnd.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/resources/dnd.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/resources/dnd.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+
+.dojoDndAvatar			{font-size: 75%; color: black;}
+.dojoDndAvatarHeader td	{padding-left: 20px; padding-right: 4px;}
+.dojoDndAvatarHeader	{background: #ccc;}
+.dojoDndAvatarItem		{background: #eee;}
+.dojoDndMove .dojoDndAvatarHeader	{background-image: url(images/dndNoMove.png); background-repeat: no-repeat;}
+.dojoDndCopy .dojoDndAvatarHeader	{background-image: url(images/dndNoCopy.png); background-repeat: no-repeat;}
+.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader	{background-image: url(images/dndMove.png); background-repeat: no-repeat;}
+.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader	{background-image: url(images/dndCopy.png); background-repeat: no-repeat;}

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/dnd.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/resources/dnd.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/resources/dnd.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+/* DnD avatar-specific settings */
+.dojoDndAvatar			{font-size: 75%; color: black;}
+.dojoDndAvatarHeader td	{padding-left: 20px; padding-right: 4px;}
+.dojoDndAvatarHeader	{background: #ccc;}
+.dojoDndAvatarItem		{background: #eee;}
+.dojoDndMove .dojoDndAvatarHeader	{background-image: url(images/dndNoMove.png); background-repeat: no-repeat;}
+.dojoDndCopy .dojoDndAvatarHeader	{background-image: url(images/dndNoCopy.png); background-repeat: no-repeat;}
+.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader	{background-image: url(images/dndMove.png); background-repeat: no-repeat;}
+.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader	{background-image: url(images/dndCopy.png); background-repeat: no-repeat;}

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/dojo.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/resources/dojo.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/resources/dojo.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,100 @@
+
+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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/dojo.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/resources/dojo.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/resources/dojo.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,198 @@
+/*
+	dojo.css
+	Baseline CSS file for general usage.
+
+	This file is intended to be a "quick and dirty" stylesheet you can use to give
+	a straight-up web page some basic styling without having to do the dirty work
+	yourself.  It includes a modified version of YUI's reset.css (we pulled some
+	of the list reset definitions, among other things), and then provides some very
+	basic style rules to be applied to general HTML elements.
+
+	This stylesheet is NOT intended to serve as the foundation for more complex things--
+	including the use of a TABLE for layout purposes.  The table definitions in this
+	file make the assumption that you will be using tables for thier declared purpose:
+	displaying tabular data.
+
+	If you are looking for a baseline stylesheet using tables for grid layout, you will
+	need to supply your own layout rules to override the ones in this stylesheet.
+	
+	Applications using Dojo will function correctly without including this
+	file, but it should provide sane defaults for many common things that page
+	authors often need to set up manually.
+
+	The Dojo Core uses this stylesheet to quickly style HTML-based tests and demos.  Feel
+	free to use it as you will.
+*/
+
+/*****************************************************************************************/
+
+/*
+	The below are borrowed from YUI's reset style sheets for pages and fonts.
+	We've verified w/ the YUI development team that these are entirely
+	copyright Yahoo, written entirely by Nate Koechley and Matt Sweeney without
+	external contributions.
+
+	Copyright (c) 2007, Yahoo! Inc. All rights reserved.
+	Code licensed under the BSD License:
+	http://developer.yahoo.net/yui/license.txt
+	version: 2.2.1
+*/
+
+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;
+}
+/* End YUI imported code. */
+
+/*****************************************************************************************/
+
+/* 
+	Begin Dojo additions.
+
+	Style definitions, based loosely on the Dijit Tundra theme.
+	Relative unit calculations based on "Compose to a Vertical Rhythm",
+	by Richard Rutter (http://24ways.org/2006/compose-to-a-vertical-rhythm)
+
+	If changing the font size, make sure you do it in both
+	percent and px (% for IE, px for everything else). 
+	% value based on default size of 16px (in most browsers).
+	So if you want the default size to be 14px, set the 
+	% to 87% (14 / 16 = 0.875).
+
+	Typical values:
+	10px: 62.5%
+	11px: 69% (68.75)
+	12px: 75%
+	13px: 81.25%
+	14px: 87.5%
+	16px: 100%
+
+	Default: 13px, specified by the YUI imports.
+*/
+body { 
+	font: 13px Myriad,Arial,Helvetica,clean,sans-serif; 
+	*font-size: small;
+	*font: x-small;
+}
+
+/* Headings */
+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;
+}
+
+/* paragraphs, quotes and lists */
+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 and code */
+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;
+}
+
+/*
+	Tables
+
+	Note that these table definitions make the assumption that you are using tables
+	to display tabular data, and NOT using tables as layout mechanisms.  If you are
+	using tables for layout, you will probably want to override these rules with
+	more specific ones.
+
+	These definitions make tabular data look presentable, particularly when presented
+	inline with paragraphs.
+*/
+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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/iframe_history.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/resources/iframe_history.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/resources/iframe_history.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
+
+<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en">
+<head>
+	<title></title>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
+	<script type="text/javascript">
+	// <!--
+	var noInit = false;
+	
+	function defineParams(sparams){
+		if(sparams){
+			var ss = (sparams.indexOf("&amp;") >= 0) ? "&amp;" : "&";
+			sparams = sparams.split(ss);
+			for(var x=0; x<sparams.length; x++){
+				var tp = sparams[x].split("=");
+				if(typeof window[tp[0]] != "undefined"){
+					window[tp[0]] = ((tp[1]=="true")||(tp[1]=="false")) ? eval(tp[1]) : tp[1];
+				}
+			}
+		}
+	}
+	
+	function init(){
+		// parse the query string if there is one to try to get params that
+		// we can act on. Also allow params to be in a fragment identifier.
+		var query = null;
+		var frag = null;
+		var url = document.location.href;
+		var hashIndex = url.indexOf("#");
+		
+		//Extract fragment identifier
+		if(hashIndex != -1){
+			frag = url.substring(hashIndex + 1, url.length);
+			url = url.substring(0, hashIndex);
+		}
+
+		//Extract querystring
+		var parts = url.split("?");
+		if(parts.length == 2){
+			query = parts[1];
+		}
+
+		defineParams(query);
+		defineParams(frag);
+
+		if(noInit){ return; }
+		var hasParentDojo = false;
+		try{
+			hasParentDojo = window.parent != window && window.parent["dojo"];
+		}catch(e){
+			alert("Initializing iframe_history.html failed. If you are using a cross-domain Dojo build,"
+				+ " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"
+				+ " to the path on your domain to iframe_history.html");
+			throw e;
+		}
+
+		if(hasParentDojo){
+			//Set the page title so IE history shows up with a somewhat correct name.
+			document.title = window.parent.document.title;
+			
+			//Notify parent that we are loaded.
+			var pdj = window.parent.dojo;
+			if(pdj["back"]){
+				pdj.back._iframeLoaded(null, window.location);
+			}
+		}
+
+	}
+	// -->
+	</script>
+</head>
+<body onload="try{ init(); }catch(e){ alert(e); }">
+	<h4>The Dojo Toolkit -- iframe_history.html</h4>
+
+	<p>This file is used in Dojo's back/fwd button management.</p>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndCopy.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndCopy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndMove.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndMove.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndNoCopy.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndNoCopy.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndNoMove.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojo/resources/images/dndNoMove.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojo/rpc/JsonService.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/rpc/JsonService.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/rpc/JsonService.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,83 @@
+if(!dojo._hasResource["dojo.rpc.JsonService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.rpc.JsonService"] = true;
+dojo.provide("dojo.rpc.JsonService");
+dojo.require("dojo.rpc.RpcService");
+
+dojo.declare("dojo.rpc.JsonService", dojo.rpc.RpcService, {
+		bustCache: false,
+		contentType: "application/json-rpc",
+		lastSubmissionId: 0,
+
+		callRemote: function(method, params){
+			// summary:
+			// 		call an arbitrary remote method without requiring it to be
+			// 		predefined with SMD
+			//	method: string
+			//		the name of the remote method you want to call.
+			//	params: array
+			//		array of parameters to pass to method
+
+			var deferred = new dojo.Deferred();
+			this.bind(method, params, deferred);
+			return deferred;
+		},
+
+		bind: function(method, parameters, deferredRequestHandler, url){
+			//summary:
+			//		JSON-RPC bind method. Takes remote method, parameters,
+			//		deferred, and a url, calls createRequest to make a JSON-RPC
+			//		envelope and passes that off with bind.
+			//	method: string
+			//		The name of the method we are calling
+			//	parameters: array
+			//		The parameters we are passing off to the method
+			//	deferredRequestHandler: deferred
+			//		The Deferred object for this particular request
+
+			var def = dojo.rawXhrPost({
+				url: url||this.serviceUrl,
+				postData: this.createRequest(method, parameters),
+				contentType: this.contentType,
+				timeout: this.timeout, 
+				handleAs: "json-comment-optional"
+			});
+			def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler));
+		},
+
+		createRequest: function(method, params){
+			// summary:
+			//	create a JSON-RPC envelope for the request
+			//	method: string
+			//		The name of the method we are creating the requst for
+			//	params: array
+			//		The array of parameters for this request;
+			
+			var req = { "params": params, "method": method, "id": ++this.lastSubmissionId };
+			var data = dojo.toJson(req);
+			return data;
+		},
+
+		parseResults: function(/*anything*/obj){
+			//summary:
+			//		parse the result envelope and pass the results back to
+			//		the callback function
+			//	obj: Object
+			//		Object containing envelope of data we recieve from the server
+
+			if(dojo.isObject(obj)){
+				if("result" in obj){
+					return obj.result;
+				}
+				if("Result" in obj){
+					return obj.Result;
+				}
+				if("ResultSet" in obj){
+					return obj.ResultSet;
+				}
+			}
+			return obj;
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/rpc/JsonpService.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/rpc/JsonpService.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/rpc/JsonpService.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,65 @@
+if(!dojo._hasResource["dojo.rpc.JsonpService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.rpc.JsonpService"] = true;
+dojo.provide("dojo.rpc.JsonpService");
+dojo.require("dojo.rpc.RpcService");
+dojo.require("dojo.io.script");
+
+dojo.declare("dojo.rpc.JsonpService", dojo.rpc.RpcService, {
+	// summary:
+	//	Generic JSONP service.  Minimally extends RpcService to allow 
+	//	easy definition of nearly any JSONP style service. Example
+	//	SMD files exist in dojox.data
+
+	constructor: function(args, requiredArgs){
+		if(this.required) {
+			if(requiredArgs){
+				dojo.mixin(this.required, requiredArgs);
+			}
+
+			dojo.forEach(this.required, function(req){
+				if(req=="" || req==undefined){
+					throw new Error("Required Service Argument not found: "+req); 
+				}
+			});
+		}		
+	},
+
+	strictArgChecks: false,
+
+	bind: function(method, parameters, deferredRequestHandler, url){
+		//summary:
+		//              JSONP bind method. Takes remote method, parameters,
+		//              deferred, and a url, calls createRequest to make a JSON-RPC
+		//              envelope and passes that off with bind.
+		//      method: string
+		//              The name of the method we are calling
+		//      parameters: array
+		//              The parameters we are passing off to the method
+		//      deferredRequestHandler: deferred
+		//              The Deferred object for this particular request
+
+		var def = dojo.io.script.get({
+			url: url||this.serviceUrl,
+			callbackParamName: this.callbackParamName||"callback",
+			content: this.createRequest(parameters),
+			timeout: this.timeout,
+			handleAs: "json",	
+			preventCache: true
+		});
+		def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler));
+	},
+
+	createRequest: function(parameters){
+		// summary:
+		//      create a JSONP req
+		//      params: array
+		//              The array of parameters for this request;
+
+		var params = (dojo.isArrayLike(parameters) && parameters.length==1) ?
+				parameters[0] : {};
+		dojo.mixin(params,this.required);
+		return params;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/rpc/RpcService.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/rpc/RpcService.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/rpc/RpcService.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,172 @@
+if(!dojo._hasResource["dojo.rpc.RpcService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.rpc.RpcService"] = true;
+dojo.provide("dojo.rpc.RpcService");
+
+dojo.declare("dojo.rpc.RpcService", null, {
+	constructor: function(args){
+		//summary:
+		//Take a string as a url to retrieve an smd or an object that is an smd or partial smd to use
+		//as a definition for the service
+		//
+		//	args: object
+		//		Takes a number of properties as kwArgs for defining the service.  It also
+		//		accepts a string.  When passed a string, it is treated as a url from
+		//		which it should synchronously retrieve an smd file.  Otherwise it is a kwArgs
+		//		object.  It accepts serviceUrl, to manually define a url for the rpc service
+		//		allowing the rpc system to be used without an smd definition. strictArgChecks
+		//		forces the system to verify that the # of arguments provided in a call
+		//		matches those defined in the smd.  smdString allows a developer to pass
+		//		a jsonString directly, which will be converted into an object or alternatively
+		//		smdObject is accepts an smdObject directly.
+		//				
+		if(args){
+			//if the arg is a string, we assume it is a url to retrieve an smd definition from
+			if( (dojo.isString(args)) || (args instanceof dojo._Url)){
+				if (args instanceof dojo._Url){
+					var url = args + "";
+				}else{
+					url = args;
+				}
+				var def = dojo.xhrGet({
+					url: url,
+					handleAs: "json-comment-optional",
+					sync: true
+				});
+				
+				def.addCallback(this, "processSmd");
+				def.addErrback(function() {
+					throw new Error("Unable to load SMD from " + args);
+				});
+
+			}else if(args.smdStr){
+				this.processSmd(dojo.eval("("+args.smdStr+")"));
+			}else{
+				// otherwise we assume it's an arguments object with the following
+				// (optional) properties:
+				//      - serviceUrl
+				//      - strictArgChecks
+				//      - smdStr
+				//      - smdObj
+
+				if(args.serviceUrl){
+					this.serviceUrl = args.serviceUrl;
+				}
+
+				this.timeout = args.timeout || 3000;
+
+				if("strictArgChecks" in args){
+					this.strictArgChecks = args.strictArgChecks;
+				}
+
+				this.processSmd(args);
+			}
+		}
+	},
+
+	strictArgChecks: true,
+	serviceUrl: "",
+
+	parseResults: function(obj){
+		// summary
+		// 		parse the results coming back from an rpc request.  this
+		// 		base implementation, just returns the full object
+		// 		subclasses should parse and only return the actual results
+		//	obj: Object
+		//		Object that is the return results from an rpc request
+		return obj;
+	},
+
+	errorCallback: function(/* dojo.Deferred */ deferredRequestHandler){
+		// summary:
+		//		create callback that calls the Deferres errback method
+		//	deferredRequestHandler: Deferred
+		//		The deferred object handling a request.
+		return function(data){
+			deferredRequestHandler.errback(new Error(data.message));
+		};
+	},
+
+	resultCallback: function(/* dojo.Deferred */ deferredRequestHandler){
+		// summary:
+		// 		create callback that calls the Deferred's callback method
+		//	deferredRequestHandler: Deferred
+		//		The deferred object handling a request.
+
+		var tf = dojo.hitch(this, 
+			function(obj){
+				if(obj.error!=null){
+					var err;
+					if(typeof obj.error == 'object'){
+						err = new Error(obj.error.message);
+						err.code = obj.error.code;
+						err.error = obj.error.error;
+					}else{
+						err = new Error(obj.error);
+					}
+					err.id = obj.id;
+					err.errorObject = obj;
+					deferredRequestHandler.errback(err);
+				}else{
+					deferredRequestHandler.callback(this.parseResults(obj)); 
+				}
+			}
+		);
+		return tf;
+	},
+
+	generateMethod: function(/*string*/ method, /*array*/ parameters, /*string*/ url){
+		// summary:
+		// 		generate the local bind methods for the remote object
+		//	method: string
+		//		The name of the method we are generating
+		//	parameters: array
+		//		the array of parameters for this call.
+		//	url: string
+		//		the service url for this call
+
+		return dojo.hitch(this, function(){
+			var deferredRequestHandler = new dojo.Deferred();
+
+			// if params weren't specified, then we can assume it's varargs
+			if( (this.strictArgChecks) &&
+				(parameters != null) &&
+				(arguments.length != parameters.length)
+			){
+				// put error stuff here, no enough params
+				throw new Error("Invalid number of parameters for remote method.");
+			}else{
+				this.bind(method, dojo._toArray(arguments), deferredRequestHandler, url);
+			}
+
+			return deferredRequestHandler;
+		});
+	},
+
+	processSmd: function(object){
+		// summary:
+		// 		callback method for reciept of a smd object.  Parse the smd
+		// 		and generate functions based on the description
+		//	object:
+		//		smd object defining this service.
+
+		if(object.methods){
+			dojo.forEach(object.methods, function(m){
+				if(m && m.name){
+					this[m.name] = this.generateMethod(	m.name,
+										m.parameters, 
+										m.url||m.serviceUrl||m.serviceURL);
+					if(!dojo.isFunction(this[m.name])){
+						throw new Error("RpcService: Failed to create" + m.name + "()");
+						/*console.debug("RpcService: Failed to create", m.name, "()");*/
+					}
+				}
+			}, this);
+		}
+
+		this.serviceUrl = object.serviceUrl||object.serviceURL;
+		this.required = object.required;
+		this.smd = object;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/string.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/string.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/string.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,84 @@
+if(!dojo._hasResource["dojo.string"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.string"] = true;
+dojo.provide("dojo.string");
+
+/*=====
+dojo.string = { 
+	// summary: String utilities for Dojo
+};
+=====*/
+
+dojo.string.pad = function(/*String*/text, /*int*/size, /*String?*/ch, /*boolean?*/end){
+	// summary:
+	//		Pad a string to guarantee that it is at least `size` length by
+	//		filling with the character `ch` at either the start or end of the
+	//		string. Pads at the start, by default.
+	// text: the string to pad
+	// size: length to provide padding
+	// ch: character to pad, defaults to '0'
+	// end: adds padding at the end if true, otherwise pads at start
+
+	var out = String(text);
+	if(!ch){
+		ch = '0';
+	}
+	while(out.length < size){
+		if(end){
+			out += ch;
+		}else{
+			out = ch + out;
+		}
+	}
+	return out;	// String
+};
+
+dojo.string.substitute = function(	/*String*/template, 
+									/*Object|Array*/map, 
+									/*Function?*/transform, 
+									/*Object?*/thisObject){
+	// summary:
+	//		Performs parameterized substitutions on a string. Throws an
+	//		exception if any parameter is unmatched.
+	// description:
+	//		For example,
+	//		|	dojo.string.substitute("File '${0}' is not found in directory '${1}'.",["foo.html","/temp"]);
+	//		|	dojo.string.substitute("File '${name}' is not found in directory '${info.dir}'.",
+	//		|		{name: "foo.html", info: {dir: "/temp"}});
+	//		both return
+	//		|	"File 'foo.html' is not found in directory '/temp'."
+	// template: 
+	//		a string with expressions in the form `${key}` to be replaced or
+	//		`${key:format}` which specifies a format function.
+	// map: hash to search for substitutions
+	// transform: 
+	//		a function to process all parameters before substitution takes
+	//		place, e.g. dojo.string.encodeXML
+	// thisObject: 
+	//		where to look for optional format function; default to the global
+	//		namespace
+
+	return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, function(match, key, format){
+		var value = dojo.getObject(key,false,map);
+		if(format){ value = dojo.getObject(format,false,thisObject)(value);}
+		if(transform){ value = transform(value, key); }
+		return value.toString();
+	}); // string
+};
+
+dojo.string.trim = function(/*String*/ str){
+	// summary: trims whitespaces from both sides of the string
+	// description:
+	//	This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript).
+	//	The short yet performant version of this function is 
+	//	dojo.trim(), which is part of Dojo base.
+	str = str.replace(/^\s+/, '');
+	for(var i = str.length - 1; i > 0; i--){
+		if(/\S/.test(str.charAt(i))){
+			str = str.substring(0, i + 1);
+			break;
+		}
+	}
+	return str;	// String
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojo/tests.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojo/tests.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojo/tests.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+//This file is the command-line entry point for running the tests in
+//Rhino and Spidermonkey.
+
+/*=====
+dojo.tests = {
+	// summary: D.O.H. Test files for Dojo unit testing.
+};
+=====*/
+
+load("dojo.js");
+load("tests/runner.js");
+tests.run();

Added: branches/vhffs-design/vhffs-panel/js/dojox/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.

Added: branches/vhffs-design/vhffs-panel/js/dojox/_sql/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/_sql/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/_sql/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+License Disclaimer:
+
+All contents of this directory are Copyright (c) the Dojo Foundation, with the
+following exceptions:
+-------------------------------------------------------------------------------
+
+_crypto.js - internally uses AES algorithm	
+	* AES algorithm copyright Chris Veness (CLA signed and permission given to use code under BSD license)
+      Taken from http://www.movable-type.co.uk/scripts/aes.html

Added: branches/vhffs-design/vhffs-panel/js/dojox/_sql/_crypto.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/_sql/_crypto.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/_sql/_crypto.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,443 @@
+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@xxxxxxxxxxxx
+
+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<Nr; round++) {
+			state = SubBytes(state, Nb);
+			state = ShiftRows(state, Nb);
+			state = MixColumns(state, Nb);
+			state = AddRoundKey(state, w, round, Nb);
+		  }
+
+		  state = SubBytes(state, Nb);
+		  state = ShiftRows(state, Nb);
+		  state = AddRoundKey(state, w, Nr, Nb);
+
+		  var output = new Array(4*Nb);	 // convert state to 1-d array before returning [§3.4]
+		  for (var i=0; i<4*Nb; i++) output[i] = state[i%4][Math.floor(i/4)];
+		  return output;
+		}
+
+
+		function SubBytes(s, Nb) {	  // apply SBox to state S [§5.1.1]
+		  for (var r=0; r<4; r++) {
+			for (var c=0; c<Nb; c++) s[r][c] = Sbox[s[r][c]];
+		  }
+		  return s;
+		}
+
+
+		function ShiftRows(s, Nb) {	   // shift row r of state S left by r bytes [§5.1.2]
+		  var t = new Array(4);
+		  for (var r=1; r<4; r++) {
+			for (var c=0; c<4; c++) t[c] = s[r][(c+r)%Nb];	// shift into temp copy
+			for (var c=0; c<4; c++) s[r][c] = t[c];			// and copy back
+		  }			 // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
+		  return s;	 // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf 
+		}
+
+
+		function MixColumns(s, Nb) {   // combine bytes of each col of state S [§5.1.3]
+		  for (var c=0; c<4; c++) {
+			var a = new Array(4);  // 'a' is a copy of the current column from 's'
+			var b = new Array(4);  // 'b' is a•{02} in GF(2^8)
+			for (var i=0; i<4; i++) {
+			  a[i] = s[i][c];
+			  b[i] = s[i][c]&0x80 ? s[i][c]<<1 ^ 0x011b : s[i][c]<<1;
+			}
+			// a[n] ^ b[n] is a•{03} in GF(2^8)
+			s[0][c] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3]; // 2*a0 + 3*a1 + a2 + a3
+			s[1][c] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3]; // a0 * 2*a1 + 3*a2 + a3
+			s[2][c] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3]; // a0 + a1 + 2*a2 + 3*a3
+			s[3][c] = a[0] ^ b[0] ^ a[1] ^ a[2] ^ b[3]; // 3*a0 + a1 + a2 + 2*a3
+		  }
+		  return s;
+		}
+
+
+		function AddRoundKey(state, w, rnd, Nb) {  // xor Round Key into state S [§5.1.4]
+		  for (var r=0; r<4; r++) {
+			for (var c=0; c<Nb; c++) state[r][c] ^= w[rnd*4+c][r];
+		  }
+		  return state;
+		}
+
+
+		function KeyExpansion(key) {  // generate Key Schedule (byte-array Nr+1 x Nb) from Key [§5.2]
+		  var Nb = 4;			 // block size (in words): no of columns in state (fixed at 4 for AES)
+		  var Nk = key.length/4	 // key length (in words): 4/6/8 for 128/192/256-bit keys
+		  var Nr = Nk + 6;		 // no of rounds: 10/12/14 for 128/192/256-bit keys
+
+		  var w = new Array(Nb*(Nr+1));
+		  var temp = new Array(4);
+
+		  for (var i=0; i<Nk; i++) {
+			var r = [key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]];
+			w[i] = r;
+		  }
+
+		  for (var i=Nk; i<(Nb*(Nr+1)); i++) {
+			w[i] = new Array(4);
+			for (var t=0; t<4; t++) temp[t] = w[i-1][t];
+			if (i % Nk == 0) {
+			  temp = SubWord(RotWord(temp));
+			  for (var t=0; t<4; t++) temp[t] ^= Rcon[i/Nk][t];
+			} else if (Nk > 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<nBytes; i++) pwBytes[i] = password.charCodeAt(i) & 0xff;
+
+		  var key = Cipher(pwBytes, KeyExpansion(pwBytes));
+
+		  key = key.concat(key.slice(0, nBytes-16));  // key is now 16/24/32 bytes long
+
+		  // initialise counter block (NIST SP800-38A §B.2): millisecond time-stamp for nonce in 1st 8 bytes,
+		  // block counter in 2nd 8 bytes
+		  var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
+		  var counterBlock = new Array(blockSize);	// block size fixed at 16 bytes / 128 bits (Nb=4) for AES
+		  var nonce = (new Date()).getTime();  // milliseconds since 1-Jan-1970
+
+		  // encode nonce in two stages to cater for JavaScript 32-bit limit on bitwise ops
+		  for (var i=0; i<4; i++) counterBlock[i] = (nonce >>> 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<blockCount; b++) {
+			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
+			// again done in two stages for 32-bit ops
+			for (var c=0; c<4; c++) counterBlock[15-c] = (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<blockCount-1 ? blockSize : (plaintext.length-1)%blockSize+1;
+
+			var ct = '';
+			for (var i=0; i<blockLength; i++) {	 // -- xor plaintext with ciphered counter byte-by-byte --
+			  var plaintextByte = plaintext.charCodeAt(b*blockSize+i);
+			  var cipherByte = plaintextByte ^ cipherCntr[i];
+			  ct += String.fromCharCode(cipherByte);
+			}
+			// ct is now ciphertext for this block
+
+			ciphertext[b] = escCtrlChars(ct);  // escape troublesome characters in ciphertext
+		  }
+
+		  // convert the nonce to a string to go on the front of the ciphertext
+		  var ctrTxt = '';
+		  for (var i=0; i<8; i++) ctrTxt += String.fromCharCode(counterBlock[i]);
+		  ctrTxt = escCtrlChars(ctrTxt);
+
+		  // use '-' to separate blocks, use Array.join to concatenate arrays of strings for efficiency
+		  return ctrTxt + '-' + ciphertext.join('-');
+		}
+
+
+		/* 
+		 * Use AES to decrypt 'ciphertext' with 'password' using 'nBits' key, in Counter mode of operation
+		 *
+		 *	 for each block
+		 *	 - outputblock = cipher(counter, key)
+		 *	 - cipherblock = plaintext xor outputblock
+		 */
+		function AESDecryptCtr(ciphertext, password, nBits) {
+		  if (!(nBits==128 || nBits==192 || nBits==256)) return '';	 // standard allows 128/192/256 bit keys
+
+		  var nBytes = nBits/8;	 // no bytes in key
+		  var pwBytes = new Array(nBytes);
+		  for (var i=0; i<nBytes; i++) pwBytes[i] = password.charCodeAt(i) & 0xff;
+		  var pwKeySchedule = KeyExpansion(pwBytes);
+		  var key = Cipher(pwBytes, pwKeySchedule);
+		  key = key.concat(key.slice(0, nBytes-16));  // key is now 16/24/32 bytes long
+
+		  var keySchedule = KeyExpansion(key);
+
+		  ciphertext = ciphertext.split('-');  // split ciphertext into array of block-length strings 
+
+		  // recover nonce from 1st element of ciphertext
+		  var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
+		  var counterBlock = new Array(blockSize);
+		  var ctrTxt = unescCtrlChars(ciphertext[0]);
+		  for (var i=0; i<8; i++) counterBlock[i] = ctrTxt.charCodeAt(i);
+
+		  var plaintext = new Array(ciphertext.length-1);
+
+		  for (var b=1; b<ciphertext.length; b++) {
+			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
+			for (var c=0; c<4; c++) counterBlock[15-c] = ((b-1) >>> 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<ciphertext[b].length; i++) {
+			  // -- xor plaintext with ciphered counter byte-by-byte --
+			  var ciphertextByte = ciphertext[b].charCodeAt(i);
+			  var plaintextByte = ciphertextByte ^ cipherCntr[i];
+			  pt += String.fromCharCode(plaintextByte);
+			}
+			// pt is now plaintext for this block
+
+			plaintext[b-1] = pt;  // b-1 'cos no initial nonce block in plaintext
+		  }
+
+		  return plaintext.join('');
+		}
+
+		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+
+		function escCtrlChars(str) {  // escape control chars which might cause problems handling ciphertext
+		  return str.replace(/[\0\t\n\v\f\r\xa0!-]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });
+		}  // \xa0 to cater for bug in Firefox; include '-' to leave it free for use as a block marker
+
+		function unescCtrlChars(str) {	// unescape potentially problematic control characters
+		  return str.replace(/!\d\d?\d?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });
+		}
+
+		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+		
+		function encrypt(plaintext, password){
+			return AESEncryptCtr(plaintext, password, 256);
+		}
+
+		function decrypt(ciphertext, password){	
+			return AESDecryptCtr(ciphertext, password, 256);
+		}
+		
+		/* End AES Implementation */
+		
+		var cmd = msg.substr(0,4);
+		var arg = msg.substr(5);
+		if(cmd == "encr"){
+			arg = eval("(" + arg + ")");
+			var plaintext = arg.plaintext;
+			var password = arg.password;
+			var results = encrypt(plaintext, password);
+			gearsWorkerPool.sendMessage(String(results), sender);
+		}else if(cmd == "decr"){
+			arg = eval("(" + arg + ")");
+			var ciphertext = arg.ciphertext;
+			var password = arg.password;
+			var results = decrypt(ciphertext, password);
+			gearsWorkerPool.sendMessage(String(results), sender);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/_sql/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/_sql/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/_sql/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,538 @@
+if(!dojo._hasResource["dojox._sql.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox._sql.common"] = true;
+dojo.provide("dojox._sql.common");
+
+dojo.require("dojox._sql._crypto");
+
+// summary:
+//	Executes a SQL expression.
+// description:
+// 	There are four ways to call this:
+// 	1) Straight SQL: dojox.sql("SELECT * FROM FOOBAR");
+// 	2) SQL with parameters: dojox.sql("INSERT INTO FOOBAR VALUES (?)", someParam)
+// 	3) Encrypting particular values: 
+//			dojox.sql("INSERT INTO FOOBAR VALUES (ENCRYPT(?))", someParam, "somePassword", callback)
+// 	4) Decrypting particular values:
+//			dojox.sql("SELECT DECRYPT(SOMECOL1), DECRYPT(SOMECOL2) FROM
+//					FOOBAR WHERE SOMECOL3 = ?", someParam,
+//					"somePassword", callback)
+//
+// 	For encryption and decryption the last two values should be the the password for
+// 	encryption/decryption, and the callback function that gets the result set.
+//
+// 	Note: We only support ENCRYPT(?) statements, and
+// 	and DECRYPT(*) statements for now -- you can not have a literal string
+// 	inside of these, such as ENCRYPT('foobar')
+//
+// 	Note: If you have multiple columns to encrypt and decrypt, you can use the following
+// 	convenience form to not have to type ENCRYPT(?)/DECRYPT(*) many times:
+//
+// 	dojox.sql("INSERT INTO FOOBAR VALUES (ENCRYPT(?, ?, ?))", 
+//					someParam1, someParam2, someParam3, 
+//					"somePassword", callback)
+//
+// 	dojox.sql("SELECT DECRYPT(SOMECOL1, SOMECOL2) FROM
+//					FOOBAR WHERE SOMECOL3 = ?", someParam,
+//					"somePassword", callback)
+dojox.sql = new Function("return dojox.sql._exec(arguments);");
+
+dojo.mixin(dojox.sql, {
+	dbName: null,
+	
+	// summary:
+	//	If true, then we print out any SQL that is executed
+	//	to the debug window
+	debug: (dojo.exists("dojox.sql.debug")?dojox.sql.debug:false),
+
+	open: function(dbName){
+		if(this._dbOpen && (!dbName || dbName == this.dbName)){
+			return;
+		}
+		
+		if(!this.dbName){
+			this.dbName = "dot_store_" 
+				+ window.location.href.replace(/[^0-9A-Za-z_]/g, "_");
+			// database names in Gears are limited to 64 characters long
+			if(this.dbName.length > 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);
+			}
+		}));
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/_sql/demos/customers/customers.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/_sql/demos/customers/customers.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/_sql/demos/customers/customers.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,292 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
+
+<html>
+	<head>
+	    <script type="text/javascript" 
+	            src="../../../../dojo/dojo.js" djConfig="isDebug: false"></script>
+		<script type="text/javascript" src="../../../../dojox/off/offline.js"></script>
+		
+		<style type="text/css">
+			body{
+				padding: 2em;
+			}
+			
+			#dataTable{
+				margin-top: 2em;
+			}
+			
+			button{
+				margin-left: 1em;
+			}
+			
+			th, tr, td{
+				text-align: left;
+			}
+			
+			table{
+				text-align: center;
+				clear: both;
+			}
+			
+			#cryptoContainer{
+				float: left;
+				width: 60%;
+			}
+			
+			#numRowsContainer{
+				float: right;
+				width: 40%;
+			}
+			
+			#numRowsContainer input{
+				margin-left: 1.5em;
+				width: 5em;
+			}
+			
+			.table-columns{
+				font-weight: bold;
+			}
+		</style>
+		
+		<script>
+			dojo.require("dojox.sql");
+			
+			dojo.connect(window, "onload", function(){
+				// draw our customer table on the screen
+				createTable();
+				
+				// create our customer table in the database
+				dojox.sql("DROP TABLE IF EXISTS CUSTOMERS");
+				dojox.sql("CREATE TABLE CUSTOMERS ("
+								+ "last_name TEXT, "
+								+ "first_name TEXT, "
+								+ "social_security TEXT"
+								+ ")"
+							);
+			});
+			
+			function createTable(){	
+				// get number of rows to create
+				var NUM_ROWS = document.getElementById("numRows").value;
+				if(!NUM_ROWS){
+					alert("Please enter the number of "
+							+ "customer rows the table should have");
+					return;
+				} 
+				
+				var table = document.getElementById("dataTable");
+				if(table){
+					table.parentNode.removeChild(table);
+				}
+				
+				table = document.createElement("table");
+				table.setAttribute("id", "dataTable");
+				table.setAttribute("border", 1);
+				
+				// if we don't use IE's craptacular proprietary table methods
+				// we get strange display glitches
+				var tr = (dojo.isIE) ? table.insertRow() : document.createElement("tr");
+				tr.className = "table-columns";
+				var th = (dojo.isIE) ? tr.insertCell() : document.createElement("th");
+				th.appendChild(document.createTextNode("Last Name"));
+				if(!dojo.isIE){
+					tr.appendChild(th);
+				}
+				th = (dojo.isIE) ? tr.insertCell() : document.createElement("th");
+				th.appendChild(document.createTextNode("First Name"));
+				if(!dojo.isIE){
+					tr.appendChild(th);
+				}
+				th = (dojo.isIE) ? tr.insertCell() : document.createElement("th");
+				th.appendChild(document.createTextNode("Social Security"));
+				if(!dojo.isIE){
+					tr.appendChild(th);
+					
+					table.appendChild(tr);
+				}
+				
+				for(var i = 1; i <= NUM_ROWS; i++){
+					tr = (dojo.isIE) ? table.insertRow() : document.createElement("tr");
+					tr.className = "data-item";
+					
+					var elem = (dojo.isIE) ? tr.insertCell() : document.createElement("td");
+					elem.className = "last-name";
+					var lastName = "Doe" + i;
+					elem.appendChild(document.createTextNode(lastName));
+					if(!dojo.isIE){
+						tr.appendChild(elem);
+					}
+					
+					elem = (dojo.isIE) ? tr.insertCell() : document.createElement("td");
+					elem.className = "first-name";
+					var firstName = "John" + i;
+					elem.appendChild(document.createTextNode(firstName));
+					if(!dojo.isIE){
+						tr.appendChild(elem);
+					}
+					
+					elem = elem = (dojo.isIE) ? tr.insertCell() : document.createElement("td");
+					elem.className = "social-security";
+					var ss = 513121500 + i;
+					ss = new String(ss);
+					ss = ss.slice(0, 3) + "-" + ss.slice(3, 5) + "-" + ss.slice(5);
+					elem.appendChild(document.createTextNode(ss));
+					if(!dojo.isIE){
+						tr.appendChild(elem);
+					
+						table.appendChild(tr);
+					}
+				}
+				
+				document.body.appendChild(table);
+				
+				// reset button state
+				dojo.byId("encrypt").disabled = false;
+				dojo.byId("decrypt").disabled = true;
+			}
+			
+			function readTable(){
+				var data = [];
+				var rows = dojo.query(".data-item");
+				dojo.forEach(rows, function(row){
+					var td = row.getElementsByTagName("td");
+					
+					var lastName = td[0].childNodes[0].nodeValue;
+					var firstName = td[1].childNodes[0].nodeValue;
+					var ssNumber = td[2].childNodes[0].nodeValue;
+
+					data.push({lastName: lastName, firstName: firstName, ssNumber: ssNumber,
+								toString: function(){
+									return "{lastName: " + lastName 
+												+ ", firstName: " + firstName
+												+ ", ssNumber: " + ssNumber
+												+ "}";
+								}});
+				});
+				
+				return data;
+			}
+			
+			function setData(data){
+				var rows = document.getElementsByTagName("tr");
+				for(var i = 1; i < rows.length; i++){
+					var customer = data[i - 1];
+					var td = rows[i].getElementsByTagName("td");
+					td[2].childNodes[0].nodeValue = customer.social_security;
+				}
+			}
+			
+			function encrypt(){
+				// disable our buttons
+				dojo.byId("encrypt").disabled = true;
+				dojo.byId("decrypt").disabled = true;
+				
+				var data = readTable();
+				
+				var password = document.getElementById("password").value;
+				
+				// delete any old data
+				dojox.sql("DELETE FROM CUSTOMERS");
+				
+				// insert new data
+				insertCustomers(data, 0, password);
+			}
+			
+			function insertCustomers(data, i, password){
+				var nextIndex = i + 1;
+				
+				if(i >= data.length){
+					var savedRows = dojox.sql("SELECT * FROM CUSTOMERS");
+					setData(savedRows);
+					return;
+				}
+				dojox.sql("INSERT INTO CUSTOMERS VALUES (?, ?, ENCRYPT(?))",
+							data[i].lastName, data[i].firstName,
+							data[i].ssNumber,
+							password,
+							function(results, error, errorMsg){
+								// enable our buttons
+								dojo.byId("encrypt").disabled = true;
+								dojo.byId("decrypt").disabled = false;
+								
+								if(error == true){
+									alert(errorMsg);
+									return;
+								}
+								
+								insertCustomers(data, nextIndex, password);
+							}
+						);
+			}
+			
+			function decrypt(){
+				// disable our buttons
+				dojo.byId("encrypt").disabled = true;
+				dojo.byId("decrypt").disabled = true;
+				
+				var password = document.getElementById("password").value;
+				
+				dojox.sql("SELECT last_name, first_name, DECRYPT(social_security) FROM CUSTOMERS",
+							password,
+							function(results, error, errorMsg){
+								// enable our buttons
+								dojo.byId("encrypt").disabled = false;
+								dojo.byId("decrypt").disabled = true;
+								
+								if(error == true){
+									alert(errorMsg);
+									return;
+								}
+								
+								setData(results);
+							}
+						);
+			}
+		</script>
+	</head>
+	
+	<body>
+		<h1>Dojo SQL Cryptography</h1>
+		
+		<h2>Instructions</h2>
+		
+		<p>This demo shows Dojo Offline's SQL encryption technologies. In the table below, we have a
+			sample SQL table that has three columns of data: a last name, a first name, and
+			a social security number. We don't want to store the social security numbers
+			in the clear, just in case they are downloaded for offline use to a laptop and the
+			laptop is stolen.</p>
+		
+		<p>To use this demo, enter a password and press the ENCRYPT button to see the Social Security column encrypt. Enter
+			the same password and press DECRYPT to see it decrypt. If you enter an incorrect password and
+			press DECRYPT, the Social Security column will remain encrypted and only show gibberish.</p>
+			
+		<p>Under the covers we use 256-bit AES encryption and your password to derive the crypto key; we use
+			a facility in Google Gears to do the cryptography in such a way that the browser does not lock up
+			during processing. Dojo Offline ties this cryptography into Dojo SQL, providing convenient ENCRYPT()
+			and DECRYPT() SQL keywords you can use to easily have this functionality in your
+			own offline applications. To learn how you can use this feature 
+			<a href="http://docs.google.com/View?docid=dhkhksk4_8gdp9gr#crypto"; target="_blank">see here</a>.</p>
+		
+		<div id="cryptoContainer">
+			<label for="password">
+				Password:
+			</label>
+		
+			<input type="input" name="password" id="password" value="sample_password">
+		
+			<button id="encrypt" onclick="window.setTimeout(encrypt, 1)">Encrypt</button>
+		
+			<button id="decrypt" onclick="window.setTimeout(decrypt, 1)" disabled="true">Decrypt</button>
+		</div>
+		
+		<div id="numRowsContainer">
+			<label for="numRows">
+				Number of Customer Rows in Table:
+			</label>
+		
+			<input id="numRows" type="input" value="30">
+			
+			<button onclick="createTable()">Update</button>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,134 @@
+-------------------------------------------------------------------------------
+dojox.analytics
+-------------------------------------------------------------------------------
+Version 1.0
+Release date: 12/17/2007
+-------------------------------------------------------------------------------
+Project state: beta
+-------------------------------------------------------------------------------
+Project authors
+	Dustin Machi
+-------------------------------------------------------------------------------
+Project description
+	analytics and client monitoring system.  Including the base analytics
+system and any number of plugins enables logging of different system data
+back to the server.  Plugins included at this time:
+
+	dojo - reports dojo startup  collected information
+	window - reports available window information to the server
+	mouseOver - allows periodic sampling of mouseOver 
+	mouseClick - reports any mouse clicks to the server
+	idle - reports idle/activity 
+	consoleMessages - reports console.* messages to the server	
+
+
+-------------------------------------------------------------------------------
+Dependencies:
+
+Dojo Core (package loader).
+-------------------------------------------------------------------------------
+Documentation
+
+Usage:
+
+The primary intended usage will be to create a custom build layer that includes 
+the particular plugins you need for your project.   However in practice you
+can use the system as such:
+
+	<script type="text/javascript" src="../../../dojo/dojo.js"
+                djConfig="parseOnLoad: true, isDebug: false, usePlainJson: true, sendMethod: 'script', sendInterval: 5000"></script>
+
+        <script language="JavaScript" type="text/javascript">
+                // include the analytics system
+                dojo.require("dojox.analytics");
+
+                //tracks mouse clicks on the page
+                dojo.require("dojox.analytics.plugins.mouseClick");
+
+                // this plugin returns the informatin dojo collects when it launches
+                dojo.require("dojox.analytics.plugins.dojo");
+
+                // this plugin return the information the window has when it launches
+                // and it also ties to a few events such as window.option
+                dojo.require("dojox.analytics.plugins.window");
+
+                // this plugin tracks console. message, It logs console.error, warn, and
+                // info messages to the tracker.  It also defines console.rlog() which
+                // can be used to log only to the server.  Note that if isDebug() is disabled
+                // you will still see the console messages on the sever, but not in the actual
+                // browser console.
+                dojo.require("dojox.analytics.plugins.consoleMessages");
+
+                // tracks where a mouse is on a page an what it is over, periodically sampling
+                // and storing this data
+                dojo.require("dojox.analytics.plugins.mouseOver");
+
+                //tracks when the user has gone idle
+                dojo.require("dojox.analytics.plugins.idle");
+
+	</script> 
+
+When done using a build, none of the dojo.require() statement will be requires 
+would already be in the build. 
+
+Most of the plugins and the base itself have a number of configurable params
+that are passed in via the djConfig variable set.  This approach is taken so that
+the parameters can be easily provided in the case of a build or for a custom
+dojo.js build with analytics built in. Examples for different build profiles 
+are in the profiles directory.
+
+Available Configuration Parameters:
+
+	Base Configs
+	sendInterval - Normal send interval. Default 5000 
+	sendMethod - "script" || "xhrPost"
+	inTransitRetry - Delay before retrying an a send if it was in transit
+			or if there is still data to be sent after a post.
+			Default 1000
+	analyticsUrl - url to send logging data to. defaults to the test php 
+			file for now
+	maxRequestSize - Maximum size of GET style requests. Capped at 2000 for 
+			IE, and 4000 otherwise	
+
+	consoleMessages Config:
+
+	consoleLogFuncs - functions from the console object that you will log to 
+			the server. If the console object doesn't exist
+			or a particuarl method doesn't exist it will be
+			created as a remote logging only method. This provides
+			a quick and convient way to automatically define
+			a remote logging funciton that includes the functions
+			name in the log.  The 'rlog' in the default paramerters
+			is an example of this.  Defaults to ["error", "warn", "info", "rlog"]	
+
+	idle Config:
+	
+		idleTime - Number of ms to be idle before being reported to the server as idle
+
+	mouseOver config:
+		targetProps - the properties whose values will be reported for each target from
+				a mouse over sample.  defaults to ["id","className","localName","href", "spellcheck", "lang", "textContent", "value" ]
+
+		sampleDelay - the delay in ms between mouseover samples. Defaults to 2500
+
+	window config:
+		windowConnects - methods on the window objec that will be attached to 
+				have its data passed to the server when called.
+
+	
+Note that the basic usage of this system simply serializes json with toJson() when passed
+to the analytics addData() method.  If data is passed that has circular references
+it will die.  Take care not to do that or be surprised when it doens't work
+in those cases.
+		
+
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/analytics
+
+Install into the following directory structure:
+/dojox/analytics/
+
+...which should be at the same level as your Dojo checkout.

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,127 @@
+if(!dojo._hasResource["dojox.analytics._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.analytics._base"] = true;
+dojo.provide("dojox.analytics._base");
+
+dojox.analytics = function(){
+	//where we store data until we're ready to send it off.
+
+	//the data queue;
+	this._data = [] ;
+
+	//id of messages for this session/page
+	this._id=1;
+
+	//some default values
+	this.sendInterval=dojo.config["sendInterval"] || 5000;
+	this.inTransitRetry=dojo.config["inTransitRetry"] || 200;
+	this.dataUrl=dojo.config["analyticsUrl"] || dojo.moduleUrl("dojox.analytics.logger", "dojoxAnalytics.php");
+	this.sendMethod = dojo.config["sendMethod"] || "xhrPost";
+	if (dojo.isIE){
+		this.maxRequestSize = 2000;
+	}else{
+		this.maxRequestSize = dojo.config["maxRequestSize"] || 4000;	
+	}
+
+	//while we can go ahead and being logging as soon as this constructor is completed
+	//we're not going to schedule pushing data to the server until after the page
+	//has completed loading
+	dojo.addOnLoad(this, "schedulePusher");
+	dojo.addOnUnload(this, "pushData", true);
+};
+
+dojo.extend(dojox.analytics, {
+	schedulePusher: function(interval){
+		// summary:
+		//	schedule the data pushing routines to happen in interval ms
+		setTimeout(dojo.hitch(this, "checkData"), interval||this.sendInterval); 
+	},
+
+	addData: function(dataType, data){
+		// summary:
+		//	add data to the queue. Will be pusshed to the server on the next
+		//	data push
+
+		if (arguments.length>2){
+			var d = [];
+			for(var i=1;i<arguments.length;i++){
+				d.push(arguments[i]);
+			}
+			data = d;
+		}
+
+		this._data.push({plugin: dataType, data: data});
+	},
+
+	checkData: function(){
+		// summary
+		if (this._inTransit){
+			this.schedulePusher(this.inTransitRetry);
+			return;
+		}
+
+		if (this.pushData()){return}
+		this.schedulePusher();
+	},
+
+	pushData: function(){
+		// summary
+		//	pushes data to the server if any exists.  If a push is done, return
+		//	the deferred after hooking up completion callbacks.  If there is no data
+		//	to be pushed, return false;
+		if (this._data.length>0){
+			//clear the queue
+			this._inTransit=this._data;
+			this._data=[];
+			var def;
+			switch(this.sendMethod){
+				case "script":
+					def = dojo.io.script.get({url: this.getQueryPacket(), preventCache: 1, callbackParamName: "callback"});
+					break;
+				case "xhrPost":
+				default:
+					console.info("post send: ", this._inTransit);
+					def = dojo.xhrPost({url:this.dataUrl, content: {id: this._id++, data: dojo.toJson(this._inTransit)}});
+					break;
+			}
+			def.addCallback(this, "onPushComplete");
+			return def;
+		}
+		return false;
+	},
+
+	getQueryPacket: function(){
+		while(true){
+			var content = {id: this._id++, data: dojo.toJson(this._inTransit)};
+
+			//FIXME would like a much better way to get the query down to lenght
+			var query = this.dataUrl + '?' + dojo.objectToQuery(content);
+			if (query.length>this.maxRequestSize){
+				this._data.unshift(this._inTransit.pop());	
+				this._split=1;
+			}else{
+				//console.log("script send: ", this._inTransit, " Remaining in queue: ", this._data.length);
+				return query;
+			}	
+		}
+	},
+
+	onPushComplete: function(results){
+		// summary
+		//	if our data push was successfully, remove the _inTransit data and schedule the next
+		//	parser run.
+		if (this._inTransit){
+			delete this._inTransit;
+		}
+
+		if (this._data.length>0){
+			this.schedulePusher(this.inTransitRetry);
+		} else {
+			this.schedulePusher();
+		}
+	}
+});
+
+//create the analytics  singleton
+dojox.analytics = new dojox.analytics();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/JSON.php
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/JSON.php	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/JSON.php	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,724 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/** 
+ * Converts to and from JSON format.
+ * 
+ * JSON (JavaScript Object Notation) is a lightweight data-interchange
+ * format. It is easy for humans to read and write. It is easy for machines
+ * to parse and generate. It is based on a subset of the JavaScript
+ * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
+ * This feature can also be found in  Python. JSON is a text format that is
+ * completely language independent but uses conventions that are familiar
+ * to programmers of the C-family of languages, including C, C++, C#, Java,
+ * JavaScript, Perl, TCL, and many others. These properties make JSON an
+ * ideal data-interchange language.
+ * 
+ * This package provides a simple encoder and decoder for JSON notation. It
+ * is intended for use with client-side Javascript applications that make
+ * use of HTTPRequest to perform server communication functions - data can
+ * be encoded into JSON notation for use in a client-side javascript, or
+ * decoded from incoming Javascript requests. JSON format is native to
+ * Javascript, and can be directly eval()'ed with no further parsing
+ * overhead
+ *
+ * All strings should be in ASCII or UTF-8 format!
+ *
+ * LICENSE: 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.
+ * 
+ * THIS SOFTWARE IS PROVIDED ``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 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.
+ * 
+ * @category   
+ * @package     Services_JSON
+ * @author      Michal Migurski <mike-json@xxxxxxxxxx>
+ * @author      Matt Knapp <mdknapp[at]gmail[dot]com>
+ * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
+ * @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:
+ *
+ * <code>
+ * // 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);
+ * </code>
+ */
+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

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/dojoxAnalytics.php
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/dojoxAnalytics.php	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/logger/dojoxAnalytics.php	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,31 @@
+<?php
+	require_once("./JSON.php");
+
+	$filename = "./logs/analytics.log";
+	$json = new Services_JSON;
+
+	$id = $_REQUEST["id"];
+	$items = $json->decode($_REQUEST["data"]);
+
+	if (!$handle = fopen($filename, 'a+')) {
+		print '{error: "server error"}';
+		exit;
+	}
+
+	foreach($items as $i=>$item){
+		$item->_analyticsId = $id;
+		$item->_analyticsTimeStamp = time();
+		$log = $json->encode($item) . "\n";
+		fwrite($handle, $log);
+	}
+	
+	fclose($handle);
+
+	$response = "{'eventsRecieved': '" . sizeof($items) . "', 'id': '" . $id . "'}";
+	if ($_REQUEST["callback"]){
+		print $_REQUEST["callback"] . "(" . $response . ");";
+	}else{
+		print $response;
+	}
+	
+?>

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/consoleMessages.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/consoleMessages.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/consoleMessages.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,24 @@
+if(!dojo._hasResource["dojox.analytics.plugins.consoleMessages"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.analytics.plugins.consoleMessages"] = true;
+dojo.provide("dojox.analytics.plugins.consoleMessages");
+
+dojox.analytics.plugins.consoleMessages = new (function(){
+	// summary:
+	//	plugin to have analyitcs return the base info dojo collects
+	this.addData = dojo.hitch(dojox.analytics, "addData", "consoleMessages");
+
+	var lvls = dojo.config["consoleLogFuncs"] || ["error", "warn", "info", "rlog"];
+	if(!console){
+		console={};
+	}
+
+	for(var i=0; i<lvls.length;i++){
+		if (console[lvls[i]]){
+			dojo.connect(console, lvls[i], dojo.hitch(this, "addData", lvls[i]));
+		}else{
+			console[lvls[i]] = dojo.hitch(this, "addData", lvls[i]);	
+		}
+	}
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/dojo.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/dojo.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/dojo.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,22 @@
+if(!dojo._hasResource["dojox.analytics.plugins.dojo"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.analytics.plugins.dojo"] = true;
+dojo.provide("dojox.analytics.plugins.dojo");
+
+dojox.analytics.plugins.dojo = new (function(){
+	// summary:
+	//	plugin to have analyitcs return the base info dojo collects
+	this.addData = dojo.hitch(dojox.analytics, "addData", "dojo");
+	dojo.addOnLoad(dojo.hitch(this, function(){
+		var data = {};
+		for(var i in dojo){
+			if ((i=="version") || ((!dojo.isObject(dojo[i]))&&(i[0]!="_"))){
+				data[i]=dojo[i];
+			}
+		}
+
+		if (dojo.config){data.djConfig=dojo.config}
+		this.addData(data);
+	}));
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/idle.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/idle.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/idle.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,34 @@
+if(!dojo._hasResource["dojox.analytics.plugins.idle"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.analytics.plugins.idle"] = true;
+dojo.provide("dojox.analytics.plugins.idle");
+
+// window startup data
+dojox.analytics.plugins.idle = new (function(){
+	this.addData = dojo.hitch(dojox.analytics, "addData", "idle");
+	this.idleTime=dojo.config["idleTime"] || 60000;
+	this.idle=true;
+
+	this.setIdle = function(){
+		this.addData("isIdle");
+		this.idle=true;
+
+	}
+	
+	dojo.addOnLoad(dojo.hitch(this, function(){
+		var idleResets=["onmousemove","onkeydown","onclick","onscroll"];
+		for (var i=0;i<idleResets.length;i++){
+			dojo.connect(dojo.doc,idleResets[i],this, function(e){ 
+				if (this.idle){
+					this.idle=false;
+					this.addData("isActive");
+					this.idleTimer=setTimeout(dojo.hitch(this,"setIdle"), this.idleTime);
+				}else{
+					clearTimeout(this.idleTimer);
+					this.idleTimer=setTimeout(dojo.hitch(this,"setIdle"), this.idleTime);
+				}
+			});
+		}
+	}));
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/mouseClick.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/mouseClick.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/mouseClick.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,49 @@
+if(!dojo._hasResource["dojox.analytics.plugins.mouseClick"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.analytics.plugins.mouseClick"] = true;
+dojo.provide("dojox.analytics.plugins.mouseClick");
+
+// window startup data
+dojox.analytics.plugins.mouseClick = new (function(){
+	this.addData = dojo.hitch(dojox.analytics, "addData", "mouseClick");
+
+	this.onClick=function(e){
+		this.addData(this.trimEvent(e));
+	}
+	dojo.connect(dojo.doc, "onclick", this, "onClick");
+
+	this.trimEvent=function(e){
+		var t = {};
+		for (var i in e){
+			switch(i){
+				case "target":
+				case "originalTarget":
+				case "explicitOriginalTarget":
+					var props=["id","className","nodeName", "localName","href", "spellcheck", "lang"];
+					t[i]={};
+					for(var j=0;j<props.length;j++){
+						if(e[i][props[j]]){
+							if (props[j]=="text" || props[j]=="textContent"){
+                                                                if ((e[i]["localName"]!="HTML")&&(e[i]["localName"]!="BODY")){
+                                                                        t[i][props[j]]=e[i][props[j]].substr(0,50);
+                                                                }
+                                                        }else{
+                                                                t[i][props[j]]=e[i][props[j]];
+                                                        }
+						}
+					}
+					break;
+				case "clientX":
+				case "clientY":
+				case "pageX":
+				case "pageY":
+				case "screenX":
+				case "screenY":
+					t[i]=e[i];
+					break;
+			}
+		}
+		return t;
+	}
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/mouseOver.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/mouseOver.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/mouseOver.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,90 @@
+if(!dojo._hasResource["dojox.analytics.plugins.mouseOver"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.analytics.plugins.mouseOver"] = true;
+dojo.provide("dojox.analytics.plugins.mouseOver");
+
+dojox.analytics.plugins.mouseOver = new (function(){
+	this.watchMouse = dojo.config["watchMouseOver"] || true;
+	this.mouseSampleDelay = dojo.config["sampleDelay"] || 2500;
+	this.addData = dojo.hitch(dojox.analytics, "addData", "mouseOver");
+	this.targetProps = dojo.config["targetProps"] || ["id","className","localName","href", "spellcheck", "lang", "textContent", "value" ];
+
+	this.toggleWatchMouse=function(){
+		if (this._watchingMouse){
+			dojo.disconnect(this._watchingMouse);
+			delete this._watchingMouse;
+			return;
+		}	
+		dojo.connect(dojo.doc, "onmousemove", this, "sampleMouse");
+	}
+
+	if (this.watchMouse){
+		dojo.connect(dojo.doc, "onmouseover", this, "toggleWatchMouse");	
+		dojo.connect(dojo.doc, "onmouseout", this, "toggleWatchMouse");
+	}
+
+	this.sampleMouse=function(e){
+		if (!this._rateLimited){
+			this.addData("sample",this.trimMouseEvent(e));	
+			this._rateLimited=true;
+			setTimeout(dojo.hitch(this, function(){
+				if (this._rateLimited){
+					//this.addData("sample", this.trimMouseEvent(this._lastMouseEvent));
+					this.trimMouseEvent(this._lastMouseEvent);
+					delete this._lastMouseEvent;
+					delete this._rateLimited;
+				}
+			}), this.mouseSampleDelay);
+		}	
+		this._lastMouseEvent = e;
+		return e;
+	}
+
+	this.trimMouseEvent=function(e){
+		var t = {};
+		for (var i in e){
+			switch(i){
+				//case "currentTarget":
+				case "target":
+				//case "originalTarget":
+				//case "explicitOriginalTarget":
+					var props=this.targetProps;
+					t[i]={};
+					//console.log(e, i, e[i]);
+					for(var j=0;j<props.length;j++){
+						if(dojo.isObject(e[i]) && props[j] in e[i]){
+							 
+							if (props[j]=="text" || props[j]=="textContent"){
+								if (e[i]["localName"] && (e[i]["localName"]!="HTML")&&(e[i]["localName"]!="BODY")){
+									t[i][props[j]]=e[i][props[j]].substr(0,50);
+								}
+							}else{
+								t[i][props[j]]=e[i][props[j]];
+							}
+						}
+					}
+					break;
+				//case "clientX":
+				//case "clientY":
+				//case "pageX":
+				//case "pageY":
+				//case "screenX":
+				//case "screenY":
+				case "x":
+				case "y":
+					if (e[i]) {
+						//console.log("Attempting: " + i);
+						var val = e[i];
+						//console.log("val: " +  val); console.log(i + "e of i: " + val);
+						t[i]=val + '';							
+					}
+					break;
+				default: 
+					//console.log("Skipping: ", i);
+					break;
+			}
+		}
+		return t;
+	}	
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/window.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/window.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/plugins/window.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,34 @@
+if(!dojo._hasResource["dojox.analytics.plugins.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.analytics.plugins.window"] = true;
+dojo.provide("dojox.analytics.plugins.window");
+
+// window startup data
+dojox.analytics.plugins.window = new (function(){
+	this.addData = dojo.hitch(dojox.analytics, "addData", "window");
+	this.windowConnects = dojo.config["windowConnects"] || ["open", "onerror"];
+
+	for(var i=0; i<this.windowConnects.length;i++){
+		dojo.connect(window, this.windowConnects[i], dojo.hitch(this, "addData", this.windowConnects[i]));
+	}
+
+	dojo.addOnLoad(dojo.hitch(this, function(){
+		var data = {};
+		for(var i in window){
+			if (dojo.isObject(window[i])){
+				switch(i){
+					case "location":
+					case "console":
+						data[i]=window[i];	
+						break;
+					default:	
+						break;
+				}
+			}else{
+				data[i]=window[i];
+			}
+		}
+		this.addData(data);
+	}));
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/analytics.profile.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/analytics.profile.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/analytics.profile.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,21 @@
+dependencies = {
+        layers: [
+                {
+			name: "../dojox/analytics.js",
+                        dependencies: [
+                                "dojox.analytics",
+				"dojox.analytics.plugins.dojo",
+				"dojox.analytics.plugins.window",
+				"dojox.analytics.plugins.consoleMessages",
+				"dojox.analytics.plugins.mouseOver",
+				"dojox.analytics.plugins.mouseClick",
+				"dojox.analytics.plugins.idle"
+                        ]
+                }        
+	],
+
+	prefixes: [
+                [ "dojox", "../dojox" ],
+                [ "dijit", "../dijit" ]
+        ]
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/analyticsInBase.profile.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/analyticsInBase.profile.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics/profiles/analyticsInBase.profile.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,22 @@
+dependencies = {
+        layers: [
+                {
+			//name: "../dojox/analytics.js",
+			name: "dojo.js",
+                        dependencies: [
+                                "dojox.analytics",
+				"dojox.analytics.plugins.dojo",
+				"dojox.analytics.plugins.window",
+				"dojox.analytics.plugins.consoleMessages",
+				"dojox.analytics.plugins.mouseOver",
+				"dojox.analytics.plugins.mouseClick",
+				"dojox.analytics.plugins.idle"
+                        ]
+                }        
+	],
+
+	prefixes: [
+                [ "dojox", "../dojox" ],
+                [ "dijit", "../dijit" ]
+        ]
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/analytics.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/analytics.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/analytics.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,16 @@
+if(!dojo._hasResource["dojox.analytics"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.analytics"] = true;
+dojo.provide("dojox.analytics");
+dojo.require("dojox.analytics._base");
+dojo.require("dojo._base.connect");
+dojo.require("dojo._base.Deferred");
+dojo.require("dojo._base.json");
+dojo.require("dojo._base.array");
+dojo.requireIf(dojo.isBrowser, "dojo._base.window");
+dojo.requireIf(dojo.isBrowser, "dojo._base.event");
+dojo.requireIf(dojo.isBrowser, "dojo._base.html");
+dojo.requireIf(dojo.isBrowser, "dojo._base.NodeList");
+dojo.requireIf(dojo.isBrowser, "dojo._base.query");
+dojo.requireIf(dojo.isBrowser, "dojo._base.xhr");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/av/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/av/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/av/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,40 @@
+-------------------------------------------------------------------------------
+DojoX Audio/Video
+-------------------------------------------------------------------------------
+Version 0.1
+Release date: 01/15/2008
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits
+	Tom Trenka (ttrenka AT gmail.com)
+-------------------------------------------------------------------------------
+Project description
+
+DojoX A/V aims to bring audio and video capabilities to the Open Web, first
+by wrapping common media types (Flash and Quicktime) and then by providing
+easy to use objects to accomplish basic A/V tasks.  As of version 0.1, only
+the base is included (Flash and Quicktime embedding mechanisms); in the near
+future, usable objects will appear, both in raw programmatic form and also with
+Dijit-compatible wrappers.
+-------------------------------------------------------------------------------
+Dependencies:
+
+DojoX A/V has no dependencies outside of the Dojo Base.
+-------------------------------------------------------------------------------
+Documentation
+
+TBD.
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/av.js
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/av/*
+
+Install into the following directory structure:
+/dojox/av/
+
+...which should be at the same level as your Dojo checkout.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/av/_base/_ieFlash.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/av/_base/_ieFlash.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/av/_base/_ieFlash.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,17 @@
+// *** Fricking Eolas.  This is here to get around the Eolas issue.  Sigh. ***************
+dojox.av.flash.place = function(node, kwArgs){
+	node=dojo.byId(node);
+	var o = dojox.av.flash.__ie_markup__(kwArgs);
+	if(o){
+		node.innerHTML = o.markup;
+		return window[o.id];
+	}
+	return null;
+}
+if(dojo._initFired){
+	dojox.av.flash.onInitialize();
+} else {
+	dojo.addOnLoad(function(){
+		dojox.av.flash.onInitialize();
+	});
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/av/_base/flash.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/av/_base/flash.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/av/_base/flash.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,186 @@
+if(!dojo._hasResource["dojox.av._base.flash"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.av._base.flash"] = true;
+dojo.provide("dojox.av._base.flash");
+
+(function(){
+	/*******************************************************
+		dojox.av.flash
+
+		Base functionality to insert a flash movie into
+		a document on the fly.
+
+		Support for Flash 6 is dropped in favor of Flash 8;
+		multiple movies are supported.
+	 ******************************************************/
+
+	//	TODO: solve the Eolas problem, the function that actually pushes
+	//		Flash movie into the doc must be loaded from an external script.
+
+	// 	TODO: add Brad's ExpressInstall for automated installation.
+
+	var fMarkup, fVersion, __def__={
+		expressInstall: false,
+		width: 320,
+		height: 240,
+		style: null,
+		redirect: null,
+		params: []
+	};
+	var keyBase="dojox-av-flash-", keyCount=0;
+	function prep(kwArgs){
+		kwArgs=dojo.mixin(dojo.clone(__def__), kwArgs || {});
+		if(!("path" in kwArgs)){
+			console.error("dojox.av._base.flash(ctor):: no path reference to a Flash movie was provided.");
+			return null;
+		}
+		if(!("id" in kwArgs)){
+			kwArgs.id=(keyBase + keyCount++);
+		}
+		return kwArgs;
+	}
+
+	if(dojo.isIE){
+		//	*** Internet Explorer branch ******************************************************************
+		fMarkup=function(kwArgs){
+			kwArgs=prep(kwArgs);
+			if(!kwArgs){ return null; }
+			var s='<object id="' + kwArgs.id + '" '
+				+ 'classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" '
+				+ 'width="' + kwArgs.width + '" '
+				+ 'height="' + kwArgs.height + '"'
+				+ ((kwArgs.style)?' style="' + kwArgs.style + '"':'')
+				+ '>'
+				+ '<param name="movie" value="' + kwArgs.path + '" />';
+			for(var i=0, l=kwArgs.params.length; i<l; i++){
+				s += '<param name="' + kwArgs.params[i].key + '" value="' + kwArgs.params[i].value + '" />';
+			}
+			s += '</object>';
+			return { id: kwArgs.id, markup: s };
+		};
+
+		fVersion=(function(){
+			var testVersion=10, testObj=null;
+			while(!testObj && testVersion > 7){
+				try {
+					testObj = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + testVersion--);
+				} catch(e){ }
+			}
+			if(testObj){
+				var v = testObj.GetVariable("$version").split(" ")[1].split(",");
+				return {
+					major: (v[0]!=null)?parseInt(v[0]):0, 
+					minor: (v[1]!=null)?parseInt(v[1]):0, 
+					rev: (v[2]!=null)?parseInt(v[2]):0 
+				};
+			}
+			return { major: 0, minor: 0, rev: 0 };
+		})();
+
+		//	attach some cleanup for IE, thanks to deconcept :)
+		dojo.addOnUnload(function(){
+			var objs=dojo.query("object");
+			for(var i=objs.length-1; i>=0; i--){
+				objs[i].style.display="none";
+				for(var p in objs[i]){
+					if(p!="FlashVars" && dojo.isFunction(objs[i][p])){
+						objs[i][p]=function(){ };
+					}
+				}
+			}
+		});
+
+		//	TODO: ...and double check this fix; is IE really firing onbeforeunload with any kind of href="#" link?
+		var beforeUnloadHandle = dojo.connect(dojo.global, "onbeforeunload", function(){
+			try{
+				if(__flash_unloadHandler){ __flash_unloadHandler=function(){ }; }
+				if(__flash_savedUnloadHandler){ __flash_savedUnloadHandler=function(){ }; }
+			} catch(e){ }
+			dojo.disconnect(beforeUnloadHandle);
+		});
+	} else {
+		//	*** Sane browsers branch ******************************************************************
+		fMarkup=function(kwArgs){
+			kwArgs=prep(kwArgs);
+			if(!kwArgs){ return null; }
+			var s = '<embed type="application/x-shockwave-flash" '
+				+ 'src="' + kwArgs.path + '" '
+				+ 'id="' + kwArgs.id + '" '
+				+ 'name="' + kwArgs.id + '" '
+				+ 'width="' + kwArgs.width + '" '
+				+ 'height="' + kwArgs.height + '"'
+				+ (("style" in kwArgs)?' style="' + kwArgs.style + '"':'')
+				+ 'swLiveConnect="true" '
+				+ 'allowScriptAccess="sameDomain" '
+				+ 'pluginspage="' + window.location.protocol + '//www.adobe.com/go/getflashplayer" ';
+			for(var i=0, l=kwArgs.params.length; i<l; i++){
+				s += ' ' + kwArgs.params[i].key + '="' + kwArgs.params[i].value + '"';
+			}
+			s += ' />'
+			return { id: kwArgs.id, markup: s };
+		};
+
+		fVersion=(function(){
+			var plugin = navigator.plugins["Shockwave Flash"];
+			if(plugin && plugin.description){
+				var v = plugin.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split(".");
+				return { 
+					major: (v[0]!=null)?parseInt(v[0]):0, 
+					minor: (v[1]!=null)?parseInt(v[1]):0, 
+					rev: (v[2]!=null)?parseInt(v[2]):0 
+				};
+			}
+			return { major: 0, minor: 0, rev: 0 };
+		})();
+	}
+
+	//	*** the static object for inserting Flash movies ******************************************************
+	dojox.av.flash = {
+		minSupported : 8,
+		available: fVersion.major,
+		supported: (fVersion.major >= 8),
+		version: fVersion,
+		initialized: false,
+		onInitialize: function(){
+			dojox.av.flash.initialized=true;
+		},
+		__ie_markup__: function(kwArgs){
+			return fMarkup(kwArgs);
+		}
+	};
+
+	if(dojo.isIE){
+		//	Ugh!
+		if(dojo._initFired){
+			var e=document.createElement("script");
+			e.type="text/javascript";
+			e.src=dojo.moduleUrl("dojox", "av/_base/_ieFlash.js");
+			e.defer=true;
+			document.getElementsByTagName("head")[0].appendChild(e);
+		} else {
+			//	we can use document.write.  What a kludge.
+			document.write('<scr'+'ipt defer type="text/javascript" src="' + dojo.moduleUrl("dojox", "av/_base/_ieFlash.js") + '">'
+				+ '</scr'+'ipt>');
+		}
+	} else {
+		dojox.av.flash.place = function(node, kwArgs){
+			node=dojo.byId(node);
+			var o = fMarkup(kwArgs);
+			if(o){
+				node.innerHTML = o.markup;
+				return document[o.id];
+			}
+			return null;
+		}
+
+		if(dojo._initFired){
+			dojox.av.flash.onInitialize();
+		} else {
+			dojo.addOnLoad(function(){
+				console.log("firing off dojox.av.flash.onInitialize() for sane browsers.");
+				dojox.av.flash.onInitialize();
+			});
+		}
+	}
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/av/_base/quicktime.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/av/_base/quicktime.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/av/_base/quicktime.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,161 @@
+if(!dojo._hasResource["dojox.av._base.quicktime"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.av._base.quicktime"] = true;
+dojo.provide("dojox.av._base.quicktime");
+
+(function(){
+	/*******************************************************
+		dojox.av.quicktime
+
+		Base functionality to insert a QuickTime movie
+		into a document on the fly.
+	 ******************************************************/
+
+	var qtMarkup, qtVersion, installed, __def__={
+		width: 320,
+		height: 240,
+		redirect: null,
+		params: []
+	};
+	var keyBase="dojox-av-quicktime-", keyCount=0;
+
+	//	reference to the test movie we will use for getting QT info from the browser.
+	var testMovieUrl=dojo.moduleUrl("dojox", "av/resources/version.mov");
+
+	//	*** private methods *********************************************************
+	function prep(kwArgs){
+		kwArgs = dojo.mixin(dojo.clone(__def__), kwArgs || {});
+		if(!("path" in kwArgs)){
+			console.error("dojox.av._base.quicktime(ctor):: no path reference to a QuickTime movie was provided.");
+			return null;
+		}
+		if(!("id" in kwArgs)){
+			kwArgs.id=(keyBase + keyCount++);
+		}
+		return kwArgs;
+	}
+	
+	var getQTMarkup = 'This content requires the <a href="http://www.apple.com/quicktime/download/"; title="Download and install QuickTime.">QuickTime plugin</a>.';
+	if(dojo.isIE){
+		installed = (function(){
+			try{
+				var o = new ActiveXObject("QuickTimeCheckObject.QuickTimeCheck.1");
+				if(o!==undefined){
+					return o.IsQuickTimeAvailable(0);
+				}
+			} catch(e){ }
+			return false;
+		})();
+
+		qtMarkup = function(kwArgs){
+			if(!installed){ return { id: null, markup: getQTMarkup }; }
+			
+			kwArgs = prep(kwArgs);
+			if(!kwArgs){ return null; }
+			var s = '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" '
+				+ 'codebase="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"; '
+				+ 'id="' + kwArgs.id + '" '
+				+ 'width="' + kwArgs.width + '" '
+				+ 'height="' + kwArgs.height + '">'
+				+ '<param name="src" value="' + kwArgs.path + '" />';
+			for(var i=0, l=kwArgs.params.length; i<l; i++){
+				s += '<param name="' + kwArgs.params[i].key + '" value="' + kwArgs.params[i].value + '" />';
+			}
+			s += '</object>';
+			return { id: kwArgs.id, markup: s };
+		}
+	} else {
+		installed = (function(){
+			for(var i=0, l=navigator.plugins.length; i<l; i++){
+				if(navigator.plugins[i].name.indexOf("QuickTime")>-1){
+					return true;
+				}
+			}
+			return false;
+		})();
+
+		qtMarkup = function(kwArgs){
+			if(!installed){ return { id: null, markup: getQTMarkup }; }
+
+			kwArgs = prep(kwArgs);
+			if(!kwArgs){ return null; }
+			var s = '<embed type="video/quicktime" src="' + kwArgs.path + '" '
+				+ 'id="' + kwArgs.id + '" '
+				+ 'name="' + kwArgs.id + '" '
+				+ 'pluginspage="www.apple.com/quicktime/download" '
+				+ 'enablejavascript="true" '
+				+ 'width="' + kwArgs.width + '" '
+				+ 'height="' + kwArgs.height + '"';
+			for(var i=0, l=kwArgs.params.length; i<l; i++){
+				s += ' ' + kwArgs.params[i].key + '="' + kwArgs.params[i].value + '"';
+			}
+			s += '></embed>';
+			return { id: kwArgs.id, markup: s };
+		}
+	}
+	
+	qtVersion = { major: 0, minor: 0, rev: 0 };
+
+	// *** This is an offical kludge, but it seems to work everywhere.  Sigh. *************************
+	dojo.addOnLoad(function(){
+		var n = document.createElement("div");
+		n.style.cssText = "top:0;left:0;width:1px;height:1px;overflow:hidden;position:absolute;";
+		var o = qtMarkup({ path: testMovieUrl, width:4, height:4 });
+
+		document.body.appendChild(n);
+		n.innerHTML = o.markup;
+		var qt = (dojo.isIE) ? dojo.byId(o.id) : document[o.id]; 
+		
+		//	Let Safari and IE have a moment to init the QT object before trying to query it.
+		setTimeout(function(){
+			var v = [ 0, 0, 0 ];
+			if(qt){
+				try {
+					v = qt.GetQuickTimeVersion().split(".");
+					qtVersion = { major: parseInt(v[0]||0), minor: parseInt(v[1]||0), rev: parseInt(v[2]||0) };
+				} catch(e){ 
+					qtVersion = { major: 0, minor: 0, rev: 0 };
+				}
+			}
+
+			dojox.av.quicktime.supported = v[0];
+			dojox.av.quicktime.version = qtVersion;
+			if(dojox.av.quicktime.supported){
+				dojox.av.quicktime.onInitialize();
+			}
+
+			//	fricking IE.  gonna end up leaving the movie in the doc, for some
+			//		reason getting an unspecified error when trying to remove it.
+			if(!dojo.isIE){
+				document.body.removeChild(n);
+			} else {
+				//	move it out of the way.
+				n.style.top = "-10000px";
+				n.style.visibility="hidden";
+			}
+		}, 10);
+	});
+	
+	//	*** The public interface. ****************************************************************
+	dojox.av.quicktime={
+		minSupported: 6,
+		available: installed,
+		supported: installed,
+		version: qtVersion,
+		initialized: false,
+		onInitialize: function(){ dojox.av.quicktime.initialized = true; },	//	stub function to let you know when this is ready
+
+		place: function(/* DOMElement */node, /* Object */kwArgs){
+			node = dojo.byId(node);
+			var o = qtMarkup(kwArgs);
+			if(o){
+				node.innerHTML = o.markup;
+				if(o.id){
+					return (dojo.isIE)? dojo.byId(o.id) : document[o.id];	//	QuickTimeObject
+				}
+			}
+			return null;	//	QuickTimeObject
+		}
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/av/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/av/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/av/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,8 @@
+if(!dojo._hasResource["dojox.av._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.av._base"] = true;
+dojo.provide("dojox.av._base");
+
+dojo.require("dojox.av._base.flash");
+dojo.require("dojox.av._base.quicktime");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/av/resources/version.mov
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/av/resources/version.mov
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/av.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/av.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/av.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+if(!dojo._hasResource["dojox.av"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.av"] = true;
+dojo.provide("dojox.av");
+
+dojo.require("dojox.av._base");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/Chart2D.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/Chart2D.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/Chart2D.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,341 @@
+if(!dojo._hasResource["dojox.charting.Chart2D"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.Chart2D"] = true;
+dojo.provide("dojox.charting.Chart2D");
+
+dojo.require("dojox.gfx");
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.fold");
+dojo.require("dojox.lang.functional.reversed");
+
+dojo.require("dojox.charting.Theme");
+dojo.require("dojox.charting.Series");
+
+dojo.require("dojox.charting.axis2d.Default");
+
+dojo.require("dojox.charting.plot2d.Default");
+dojo.require("dojox.charting.plot2d.Lines");
+dojo.require("dojox.charting.plot2d.Areas");
+dojo.require("dojox.charting.plot2d.Markers");
+dojo.require("dojox.charting.plot2d.MarkersOnly");
+dojo.require("dojox.charting.plot2d.Scatter");
+dojo.require("dojox.charting.plot2d.Stacked");
+dojo.require("dojox.charting.plot2d.StackedLines");
+dojo.require("dojox.charting.plot2d.StackedAreas");
+dojo.require("dojox.charting.plot2d.Columns");
+dojo.require("dojox.charting.plot2d.StackedColumns");
+dojo.require("dojox.charting.plot2d.ClusteredColumns");
+dojo.require("dojox.charting.plot2d.Bars");
+dojo.require("dojox.charting.plot2d.StackedBars");
+dojo.require("dojox.charting.plot2d.ClusteredBars");
+dojo.require("dojox.charting.plot2d.Grid");
+dojo.require("dojox.charting.plot2d.Pie");
+
+(function(){
+	var df = dojox.lang.functional, dc = dojox.charting, 
+		clear = df.lambda("item.clear()"), 
+		purge = df.lambda("item.purgeGroup()"),
+		destroy = df.lambda("item.destroy()"),
+		makeClean = df.lambda("item.dirty = false"),
+		makeDirty = df.lambda("item.dirty = true");
+		
+	dojo.declare("dojox.charting.Chart2D", null, {
+		constructor: function(node, kwArgs){
+			// initialize parameters
+			if(!kwArgs){ kwArgs = {}; }
+			this.margins = kwArgs.margins ? kwArgs.margins : {l: 10, t: 10, r: 10, b: 10};
+			this.stroke  = kwArgs.stroke;
+			this.fill    = kwArgs.fill;
+			
+			// default initialization
+			this.theme = null;
+			this.axes = {};		// map of axes
+			this.stack = [];	// stack of plotters
+			this.plots = {};	// map of plotter indices
+			this.series = [];	// stack of data runs
+			this.runs = {};		// map of data run indices
+			this.dirty = true;
+			this.coords = null;
+			
+			// create a surface
+			this.node = dojo.byId(node);
+			var box = dojo.marginBox(node);
+			this.surface = dojox.gfx.createSurface(this.node, box.w, box.h);
+		},
+		destroy: function(){
+			dojo.forEach(this.series, destroy);
+			dojo.forEach(this.stack,  destroy);
+			df.forIn(this.axes, destroy);
+		},
+		getCoords: function(){
+			if(!this.coords){
+				this.coords = dojo.coords(this.node, true);
+			}
+			return this.coords;
+		},
+		setTheme: function(theme){
+			this.theme = theme;
+			this.dirty = true;
+			return this;
+		},
+		addAxis: function(name, kwArgs){
+			var axis;
+			if(!kwArgs || !("type" in kwArgs)){
+				axis = new dc.axis2d.Default(this, kwArgs);
+			}else{
+				axis = typeof kwArgs.type == "string" ?
+					new dc.axis2d[kwArgs.type](this, kwArgs) :
+					new kwArgs.type(this, kwArgs);
+			}
+			axis.name = name;
+			axis.dirty = true;
+			if(name in this.axes){
+				this.axes[name].destroy();
+			}
+			this.axes[name] = axis;
+			this.dirty = true;
+			return this;
+		},
+		addPlot: function(name, kwArgs){
+			var plot;
+			if(!kwArgs || !("type" in kwArgs)){
+				plot = new dc.plot2d.Default(this, kwArgs);
+			}else{
+				plot = typeof kwArgs.type == "string" ?
+					new dc.plot2d[kwArgs.type](this, kwArgs) :
+					new kwArgs.type(this, kwArgs);
+			}
+			plot.name = name;
+			plot.dirty = true;
+			if(name in this.plots){
+				this.stack[this.plots[name]].destroy();
+				this.stack[this.plots[name]] = plot;
+			}else{
+				this.plots[name] = this.stack.length;
+				this.stack.push(plot);
+			}
+			this.dirty = true;
+			return this;
+		},
+		addSeries: function(name, data, kwArgs){
+			var run = new dc.Series(this, data, kwArgs);
+			if(name in this.runs){
+				this.series[this.runs[name]].destroy();
+				this.series[this.runs[name]] = run;
+			}else{
+				this.runs[name] = this.series.length;
+				this.series.push(run);
+			}
+			this.dirty = true;
+			// fix min/max
+			if(!("ymin" in run) && "min" in run){ run.ymin = run.min; }
+			if(!("ymax" in run) && "max" in run){ run.ymax = run.max; }
+			return this;
+		},
+		updateSeries: function(name, data){
+			if(name in this.runs){
+				var run = this.series[this.runs[name]],
+					plot = this.stack[this.plots[run.plot]], axis;
+				run.data = data;
+				run.dirty = true;
+				// check to see if axes and plot should be updated
+				if(plot.hAxis){
+					axis = this.axes[plot.hAxis];
+					if(axis.dependOnData()){
+						axis.dirty = true;
+						// find all plots and mark them dirty
+						dojo.forEach(this.stack, function(p){
+							if(p.hAxis && p.hAxis == plot.hAxis){
+								p.dirty = true;
+							}
+						});
+					}
+				}else{
+					plot.dirty = true;
+				}
+				if(plot.vAxis){
+					axis = this.axes[plot.vAxis];
+					if(axis.dependOnData()){
+						axis.dirty = true;
+						// find all plots and mark them dirty
+						dojo.forEach(this.stack, function(p){
+							if(p.vAxis && p.vAxis == plot.vAxis){
+								p.dirty = true;
+							}
+						});
+					}
+				}else{
+					plot.dirty = true;
+				}
+			}
+			return this;
+		},
+		resize: function(width, height){
+			var box;
+			switch(arguments.length){
+				case 0:
+					box = dojo.marginBox(this.node);
+					break;
+				case 1: 
+					box = width;
+					break;
+				default:
+					box = {w: width, h: height};
+					break;
+			}
+			dojo.marginBox(this.node, box);
+			this.surface.setDimensions(box.w, box.h);
+			this.dirty = true;
+			this.coords = null;
+			return this.render();
+		},
+		render: function(){
+			if(this.dirty){
+				return this.fullRender();
+			}
+			
+			// calculate geometry
+			dojo.forEach(this.stack, function(plot){
+				if(plot.dirty || (plot.hAxis && this.axes[plot.hAxis].dirty) ||
+						(plot.vAxis && this.axes[plot.vAxis].dirty)){
+					plot.calculateAxes(this.plotArea);
+				}
+			}, this);
+
+			// go over the stack backwards
+			df.forEachRev(this.stack, function(plot){ plot.render(this.dim, this.offsets); }, this);
+			
+			// go over axes
+			df.forIn(this.axes, function(axis){ axis.render(this.dim, this.offsets); }, this);
+
+			this._makeClean();
+
+			// BEGIN FOR HTML CANVAS 
+			if(this.surface.render){ this.surface.render(); };	
+			// END FOR HTML CANVAS
+			
+			return this;
+		},
+		fullRender: function(){
+			this._makeDirty();
+			
+			// clear old values
+			dojo.forEach(this.stack,  clear);
+			dojo.forEach(this.series, purge);
+			df.forIn(this.axes, purge);
+			dojo.forEach(this.stack,  purge);
+			this.surface.clear();
+			
+			// rebuild new connections, and add defaults
+			
+			// assign series
+			dojo.forEach(this.series, function(run){
+				if(!(run.plot in this.plots)){
+					var plot = new dc.plot2d.Default(this, {});
+					plot.name = run.plot;
+					this.plots[run.plot] = this.stack.length;
+					this.stack.push(plot);
+				}
+				this.stack[this.plots[run.plot]].addSeries(run);
+			}, this);
+			// assign axes
+			dojo.forEach(this.stack, function(plot){
+				if(plot.hAxis){
+					plot.setAxis(this.axes[plot.hAxis]);
+				}
+				if(plot.vAxis){
+					plot.setAxis(this.axes[plot.vAxis]);
+				}
+			}, this);
+			// set up a theme
+			if(!this.theme){
+				this.theme = new dojox.charting.Theme(dojox.charting._def);
+			}
+			var requiredColors = df.foldl(this.stack, "z + plot.getRequiredColors()", 0);
+			this.theme.defineColors({num: requiredColors, cache: false});
+			
+			// calculate geometry
+			
+			// 1st pass
+			var dim = this.dim = this.surface.getDimensions();
+			dim.width  = dojox.gfx.normalizedLength(dim.width);
+			dim.height = dojox.gfx.normalizedLength(dim.height);
+			df.forIn(this.axes, clear);
+			dojo.forEach(this.stack, function(plot){ plot.calculateAxes(dim); });
+			
+			// assumption: we don't have stacked axes yet
+			var offsets = this.offsets = {l: 0, r: 0, t: 0, b: 0};
+			df.forIn(this.axes, function(axis){
+				df.forIn(axis.getOffsets(), function(o, i){ offsets[i] += o; });
+			});
+			// add margins
+			df.forIn(this.margins, function(o, i){ offsets[i] += o; });
+			
+			// 2nd pass with realistic dimensions
+			this.plotArea = {width: dim.width - offsets.l - offsets.r, height: dim.height - offsets.t - offsets.b};
+			df.forIn(this.axes, clear);
+			dojo.forEach(this.stack, function(plot){ plot.calculateAxes(this.plotArea); }, this);
+			
+			// generate shapes
+			
+			// draw a chart background
+			var t = this.theme,
+				fill   = this.fill   ? this.fill   : (t.chart && t.chart.fill),
+				stroke = this.stroke ? this.stroke : (t.chart && t.chart.stroke);
+			if(fill){
+				this.surface.createRect({
+					width:  dim.width, 
+					height: dim.height
+				}).setFill(fill);
+			}
+			if(stroke){
+				this.surface.createRect({
+					width:  dim.width - 1, 
+					height: dim.height - 1
+				}).setStroke(stroke);
+			}
+			// draw a plot background
+			fill   = t.plotarea && t.plotarea.fill;
+			stroke = t.plotarea && t.plotarea.stroke;
+			if(fill){
+				this.surface.createRect({
+					x: offsets.l, y: offsets.t,
+					width:  dim.width  - offsets.l - offsets.r, 
+					height: dim.height - offsets.t - offsets.b
+				}).setFill(fill);
+			}
+			if(stroke){
+				this.surface.createRect({
+					x: offsets.l, y: offsets.t,
+					width:  dim.width  - offsets.l - offsets.r - 1, 
+					height: dim.height - offsets.t - offsets.b - 1
+				}).setStroke(stroke);
+			}
+			
+			// go over the stack backwards
+			df.foldr(this.stack, function(z, plot){ return plot.render(dim, offsets), 0; }, 0);
+			
+			// go over axes
+			df.forIn(this.axes, function(axis){ axis.render(dim, offsets); });
+			
+			this._makeClean();
+			
+			return this;
+		},
+		_makeClean: function(){
+			// reset dirty flags
+			dojo.forEach(this.axes,   makeClean);
+			dojo.forEach(this.stack,  makeClean);
+			dojo.forEach(this.series, makeClean);
+			this.dirty = false;
+		},
+		_makeDirty: function(){
+			// reset dirty flags
+			dojo.forEach(this.axes,   makeDirty);
+			dojo.forEach(this.stack,  makeDirty);
+			dojo.forEach(this.series, makeDirty);
+			this.dirty = true;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/Chart3D.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/Chart3D.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/Chart3D.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,86 @@
+if(!dojo._hasResource["dojox.charting.Chart3D"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.Chart3D"] = true;
+dojo.provide("dojox.charting.Chart3D");
+
+dojo.require("dojox.gfx3d");
+
+(function(){
+	var observerVector = {x: 0, y: 0, z: 1}, v = dojox.gfx3d.vector, n = dojox.gfx.normalizedLength;
+
+	dojo.declare("dojox.charting.Chart3D", null, {
+		constructor: function(node, lights, camera, theme){
+			// setup a view
+			this.node = dojo.byId(node);
+			this.surface = dojox.gfx.createSurface(this.node, n(this.node.style.width), n(this.node.style.height));
+			this.view = this.surface.createViewport();
+			this.view.setLights(lights.lights, lights.ambient, lights.specular);
+			this.view.setCameraTransform(camera);
+			this.theme = theme;
+			
+			// initialize internal variables
+			this.walls = [];
+			this.plots = [];
+		},
+		
+		// public API
+		generate: function(){
+			return this._generateWalls()._generatePlots();
+		},
+		invalidate: function(){
+			this.view.invalidate();
+			return this;
+		},
+		render: function(){
+			this.view.render();
+			return this;
+		},
+		addPlot: function(plot){
+			return this._add(this.plots, plot);
+		},
+		removePlot: function(plot){
+			return this._remove(this.plots, plot);
+		},
+		addWall: function(wall){
+			return this._add(this.walls, wall);
+		},
+		removeWall: function(wall){
+			return this._remove(this.walls, wall);
+		},
+		
+		// internal API
+		_add: function(array, item){
+			if(!dojo.some(array, function(i){ return i == item; })){
+				array.push(item);
+				this.view.invalidate();
+			}
+			return this;
+		},
+		_remove: function(array, item){
+			var a = dojo.filter(array, function(i){ return i != item; });
+			return a.length < array.length ? (array = a, this.invalidate()) : this;
+		},
+		_generateWalls: function(){
+			for(var i = 0; i < this.walls.length; ++i){
+				if(v.dotProduct(observerVector, this.walls[i].normal) > 0){
+					this.walls[i].generate(this);
+				}
+			}
+			return this;
+		},
+		_generatePlots: function(){
+			var depth = 0, m = dojox.gfx3d.matrix, i = 0;
+			for(; i < this.plots.length; ++i){
+				depth += this.plots[i].getDepth();
+			}
+			for(--i; i >= 0; --i){
+				var scene = this.view.createScene();
+				scene.setTransform(m.translate(0, 0, -depth));
+				this.plots[i].generate(this, scene);
+				depth -= this.plots[i].getDepth();
+			}
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/Element.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/Element.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/Element.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,49 @@
+if(!dojo._hasResource["dojox.charting.Element"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.Element"] = true;
+dojo.provide("dojox.charting.Element");
+
+dojo.declare("dojox.charting.Element", null, {
+	constructor: function(chart){
+		this.chart = chart;
+		this.group = null;
+		this.htmlElements = [];
+		this.dirty = true;
+	},
+	createGroup: function(creator){
+		if(!creator){ creator = this.chart.surface; }
+		if(!this.group){
+			this.group = creator.createGroup();
+		}
+		return this;
+	},
+	purgeGroup: function(){
+		this.destroyHtmlElements();
+		if(this.group){
+			this.group.clear();
+			this.group.removeShape();
+			this.group = null;
+		}
+		this.dirty = true;
+		return this;
+	},
+	cleanGroup: function(creator){
+		this.destroyHtmlElements();
+		if(!creator){ creator = this.chart.surface; }
+		if(this.group){
+			this.group.clear();
+		}else{
+			this.group = creator.createGroup();
+		}
+		this.dirty = true;
+		return this;
+	},
+	destroyHtmlElements: function(){
+		dojo.forEach(this.htmlElements, dojo._destroyElement);
+		this.htmlElements = [];
+	},
+	destroy: function(){
+		this.purgeGroup();
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,31 @@
+-------------------------------------------------------------------------------
+dojox.charting
+-------------------------------------------------------------------------------
+Version 0.800
+Release date: 10/31/2007
+-------------------------------------------------------------------------------
+Project state:
+beta
+-------------------------------------------------------------------------------
+Credits
+	Tom Trenka (ttrenka@xxxxxxxxx)
+	Eugene Lazutkin (eugene.lazutkin@xxxxxxxxx)
+-------------------------------------------------------------------------------
+Project description
+
+Implementation of simple charting library based on dojox.gfx/dojox.gfx3d.
+-------------------------------------------------------------------------------
+Dependencies:
+
+Dojo Core, dojox.gfx, dojox.gfx3d, dojox.lang.
+-------------------------------------------------------------------------------
+Documentation
+
+Not ready yet.
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/Series.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/Series.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/Series.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,20 @@
+if(!dojo._hasResource["dojox.charting.Series"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.Series"] = true;
+dojo.provide("dojox.charting.Series");
+
+dojo.require("dojox.charting.Element");
+
+dojo.declare("dojox.charting.Series", dojox.charting.Element, {
+	constructor: function(chart, data, kwArgs){
+		dojo.mixin(this, kwArgs);
+		if(typeof this.plot != "string"){ this.plot = "default"; }
+		this.data = data;
+		this.dirty = true;
+		this.clear();
+	},
+	clear: function(){
+		this.dyn = {};
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/Theme.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/Theme.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/Theme.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,256 @@
+if(!dojo._hasResource["dojox.charting.Theme"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.Theme"] = true;
+dojo.provide("dojox.charting.Theme");
+dojo.require("dojox.charting._color");
+
+(function(){
+	var dxc=dojox.charting;
+	//	TODO: Legend information
+
+	dxc.Theme = function(/*Object?*/ kwArgs){
+		kwArgs=kwArgs||{};
+		var def = dxc.Theme._def;
+		dojo.forEach(["chart", "plotarea", "axis", "series", "marker"], function(n){
+			this[n] = dojo.mixin(dojo.clone(def[n]), kwArgs[n]||{});
+		}, this);
+		this.markers = dojo.mixin(dojo.clone(dxc.Theme.Markers), kwArgs.markers||{});
+		this.colors = [];
+		this.antiAlias = ("antiAlias" in kwArgs)?kwArgs.antiAlias:true;
+		this.assignColors = ("assignColors" in kwArgs)?kwArgs.assignColors:true;
+		this.assignMarkers = ("assignMarkers" in kwArgs)?kwArgs.assignMarkers:true;
+		this._colorCache = null;
+
+		//	push the colors, use _def colors if none passed.
+		kwArgs.colors = kwArgs.colors||def.colors;
+		dojo.forEach(kwArgs.colors, function(item){ 
+			this.colors.push(item); 
+		}, this);
+
+		//	private variables for color and marker indexing
+		this._current = { color:0, marker: 0 };
+		this._markers = [];
+		this._buildMarkerArray();
+	};
+
+	//	"static" fields
+	//	default markers.
+	//	A marker is defined by an SVG path segment; it should be defined as
+	//		relative motion, and with the assumption that the path segment
+	//		will be moved to the value point (i.e prepend Mx,y)
+	dxc.Theme.Markers={
+		CIRCLE:		"m-3,0 c0,-4 6,-4 6,0 m-6,0 c0,4 6,4 6,0", 
+		SQUARE:		"m-3,-3 l0,6 6,0 0,-6 z", 
+		DIAMOND:	"m0,-3 l3,3 -3,3 -3,-3 z", 
+		CROSS:		"m0,-3 l0,6 m-3,-3 l6,0", 
+		X:			"m-3,-3 l6,6 m0,-6 l-6,6", 
+		TRIANGLE:	"m-3,3 l3,-6 3,6 z", 
+		TRIANGLE_INVERTED:"m-3,-3 l3,6 3,-6 z"
+	};
+	dxc.Theme._def={
+		//	all objects are structs used directly in dojox.gfx
+		chart:{ 
+			stroke:null,
+			fill: "white"
+		},
+		plotarea:{ 
+			stroke:null,
+			fill: "white"
+		},
+		//	TODO: label rotation on axis
+		axis:{
+			stroke:	{ //	the axis itself
+				color:"#333",
+				width:1
+			},
+			line:	{ //	gridlines
+				color:"#ccc",
+				width:1,
+				style:"Dot",
+				cap:"round"
+			},
+			majorTick:	{ //	major ticks on axis
+				color:"#666",
+				width:1, 
+				length:6, 
+				position:"center"
+			},
+			minorTick:	{ //	minor ticks on axis
+				color:"#666", 
+				width:0.8, 
+				length:3, 
+				position:"center"
+			},	
+			font: "normal normal normal 7pt Tahoma", //	labels on axis
+			fontColor:"#333"						//	color of labels
+		},
+		series:{
+			outline: {width: 0.1, color: "#ccc"},							//	line or outline
+			stroke: {width: 1.5, color: "#333"},							//	line or outline
+			fill: "#ccc",												//	fill, if appropriate
+			font: "normal normal normal 7pt Tahoma",					//	if there's a label
+			fontColor: "#000"											// 	color of labels
+		},
+		marker:{	//	any markers on a series.
+			stroke: {width:1},											//	stroke or outline
+			fill: "#333",												//	fill if needed
+			font: "normal normal normal 7pt Tahoma",					//	label
+			fontColor: "#000"
+		},
+		colors:[
+			"#000","#111","#222","#333",
+			"#444","#555","#666","#777",
+			"#888","#999","#aaa","#bbb",
+			"#ccc"
+		]
+	};
+	
+	//	prototype methods
+	dojo.extend(dxc.Theme, {
+		defineColors: function(obj){
+			//	summary:
+			//		Generate a set of colors for the theme based on keyword
+			//		arguments
+			var kwArgs=obj||{};
+
+			//	deal with caching
+			var cache = false;
+			if(kwArgs.cache === undefined){ cache = true; }
+			if(kwArgs.cache == true){ cache = true; }
+			
+			if(cache){
+				this._colorCache=kwArgs;
+			} else {
+				var mix=this._colorCache||{};
+				kwArgs=dojo.mixin(dojo.clone(mix), kwArgs);
+			}
+
+			var c=[], n=kwArgs.num||32;	//	the number of colors to generate
+			if(kwArgs.colors){
+				//	we have an array of colors predefined, so fix for the number of series.
+				var l=kwArgs.colors.length;
+				for(var i=0; i<n; i++){
+					c.push(kwArgs.colors[i%l]);
+				}
+				this.colors=c;
+			}else if(kwArgs.hue){
+				//	single hue, generate a set based on brightness
+				var s=kwArgs.saturation||100;	//	saturation
+				var st=kwArgs.low||30;
+				var end=kwArgs.high||90;
+				var step=(end-st)/n;			//	brightness steps
+				for(var i=0; i<n; i++){
+					c.push(dxc._color.fromHsb(kwArgs.hue, s, st+(step*i)).toHex());
+				}
+				this.colors=c;
+			}else if(kwArgs.stops){
+				//	create color ranges that are either equally distributed, or
+				//	(optionally) based on a passed "offset" property.  If you
+				//	pass an array of Colors, it will equally distribute, if
+				//	you pass an array of structs { color, offset }, it will
+				//	use the offset (0.0 - 1.0) to distribute.  Note that offset
+				//	values should be plotted on a line from 0.0 to 1.0--i.e.
+				//	they should be additive.  For example:
+				//	[ {color, offset:0}, { color, offset:0.2 }, { color, offset:0.5 }, { color, offset:1.0 } ]
+				//	
+				//	If you use stops for colors, you MUST have a color at 0.0 and one
+				//	at 1.0.
+			
+				//	figure out how many stops we have
+				var l=kwArgs.stops.length;
+				if(l<2){
+					throw new Error(
+						"dojox.charting.Theme::defineColors: when using stops to "
+						+ "define a color range, you MUST specify at least 2 colors."
+					);
+				}
+
+				//	figure out if the distribution is equal or not.  Note that
+				//	colors may not exactly match the stops you define; because
+				//	color generation is linear (i.e. evenly divided on a linear
+				//	axis), it's very possible that a color will land in between
+				//	two stops and not exactly *at* a stop.
+				//
+				//	The only two colors guaranteed will be the end stops (i.e.
+				//	the first and last stop), which will *always* be set as
+				//	the end stops.
+				if(typeof(kwArgs.stops[0].offset) == "undefined"){ 
+					//	set up equal offsets
+					var off=1/(l-1);
+					for(var i=0; i<l; i++){
+						kwArgs.stops[i]={
+							color:kwArgs.stops[i],
+							offset:off*i
+						};
+					}
+				}
+				//	ensure the ends.
+				kwArgs.stops[0].offset=0;
+				kwArgs.stops[l-1].offset=1;
+				kwArgs.stops.sort(function(a,b){ return a.offset-b.offset; });
+
+				//	create the colors.
+				//	first stop.
+				c.push(kwArgs.stops[0].color.toHex());
+
+				//	TODO: calculate the blend at n/steps and set the color
+
+				//	last stop
+				c.push(kwArgs.stops[l-1].color.toHex());
+				this.colors=c;
+			}
+		},
+	
+		_buildMarkerArray: function(){
+			this._markers = [];
+			for(var p in this.markers){ this._markers.push(this.markers[p]); }
+			//	reset the position
+			this._current.marker=0;
+		},
+
+		addMarker:function(/*String*/ name, /*String*/ segment){
+			//	summary:
+			//		Add a custom marker to this theme.
+			//	example:
+			//	|	myTheme.addMarker("Ellipse", foo);
+			this.markers[name]=segment;
+			this._buildMarkerArray();
+		},
+		setMarkers:function(/*Object*/ obj){
+			//	summary:
+			//		Set all the markers of this theme at once.  obj should be a
+			//		dictionary of keys and path segments.
+			//
+			//	example:
+			//	|	myTheme.setMarkers({ "CIRCLE": foo });
+			this.markers=obj;
+			this._buildMarkerArray();
+		},
+
+		next: function(/*String?*/ type){
+			//	summary:
+			//		get either the next color or the next marker, depending on
+			//		what was passed. If type is not passed, it assumes color.
+			//	type:
+			//		Optional. One of either "color" or "marker". Defaults to
+			//		"color".
+			//	example:
+			//	|	var color = myTheme.next();
+			//	|	var color = myTheme.next("color");
+			//	|	var marker = myTheme.next("marker");
+			if(type == "marker"){
+				return this._markers[ this._current.marker++ % this._markers.length ];
+			}else{
+				return this.colors[ this._current.color++ % this.colors.length ];
+			}
+		},
+		clear: function(){
+			// summary:
+			//		resets both marker and color counters back to the start.
+			//		Subsequent calls to `next` will retrievie the first value
+			//		of each depending on the passed type.
+			this._current = {color: 0, marker: 0};
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/_color.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/_color.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/_color.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,62 @@
+if(!dojo._hasResource["dojox.charting._color"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting._color"] = true;
+dojo.provide("dojox.charting._color");
+
+dojox.charting._color={};
+dojox.charting._color.fromHsb=function(/* int */hue, /* int */saturation, /* int */brightness){
+	//	summary
+	//	Creates an instance of dojo.Color based on HSB input (360, %, %)
+	hue=Math.round(hue);
+	saturation=Math.round((saturation/100)*255); 
+	brightness=Math.round((brightness/100)*255);
+
+	var r, g, b;
+	if(saturation==0){
+		r=g=b=brightness;
+	} else {
+		var tint1=brightness, 
+			tint2=(255-saturation)*brightness/255, 
+			tint3=(tint1-tint2)*(hue%60)/60;
+		if(hue<60){ r=tint1, g=tint2+tint3, b=tint2; }
+		else if(hue<120){ r=tint1-tint3, g=tint1, b=tint2; }
+		else if(hue<180){ r=tint2, g=tint1, b=tint2+tint3; }
+		else if(hue<240){ r=tint2, g=tint1-tint3, b=tint1; }
+		else if(hue<300){ r=tint2+tint3, g=tint2, b=tint1; }
+		else if(hue<360){ r=tint1, g=tint2, b=tint1-tint3; }
+	}
+
+	r=Math.round(r); g=Math.round(g); b=Math.round(b);
+	return new dojo.Color({ r:r, g:g, b:b });
+};
+
+dojox.charting._color.toHsb=function(/* int|Object|dojo.Color */ red, /* int? */ green, /* int? */blue){
+	//	summary
+	//	Returns the color in HSB representation (360, %, %)
+	var r=red,g=green,b=blue;
+	if(dojo.isObject(red)){
+		r=red.r,g=red.g,b=red.b;
+	}
+	var min=Math.min(r,g,b);
+	var max=Math.max(r,g,b);
+	var delta=max-min;
+
+	var hue=0, saturation=(max!=0?delta/max:0), brightness=max/255;
+	if(saturation==0){ hue=0; }
+	else {
+		if(r==max){ hue=((max-b)/delta)-((max-g)/delta); }
+		else if(g==max){ hue=2+(((max-r)/delta)-((max-b)/delta)); }
+		else { hue=4+(((max-g)/delta)-((max-r)/delta)); }
+		hue/=6;
+		if(hue<0) hue++;
+	}
+	
+	hue=Math.round(hue*360);
+	saturation=Math.round(saturation*100);
+	brightness=Math.round(brightness*100);
+	return { 
+		h:hue, s:saturation, b:brightness,
+		hue:hue, saturation:saturation, brightness:brightness
+	};	//	Object
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/Base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/Base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/Base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,31 @@
+if(!dojo._hasResource["dojox.charting.axis2d.Base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.axis2d.Base"] = true;
+dojo.provide("dojox.charting.axis2d.Base");
+
+dojo.require("dojox.charting.Element");
+
+dojo.declare("dojox.charting.axis2d.Base", dojox.charting.Element, {
+	constructor: function(chart, kwArgs){
+		this.vertical = kwArgs && kwArgs.vertical;
+	},
+	clear: function(){
+		return this;
+	},
+	initialized: function(){
+		return false;
+	},
+	calculate: function(min, max, span){
+		return this;
+	},
+	getScaler: function(){
+		return null;
+	},
+	getOffsets: function(){
+		return {l: 0, r: 0, t: 0, b: 0};
+	},
+	render: function(dim, offsets){
+		return this;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/Default.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/Default.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/Default.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,323 @@
+if(!dojo._hasResource["dojox.charting.axis2d.Default"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.axis2d.Default"] = true;
+dojo.provide("dojox.charting.axis2d.Default");
+
+dojo.require("dojox.charting.scaler");
+dojo.require("dojox.charting.axis2d.common");
+dojo.require("dojox.charting.axis2d.Base");
+
+dojo.require("dojo.colors");
+dojo.require("dojox.gfx");
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.utils");
+
+(function(){
+	var dc = dojox.charting, 
+		df = dojox.lang.functional, 
+		du = dojox.lang.utils, 
+		g = dojox.gfx,
+		labelGap = 4;	// in pixels
+		
+	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
+	};
+
+	dojo.declare("dojox.charting.axis2d.Default", dojox.charting.axis2d.Base, {
+		 defaultParams: {
+			vertical:    false,		// true for vertical axis
+			fixUpper:    "none",	// align the upper on ticks: "major", "minor", "micro", "none"
+			fixLower:    "none",	// align the lower on ticks: "major", "minor", "micro", "none"
+			natural:     false,		// all tick marks should be made on natural numbers
+			leftBottom:  true,		// position of the axis, used with "vertical"
+			includeZero: false,		// 0 should be included
+			fixed:       true,		// all labels are fixed numbers
+			majorLabels: true,		// draw major labels
+			minorTicks:  true,		// draw minor ticks
+			minorLabels: true,		// draw minor labels
+			microTicks:  false,		// draw micro ticks
+			htmlLabels:  true		// use HTML to draw labels
+		},
+		optionalParams: {
+			"min":           0,		// minimal value on this axis
+			"max":           1,		// maximal value on this axis
+			"majorTickStep": 4,		// major tick step
+			"minorTickStep": 2,		// minor tick step
+			"microTickStep": 1,		// micro tick step
+			"labels":        [],	// array of labels for major ticks
+									// with corresponding numeric values
+									// ordered by values
+			// theme components
+			"stroke":        {},	// stroke for an axis
+			"majorTick":     {},	// stroke + length for a tick
+			"minorTick":     {},	// stroke + length for a tick
+			"font":          "",	// font for labels
+			"fontColor":     ""		// color for labels as a string
+		},
+
+		constructor: function(chart, kwArgs){
+			this.opt = dojo.clone(this.defaultParams);
+			du.updateWithObject(this.opt, kwArgs);
+			du.updateWithPattern(this.opt, kwArgs, this.optionalParams);
+		},
+		dependOnData: function(){
+			return !("min" in this.opt) || !("max" in this.opt);
+		},
+		clear: function(){
+			delete this.scaler;
+			this.dirty = true;
+			return this;
+		},
+		initialized: function(){
+			return "scaler" in this;
+		},
+		calculate: function(min, max, span, labels){
+			if(this.initialized()){ return this; }
+			this.labels = "labels" in this.opt ? this.opt.labels : labels;
+			if("min" in this.opt){ min = this.opt.min; }
+			if("max" in this.opt){ max = this.opt.max; }
+			if(this.opt.includeZero){
+				if(min > 0){ min = 0; }
+				if(max < 0){ max = 0; }
+			}
+			var minMinorStep = 0, ta = this.chart.theme.axis, 
+				taFont = "font" in this.opt ? this.opt.font : ta.font,
+				size = taFont ? g.normalizedLength(g.splitFontString(taFont).size) : 0;
+			if(this.vertical){
+				if(size){
+					minMinorStep = size + labelGap;
+				}
+			}else{
+				if(size){
+					var labelWidth, i;
+					if(this.labels){
+						labelWidth = df.foldl(df.map(this.labels, function(label){
+							return dojox.gfx._base._getTextBox(label.text, {font: taFont}).w;
+						}), "Math.max(a, b)", 0);
+					}else{
+						var labelLength = Math.ceil(Math.log(Math.max(Math.abs(min), Math.abs(max))) / Math.LN10), t = [];
+						if(min < 0 || max < 0){ t.push("-"); }
+						for(i = 0; i < labelLength; ++i){ t.push("9"); }
+						var precision = Math.floor(Math.log(max - min) / Math.LN10);
+						if(precision > 0){
+							t.push(".");
+							for(i = 0; i < precision; ++i){ t.push("9"); }
+						}
+						labelWidth = dojox.gfx._base._getTextBox(t.join(""), {font: taFont}).w;
+					}
+					minMinorStep = labelWidth + labelGap;
+				}
+			}
+			var kwArgs = {
+				fixUpper: this.opt.fixUpper, 
+				fixLower: this.opt.fixLower, 
+				natural:  this.opt.natural
+			};
+			if("majorTickStep" in this.opt){ kwArgs.majorTick = this.opt.majorTickStep; }
+			if("minorTickStep" in this.opt){ kwArgs.minorTick = this.opt.minorTickStep; }
+			if("microTickStep" in this.opt){ kwArgs.microTick = this.opt.microTickStep; }
+			this.scaler = dojox.charting.scaler(min, max, span, kwArgs);
+			this.scaler.minMinorStep = minMinorStep;
+			return this;
+		},
+		getScaler: function(){
+			return this.scaler;
+		},
+		getOffsets: function(){
+			var offsets = {l: 0, r: 0, t: 0, b: 0}, s, labelWidth, gtb, a, b, c, d;
+			var offset = 0, ta = this.chart.theme.axis,
+				taFont = "font" in this.opt ? this.opt.font : ta.font,
+				taMajorTick = "majorTick" in this.opt ? this.opt.majorTick : ta.majorTick,
+				taMinorTick = "minorTick" in this.opt ? this.opt.minorTick : ta.minorTick,
+				size = taFont ? g.normalizedLength(g.splitFontString(taFont).size) : 0;
+			if(this.vertical){
+				if(size){
+					s = this.scaler;
+					if(this.labels){
+						labelWidth = df.foldl(df.map(this.labels, function(label){
+							return dojox.gfx._base._getTextBox(label.text, {font: taFont}).w;
+						}), "Math.max(a, b)", 0);
+					}else{
+						gtb = dojox.gfx._base._getTextBox;
+						a = gtb(this._getLabel(s.major.start, s.major.prec), {font: taFont}).w;
+						b = gtb(this._getLabel(s.major.start + s.major.count * s.major.tick, s.major.prec), {font: taFont}).w;
+						c = gtb(this._getLabel(s.minor.start, s.minor.prec), {font: taFont}).w;
+						d = gtb(this._getLabel(s.minor.start + s.minor.count * s.minor.tick, s.minor.prec), {font: taFont}).w;
+						labelWidth = Math.max(a, b, c, d);
+					}
+					offset = labelWidth + labelGap;
+				}
+				offset += labelGap + Math.max(taMajorTick.length, taMinorTick.length);
+				offsets[this.opt.leftBottom ? "l" : "r"] = offset;
+				offsets.t = offsets.b = size / 2;
+			}else{
+				if(size){
+					offset = size + labelGap;
+				}
+				offset += labelGap + Math.max(taMajorTick.length, taMinorTick.length);
+				offsets[this.opt.leftBottom ? "b" : "t"] = offset;
+				if(size){
+					s = this.scaler;
+					if(this.labels){
+						labelWidth = df.foldl(df.map(this.labels, function(label){
+							return dojox.gfx._base._getTextBox(label.text, {font: taFont}).w;
+						}), "Math.max(a, b)", 0);
+					}else{
+						gtb = dojox.gfx._base._getTextBox;
+						a = gtb(this._getLabel(s.major.start, s.major.prec), {font: taFont}).w;
+						b = gtb(this._getLabel(s.major.start + s.major.count * s.major.tick, s.major.prec), {font: taFont}).w;
+						c = gtb(this._getLabel(s.minor.start, s.minor.prec), {font: taFont}).w;
+						d = gtb(this._getLabel(s.minor.start + s.minor.count * s.minor.tick, s.minor.prec), {font: taFont}).w;
+						labelWidth = Math.max(a, b, c, d);
+					}
+					offsets.l = offsets.r = labelWidth / 2;
+				}
+			}
+			return offsets;
+		},
+		render: function(dim, offsets){
+			if(!this.dirty){ return this; }
+			// prepare variable
+			var start, stop, axisVector, tickVector, labelOffset, labelAlign,
+				ta = this.chart.theme.axis, 
+				taStroke = "stroke" in this.opt ? this.opt.stroke : ta.stroke,
+				taMajorTick = "majorTick" in this.opt ? this.opt.majorTick : ta.majorTick,
+				taMinorTick = "minorTick" in this.opt ? this.opt.minorTick : ta.minorTick,
+				taFont = "font" in this.opt ? this.opt.font : ta.font,
+				taFontColor = "fontColor" in this.opt ? this.opt.fontColor : ta.fontColor,
+				tickSize = Math.max(taMajorTick.length, taMinorTick.length),
+				size = taFont ? g.normalizedLength(g.splitFontString(taFont).size) : 0;
+			if(this.vertical){
+				start = {y: dim.height - offsets.b};
+				stop  = {y: offsets.t};
+				axisVector = {x: 0, y: -1};
+				if(this.opt.leftBottom){
+					start.x = stop.x = offsets.l;
+					tickVector = {x: -1, y: 0};
+					labelAlign = "end";
+				}else{
+					start.x = stop.x = dim.width - offsets.r;
+					tickVector = {x: 1, y: 0};
+					labelAlign = "start";
+				}
+				labelOffset = {x: tickVector.x * (tickSize + labelGap), y: size * 0.4};
+			}else{
+				start = {x: offsets.l};
+				stop  = {x: dim.width - offsets.r};
+				axisVector = {x: 1, y: 0};
+				labelAlign = "middle";
+				if(this.opt.leftBottom){
+					start.y = stop.y = dim.height - offsets.b;
+					tickVector = {x: 0, y: 1};
+					labelOffset = {y: tickSize + labelGap + size};
+				}else{
+					start.y = stop.y = offsets.t;
+					tickVector = {x: 0, y: -1};
+					labelOffset = {y: -tickSize - labelGap};
+				}
+				labelOffset.x = 0;
+			}
+			
+			// render shapes
+			this.cleanGroup();
+			var s = this.group, c = this.scaler, step, next,
+				nextMajor = c.major.start, nextMinor = c.minor.start, nextMicro = c.micro.start;
+			s.createLine({x1: start.x, y1: start.y, x2: stop.x, y2: stop.y}).setStroke(taStroke);
+			if(this.opt.microTicks && c.micro.tick){
+				step = c.micro.tick, next = nextMicro;
+			}else if(this.opt.minorTicks && c.minor.tick){
+				step = c.minor.tick, next = nextMinor;
+			}else if(c.major.tick){
+				step = c.major.tick, next = nextMajor;
+			}else{
+				// don't draw anything
+				return this;
+			}
+			while(next <= c.bounds.upper + 1/c.scale){
+				var offset = (next - c.bounds.lower) * c.scale,
+					x = start.x + axisVector.x * offset,
+					y = start.y + axisVector.y * offset, elem;
+				if(Math.abs(nextMajor - next) < step / 2){
+					// major tick
+					s.createLine({
+						x1: x, y1: y,
+						x2: x + tickVector.x * taMajorTick.length,
+						y2: y + tickVector.y * taMajorTick.length
+					}).setStroke(taMajorTick);
+					if(this.opt.majorLabels){
+						elem = dc.axis2d.common.createText[this.opt.htmlLabels && dojox.gfx.renderer != "vml" ? "html" : "gfx"]
+										(this.chart, s, x + labelOffset.x, y + labelOffset.y, labelAlign,
+											this._getLabel(nextMajor, c.major.prec), taFont, taFontColor);
+						if(this.opt.htmlLabels){ this.htmlElements.push(elem); }
+					}
+					nextMajor += c.major.tick;
+					nextMinor += c.minor.tick;
+					nextMicro += c.micro.tick;
+				}else if(Math.abs(nextMinor - next) < step / 2){
+					// minor tick
+					if(this.opt.minorTicks){
+						s.createLine({
+							x1: x, y1: y,
+							x2: x + tickVector.x * taMinorTick.length,
+							y2: y + tickVector.y * taMinorTick.length
+						}).setStroke(taMinorTick);
+						if(this.opt.minorLabels && (c.minMinorStep <= c.minor.tick * c.scale)){
+							elem = dc.axis2d.common.createText[this.opt.htmlLabels && dojox.gfx.renderer != "vml" ? "html" : "gfx"]
+											(this.chart, s, x + labelOffset.x, y + labelOffset.y, labelAlign,
+												this._getLabel(nextMinor, c.minor.prec), taFont, taFontColor);
+							if(this.opt.htmlLabels){ this.htmlElements.push(elem); }
+						}
+					}
+					nextMinor += c.minor.tick;
+					nextMicro += c.micro.tick;
+				}else{
+					// micro tick
+					if(this.opt.microTicks){
+						s.createLine({
+							x1: x, y1: y,
+							// use minor ticks for now
+							x2: x + tickVector.x * taMinorTick.length,
+							y2: y + tickVector.y * taMinorTick.length
+						}).setStroke(taMinorTick);
+					}
+					nextMicro += c.micro.tick;
+				}
+				next += step;
+			}
+			this.dirty = false;
+			return this;
+		},
+		
+		// utilities
+		_getLabel: function(number, precision){
+			if(this.opt.labels){
+				// classic binary search
+				var l = this.opt.labels, lo = 0, hi = l.length;
+				while(lo < hi){
+					var mid = Math.floor((lo + hi) / 2), val = l[mid].value;
+					if(val < number){
+						lo = mid + 1;
+					}else{
+						hi = mid;
+					}
+				}
+				// lets take into account FP errors
+				if(lo < l.length && eq(l[lo].value, number)){
+					return l[lo].text;
+				}
+				--lo;
+				if(lo < l.length && eq(l[lo].value, number)){
+					return l[lo].text;
+				}
+				lo += 2;
+				if(lo < l.length && eq(l[lo].value, number)){
+					return l[lo].text;
+				}
+				// otherwise we will produce a number
+			}
+			return this.opt.fixed ? number.toFixed(precision < 0 ? -precision : 0) : number.toString();
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/axis2d/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,75 @@
+if(!dojo._hasResource["dojox.charting.axis2d.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.axis2d.common"] = true;
+dojo.provide("dojox.charting.axis2d.common");
+
+dojo.require("dojox.gfx");
+
+(function(){
+	var g = dojox.gfx;
+	
+	function clearNode(s){
+		s.marginLeft   = "0px";
+		s.marginTop    = "0px";
+		s.marginRight  = "0px";
+		s.marginBottom = "0px";
+		s.paddingLeft   = "0px";
+		s.paddingTop    = "0px";
+		s.paddingRight  = "0px";
+		s.paddingBottom = "0px";
+		s.borderLeftWidth   = "0px";
+		s.borderTopWidth    = "0px";
+		s.borderRightWidth  = "0px";
+		s.borderBottomWidth = "0px";
+	}
+	
+	dojo.mixin(dojox.charting.axis2d.common, {
+		createText: {
+			gfx: function(chart, creator, x, y, align, text, font, fontColor){
+				return creator.createText({
+					x: x, y: y, text: text, align: align
+				}).setFont(font).setFill(fontColor);
+			},
+			html: function(chart, creator, x, y, align, text, font, fontColor){
+				// setup the text node
+				var p = dojo.doc.createElement("div"), s = p.style;
+				clearNode(s);
+				s.font = font;
+				p.innerHTML = text;
+				s.color = fontColor;
+				// measure the size
+				s.position = "absolute";
+				s.left = "-10000px";
+				dojo.body().appendChild(p);
+				var size = g.normalizedLength(g.splitFontString(font).size),
+					box = dojo.marginBox(p);
+				// new settings for the text node
+				dojo.body().removeChild(p);
+				s.position = "relative";
+				switch(align){
+					case "middle":
+						s.left = Math.floor(x - box.w / 2) + "px";
+						break;
+					case "end":
+						s.left = Math.floor(x - box.w) + "px";
+						break;
+					//case "start":
+					default:
+						s.left = Math.floor(x) + "px";
+						break;
+				}
+				s.top = Math.floor(y - size) + "px";
+				// setup the wrapper node
+				var wrap = dojo.doc.createElement("div"), w = wrap.style;
+				clearNode(w);
+				w.width = "0px";
+				w.height = "0px";
+				// insert nodes
+				wrap.appendChild(p)
+				chart.node.insertBefore(wrap, chart.node.firstChild);
+				return p;
+			}
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Areas.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Areas.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Areas.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Areas"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Areas"] = true;
+dojo.provide("dojox.charting.plot2d.Areas");
+
+dojo.require("dojox.charting.plot2d.Default");
+
+dojo.declare("dojox.charting.plot2d.Areas", dojox.charting.plot2d.Default, {
+	constructor: function(){
+		this.opt.lines = true;
+		this.opt.areas = true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Bars.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Bars.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Bars.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,89 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Bars"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Bars"] = true;
+dojo.provide("dojox.charting.plot2d.Bars");
+
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.charting.plot2d.Base");
+
+dojo.require("dojox.lang.utils");
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.reversed");
+
+(function(){
+	var df = dojox.lang.functional, du = dojox.lang.utils,
+		dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	dojo.declare("dojox.charting.plot2d.Bars", dojox.charting.plot2d.Base, {
+		defaultParams: {
+			hAxis: "x",		// use a horizontal axis named "x"
+			vAxis: "y",		// use a vertical axis named "y"
+			gap:	0,		// gap between columns in pixels
+			shadows: null	// draw shadows
+		},
+		optionalParams: {},	// no optional parameters
+		
+		constructor: function(chart, kwArgs){
+			this.opt = dojo.clone(this.defaultParams);
+			du.updateWithObject(this.opt, kwArgs);
+			this.series = [];
+			this.hAxis = this.opt.hAxis;
+			this.vAxis = this.opt.vAxis;
+		},
+		
+		calculateAxes: function(dim){
+			var stats = dc.collectSimpleStats(this.series), t;
+			stats.hmin -= 0.5;
+			stats.hmax += 0.5;
+			t = stats.hmin, stats.hmin = stats.vmin, stats.vmin = t;
+			t = stats.hmax, stats.hmax = stats.vmax, stats.vmax = t;
+			this._calc(dim, stats);
+			return this;
+		},
+		render: function(dim, offsets){
+			if(this.dirty){
+				dojo.forEach(this.series, purgeGroup);
+				this.cleanGroup();
+				var s = this.group;
+				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
+			}
+			var t = this.chart.theme, color, stroke, fill, f,
+				gap = this.opt.gap < this._vScaler.scale / 3 ? this.opt.gap : 0;
+			for(var i = this.series.length - 1; i >= 0; --i){
+				var run = this.series[i];
+				if(!this.dirty && !run.dirty){ continue; }
+				run.cleanGroup();
+				var s = run.group;
+				if(!run.fill || !run.stroke){
+					// need autogenerated color
+					color = run.dyn.color = new dojo.Color(t.next("color"));
+				}
+				stroke = run.stroke ? run.stroke : dc.augmentStroke(t.series.stroke, color);
+				fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
+				var baseline = Math.max(0, this._hScaler.bounds.lower),
+					xoff = offsets.l + this._hScaler.scale * (baseline - this._hScaler.bounds.lower),
+					yoff = dim.height - offsets.b - this._vScaler.scale * (1.5 - this._vScaler.bounds.lower) + gap;
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j],
+						width  = this._hScaler.scale * (v - baseline),
+						height = this._vScaler.scale - 2 * gap,
+						w = Math.abs(width);
+					if(w >= 1 && height >= 1){
+						var shape = s.createRect({
+							x: xoff + (width < 0 ? width : 0),
+							y: yoff - this._vScaler.scale * j,
+							width: w, height: height
+						}).setFill(fill).setStroke(stroke);
+						run.dyn.fill   = shape.getFill();
+						run.dyn.stroke = shape.getStroke();
+					}
+				}
+				run.dirty = false;
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,60 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Base"] = true;
+dojo.provide("dojox.charting.plot2d.Base");
+
+dojo.require("dojox.charting.Element");
+dojo.require("dojox.charting.plot2d.common");
+
+dojo.declare("dojox.charting.plot2d.Base", dojox.charting.Element, {
+	clear: function(){
+		this.series = [];
+		this._hAxis = null;
+		this._vAxis = null;
+		this.dirty = true;
+		return this;
+	},
+	setAxis: function(axis){
+		if(axis){
+			this[axis.vertical ? "_vAxis" : "_hAxis"] = axis;
+		}
+		return this;
+	},
+	addSeries: function(run){
+		this.series.push(run);
+		return this;
+	},
+	calculateAxes: function(dim){
+		return this;
+	},
+	render: function(dim, offsets){
+		return this;
+	},
+	getRequiredColors: function(){
+		return this.series.length;
+	},
+	
+	// utilities
+	_calc: function(dim, stats){
+		// calculate scaler
+		if(this._hAxis){
+			if(!this._hAxis.initialized()){
+				this._hAxis.calculate(stats.hmin, stats.hmax, dim.width);
+			}
+			this._hScaler = this._hAxis.getScaler();
+		}else{
+			this._hScaler = {bounds: {lower: stats.hmin, upper: stats.hmax}, 
+				scale: dim.width / (stats.hmax - stats.hmin)};
+		}
+		if(this._vAxis){
+			if(!this._vAxis.initialized()){
+				this._vAxis.calculate(stats.vmin, stats.vmax, dim.height);
+			}
+			this._vScaler = this._vAxis.getScaler();
+		}else{
+			this._vScaler = {bounds: {lower: stats.vmin, upper: stats.vmax}, 
+				scale: dim.height / (stats.vmax - stats.vmin)};
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/ClusteredBars.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/ClusteredBars.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/ClusteredBars.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,63 @@
+if(!dojo._hasResource["dojox.charting.plot2d.ClusteredBars"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.ClusteredBars"] = true;
+dojo.provide("dojox.charting.plot2d.ClusteredBars");
+
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.charting.plot2d.Bars");
+
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.reversed");
+
+(function(){
+	var df = dojox.lang.functional, dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	dojo.declare("dojox.charting.plot2d.ClusteredBars", dojox.charting.plot2d.Bars, {
+		render: function(dim, offsets){
+			if(this.dirty){
+				dojo.forEach(this.series, purgeGroup);
+				this.cleanGroup();
+				var s = this.group;
+				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
+			}
+			var t = this.chart.theme, color, stroke, fill, f,
+				gap = this.opt.gap < this._vScaler.scale / 3 ? this.opt.gap : 0,
+				thickness = (this._vScaler.scale - 2 * gap) / this.series.length;
+			for(var i = this.series.length - 1; i >= 0; --i){
+				var run = this.series[i];
+				if(!this.dirty && !run.dirty){ continue; }
+				run.cleanGroup();
+				var s = run.group;
+				if(!run.fill || !run.stroke){
+					// need autogenerated color
+					color = run.dyn.color = new dojo.Color(t.next("color"));
+				}
+				stroke = run.stroke ? run.stroke : dc.augmentStroke(t.series.stroke, color);
+				fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
+				var baseline = Math.max(0, this._hScaler.bounds.lower),
+					xoff = offsets.l + this._hScaler.scale * (baseline - this._hScaler.bounds.lower),
+					yoff = dim.height - offsets.b - this._vScaler.scale * (1.5 - this._vScaler.bounds.lower) + 
+						gap + thickness * (this.series.length - i - 1);
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j],
+						width  = this._hScaler.scale * (v - baseline),
+						height = thickness, w = Math.abs(width);
+					if(w >= 1 && height >= 1){
+						var shape = s.createRect({
+							x: xoff + (width < 0 ? width : 0),
+							y: yoff - this._vScaler.scale * j,
+							width: w, height: height
+						}).setFill(fill).setStroke(stroke);
+						run.dyn.fill   = shape.getFill();
+						run.dyn.stroke = shape.getStroke();
+					}
+				}
+				run.dirty = false;
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/ClusteredColumns.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/ClusteredColumns.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/ClusteredColumns.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,63 @@
+if(!dojo._hasResource["dojox.charting.plot2d.ClusteredColumns"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.ClusteredColumns"] = true;
+dojo.provide("dojox.charting.plot2d.ClusteredColumns");
+
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.charting.plot2d.Columns");
+
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.reversed");
+
+(function(){
+	var df = dojox.lang.functional, dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	dojo.declare("dojox.charting.plot2d.ClusteredColumns", dojox.charting.plot2d.Columns, {
+		render: function(dim, offsets){
+			if(this.dirty){
+				dojo.forEach(this.series, purgeGroup);
+				this.cleanGroup();
+				var s = this.group;
+				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
+			}
+			var t = this.chart.theme, color, stroke, fill, f,
+				gap = this.opt.gap < this._hScaler.scale / 3 ? this.opt.gap : 0,
+				thickness = (this._hScaler.scale - 2 * gap) / this.series.length;
+			for(var i = 0; i < this.series.length; ++i){
+				var run = this.series[i];
+				if(!this.dirty && !run.dirty){ continue; }
+				run.cleanGroup();
+				var s = run.group;
+				if(!run.fill || !run.stroke){
+					// need autogenerated color
+					color = run.dyn.color = new dojo.Color(t.next("color"));
+				}
+				stroke = run.stroke ? run.stroke : dc.augmentStroke(t.series.stroke, color);
+				fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
+				var baseline = Math.max(0, this._vScaler.bounds.lower),
+					xoff = offsets.l + this._hScaler.scale * (0.5 - this._hScaler.bounds.lower) + gap + thickness * i,
+					yoff = dim.height - offsets.b - this._vScaler.scale * (baseline - this._vScaler.bounds.lower);
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j],
+						width  = thickness,
+						height = this._vScaler.scale * (v - baseline),
+						h = Math.abs(height);
+					if(width >= 1 && h >= 1){
+						var shape = s.createRect({
+							x: xoff + this._hScaler.scale * j,
+							y: yoff - (height < 0 ? 0 : height),
+							width: width, height: h
+						}).setFill(fill).setStroke(stroke);
+						run.dyn.fill   = shape.getFill();
+						run.dyn.stroke = shape.getStroke();
+					}
+				}
+				run.dirty = false;
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Columns.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Columns.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Columns.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,88 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Columns"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Columns"] = true;
+dojo.provide("dojox.charting.plot2d.Columns");
+
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.charting.plot2d.Base");
+
+dojo.require("dojox.lang.utils");
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.reversed");
+
+(function(){
+	var df = dojox.lang.functional, du = dojox.lang.utils,
+		dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	dojo.declare("dojox.charting.plot2d.Columns", dojox.charting.plot2d.Base, {
+		defaultParams: {
+			hAxis: "x",		// use a horizontal axis named "x"
+			vAxis: "y",		// use a vertical axis named "y"
+			gap:	0,		// gap between columns in pixels
+			shadows: null	// draw shadows
+		},
+		optionalParams: {},	// no optional parameters
+		
+		constructor: function(chart, kwArgs){
+			this.opt = dojo.clone(this.defaultParams);
+			du.updateWithObject(this.opt, kwArgs);
+			this.series = [];
+			this.hAxis = this.opt.hAxis;
+			this.vAxis = this.opt.vAxis;
+		},
+		
+		calculateAxes: function(dim){
+			var stats = dc.collectSimpleStats(this.series);
+			stats.hmin -= 0.5;
+			stats.hmax += 0.5;
+			this._calc(dim, stats);
+			return this;
+		},
+		render: function(dim, offsets){
+			if(this.dirty){
+				dojo.forEach(this.series, purgeGroup);
+				this.cleanGroup();
+				var s = this.group;
+				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
+			}
+			var t = this.chart.theme, color, stroke, fill, f,
+				gap = this.opt.gap < this._hScaler.scale / 3 ? this.opt.gap : 0;
+			for(var i = this.series.length - 1; i >= 0; --i){
+				var run = this.series[i];
+				if(!this.dirty && !run.dirty){ continue; }
+				run.cleanGroup();
+				var s = run.group;
+				if(!run.fill || !run.stroke){
+					// need autogenerated color
+					color = run.dyn.color = new dojo.Color(t.next("color"));
+				}
+				stroke = run.stroke ? run.stroke : dc.augmentStroke(t.series.stroke, color);
+				fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
+				var baseline = Math.max(0, this._vScaler.bounds.lower),
+					xoff = offsets.l + this._hScaler.scale * (0.5 - this._hScaler.bounds.lower) + gap,
+					yoff = dim.height - offsets.b - this._vScaler.scale * (baseline - this._vScaler.bounds.lower);
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j], 
+						width  = this._hScaler.scale - 2 * gap,
+						height = this._vScaler.scale * (v - baseline),
+						h = Math.abs(height);
+					if(width >= 1 && h >= 1){
+						var rect = {
+								x: xoff + this._hScaler.scale * j,
+								y: yoff - (height < 0 ? 0 : height),
+								width: width, height: h
+							},
+							shape = s.createRect(rect).setFill(fill).setStroke(stroke);
+						run.dyn.fill   = shape.getFill();
+						run.dyn.stroke = shape.getStroke();
+					}
+				}
+				run.dirty = false;
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Default.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Default.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Default.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,173 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Default"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Default"] = true;
+dojo.provide("dojox.charting.plot2d.Default");
+
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.charting.plot2d.Base");
+
+dojo.require("dojox.lang.utils");
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.reversed");
+
+(function(){
+	var df = dojox.lang.functional, du = dojox.lang.utils,
+		dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	dojo.declare("dojox.charting.plot2d.Default", dojox.charting.plot2d.Base, {
+		defaultParams: {
+			hAxis: "x",		// use a horizontal axis named "x"
+			vAxis: "y",		// use a vertical axis named "y"
+			lines:   true,	// draw lines
+			areas:   false,	// draw areas
+			markers: false,	// draw markers
+			shadows: 0,		// draw shadows
+			tension: 0		// draw curved lines (tension>0)
+		},
+		optionalParams: {},	// no optional parameters
+		
+		constructor: function(chart, kwArgs){
+			this.opt = dojo.clone(this.defaultParams);
+			du.updateWithObject(this.opt, kwArgs);
+			this.series = [];
+			this.hAxis = this.opt.hAxis;
+			this.vAxis = this.opt.vAxis;
+		},
+		
+		calculateAxes: function(dim){
+			this._calc(dim, dc.collectSimpleStats(this.series));
+			return this;
+		},
+		render: function(dim, offsets){
+			if(this.dirty){
+				dojo.forEach(this.series, purgeGroup);
+				this.cleanGroup();
+				var s = this.group;
+				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
+			}
+			var t = this.chart.theme, stroke, outline, color, marker;
+			for(var i = this.series.length - 1; i >= 0; --i){
+				var run = this.series[i];
+				if(!this.dirty && !run.dirty){ continue; }
+				run.cleanGroup();
+				if(!run.data.length){
+					run.dirty = false;
+					continue;
+				}
+
+				//	inner function for translating polylines to curves with tension
+				function curve(arr, tension){
+					var p=dojo.map(arr, function(item, i){
+						if(i==0){ return "M" + item.x + "," + item.y; }
+						var dx=item.x-arr[i-1].x, dy=arr[i-1].y;
+						return "C"+(item.x-(tension-1)*(dx/tension))+","+dy+" "+(item.x-(dx/tension))+","+item.y+" "+item.x+","+item.y;
+					});
+					return p.join(" ");
+				}
+				
+				var s = run.group, lpoly;
+				if(typeof run.data[0] == "number"){
+					lpoly = dojo.map(run.data, function(v, i){
+						return {
+							x: this._hScaler.scale * (i + 1 - this._hScaler.bounds.lower) + offsets.l,
+							y: dim.height - offsets.b - this._vScaler.scale * (v - this._vScaler.bounds.lower)
+						};
+					}, this);
+				}else{
+					lpoly = dojo.map(run.data, function(v, i){
+						return {
+							x: this._hScaler.scale * (v.x - this._hScaler.bounds.lower) + offsets.l,
+							y: dim.height - offsets.b - this._vScaler.scale * (v.y - this._vScaler.bounds.lower)
+						};
+					}, this);
+				}
+				if(!run.fill || !run.stroke){
+					// need autogenerated color
+					color = run.dyn.color = new dojo.Color(t.next("color"));
+				}
+
+				var lpath="";
+				if(this.opt.tension){
+					var lpath=curve(lpoly, this.opt.tension);
+				}
+
+				if(this.opt.areas){
+					var fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
+					var apoly = dojo.clone(lpoly);
+					if(this.opt.tension){
+						var apath="L" + (apoly[apoly.length-1].x) + "," + (dim.height-offsets.b) + " "
+							+ "L"+apoly[0].x+","+(dim.height-offsets.b)+" "
+							+ "L"+apoly[0].x+","+apoly[0].y;
+						run.dyn.fill = s.createPath(lpath+" "+apath).setFill(fill).getFill();
+					} else {
+						apoly.push({x: lpoly[lpoly.length - 1].x, y: dim.height - offsets.b});
+						apoly.push({x: lpoly[0].x, y: dim.height - offsets.b});
+						apoly.push(lpoly[0]);
+						run.dyn.fill = s.createPolyline(apoly).setFill(fill).getFill();
+					}
+				}
+				if(this.opt.lines || this.opt.markers){
+					// need a stroke
+					stroke = run.stroke ? dc.makeStroke(run.stroke) : dc.augmentStroke(t.series.stroke, color);
+					if(run.outline || t.series.outline){
+						outline = dc.makeStroke(run.outline ? run.outline : t.series.outline);
+						outline.width = 2 * outline.width + stroke.width;
+					}
+				}
+				if(this.opt.markers){
+					// need a marker
+					marker = run.dyn.marker = run.marker ? run.marker : t.next("marker");
+				}
+				if(this.opt.shadows && stroke){
+					var sh = this.opt.shadows, shadowColor = new dojo.Color([0, 0, 0, 0.3]),
+						spoly = dojo.map(lpoly, function(c){
+							return {x: c.x + sh.dx, y: c.y + sh.dy};
+						}),
+						shadowStroke = dojo.clone(outline ? outline : stroke);
+					shadowStroke.color = shadowColor;
+					shadowStroke.width += sh.dw ? sh.dw : 0;
+					if(this.opt.lines){
+						if(this.opt.tension){
+							s.createPath(curve(spoly, this.opt.tension)).setStroke(shadowStroke);
+						} else {
+							s.createPolyline(spoly).setStroke(shadowStroke);
+						}
+					}
+					if(this.opt.markers){
+						dojo.forEach(spoly, function(c){
+							s.createPath("M" + c.x + " " + c.y + " " + marker).setStroke(shadowStroke).setFill(shadowColor);
+						}, this);
+					}
+				}
+				if(this.opt.lines){
+					if(outline){
+						if(this.opt.tension){
+							run.dyn.outline = s.createPath(lpath).setStroke(outline).getStroke();
+						} else {
+							run.dyn.outline = s.createPolyline(lpoly).setStroke(outline).getStroke();
+						}
+					}
+					if(this.opt.tension){
+						run.dyn.stroke = s.createPath(lpath).setStroke(stroke).getStroke();
+					} else {
+						run.dyn.stroke = s.createPolyline(lpoly).setStroke(stroke).getStroke();
+					}
+				}
+				if(this.opt.markers){
+					dojo.forEach(lpoly, function(c){
+						var path = "M" + c.x + " " + c.y + " " + marker;
+						if(outline){
+							s.createPath(path).setStroke(outline);
+						}
+						s.createPath(path).setStroke(stroke).setFill(stroke.color);
+					}, this);
+				}
+				run.dirty = false;
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Grid.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Grid.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Grid.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,116 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Grid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Grid"] = true;
+dojo.provide("dojox.charting.plot2d.Grid");
+
+dojo.require("dojox.charting.Element");
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.lang.functional");
+
+(function(){
+	var du = dojox.lang.utils;
+
+	dojo.declare("dojox.charting.plot2d.Grid", dojox.charting.Element, {
+		defaultParams: {
+			hAxis: "x",			// use a horizontal axis named "x"
+			vAxis: "y",			// use a vertical axis named "y"
+			hMajorLines: true,	// draw horizontal major lines
+			hMinorLines: false,	// draw horizontal minor lines
+			vMajorLines: true,	// draw vertical major lines
+			vMinorLines: false,	// draw vertical minor lines
+			hStripes: "none",	// TBD
+			vStripes: "none"	// TBD
+		},
+		optionalParams: {},	// no optional parameters
+		
+		constructor: function(chart, kwArgs){
+			this.opt = dojo.clone(this.defaultParams);
+			du.updateWithObject(this.opt, kwArgs);
+			this.hAxis = this.opt.hAxis;
+			this.vAxis = this.opt.vAxis;
+		},
+		clear: function(){
+			this._hAxis = null;
+			this._vAxis = null;
+			this.dirty = true;
+			return this;
+		},
+		setAxis: function(axis){
+			if(axis){
+				this[axis.vertical ? "_vAxis" : "_hAxis"] = axis;
+			}
+			return this;
+		},
+		addSeries: function(run){
+			// nothing
+			return this;
+		},
+		calculateAxes: function(dim){
+			// nothing
+			return this;
+		},
+		getRequiredColors: function(){
+			return 0;
+		},
+		render: function(dim, offsets){
+			// draw horizontal stripes and lines
+			if(!this.dirty){ return this; }
+			this.cleanGroup();
+			var s = this.group, ta = this.chart.theme.axis,
+				scaler = this._vAxis.getScaler();
+			if(this.opt.hMinorLines && scaler.minor.tick){
+				for(var i = 0; i < scaler.minor.count; ++i){
+					var y = dim.height - offsets.b - scaler.scale * 
+							(scaler.minor.start - scaler.bounds.lower + i * scaler.minor.tick);
+					s.createLine({
+						x1: offsets.l,
+						y1: y,
+						x2: dim.width - offsets.r,
+						y2: y
+					}).setStroke(ta.minorTick);
+				}
+			}
+			if(this.opt.hMajorLines && scaler.major.tick){
+				for(var i = 0; i < scaler.major.count; ++i){
+					var y = dim.height - offsets.b - scaler.scale * 
+							(scaler.major.start - scaler.bounds.lower + i * scaler.major.tick);
+					s.createLine({
+						x1: offsets.l,
+						y1: y,
+						x2: dim.width - offsets.r,
+						y2: y
+					}).setStroke(ta.majorTick);
+				}
+			}
+			// draw vertical stripes and lines
+			scaler = this._hAxis.getScaler();
+			if(this.opt.vMinorLines && scaler.minor.tick){
+				for(var i = 0; i < scaler.minor.count; ++i){
+					var x = offsets.l + scaler.scale * 
+							(scaler.minor.start - scaler.bounds.lower + i * scaler.minor.tick);
+					s.createLine({
+						x1: x,
+						y1: offsets.t,
+						x2: x,
+						y2: dim.height - offsets.b
+					}).setStroke(ta.minorTick);
+				}
+			}
+			if(this.opt.vMajorLines && scaler.major.tick){
+				for(var i = 0; i < scaler.major.count; ++i){
+					var x = offsets.l + scaler.scale * 
+							(scaler.major.start - scaler.bounds.lower + i * scaler.major.tick);
+					s.createLine({
+						x1: x,
+						y1: offsets.t,
+						x2: x,
+						y2: dim.height - offsets.b
+					}).setStroke(ta.majorTick);
+				}
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Lines.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Lines.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Lines.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,13 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Lines"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Lines"] = true;
+dojo.provide("dojox.charting.plot2d.Lines");
+
+dojo.require("dojox.charting.plot2d.Default");
+
+dojo.declare("dojox.charting.plot2d.Lines", dojox.charting.plot2d.Default, {
+	constructor: function(){
+		this.opt.lines = true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Markers.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Markers.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Markers.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,13 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Markers"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Markers"] = true;
+dojo.provide("dojox.charting.plot2d.Markers");
+
+dojo.require("dojox.charting.plot2d.Default");
+
+dojo.declare("dojox.charting.plot2d.Markers", dojox.charting.plot2d.Default, {
+	constructor: function(){
+		this.opt.markers = true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/MarkersOnly.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/MarkersOnly.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/MarkersOnly.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+if(!dojo._hasResource["dojox.charting.plot2d.MarkersOnly"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.MarkersOnly"] = true;
+dojo.provide("dojox.charting.plot2d.MarkersOnly");
+
+dojo.require("dojox.charting.plot2d.Default");
+
+dojo.declare("dojox.charting.plot2d.MarkersOnly", dojox.charting.plot2d.Default, {
+	constructor: function(){
+		this.opt.lines   = false;
+		this.opt.markers = true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Pie.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Pie.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Pie.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,199 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Pie"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Pie"] = true;
+dojo.provide("dojox.charting.plot2d.Pie");
+
+dojo.require("dojox.charting.Element");
+dojo.require("dojox.charting.axis2d.common");
+dojo.require("dojox.charting.plot2d.common");
+
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.gfx");
+
+(function(){
+	var df = dojox.lang.functional, du = dojox.lang.utils,
+		dc = dojox.charting.plot2d.common,
+		da = dojox.charting.axis2d.common,
+		g = dojox.gfx;
+
+	dojo.declare("dojox.charting.plot2d.Pie", dojox.charting.Element, {
+		defaultParams: {
+			labels:			true,
+			ticks:			false,
+			fixed:			true,
+			precision:		1,
+			labelOffset:	20,
+			labelStyle:		"default",	// default/rows/auto
+			htmlLabels:		true		// use HTML to draw labels
+		},
+		optionalParams: {
+			font:		"",
+			fontColor:	"",
+			radius:		0
+		},
+
+		constructor: function(chart, kwArgs){
+			this.opt = dojo.clone(this.defaultParams);
+			du.updateWithObject(this.opt, kwArgs);
+			du.updateWithPattern(this.opt, kwArgs, this.optionalParams);
+			this.run = null;
+			this.dyn = [];
+		},
+		clear: function(){
+			this.dirty = true;
+			this.dyn = [];
+			return this;
+		},
+		setAxis: function(axis){
+			// nothing
+			return this;
+		},
+		addSeries: function(run){
+			this.run = run;
+			return this;
+		},
+		calculateAxes: function(dim){
+			// nothing
+			return this;
+		},
+		getRequiredColors: function(){
+			return this.run ? this.run.data.length : 0;
+		},
+		render: function(dim, offsets){
+			if(!this.dirty){ return this; }
+			this.dirty = false;
+			this.cleanGroup();
+			var s = this.group, color, t = this.chart.theme;
+
+			// calculate the geometry
+			var rx = (dim.width  - offsets.l - offsets.r) / 2,
+				ry = (dim.height - offsets.t - offsets.b) / 2,
+				r  = Math.min(rx, ry),
+				taFont = "font" in this.opt ? this.opt.font : t.axis.font,
+				size = taFont ? g.normalizedLength(g.splitFontString(taFont).size) : 0,
+				taFontColor = "fontColor" in this.opt ? this.opt.fontColor : t.axis.fontColor,
+				start = 0, step, sum, slices, labels, shift, labelR,
+				run = this.run.data;
+			if(typeof run[0] == "number"){
+				sum = df.foldl1(run, "+");
+				slices = dojo.map(run, function(x){ return x / sum; });
+				if(this.opt.labels){
+					labels = dojo.map(slices, function(x){
+						return this._getLabel(x * 100) + "%";
+					}, this);
+				}
+			}else{
+				sum = df.foldl1(run, function(a, b){ return {y: a.y + b.y}; }).y;
+				slices = df.map(run, function(x){ return x.y / sum; });
+				if(this.opt.labels){
+					labels = dojo.map(slices, function(x, i){
+						var v = run[i];
+						return "text" in v ? v.text : this._getLabel(x * 100) + "%";
+					}, this);
+				}
+			}
+			if(this.opt.labels){
+				shift = df.foldl1(df.map(labels, function(label){
+					return dojox.gfx._base._getTextBox(label, {font: taFont}).w;
+				}, this), "Math.max(a, b)") / 2;
+				if(this.opt.labelOffset < 0){
+					r = Math.min(rx - 2 * shift, ry - size) + this.opt.labelOffset;
+				}
+				labelR = r - this.opt.labelOffset;
+			}
+			if("radius" in this.opt){
+				r = this.opt.radius;
+				labelR = r - this.opt.labelOffset;
+			}
+			var	circle = {
+					cx: offsets.l + rx,
+					cy: offsets.t + ry,
+					r:  r
+				};
+
+			this.dyn = [];			
+			if(!this.run || !run.length){
+				return this;
+			}
+			if(run.length == 1){
+				// need autogenerated color
+				color = new dojo.Color(t.next("color"));
+				var shape = s.createCircle(circle).
+						setFill(dc.augmentFill(t.run.fill, color)).
+						setStroke(dc.augmentStroke(t.series.stroke, color));
+				this.dyn.push({color: color, fill: shape.getFill(), stroke: shape.getStroke()});
+				if(this.opt.labels){
+					// draw the label
+					var elem = da.createText[this.opt.htmlLabels && dojox.gfx.renderer != "vml" ? "html" : "gfx"]
+									(this.chart, s, circle.cx, circle.cy + size / 2, "middle",
+										"100%", taFont, taFontColor);
+					if(this.opt.htmlLabels){ this.htmlElements.push(elem); }
+				}
+				return this;
+			}
+			// draw slices
+			dojo.forEach(slices, function(x, i){
+				// calculate the geometry of the slice
+				var end = start + x * 2 * Math.PI, v = run[i];
+				if(i + 1 == slices.length){
+					end = 2 * Math.PI;
+				}
+				var	step = end - start,
+					x1 = circle.cx + r * Math.cos(start),
+					y1 = circle.cy + r * Math.sin(start),
+					x2 = circle.cx + r * Math.cos(end),
+					y2 = circle.cy + r * Math.sin(end);
+				// draw the slice
+				var color, fill, stroke;
+				if(typeof v == "object"){
+					color  = "color"  in v ? v.color  : new dojo.Color(t.next("color"));
+					fill   = "fill"   in v ? v.fill   : dc.augmentFill(t.series.fill, color);
+					stroke = "stroke" in v ? v.stroke : dc.augmentStroke(t.series.stroke, color);
+				}else{
+					color  = new dojo.Color(t.next("color"));
+					fill   = dc.augmentFill(t.series.fill, color);
+					stroke = dc.augmentStroke(t.series.stroke, color);
+				}
+				var shape = s.createPath({}).
+						moveTo(circle.cx, circle.cy).
+						lineTo(x1, y1).
+						arcTo(r, r, 0, step > Math.PI, true, x2, y2).
+						lineTo(circle.cx, circle.cy).
+						closePath().
+						setFill(fill).
+						setStroke(stroke);
+				this.dyn.push({color: color, fill: fill, stroke: stroke});
+				start = end;
+			}, this);
+			// draw labels
+			if(this.opt.labels){
+				start = 0;
+				dojo.forEach(slices, function(slice, i){
+					// calculate the geometry of the slice
+					var end = start + slice * 2 * Math.PI, v = run[i];
+					if(i + 1 == slices.length){
+						end = 2 * Math.PI;
+					}
+					var	labelAngle = (start + end) / 2,
+						x = circle.cx + labelR * Math.cos(labelAngle),
+						y = circle.cy + labelR * Math.sin(labelAngle) + size / 2;
+					// draw the label
+					var elem = da.createText[this.opt.htmlLabels && dojox.gfx.renderer != "vml" ? "html" : "gfx"]
+									(this.chart, s, x, y, "middle",
+										labels[i], taFont, 
+										(typeof v == "object" && "fontColor" in v) 
+											? v.fontColor : taFontColor);
+					if(this.opt.htmlLabels){ this.htmlElements.push(elem); }
+					start = end;
+				}, this);
+			}
+			return this;
+		},
+		
+		// utilities
+		_getLabel: function(number){
+			return this.opt.fixed ? number.toFixed(this.opt.precision) : number.toString();
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Scatter.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Scatter.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Scatter.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Scatter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Scatter"] = true;
+dojo.provide("dojox.charting.plot2d.Scatter");
+
+dojo.require("dojox.charting.plot2d.Default");
+
+dojo.declare("dojox.charting.plot2d.Scatter", dojox.charting.plot2d.Default, {
+	constructor: function(){
+		this.opt.lines   = false;
+		this.opt.markers = true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Stacked.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Stacked.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/Stacked.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,160 @@
+if(!dojo._hasResource["dojox.charting.plot2d.Stacked"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Stacked"] = true;
+dojo.provide("dojox.charting.plot2d.Stacked");
+
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.charting.plot2d.Default");
+
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.sequence");
+dojo.require("dojox.lang.functional.reversed");
+
+(function(){
+	var df = dojox.lang.functional, dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	dojo.declare("dojox.charting.plot2d.Stacked", dojox.charting.plot2d.Default, {
+		calculateAxes: function(dim){
+			var stats = dc.collectStackedStats(this.series);
+			this._maxRunLength = stats.hmax;
+			this._calc(dim, stats);
+			return this;
+		},
+		render: function(dim, offsets){
+			// stack all values
+			var acc = df.repeat(this._maxRunLength, "-> 0", 0);
+			for(var i = 0; i < this.series.length; ++i){
+				var run = this.series[i];
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j];
+					if(isNaN(v)){ v = 0; }
+					acc[j] += v;
+				}
+			}
+			// draw runs in backwards
+			if(this.dirty){
+				dojo.forEach(this.series, purgeGroup);
+				this.cleanGroup();
+				var s = this.group;
+				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
+			}
+
+			//	inner function for translating polylines to curves with tension
+			function curve(arr, tension){
+				var p=dojo.map(arr, function(item, i){
+					if(i==0){ return "M" + item.x + "," + item.y; }
+					var dx=item.x-arr[i-1].x, dy=arr[i-1].y;
+					return "C"+(item.x-(tension-1)*(dx/tension))+","+dy+" "+(item.x-(dx/tension))+","+item.y+" "+item.x+","+item.y;
+				});
+				return p.join(" ");
+			}
+				
+			var t = this.chart.theme, stroke, outline, color, marker;
+			for(var i = this.series.length - 1; i >= 0; --i){
+				var run = this.series[i];
+				if(!this.dirty && !run.dirty){ continue; }
+				run.cleanGroup();
+				var s = run.group,
+					lpoly = dojo.map(acc, function(v, i){
+						return {
+							x: this._hScaler.scale * (i + 1 - this._hScaler.bounds.lower) + offsets.l,
+							y: dim.height - offsets.b - this._vScaler.scale * (v - this._vScaler.bounds.lower)
+						};
+					}, this);
+				if(!run.fill || !run.stroke){
+					// need autogenerated color
+					color = new dojo.Color(t.next("color"));
+				}
+
+				var lpath="";
+				if(this.opt.tension){
+					lpath=curve(lpoly, this.opt.tension);
+				}
+				
+				if(this.opt.areas){
+					var apoly = dojo.clone(lpoly);
+					var fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
+					if(this.opt.tension){
+						var p=curve(apoly, this.opt.tension);
+						p += " L" + lpoly[lpoly.length-1].x + "," + (dim.height - offsets.b) + " "
+							+ "L" + lpoly[0].x + "," + (dim.height - offsets.b) + " "
+							+ "L" + lpoly[0].x + "," + lpoly[0].y;
+						s.createPath(p).setFill(fill);
+					} else {
+						apoly.push({x: lpoly[lpoly.length - 1].x, y: dim.height - offsets.b});
+						apoly.push({x: lpoly[0].x, y: dim.height - offsets.b});
+						apoly.push(lpoly[0]);
+						s.createPolyline(apoly).setFill(fill);
+					}
+				}
+				if(this.opt.lines || this.opt.markers){
+					// need a stroke
+					stroke = run.stroke ? dc.makeStroke(run.stroke) : dc.augmentStroke(t.series.stroke, color);
+					if(run.outline || t.series.outline){
+						outline = dc.makeStroke(run.outline ? run.outline : t.series.outline);
+						outline.width = 2 * outline.width + stroke.width;
+					}
+				}
+				if(this.opt.markers){
+					// need a marker
+					marker = run.marker ? run.marker : t.next("marker");
+				}
+				if(this.opt.shadows && stroke){
+					var sh = this.opt.shadows, shadowColor = new dojo.Color([0, 0, 0, 0.3]),
+						spoly = dojo.map(lpoly, function(c){
+							return {x: c.x + sh.dx, y: c.y + sh.dy};
+						}),
+						shadowStroke = dojo.clone(outline ? outline : stroke);
+					shadowStroke.color = shadowColor;
+					shadowStroke.width += sh.dw ? sh.dw : 0;
+					if(this.opt.lines){
+						if(this.opt.tension){
+							s.createPath(curve(spoly, this.opt.tension)).setStroke(shadowStroke);
+						} else {
+							s.createPolyline(spoly).setStroke(shadowStroke);
+						}
+					}
+					if(this.opt.markers){
+						dojo.forEach(spoly, function(c){
+							s.createPath("M" + c.x + " " + c.y + " " + marker).setStroke(shadowStroke).setFill(shadowColor);
+						}, this);
+					}
+				}
+				if(this.opt.lines){
+					if(outline){
+						if(this.opt.tension){
+							s.createPath(lpath).setStroke(outline);
+						} else {
+							s.createPolyline(lpoly).setStroke(outline);
+						}
+					}
+					if(this.opt.tension){
+						s.createPath(lpath).setStroke(stroke);
+					} else {
+						s.createPolyline(lpoly).setStroke(stroke);
+					}
+				}
+				if(this.opt.markers){
+					dojo.forEach(lpoly, function(c){
+						var path = "M" + c.x + " " + c.y + " " + marker;
+						if(outline){
+							s.createPath(path).setStroke(outline);
+						}
+						s.createPath(path).setStroke(stroke).setFill(stroke.color);
+					}, this);
+				}
+				run.dirty = false;
+				// update the accumulator
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j];
+					if(isNaN(v)){ v = 0; }
+					acc[j] -= v;
+				}
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedAreas.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedAreas.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedAreas.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+if(!dojo._hasResource["dojox.charting.plot2d.StackedAreas"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.StackedAreas"] = true;
+dojo.provide("dojox.charting.plot2d.StackedAreas");
+
+dojo.require("dojox.charting.plot2d.Stacked");
+
+dojo.declare("dojox.charting.plot2d.StackedAreas", dojox.charting.plot2d.Stacked, {
+	constructor: function(){
+		this.opt.lines = true;
+		this.opt.areas = true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedBars.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedBars.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedBars.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,85 @@
+if(!dojo._hasResource["dojox.charting.plot2d.StackedBars"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.StackedBars"] = true;
+dojo.provide("dojox.charting.plot2d.StackedBars");
+
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.charting.plot2d.Bars");
+
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.reversed");
+
+(function(){
+	var df = dojox.lang.functional, dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	dojo.declare("dojox.charting.plot2d.StackedBars", dojox.charting.plot2d.Bars, {
+		calculateAxes: function(dim){
+			var stats = dc.collectStackedStats(this.series), t;
+			this._maxRunLength = stats.hmax;
+			stats.hmin -= 0.5;
+			stats.hmax += 0.5;
+			t = stats.hmin, stats.hmin = stats.vmin, stats.vmin = t;
+			t = stats.hmax, stats.hmax = stats.vmax, stats.vmax = t;
+			this._calc(dim, stats);
+			return this;
+		},
+		render: function(dim, offsets){
+			// stack all values
+			var acc = df.repeat(this._maxRunLength, "-> 0", 0);
+			for(var i = 0; i < this.series.length; ++i){
+				var run = this.series[i];
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j];
+					if(isNaN(v)){ v = 0; }
+					acc[j] += v;
+				}
+			}
+			// draw runs in backwards
+			if(this.dirty){
+				dojo.forEach(this.series, purgeGroup);
+				this.cleanGroup();
+				var s = this.group;
+				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
+			}
+			var t = this.chart.theme, color, stroke, fill, f,
+				gap = this.opt.gap < this._vScaler.scale / 3 ? this.opt.gap : 0;
+			for(var i = this.series.length - 1; i >= 0; --i){
+				var run = this.series[i];
+				if(!this.dirty && !run.dirty){ continue; }
+				run.cleanGroup();
+				var s = run.group;
+				if(!run.fill || !run.stroke){
+					// need autogenerated color
+					color = run.dyn.color = new dojo.Color(t.next("color"));
+				}
+				stroke = run.stroke ? run.stroke : dc.augmentStroke(t.series.stroke, color);
+				fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
+				for(var j = 0; j < acc.length; ++j){
+					var v = acc[j],
+						width  = this._hScaler.scale * (v - this._hScaler.bounds.lower),
+						height = this._vScaler.scale - 2 * gap;
+					if(width >= 1 && height >= 1){
+						var shape = s.createRect({
+							x: offsets.l,
+							y: dim.height - offsets.b - this._vScaler.scale * (j + 1.5 - this._vScaler.bounds.lower) + gap,
+							width: width, height: height
+						}).setFill(fill).setStroke(stroke);
+						run.dyn.fill   = shape.getFill();
+						run.dyn.stroke = shape.getStroke();
+					}
+				}
+				run.dirty = false;
+				// update the accumulator
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j];
+					if(isNaN(v)){ v = 0; }
+					acc[j] -= v;
+				}
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedColumns.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedColumns.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedColumns.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,83 @@
+if(!dojo._hasResource["dojox.charting.plot2d.StackedColumns"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.StackedColumns"] = true;
+dojo.provide("dojox.charting.plot2d.StackedColumns");
+
+dojo.require("dojox.charting.plot2d.common");
+dojo.require("dojox.charting.plot2d.Columns");
+
+dojo.require("dojox.lang.functional");
+dojo.require("dojox.lang.functional.reversed");
+
+(function(){
+	var df = dojox.lang.functional, dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	dojo.declare("dojox.charting.plot2d.StackedColumns", dojox.charting.plot2d.Columns, {
+		calculateAxes: function(dim){
+			var stats = dc.collectStackedStats(this.series);
+			this._maxRunLength = stats.hmax;
+			stats.hmin -= 0.5;
+			stats.hmax += 0.5;
+			this._calc(dim, stats);
+			return this;
+		},
+		render: function(dim, offsets){
+			// stack all values
+			var acc = df.repeat(this._maxRunLength, "-> 0", 0);
+			for(var i = 0; i < this.series.length; ++i){
+				var run = this.series[i];
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j];
+					if(isNaN(v)){ v = 0; }
+					acc[j] += v;
+				}
+			}
+			// draw runs in backwards
+			if(this.dirty){
+				dojo.forEach(this.series, purgeGroup);
+				this.cleanGroup();
+				var s = this.group;
+				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
+			}
+			var t = this.chart.theme, color, stroke, fill, f,
+				gap = this.opt.gap < this._hScaler.scale / 3 ? this.opt.gap : 0;
+			for(var i = this.series.length - 1; i >= 0; --i){
+				var run = this.series[i];
+				if(!this.dirty && !run.dirty){ continue; }
+				run.cleanGroup();
+				var s = run.group;
+				if(!run.fill || !run.stroke){
+					// need autogenerated color
+					color = run.dyn.color = new dojo.Color(t.next("color"));
+				}
+				stroke = run.stroke ? run.stroke : dc.augmentStroke(t.series.stroke, color);
+				fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
+				for(var j = 0; j < acc.length; ++j){
+					var v = acc[j],
+						width  = this._hScaler.scale - 2 * gap,
+						height = this._vScaler.scale * (v - this._vScaler.bounds.lower);
+					if(width >= 1 && height >= 1){
+						var shape = s.createRect({
+							x: offsets.l + this._hScaler.scale * (j + 0.5 - this._hScaler.bounds.lower) + gap,
+							y: dim.height - offsets.b - this._vScaler.scale * (v - this._vScaler.bounds.lower),
+							width: width, height: height
+						}).setFill(fill).setStroke(stroke);
+						run.dyn.fill   = shape.getFill();
+						run.dyn.stroke = shape.getStroke();
+					}
+				}
+				run.dirty = false;
+				// update the accumulator
+				for(var j = 0; j < run.data.length; ++j){
+					var v = run.data[j];
+					if(isNaN(v)){ v = 0; }
+					acc[j] -= v;
+				}
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedLines.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedLines.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/StackedLines.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,13 @@
+if(!dojo._hasResource["dojox.charting.plot2d.StackedLines"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.StackedLines"] = true;
+dojo.provide("dojox.charting.plot2d.StackedLines");
+
+dojo.require("dojox.charting.plot2d.Stacked");
+
+dojo.declare("dojox.charting.plot2d.StackedLines", dojox.charting.plot2d.Stacked, {
+	constructor: function(){
+		this.opt.lines = true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot2d/common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,113 @@
+if(!dojo._hasResource["dojox.charting.plot2d.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.common"] = true;
+dojo.provide("dojox.charting.plot2d.common");
+
+dojo.require("dojo.colors");
+dojo.require("dojox.gfx");
+dojo.require("dojox.lang.functional");
+
+(function(){
+	var df = dojox.lang.functional, dc = dojox.charting.plot2d.common;
+	
+	dojo.mixin(dojox.charting.plot2d.common, {
+		makeStroke: function(stroke){
+			if(!stroke){ return stroke; }
+			if(typeof stroke == "string" || stroke instanceof dojo.Color){
+				stroke = {color: stroke};
+			}
+			return dojox.gfx.makeParameters(dojox.gfx.defaultStroke, stroke);
+		},
+		augmentColor: function(target, color){
+			var t = new dojo.Color(target),
+				c = new dojo.Color(color);
+			c.a = t.a;
+			return c;
+		},
+		augmentStroke: function(stroke, color){
+			var s = dc.makeStroke(stroke);
+			if(s){
+				s.color = dc.augmentColor(s.color, color);
+			}
+			return s;
+		},
+		augmentFill: function(fill, color){
+			var fc, c = new dojo.Color(color);
+			if(typeof fill == "string" || fill instanceof dojo.Color){
+				return dc.augmentColor(fill, color);
+			}
+			return fill;
+		},
+		
+		defaultStats: {hmin: Number.POSITIVE_INFINITY, hmax: Number.NEGATIVE_INFINITY, 
+			vmin: Number.POSITIVE_INFINITY, vmax: Number.NEGATIVE_INFINITY},
+		
+		collectSimpleStats: function(series){
+			var stats = dojo.clone(dc.defaultStats);
+			for(var i = 0; i < series.length; ++i){
+				var run = series[i];
+				if(!run.data.length){ continue; }
+				if(typeof run.data[0] == "number"){
+					// 1D case
+					var old_vmin = stats.vmin, old_vmax = stats.vmax;
+					if(!("ymin" in run) || !("ymax" in run)){
+						dojo.forEach(run.data, function(val, i){
+							var x = i + 1, y = val;
+							if(isNaN(y)){ y = 0; }
+							stats.hmin = Math.min(stats.hmin, x);
+							stats.hmax = Math.max(stats.hmax, x);
+							stats.vmin = Math.min(stats.vmin, y);
+							stats.vmax = Math.max(stats.vmax, y);
+						});
+					}
+					if("ymin" in run){ stats.vmin = Math.min(old_vmin, run.ymin); }
+					if("ymax" in run){ stats.vmax = Math.max(old_vmax, run.ymax); }
+				}else{
+					// 2D case
+					var old_hmin = stats.hmin, old_hmax = stats.hmax,
+						old_vmin = stats.vmin, old_vmax = stats.vmax;
+					if(!("xmin" in run) || !("xmax" in run) || !("ymin" in run) || !("ymax" in run)){
+						dojo.forEach(run.data, function(val, i){
+							var x = val.x, y = val.y;
+							if(isNaN(x)){ x = 0; }
+							if(isNaN(y)){ y = 0; }
+							stats.hmin = Math.min(stats.hmin, x);
+							stats.hmax = Math.max(stats.hmax, x);
+							stats.vmin = Math.min(stats.vmin, y);
+							stats.vmax = Math.max(stats.vmax, y);
+						});
+					}
+					if("xmin" in run){ stats.hmin = Math.min(old_hmin, run.xmin); }
+					if("xmax" in run){ stats.hmax = Math.max(old_hmax, run.xmax); }
+					if("ymin" in run){ stats.vmin = Math.min(old_vmin, run.ymin); }
+					if("ymax" in run){ stats.vmax = Math.max(old_vmax, run.ymax); }
+				}
+			}
+			return stats;
+		},
+		
+		collectStackedStats: function(series){
+			// collect statistics
+			var stats = dojo.clone(dc.defaultStats);
+			if(series.length){
+				// 1st pass: find the maximal length of runs
+				stats.hmin = Math.min(stats.hmin, 1);
+				stats.hmax = df.foldl(series, "seed, run -> Math.max(seed, run.data.length)", stats.hmax);
+				// 2nd pass: stack values
+				for(var i = 0; i < stats.hmax; ++i){
+					var v = series[0].data[i];
+					if(isNaN(v)){ v = 0; }
+					stats.vmin = Math.min(stats.vmin, v);
+					for(var j = 1; j < series.length; ++j){
+						var t = series[j].data[i];
+						if(isNaN(t)){ t = 0; }
+						v += t;
+					}
+					stats.vmax = Math.max(stats.vmax, v);
+				}
+			}
+			return stats;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Bars.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Bars.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Bars.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,66 @@
+if(!dojo._hasResource["dojox.charting.plot3d.Bars"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot3d.Bars"] = true;
+dojo.provide("dojox.charting.plot3d.Bars");
+
+dojo.require("dojox.charting.plot3d.Base");
+
+(function(){
+
+	// reduce function borrowed from dojox.fun
+	var reduce = function(/*Array*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
+		// summary: repeatedly applies a binary function to an array from left 
+		//	to right; returns the final value.
+		a = typeof a == "string" ? a.split("") : a; o = o || dojo.global;
+		var z = a[0];
+		for(var i = 1; i < a.length; z = f.call(o, z, a[i++]));
+		return z;	// Object
+	};
+
+	dojo.declare("dojox.charting.plot3d.Bars", dojox.charting.plot3d.Base, {
+		constructor: function(width, height, kwArgs){
+			this.depth = "auto";
+			this.gap   = 0;
+			this.data  = [];
+			this.material = {type: "plastic", finish: "dull", color: "lime"};
+			if(kwArgs){
+				if("depth" in kwArgs){ this.depth = kwArgs.depth; }
+				if("gap"   in kwArgs){ this.gap   = kwArgs.gap; }
+				if("material" in kwArgs){
+					var m = kwArgs.material;
+					if(typeof m == "string" || m instanceof dojo.Color){
+						this.material.color = m;
+					}else{
+						this.material = m;
+					}
+				}
+			}
+		},
+		getDepth: function(){
+			if(this.depth == "auto"){
+				var w = this.width;
+				if(this.data && this.data.length){
+					w = w / this.data.length;
+				}
+				return w - 2 * this.gap;
+			}
+			return this.depth;
+		},
+		generate: function(chart, creator){
+			if(!this.data){ return this; }
+			var step = this.width / this.data.length, org = 0,
+				depth = this.depth == "auto" ? step - 2 * this.gap : this.depth,
+				scale = this.height / reduce(this.data, Math.max);
+			if(!creator){ creator = chart.view; }
+			for(var i = 0; i < this.data.length; ++i, org += step){
+				creator
+					.createCube({
+						bottom: {x: org + this.gap, y: 0, z: 0}, 
+						top:    {x: org + step - this.gap, y: this.data[i] * scale, z: depth}
+					})
+					.setFill(this.material);
+			}
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,23 @@
+if(!dojo._hasResource["dojox.charting.plot3d.Base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot3d.Base"] = true;
+dojo.provide("dojox.charting.plot3d.Base");
+
+dojo.require("dojox.charting.Chart3D");
+
+dojo.declare("dojox.charting.plot3d.Base", null, {
+	constructor: function(width, height, kwArgs){
+		this.width  = width;
+		this.height = height;
+	},
+	setData: function(data){
+		this.data = data ? data : [];
+		return this;
+	},
+	getDepth: function(){
+		return this.depth;
+	},
+	generate: function(chart, creator){
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Cylinders.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Cylinders.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/plot3d/Cylinders.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,69 @@
+if(!dojo._hasResource["dojox.charting.plot3d.Cylinders"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot3d.Cylinders"] = true;
+dojo.provide("dojox.charting.plot3d.Cylinders");
+
+dojo.require("dojox.charting.plot3d.Base");
+
+(function(){
+
+	// reduce function borrowed from dojox.fun
+	var reduce = function(/*Array*/ a, /*Function|String|Array*/ f, /*Object?*/ o){
+		// summary: repeatedly applies a binary function to an array from left 
+		//	to right; returns the final value.
+		a = typeof a == "string" ? a.split("") : a; o = o || dojo.global;
+		var z = a[0];
+		for(var i = 1; i < a.length; z = f.call(o, z, a[i++]));
+		return z;	// Object
+	};
+
+	dojo.declare("dojox.charting.plot3d.Cylinders", dojox.charting.plot3d.Base, {
+		constructor: function(width, height, kwArgs){
+			this.depth = "auto";
+			this.gap   = 0;
+			this.data  = [];
+			this.material = {type: "plastic", finish: "shiny", color: "lime"};
+			this.outline  = null;
+			if(kwArgs){
+				if("depth" in kwArgs){ this.depth = kwArgs.depth; }
+				if("gap"   in kwArgs){ this.gap   = kwArgs.gap; }
+				if("material" in kwArgs){
+					var m = kwArgs.material;
+					if(typeof m == "string" || m instanceof dojo.Color){
+						this.material.color = m;
+					}else{
+						this.material = m;
+					}
+				}
+				if("outline" in kwArgs){ this.outline = kwArgs.outline; }
+			}
+		},
+		getDepth: function(){
+			if(this.depth == "auto"){
+				var w = this.width;
+				if(this.data && this.data.length){
+					w = w / this.data.length;
+				}
+				return w - 2 * this.gap;
+			}
+			return this.depth;
+		},
+		generate: function(chart, creator){
+			if(!this.data){ return this; }
+			var step = this.width / this.data.length, org = 0,
+				scale = this.height / reduce(this.data, Math.max);
+			if(!creator){ creator = chart.view; }
+			for(var i = 0; i < this.data.length; ++i, org += step){
+				creator
+					.createCylinder({
+						center: {x: org + step / 2, y: 0, z: 0}, 
+						radius: step / 2 - this.gap, 
+						height: this.data[i] * scale
+					})
+					.setTransform(dojox.gfx3d.matrix.rotateXg(-90))
+					.setFill(this.material).setStroke(this.outline);
+			}
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/scaler.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/scaler.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/scaler.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,161 @@
+if(!dojo._hasResource["dojox.charting.scaler"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.scaler"] = true;
+dojo.provide("dojox.charting.scaler");
+
+(function(){
+	var deltaLimit = 3;	// pixels
+	
+	var isText = function(val, text){
+		val = val.toLowerCase();
+		for(var i = 0; i < text.length; ++i){
+			if(val == text[i]){ return true; }
+		}
+		return false;
+	};
+	
+	var calcTicks = function(min, max, kwArgs, majorTick, minorTick, microTick, span){
+		kwArgs = dojo.clone(kwArgs);
+		if(!majorTick){
+			if(kwArgs.fixUpper == "major"){ kwArgs.fixUpper = "minor"; }
+			if(kwArgs.fixLower == "major"){ kwArgs.fixLower = "minor"; }
+		}
+		if(!minorTick){
+			if(kwArgs.fixUpper == "minor"){ kwArgs.fixUpper = "micro"; }
+			if(kwArgs.fixLower == "minor"){ kwArgs.fixLower = "micro"; }
+		}
+		if(!microTick){
+			if(kwArgs.fixUpper == "micro"){ kwArgs.fixUpper = "none"; }
+			if(kwArgs.fixLower == "micro"){ kwArgs.fixLower = "none"; }
+		}
+		var lowerBound = isText(kwArgs.fixLower, ["major"]) ? 
+				Math.floor(min / majorTick) * majorTick :
+					isText(kwArgs.fixLower, ["minor"]) ? 
+						Math.floor(min / minorTick) * minorTick :
+							isText(kwArgs.fixLower, ["micro"]) ?
+								Math.floor(min / microTick) * unit : min,
+			upperBound = isText(kwArgs.fixUpper, ["major"]) ? 
+				Math.ceil(max / majorTick) * majorTick :
+					isText(kwArgs.fixUpper, ["minor"]) ? 
+						Math.ceil(max / minorTick) * minorTick :
+							isText(kwArgs.fixUpper, ["unit"]) ?
+								Math.ceil(max / unit) * unit : max,
+			majorStart = (isText(kwArgs.fixLower, ["major"]) || !majorTick) ?
+				lowerBound : Math.ceil(lowerBound / majorTick) * majorTick,
+			minorStart = (isText(kwArgs.fixLower, ["major", "minor"]) || !minorTick) ?
+				lowerBound : Math.ceil(lowerBound / minorTick) * minorTick,
+			microStart = (isText(kwArgs.fixLower, ["major", "minor", "micro"]) || ! microTick) ?
+				lowerBound : Math.ceil(lowerBound / microTick) * microTick,
+			majorCount = !majorTick ? 0 : (isText(kwArgs.fixUpper, ["major"]) ?
+				Math.round((upperBound - majorStart) / majorTick) :
+				Math.floor((upperBound - majorStart) / majorTick)) + 1,
+			minorCount = !minorTick ? 0 : (isText(kwArgs.fixUpper, ["major", "minor"]) ?
+				Math.round((upperBound - minorStart) / minorTick) :
+				Math.floor((upperBound - minorStart) / minorTick)) + 1,
+			microCount = !microTick ? 0 : (isText(kwArgs.fixUpper, ["major", "minor", "micro"]) ?
+				Math.round((upperBound - microStart) / microTick) :
+				Math.floor((upperBound - microStart) / microTick)) + 1,
+			minorPerMajor  = minorTick ? Math.round(majorTick / minorTick) : 0,
+			microPerMinor  = microTick ? Math.round(minorTick / microTick) : 0,
+			majorPrecision = majorTick ? Math.floor(Math.log(majorTick) / Math.LN10) : 0,
+			minorPrecision = minorTick ? Math.floor(Math.log(minorTick) / Math.LN10) : 0,
+			scale = span / (upperBound - lowerBound);
+		if(!isFinite(scale)){ scale = 1; }
+		return {
+			bounds: {
+				lower:	lowerBound,
+				upper:	upperBound
+			},
+			major: {
+				tick:	majorTick,
+				start:	majorStart,
+				count:	majorCount,
+				prec:	majorPrecision
+			},
+			minor: {
+				tick:	minorTick,
+				start:	minorStart,
+				count:	minorCount,
+				prec:	minorPrecision
+			},
+			micro: {
+				tick:	microTick,
+				start:	microStart,
+				count:	microCount,
+				prec:	0
+			},
+			minorPerMajor:	minorPerMajor,
+			microPerMinor:	microPerMinor,
+			scale:			scale
+		};
+	};
+
+	dojox.charting.scaler = function(min, max, span, kwArgs){
+		var h = {fixUpper: "none", fixLower: "none", natural: false};
+		if(kwArgs){
+			if("fixUpper" in kwArgs){ h.fixUpper = String(kwArgs.fixUpper); }
+			if("fixLower" in kwArgs){ h.fixLower = String(kwArgs.fixLower); }
+			if("natural"  in kwArgs){ h.natural  = Boolean(kwArgs.natural); }
+		}
+		
+		if(max <= min){
+			return calcTicks(min, max, h, 0, 0, 0, span);	// Object
+		}
+		
+		var mag = Math.floor(Math.log(max - min) / Math.LN10),
+			major = kwArgs && ("majorTick" in kwArgs) ? kwArgs.majorTick : Math.pow(10, mag), 
+			minor = 0, micro = 0, ticks;
+			
+		// calculate minor ticks
+		if(kwArgs && ("minorTick" in kwArgs)){
+			minor = kwArgs.minorTick;
+		}else{
+			do{
+				minor = major / 10;
+				if(!h.natural || minor > 0.9){
+					ticks = calcTicks(min, max, h, major, minor, 0, span);
+					if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
+				}
+				minor = major / 5;
+				if(!h.natural || minor > 0.9){
+					ticks = calcTicks(min, max, h, major, minor, 0, span);
+					if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
+				}
+				minor = major / 2;
+				if(!h.natural || minor > 0.9){
+					ticks = calcTicks(min, max, h, major, minor, 0, span);
+					if(ticks.scale * ticks.minor.tick > deltaLimit){ break; }
+				}
+				return calcTicks(min, max, h, major, 0, 0, span);	// Object
+			}while(false);
+		}
+
+		// calculate micro ticks
+		if(kwArgs && ("microTick" in kwArgs)){
+			micro = kwArgs.microTick;
+			ticks = calcTicks(min, max, h, major, minor, micro, span);
+		}else{
+			do{
+				micro = minor / 10;
+				if(!h.natural || micro > 0.9){
+					ticks = calcTicks(min, max, h, major, minor, micro, span);
+					if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
+				}
+				micro = minor / 5;
+				if(!h.natural || micro > 0.9){
+					ticks = calcTicks(min, max, h, major, minor, micro, span);
+					if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
+				}
+				micro = minor / 2;
+				if(!h.natural || micro > 0.9){
+					ticks = calcTicks(min, max, h, major, minor, micro, span);
+					if(ticks.scale * ticks.micro.tick > deltaLimit){ break; }
+				}
+				micro = 0;
+			}while(false);
+		}
+
+		return micro ? ticks : calcTicks(min, max, h, major, minor, 0, span);	// Object
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/ET/greys.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/ET/greys.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/ET/greys.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,63 @@
+if(!dojo._hasResource["dojox.charting.themes.ET.greys"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.themes.ET.greys"] = true;
+dojo.provide("dojox.charting.themes.ET.greys");
+dojo.require("dojox.charting.Theme");
+
+(function(){
+	var dxc=dojox.charting;
+	dxc.themes.ET.greys = new dxc.Theme({
+		antiAlias: false,
+		chart: {
+			stroke: null,
+			fill: "transparent"
+		},
+		plotarea: {
+			// stroke: { width: 0.2, color: "#666666" },
+			stroke: null,
+			fill: "transparent"
+		},
+		axis:{
+			stroke:{ width:	0 },
+			line:{ width:	0 },
+			majorTick:{ 
+				color:	"#666666", 
+				width:	1,
+				length: 5
+			},
+			minorTick: { 
+				color:	"black", 
+				width:	0.5, 
+				length:	2
+			},
+			font:"normal normal normal 8pt Tahoma",
+			fontColor:"#999999"
+		},
+		series:{
+			outline:{ width: 0, color: "black" },
+			stroke:	{ width: 1, color: "black" },
+			fill:	dojo.colorFromHex("#3b444b"),
+			font: "normal normal normal 7pt Tahoma",	//	label
+			fontColor: "#717171"
+		},
+		marker:{	//	any markers on a series.
+			stroke:{ width:1 },
+			fill:"#333",
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		colors:[]
+	});
+	dxc.themes.ET.greys.defineColors({
+		colors: [
+			// dojo.colorFromHex("#c3c3c3"), 
+			dojo.colorFromHex("#8a8c8f"), 
+			dojo.colorFromHex("#4b4b4b"),
+			dojo.colorFromHex("#3b444b"), 
+			dojo.colorFromHex("#2e2d30"),
+			dojo.colorFromHex("#000000") 
+		]
+	});
+})();
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/GreySkies.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/GreySkies.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/GreySkies.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,11 @@
+if(!dojo._hasResource["dojox.charting.themes.GreySkies"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.themes.GreySkies"] = true;
+dojo.provide("dojox.charting.themes.GreySkies");
+dojo.require("dojox.charting.Theme");
+
+(function(){
+	var dxc=dojox.charting;
+	dxc.themes.GreySkies=new dxc.Theme(dxc.Theme._def);
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,11 @@
+This directory contains a set of themes for the DojoX Charting 
+engine that are based on the visual stylings of the PlotKit
+chart kit, created by Alastair Tse:
+
+http://www.liquidx.net/plotkit/
+
+...whose work we admire.  Consider these themes to not be a 
+ripoff of his fine work, but instead a true homage: his charts
+are beautiful, and we stand in awe.
+
+--trt, 2007-06-08

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/blue.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/blue.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/blue.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+if(!dojo._hasResource["dojox.charting.themes.PlotKit.blue"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.themes.PlotKit.blue"] = true;
+dojo.provide("dojox.charting.themes.PlotKit.blue");
+dojo.require("dojox.charting.Theme");
+
+(function(){
+	var dxc=dojox.charting;
+	dxc.themes.PlotKit.blue=new dxc.Theme({
+		chart:{
+			stroke:null,
+			fill: "white"
+		},
+		plotarea:{
+			stroke:null,
+			fill: "#e7eef6"
+		},
+		axis:{
+			stroke:{ color:"#fff",width:2 },
+			line:{ color:"#fff",width:1 },
+			majorTick:{ color:"#fff", width:2, length:12 },
+			minorTick:{ color:"#fff", width:1, length:8 },
+			font:"normal normal normal 8pt Tahoma",
+			fontColor:"#999"
+		},
+		series:{
+			outline:{ width: 0.1, color:"#fff" },
+			stroke:{ width: 1.5, color:"#666" },
+			fill:new dojo.Color([0x66, 0x66, 0x66, 0.8]),
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		marker:{	//	any markers on a series.
+			stroke:{ width:2 },
+			fill:"#333",
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		colors:[]
+	});
+	dxc.themes.PlotKit.blue.defineColors({ hue:217, saturation:60, low:40, high:88 });
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/cyan.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/cyan.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/cyan.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+if(!dojo._hasResource["dojox.charting.themes.PlotKit.cyan"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.themes.PlotKit.cyan"] = true;
+dojo.provide("dojox.charting.themes.PlotKit.cyan");
+dojo.require("dojox.charting.Theme");
+
+(function(){
+	var dxc=dojox.charting;
+	dxc.themes.PlotKit.cyan=new dxc.Theme({
+		chart:{
+			stroke:null,
+			fill: "white"
+		},
+		plotarea:{
+			stroke:null,
+			fill: "#e6f1f5"
+		},
+		axis:{
+			stroke:{ color:"#fff",width:2 },
+			line:{ color:"#fff",width:1 },
+			majorTick:{ color:"#fff", width:2, length:12 },
+			minorTick:{ color:"#fff", width:1, length:8 },
+			font:"normal normal normal 8pt Tahoma",
+			fontColor:"#999"
+		},
+		series:{
+			outline:{ width:1, color:"#fff" },
+			stroke:{ width:2, color:"#666" },
+			fill:new dojo.Color([0x66, 0x66, 0x66, 0.8]),
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		marker:{	//	any markers on a series.
+			stroke:{ width:2 },
+			fill:"#333",
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		colors:[]
+	});
+	dxc.themes.PlotKit.cyan.defineColors({ hue:194, saturation:60, low:40, high:88 });
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/green.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/green.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/green.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+if(!dojo._hasResource["dojox.charting.themes.PlotKit.green"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.themes.PlotKit.green"] = true;
+dojo.provide("dojox.charting.themes.PlotKit.green");
+dojo.require("dojox.charting.Theme");
+
+(function(){
+	var dxc=dojox.charting;
+	dxc.themes.PlotKit.green=new dxc.Theme({
+		chart:{
+			stroke:null,
+			fill: "white"
+		},
+		plotarea:{
+			stroke:null,
+			fill: "#eff5e6"
+		},
+		axis:{
+			stroke:{ color:"#fff",width:2 },
+			line:{ color:"#fff",width:1 },
+			majorTick:{ color:"#fff", width:2, length:12 },
+			minorTick:{ color:"#fff", width:1, length:8 },
+			font:"normal normal normal 8pt Tahoma",
+			fontColor:"#999"
+		},
+		series:{
+			outline:{ width:1, color:"#fff" },
+			stroke:{ width:2, color:"#666" },
+			fill:new dojo.Color([0x66, 0x66, 0x66, 0.8]),
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		marker:{	//	any markers on a series.
+			stroke:{ width:2 },
+			fill:"#333",
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		colors:[]
+	});
+	dxc.themes.PlotKit.green.defineColors({ hue:82, saturation:60, low:40, high:88 });
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/orange.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/orange.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/orange.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+if(!dojo._hasResource["dojox.charting.themes.PlotKit.orange"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.themes.PlotKit.orange"] = true;
+dojo.provide("dojox.charting.themes.PlotKit.orange");
+dojo.require("dojox.charting.Theme");
+
+(function(){
+	var dxc=dojox.charting;
+	dxc.themes.PlotKit.orange=new dxc.Theme({
+		chart:{
+			stroke:null,
+			fill: "white"
+		},
+		plotarea:{
+			stroke:null,
+			fill: "#f5eee6"
+		},
+		axis:{
+			stroke:{ color:"#fff",width:2 },
+			line:{ color:"#fff",width:1 },
+			majorTick:{ color:"#fff", width:2, length:12 },
+			minorTick:{ color:"#fff", width:1, length:8 },
+			font:"normal normal normal 8pt Tahoma",
+			fontColor:"#999"
+		},
+		series:{
+			outline:{ width:0.15, color: "#fff" },
+			stroke:{ width:1.5, color: "#666" },
+			fill:new dojo.Color([0x66, 0x66, 0x66, 0.8]),
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		marker:{	//	any markers on a series.
+			stroke:{ width:2 },
+			fill:"#333",
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		colors:[]
+	});
+	dxc.themes.PlotKit.orange.defineColors({ hue:31, saturation:60, low:40, high:88 });
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/purple.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/purple.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/purple.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+if(!dojo._hasResource["dojox.charting.themes.PlotKit.purple"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.themes.PlotKit.purple"] = true;
+dojo.provide("dojox.charting.themes.PlotKit.purple");
+dojo.require("dojox.charting.Theme");
+
+(function(){
+	var dxc=dojox.charting;
+	dxc.themes.PlotKit.purple=new dxc.Theme({
+		chart:{
+			stroke:null,
+			fill: "white"
+		},
+		plotarea:{
+			stroke:null,
+			fill: "#eee6f5"
+		},
+		axis:{
+			stroke:{ color:"#fff",width:2 },
+			line:{ color:"#fff",width:1 },
+			majorTick:{ color:"#fff", width:2, length:12 },
+			minorTick:{ color:"#fff", width:1, length:8 },
+			font:"normal normal normal 8pt Tahoma",
+			fontColor:"#999"
+		},
+		series:{
+			outline:{ width:1, color:"#fff" },
+			stroke:{ width:2, color:"#666" },
+			fill:new dojo.Color([0x66, 0x66, 0x66, 0.8]),
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		marker:{	//	any markers on a series.
+			stroke:{ width:2 },
+			fill:"#333",
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		colors:[]
+	});
+	dxc.themes.PlotKit.purple.defineColors({ hue:271, saturation:60, low:40, high:88 });
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/red.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/red.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/themes/PlotKit/red.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+if(!dojo._hasResource["dojox.charting.themes.PlotKit.red"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.themes.PlotKit.red"] = true;
+dojo.provide("dojox.charting.themes.PlotKit.red");
+dojo.require("dojox.charting.Theme");
+
+(function(){
+	var dxc=dojox.charting;
+	dxc.themes.PlotKit.red=new dxc.Theme({
+		chart:{
+			stroke:null,
+			fill: "white"
+		},
+		plotarea:{
+			stroke:null,
+			fill: "#f5e6e6"
+		},
+		axis:{
+			stroke:{ color:"#fff",width:2 },
+			line:{ color:"#fff",width:1 },
+			majorTick:{ color:"#fff", width:2, length:12 },
+			minorTick:{ color:"#fff", width:1, length:8 },
+			font:"normal normal normal 8pt Tahoma",
+			fontColor:"#999"
+		},
+		series:{
+			outline:{ width:1, color:"#fff" },
+			stroke:{ width:2, color:"#666" },
+			fill:new dojo.Color([0x66, 0x66, 0x66, 0.8]),
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		marker:{	//	any markers on a series.
+			stroke:{ width:2 },
+			fill:"#333",
+			font:"normal normal normal 7pt Tahoma",	//	label
+			fontColor:"#000"
+		},
+		colors:[]
+	});
+	dxc.themes.PlotKit.red.defineColors({ hue:1, saturation:60, low:40, high:88 });
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/charting/widget/Chart2D.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/charting/widget/Chart2D.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/charting/widget/Chart2D.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,215 @@
+if(!dojo._hasResource["dojox.charting.widget.Chart2D"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.widget.Chart2D"] = true;
+dojo.provide("dojox.charting.widget.Chart2D");
+
+dojo.require("dijit._Widget");
+dojo.require("dojox.charting.Chart2D");
+dojo.require("dojox.lang.functional");
+
+(function(){
+	var collectAxisParams, collectPlotParams, collectDataParams,
+		notNull = function(o){ return o; },
+		df = dojox.lang.functional,
+		du = dojox.lang.utils;
+	
+	dojo.declare("dojox.charting.widget.Chart2D", dijit._Widget, {
+		// parameters for the markup
+		
+		// theme for the chart
+		theme: null,
+		
+		// margins for the chart: {l: 10, r: 10, t: 10, b: 10}
+		margins: null,
+		
+		// chart area
+		stroke: null,
+		fill:   null,
+		
+		// methods
+		
+		buildRendering: function(){
+			var n = this.domNode = this.srcNodeRef;
+			
+			// collect chart parameters
+			var axes   = dojo.filter(dojo.query("> .axis",   n).map(collectAxisParams), notNull);
+			var plots  = dojo.filter(dojo.query("> .plot",   n).map(collectPlotParams), notNull);
+			var series = dojo.filter(dojo.query("> .series", n).map(collectDataParams), notNull);
+			
+			// build the chart
+			n.innerHTML = "";
+			var c = this.chart = new dojox.charting.Chart2D(n, {
+				margins: this.margins, 
+				stroke:  this.stroke,
+				fill:    this.fill
+			});
+			
+			// add collected parameters
+			if(this.theme){
+				c.setTheme(this.theme);
+			}
+			dojo.forEach(axes, function(axis){
+				c.addAxis(axis.name, axis.kwArgs);
+			});
+			dojo.forEach(plots, function(plot){
+				c.addPlot(plot.name, plot.kwArgs);
+			});
+			var render = df.foldl(series, function(render, series){
+				if(series.type == "data"){
+					c.addSeries(series.name, series.data, series.kwArgs);
+					render = true;
+				}else{
+					c.addSeries(series.name, [0], series.kwArgs);
+					var kw = {};
+					du.updateWithPattern(
+						kw, 
+						series.kwArgs, 
+						{
+							"query": "", 
+							"queryOptions": null, 
+							"start": 0, 
+							"count": 1 //, 
+							// "sort": []
+						}, 
+						true
+					);
+					if(series.kwArgs.sort){
+						// sort is a complex object type and doesn't survive coercian
+						kw.sort = dojo.clone(series.kwArgs.sort);
+					}
+					dojo.mixin(kw, {
+						onComplete: function(data){
+							var values;
+							if("valueFn" in series.kwArgs){
+								var fn = series.kwArgs.valueFn;
+								values = dojo.map(data, function(x){
+									return fn(series.data.getValue(x, series.field, 0));
+								});
+							}else{
+								values = dojo.map(data, function(x){
+									return series.data.getValue(x, series.field, 0);
+								});
+							}
+							c.addSeries(series.name, values, series.kwArgs).render();
+						}
+					});
+					series.data.fetch(kw);
+				}
+				return render;
+			}, false);
+			if(render){ c.render(); }
+		},
+		resize: function(box){
+			dojo.marginBox(this.domNode, box);
+			this.chart.resize();
+		}
+	});
+	
+	collectAxisParams = function(node){
+		var name = node.getAttribute("name"), type = node.getAttribute("type");
+		if(!name){ return null; }
+		var o = {name: name, kwArgs: {}}, kw = o.kwArgs;
+		if(type){
+			if(dojox.charting.axis2d[type]){
+				type = dojox._scopeName + ".charting.axis2d." + type;
+			}
+			var axis = eval("(" + type + ")");
+			if(axis){ kw.type = axis; } 
+		}else{
+			type = dojox._scopeName + ".charting.axis2d.Default";
+		}
+		var dp = eval("(" + type + ".prototype.defaultParams)");
+		for(var x in dp){
+			if(x in kw){ continue; }
+			var attr = node.getAttribute(x);
+			kw[x] = du.coerceType(dp[x], attr == null ? dp[x] : attr);
+		}
+		var op = eval("(" + type + ".prototype.optionalParams)");
+		for(var x in op){
+			if(x in kw){ continue; }
+			var attr = node.getAttribute(x);
+			if(attr != null){
+				kw[x] = du.coerceType(op[x], attr);
+			}
+		}
+		return o;
+	};
+	
+	collectPlotParams = function(node){
+		var name = node.getAttribute("name"), type = node.getAttribute("type");
+		if(!name){ return null; }
+		var o = {name: name, kwArgs: {}}, kw = o.kwArgs;
+		if(type){
+			if(dojox.charting.plot2d[type]){
+				type = dojox._scopeName + ".charting.plot2d." + type;
+			}
+			var plot = eval("(" + type + ")");
+			if(plot){ kw.type = plot; } 
+		}else{
+			type = dojox._scopeName + ".charting.plot2d.Default";
+		}
+		var dp = eval("(" + type + ".prototype.defaultParams)");
+		for(var x in dp){
+			if(x in kw){ continue; }
+			var attr = node.getAttribute(x);
+			kw[x] = du.coerceType(dp[x], attr == null ? dp[x] : attr);
+		}
+		var op = eval("(" + type + ".prototype.optionalParams)");
+		for(var x in op){
+			if(x in kw){ continue; }
+			var attr = node.getAttribute(x);
+			if(attr != null){
+				kw[x] = du.coerceType(op[x], attr);
+			}
+		}
+		return o;
+	};
+	
+	collectDataParams = function(node){
+		var name = node.getAttribute("name");
+		if(!name){ return null; }
+		var o = {name: name, kwArgs: {}}, kw = o.kwArgs, t;
+		t = node.getAttribute("plot");
+		if(t != null){ kw.plot = t; }
+		t = node.getAttribute("marker");
+		if(t != null){ kw.marker = t; }
+		t = node.getAttribute("stroke");
+		if(t != null){ kw.stroke = eval("(" + t + ")"); }
+		t = node.getAttribute("fill");
+		if(t != null){ kw.fill = eval("(" + t + ")"); }
+		t = node.getAttribute("data");
+		if(t != null){
+			o.type = "data";
+			o.data = dojo.map(String(t).split(','), Number);
+			return o;
+		}
+		t = node.getAttribute("array");
+		if(t != null){
+			o.type = "data";
+			o.data = eval("(" + t + ")");
+			return o;
+		}
+		t = node.getAttribute("store");
+		if(t != null){
+			o.type = "store";
+			o.data = eval("(" + t + ")");
+			t = node.getAttribute("field");
+			o.field = t != null ? t : "value";
+			t = node.getAttribute("query");
+			if(!!t){ kw.query = t; }
+			t = node.getAttribute("queryOptions");
+			if(!!t){ kw.queryOptions = eval("(" + t + ")"); }
+			t = node.getAttribute("start");
+			if(!!t){ kw.start = Number(t); }
+			t = node.getAttribute("count");
+			if(!!t){ kw.count = Number(t); }
+			t = node.getAttribute("sort");
+			if(!!t){ kw.sort = eval("("+t+")"); }
+			t = node.getAttribute("valueFn");
+			if(!!t){ kw.valueFn = df.lambda(t); }
+			return o;
+		}
+		return null;
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/ArrayList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/ArrayList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/ArrayList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,133 @@
+if(!dojo._hasResource["dojox.collections.ArrayList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections.ArrayList"] = true;
+dojo.provide("dojox.collections.ArrayList");
+dojo.require("dojox.collections._base");
+
+dojox.collections.ArrayList=function(/* array? */arr){
+	//	summary
+	//	Returns a new object of type dojox.collections.ArrayList
+	var items=[];
+	if(arr) items=items.concat(arr);
+	this.count=items.length;
+	this.add=function(/* object */obj){
+		//	summary
+		//	Add an element to the collection.
+		items.push(obj);
+		this.count=items.length;
+	};
+	this.addRange=function(/* array */a){
+		//	summary
+		//	Add a range of objects to the ArrayList
+		if(a.getIterator){
+			var e=a.getIterator();
+			while(!e.atEnd()){
+				this.add(e.get());
+			}
+			this.count=items.length;
+		}else{
+			for(var i=0; i<a.length; i++){
+				items.push(a[i]);
+			}
+			this.count=items.length;
+		}
+	};
+	this.clear=function(){
+		//	summary
+		//	Clear all elements out of the collection, and reset the count.
+		items.splice(0, items.length);
+		this.count=0;
+	};
+	this.clone=function(){
+		//	summary
+		//	Clone the array list
+		return new dojox.collections.ArrayList(items);	//	dojox.collections.ArrayList
+	};
+	this.contains=function(/* object */obj){
+		//	summary
+		//	Check to see if the passed object is a member in the ArrayList
+		for(var i=0; i < items.length; i++){
+			if(items[i] == obj) {
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		dojo.forEach(items, fn, scope);
+	};
+	this.getIterator=function(){
+		//	summary
+		//	Get an Iterator for this object
+		return new dojox.collections.Iterator(items);	//	dojox.collections.Iterator
+	};
+	this.indexOf=function(/* object */obj){
+		//	summary
+		//	Return the numeric index of the passed object; will return -1 if not found.
+		for(var i=0; i < items.length; i++){
+			if(items[i] == obj) {
+				return i;	//	int
+			}
+		}
+		return -1;	// int
+	};
+	this.insert=function(/* int */ i, /* object */ obj){
+		//	summary
+		//	Insert the passed object at index i
+		items.splice(i,0,obj);
+		this.count=items.length;
+	};
+	this.item=function(/* int */ i){
+		//	summary
+		//	return the element at index i
+		return items[i];	//	object
+	};
+	this.remove=function(/* object */obj){
+		//	summary
+		//	Look for the passed object, and if found, remove it from the internal array.
+		var i=this.indexOf(obj);
+		if(i >=0) {
+			items.splice(i,1);
+		}
+		this.count=items.length;
+	};
+	this.removeAt=function(/* int */ i){
+		//	summary
+		//	return an array with function applied to all elements
+		items.splice(i,1);
+		this.count=items.length;
+	};
+	this.reverse=function(){
+		//	summary
+		//	Reverse the internal array
+		items.reverse();
+	};
+	this.sort=function(/* function? */ fn){
+		//	summary
+		//	sort the internal array
+		if(fn){
+			items.sort(fn);
+		}else{
+			items.sort();
+		}
+	};
+	this.setByIndex=function(/* int */ i, /* object */ obj){
+		//	summary
+		//	Set an element in the array by the passed index.
+		items[i]=obj;
+		this.count=items.length;
+	};
+	this.toArray=function(){
+		//	summary
+		//	Return a new array with all of the items of the internal array concatenated.
+		return [].concat(items);
+	}
+	this.toString=function(/* string */ delim){
+		//	summary
+		//	implementation of toString, follows [].toString();
+		return items.join((delim||","));
+	};
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/BinaryTree.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/BinaryTree.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/BinaryTree.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,211 @@
+if(!dojo._hasResource["dojox.collections.BinaryTree"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections.BinaryTree"] = true;
+dojo.provide("dojox.collections.BinaryTree");
+dojo.require("dojox.collections._base");
+
+dojox.collections.BinaryTree=function(data){
+	function node(data, rnode, lnode){
+		this.value=data||null;
+		this.right=rnode||null;
+		this.left=lnode||null;
+		this.clone=function(){
+			var c=new node();
+			if(this.value.value){
+				c.value=this.value.clone();
+			}else{ 
+				c.value=this.value;
+			}
+			if(this.left!=null){
+				c.left=this.left.clone();
+			}
+			if(this.right!=null){
+				c.right=this.right.clone();
+			}
+			return c;
+		}
+		this.compare=function(n){
+			if(this.value>n.value){ return 1; }
+			if(this.value<n.value){ return -1; }
+			return 0;
+		}
+		this.compareData=function(d){
+			if(this.value>d){ return 1; }
+			if(this.value<d){ return -1; }
+			return 0;
+		}
+	}
+
+	function inorderTraversalBuildup(current, a){
+		if(current){
+			inorderTraversalBuildup(current.left, a);
+			a.push(current.value);
+			inorderTraversalBuildup(current.right, a);
+		}
+	}
+
+	function preorderTraversal(current, sep){
+		var s="";
+		if (current){
+			s=current.value.toString() + sep;
+			s+=preorderTraversal(current.left, sep);
+			s+=preorderTraversal(current.right, sep);
+		}
+		return s;
+	}
+	function inorderTraversal(current, sep){
+		var s="";
+		if (current){
+			s=inorderTraversal(current.left, sep);
+			s+=current.value.toString() + sep;
+			s+=inorderTraversal(current.right, sep);
+		}
+		return s;
+	}
+	function postorderTraversal(current, sep){
+		var s="";
+		if (current){
+			s=postorderTraversal(current.left, sep);
+			s+=postorderTraversal(current.right, sep);
+			s+=current.value.toString() + sep;
+		}
+		return s;
+	}
+	
+	function searchHelper(current, data){
+		if(!current){ return null; }
+		var i=current.compareData(data);
+		if(i==0){ return current; }
+		if(i>0){ return searchHelper(current.left, data); }
+		else{ return searchHelper(current.right, data); }
+	}
+
+	this.add=function(data){
+		var n=new node(data);
+		var i;
+		var current=root;
+		var parent=null;
+		while(current){
+			i=current.compare(n);
+			if(i==0){ return; }
+			parent=current;
+			if(i>0){ current=current.left; }
+			else{ current=current.right; }
+		}
+		this.count++;
+		if(!parent){
+			root=n;
+		}else{
+			i=parent.compare(n);
+			if(i>0){ 
+				parent.left=n;
+			}else{
+				parent.right=n;
+			}
+		}
+	};
+	this.clear=function(){
+		root=null;
+		this.count=0;
+	};
+	this.clone=function(){
+		var c=new dojox.collections.BinaryTree();
+		var itr=this.getIterator();
+		while(!itr.atEnd()){
+			c.add(itr.get());
+		}
+		return c;
+	};
+	this.contains=function(data){
+		return this.search(data) != null;
+	};
+	this.deleteData=function(data){
+		var current=root;
+		var parent=null;
+		var i=current.compareData(data);
+		while(i!=0&&current!=null){
+			if(i>0){
+				parent=current;
+				current=current.left;
+			}else if(i<0){
+				parent=current;
+				current=current.right;
+			}
+			i=current.compareData(data);
+		}
+		if(!current){ return; }
+		this.count--;
+		if(!current.right){
+			if(!parent){ 
+				root=current.left;
+			}else{
+				i=parent.compare(current);
+				if(i>0){ parent.left=current.left; }
+				else if(i<0){ parent.right=current.left; }
+			}
+		} 
+		else if(!current.right.left){
+			if(!parent){
+				root=current.right;
+			}else{
+				i=parent.compare(current);
+				if(i>0){ parent.left=current.right; }
+				else if(i<0){ parent.right=current.right; }
+			}
+		}
+		else{
+			var leftmost=current.right.left;
+			var lmParent=current.right;
+			while(leftmost.left!=null){
+				lmParent=leftmost;
+				leftmost=leftmost.left;
+			}
+			lmParent.left=leftmost.right;
+			leftmost.left=current.left;
+			leftmost.right=current.right;
+			if(!parent){ 
+				root=leftmost;
+			}else{
+				i=parent.compare(current);
+				if(i>0){ parent.left=leftmost; }
+				else if(i<0){ parent.right=leftmost; }
+			}
+		}
+	};
+	this.getIterator=function(){
+		var a=[];
+		inorderTraversalBuildup(root, a);
+		return new dojox.collections.Iterator(a);
+	};
+	this.search=function(data){
+		return searchHelper(root, data);
+	};
+	this.toString=function(order, sep){
+		if(!order){ order=dojox.collections.BinaryTree.TraversalMethods.Inorder; }
+		if(!sep){ sep=","; }
+		var s="";
+		switch(order){
+			case dojox.collections.BinaryTree.TraversalMethods.Preorder:
+				s=preorderTraversal(root, sep);
+				break;
+			case dojox.collections.BinaryTree.TraversalMethods.Inorder:
+				s=inorderTraversal(root, sep);
+				break;
+			case dojox.collections.BinaryTree.TraversalMethods.Postorder:
+				s=postorderTraversal(root, sep);
+				break;
+		};
+		if(s.length==0){ return ""; }
+		else{ return s.substring(0, s.length - sep.length); }
+	};
+
+	this.count=0;
+	var root=this.root=null;
+	if(data){
+		this.add(data);
+	}
+}
+dojox.collections.BinaryTree.TraversalMethods={
+	Preorder: 1, Inorder: 2, Postorder: 3
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/Dictionary.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/Dictionary.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/Dictionary.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,116 @@
+if(!dojo._hasResource["dojox.collections.Dictionary"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections.Dictionary"] = true;
+dojo.provide("dojox.collections.Dictionary");
+dojo.require("dojox.collections._base");
+
+dojox.collections.Dictionary=function(/* dojox.collections.Dictionary? */dictionary){
+	//	summary
+	//	Returns an object of type dojox.collections.Dictionary
+	var items={};
+	this.count=0;
+
+	//	comparator for property addition and access.
+	var testObject={};
+
+	this.add=function(/* string */k, /* object */v){
+		//	summary
+		//	Add a new item to the Dictionary.
+		var b=(k in items);
+		items[k]=new dojox.collections.DictionaryEntry(k,v);
+		if(!b){
+			this.count++;
+		}
+	};
+	this.clear=function(){
+		//	summary
+		//	Clears the internal dictionary.
+		items={};
+		this.count=0;
+	};
+	this.clone=function(){
+		//	summary
+		//	Returns a new instance of dojox.collections.Dictionary; note the the dictionary is a clone but items might not be.
+		return new dojox.collections.Dictionary(this);	//	dojox.collections.Dictionary
+	};
+	this.contains=this.containsKey=function(/* string */k){
+		//	summary
+		//	Check to see if the dictionary has an entry at key "k".
+		if(testObject[k]){
+			return false;			// bool
+		}
+		return (items[k]!=null);	//	bool
+	};
+	this.containsValue=function(/* object */v){
+		//	summary
+		//	Check to see if the dictionary has an entry with value "v".
+		var e=this.getIterator();
+		while(e.get()){
+			if(e.element.value==v){
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.entry=function(/* string */k){
+		//	summary
+		//	Accessor method; similar to dojox.collections.Dictionary.item but returns the actual Entry object.
+		return items[k];	//	dojox.collections.DictionaryEntry
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		var a=[];	//	Create an indexing array
+		for(var p in items) {
+			if(!testObject[p]){
+				a.push(items[p]);	//	fill it up
+			}
+		}
+		dojo.forEach(a, fn, scope);
+	};
+	this.getKeyList=function(){
+		//	summary
+		//	Returns an array of the keys in the dictionary.
+		return (this.getIterator()).map(function(entry){ 
+			return entry.key; 
+		});	//	array
+	};
+	this.getValueList=function(){
+		//	summary
+		//	Returns an array of the values in the dictionary.
+		return (this.getIterator()).map(function(entry){ 
+			return entry.value; 
+		});	//	array
+	};
+	this.item=function(/* string */k){
+		//	summary
+		//	Accessor method.
+		if(k in items){
+			return items[k].valueOf();	//	object
+		}
+		return undefined;	//	object
+	};
+	this.getIterator=function(){
+		//	summary
+		//	Gets a dojox.collections.DictionaryIterator for iteration purposes.
+		return new dojox.collections.DictionaryIterator(items);	//	dojox.collections.DictionaryIterator
+	};
+	this.remove=function(/* string */k){
+		//	summary
+		//	Removes the item at k from the internal collection.
+		if(k in items && !testObject[k]){
+			delete items[k];
+			this.count--;
+			return true;	//	bool
+		}
+		return false;	//	bool
+	};
+
+	if (dictionary){
+		var e=dictionary.getIterator();
+		while(e.get()) {
+			 this.add(e.element.key, e.element.value);
+		}
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/Queue.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/Queue.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/Queue.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,74 @@
+if(!dojo._hasResource["dojox.collections.Queue"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections.Queue"] = true;
+dojo.provide("dojox.collections.Queue");
+dojo.require("dojox.collections._base");
+
+dojox.collections.Queue=function(/* array? */arr){
+	//	summary
+	//	return an object of type dojox.collections.Queue
+	var q=[];
+	if (arr){
+		q=q.concat(arr);
+	}
+	this.count=q.length;
+	this.clear=function(){
+		//	summary
+		//	clears the internal collection
+		q=[];
+		this.count=q.length;
+	};
+	this.clone=function(){
+		//	summary
+		//	creates a new Queue based on this one
+		return new dojox.collections.Queue(q);	//	dojox.collections.Queue
+	};
+	this.contains=function(/* object */ o){
+		//	summary
+		//	Check to see if the passed object is an element in this queue
+		for(var i=0; i<q.length; i++){
+			if (q[i]==o){
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.copyTo=function(/* array */ arr, /* int */ i){
+		//	summary
+		//	Copy the contents of this queue into the passed array at index i.
+		arr.splice(i,0,q);
+	};
+	this.dequeue=function(){
+		//	summary
+		//	shift the first element off the queue and return it
+		var r=q.shift();
+		this.count=q.length;
+		return r;	//	object
+	};
+	this.enqueue=function(/* object */ o){
+		//	summary
+		//	put the passed object at the end of the queue
+		this.count=q.push(o);
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		dojo.forEach(q, fn, scope);
+	};
+	this.getIterator=function(){
+		//	summary
+		//	get an Iterator based on this queue.
+		return new dojox.collections.Iterator(q);	//	dojox.collections.Iterator
+	};
+	this.peek=function(){
+		//	summary
+		//	get the next element in the queue without altering the queue.
+		return q[0];
+	};
+	this.toArray=function(){
+		//	summary
+		//	return an array based on the internal array of the queue.
+		return [].concat(q);
+	};
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,39 @@
+-------------------------------------------------------------------------------
+DojoX Collections
+-------------------------------------------------------------------------------
+Version 0.9
+Release date: 05/27/2007
+-------------------------------------------------------------------------------
+Project state: stable
+-------------------------------------------------------------------------------
+Project authors
+	Tom Trenka (ttrenka@xxxxxxxxx)
+-------------------------------------------------------------------------------
+Project description
+
+DojoX Collections is the port of the original Dojo 0.4.x collection classes.
+It is intended for use by people who are looking for a little bit more 
+functionality out of common collections, like ArrayLists or Dictionaries.
+
+Included are the Iterator and DictionaryIterator classes, both of which can
+operate on standard arrays and objects (respectively).
+-------------------------------------------------------------------------------
+Dependencies:
+
+DojoX Collections has no dependencies, outside of Dojo Core.
+-------------------------------------------------------------------------------
+Documentation
+
+See the API documentation for Dojo (http://dojotoolkit.org/api).
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/collections.js
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/collections/*
+
+Install into the following directory structure:
+/dojox/collections/
+
+...which should be at the same level as your Dojo checkout.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/Set.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/Set.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/Set.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,89 @@
+if(!dojo._hasResource["dojox.collections.Set"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections.Set"] = true;
+dojo.provide("dojox.collections.Set");
+dojo.require("dojox.collections.ArrayList");
+
+(function(){
+	var dxc=dojox.collections;
+	dxc.Set=new (function(){
+		function conv(arr){
+			if(arr.constructor==Array){
+				return new dojox.collections.ArrayList(arr);	//	dojox.collections.ArrayList
+			}
+			return arr;		//	dojox.collections.ArrayList
+		}
+		this.union = function(/* array */setA, /* array */setB){
+			//	summary
+			//	Return the union of the two passed sets.
+			setA=conv(setA);
+			setB=conv(setB);
+			var result = new dojox.collections.ArrayList(setA.toArray());
+			var e = setB.getIterator();
+			while(!e.atEnd()){
+				var item=e.get();
+				if(!result.contains(item)){
+					result.add(item);
+				}
+			}
+			return result;	//	dojox.collections.ArrayList
+		};
+		this.intersection = function(/* array */setA, /* array */setB){
+			//	summary
+			//	Return the intersection of the two passed sets.
+			setA=conv(setA);
+			setB=conv(setB);
+			var result = new dojox.collections.ArrayList();
+			var e = setB.getIterator();
+			while(!e.atEnd()){
+				var item=e.get();
+				if(setA.contains(item)){
+					result.add(item);
+				}
+			}
+			return result;	//	dojox.collections.ArrayList
+		};
+		this.difference = function(/* array */setA, /* array */setB){
+			//	summary
+			//	Returns everything in setA that is not in setB.
+			setA=conv(setA);
+			setB=conv(setB);
+			var result = new dojox.collections.ArrayList();
+			var e=setA.getIterator();
+			while(!e.atEnd()){
+				var item=e.get();
+				if(!setB.contains(item)){
+					result.add(item);
+				}
+			}
+			return result;	//	dojox.collections.ArrayList
+		};
+		this.isSubSet = function(/* array */setA, /* array */setB) {
+			//	summary
+			//	Returns if set B is a subset of set A.
+			setA=conv(setA);
+			setB=conv(setB);
+			var e = setA.getIterator();
+			while(!e.atEnd()){
+				if(!setB.contains(e.get())){
+					return false;	//	boolean
+				}
+			}
+			return true;	//	boolean
+		};
+		this.isSuperSet = function(/* array */setA, /* array */setB){
+			//	summary
+			//	Returns if set B is a superset of set A.
+			setA=conv(setA);
+			setB=conv(setB);
+			var e = setB.getIterator();
+			while(!e.atEnd()){
+				if(!setA.contains(e.get())){
+					return false;	//	boolean
+				}
+			}
+			return true;	//	boolean
+		};
+	})();
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/SortedList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/SortedList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/SortedList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,198 @@
+if(!dojo._hasResource["dojox.collections.SortedList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections.SortedList"] = true;
+dojo.provide("dojox.collections.SortedList");
+dojo.require("dojox.collections._base");
+
+dojox.collections.SortedList=function(/* object? */ dictionary){
+	//	summary
+	//	creates a collection that acts like a dictionary but is also internally sorted.
+	//	Note that the act of adding any elements forces an internal resort, making this object potentially slow.
+	var _this=this;
+	var items={};
+	var q=[];
+	var sorter=function(a,b){
+		if (a.key > b.key) return 1;
+		if (a.key < b.key) return -1;
+		return 0;
+	};
+	var build=function(){
+		q=[];
+		var e=_this.getIterator();
+		while (!e.atEnd()){
+			q.push(e.get());
+		}
+		q.sort(sorter);
+	};
+	var testObject={};
+
+	this.count=q.length;
+	this.add=function(/* string */ k,/* object */v){
+		//	summary
+		//	add the passed value to the dictionary at location k
+		if (!items[k]) {
+			items[k]=new dojox.collections.DictionaryEntry(k,v);
+			this.count=q.push(items[k]);
+			q.sort(sorter);
+		}
+	};
+	this.clear=function(){
+		//	summary
+		//	clear the internal collections
+		items={};
+		q=[];
+		this.count=q.length;
+	};
+	this.clone=function(){
+		//	summary
+		//	create a clone of this sorted list
+		return new dojox.collections.SortedList(this);	//	dojox.collections.SortedList
+	};
+	this.contains=this.containsKey=function(/* string */ k){
+		//	summary
+		//	Check to see if the list has a location k
+		if(testObject[k]){
+			return false;			//	bool
+		}
+		return (items[k]!=null);	//	bool
+	};
+	this.containsValue=function(/* object */ o){
+		//	summary
+		//	Check to see if this list contains the passed object
+		var e=this.getIterator();
+		while (!e.atEnd()){
+			var item=e.get();
+			if(item.value==o){ 
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.copyTo=function(/* array */ arr, /* int */ i){
+		//	summary
+		//	copy the contents of the list into array arr at index i
+		var e=this.getIterator();
+		var idx=i;
+		while(!e.atEnd()){
+			arr.splice(idx,0,e.get());
+			idx++;
+		}
+	};
+	this.entry=function(/* string */ k){
+		//	summary
+		//	return the object at location k
+		return items[k];	//	dojox.collections.DictionaryEntry
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		dojo.forEach(q, fn, scope);
+	};
+	this.getByIndex=function(/* int */ i){
+		//	summary
+		//	return the item at index i
+		return q[i].valueOf();	//	object
+	};
+	this.getIterator=function(){
+		//	summary
+		//	get an iterator for this object
+		return new dojox.collections.DictionaryIterator(items);	//	dojox.collections.DictionaryIterator
+	};
+	this.getKey=function(/* int */ i){
+		//	summary
+		//	return the key of the item at index i
+		return q[i].key;
+	};
+	this.getKeyList=function(){
+		//	summary
+		//	return an array of the keys set in this list
+		var arr=[];
+		var e=this.getIterator();
+		while (!e.atEnd()){
+			arr.push(e.get().key);
+		}
+		return arr;	//	array
+	};
+	this.getValueList=function(){
+		//	summary
+		//	return an array of values in this list
+		var arr=[];
+		var e=this.getIterator();
+		while (!e.atEnd()){
+			arr.push(e.get().value);
+		}
+		return arr;	//	array
+	};
+	this.indexOfKey=function(/* string */ k){
+		//	summary
+		//	return the index of the passed key.
+		for (var i=0; i<q.length; i++){
+			if (q[i].key==k){
+				return i;	//	int
+			}
+		}
+		return -1;	//	int
+	};
+	this.indexOfValue=function(/* object */ o){
+		//	summary
+		//	return the first index of object o
+		for (var i=0; i<q.length; i++){
+			if (q[i].value==o){
+				return i;	//	int
+			}
+		}
+		return -1;	//	int
+	};
+	this.item=function(/* string */ k){
+		// 	summary
+		//	return the value of the object at location k.
+		if(k in items && !testObject[k]){
+			return items[k].valueOf();	//	object
+		}
+		return undefined;	//	object
+	};
+	this.remove=function(/* string */k){
+		// 	summary
+		//	remove the item at location k and rebuild the internal collections.
+		delete items[k];
+		build();
+		this.count=q.length;
+	};
+	this.removeAt=function(/* int */ i){
+		//	summary
+		//	remove the item at index i, and rebuild the internal collections.
+		delete items[q[i].key];
+		build();
+		this.count=q.length;
+	};
+	this.replace=function(/* string */ k, /* object */ v){
+		//	summary
+		//	Replace an existing item if it's there, and add a new one if not.
+		if (!items[k]){
+			//	we're adding a new object, return false
+			this.add(k,v);
+			return false; // bool
+		}else{
+			//	we're replacing an object, return true
+			items[k]=new dojox.collections.DictionaryEntry(k,v);
+			build();
+			return true; // bool
+		}
+	};
+	this.setByIndex=function(/* int */ i, /* object */ o){
+		//	summary
+		//	set an item by index
+		items[q[i].key].value=o;
+		build();
+		this.count=q.length;
+	};
+	if (dictionary){
+		var e=dictionary.getIterator();
+		while (!e.atEnd()){
+			var item=e.get();
+			q[q.length]=items[item.key]=new dojox.collections.DictionaryEntry(item.key,item.value);
+		}
+		q.sort(sorter);
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/Stack.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/Stack.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/Stack.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,72 @@
+if(!dojo._hasResource["dojox.collections.Stack"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections.Stack"] = true;
+dojo.provide("dojox.collections.Stack");
+dojo.require("dojox.collections._base");
+
+dojox.collections.Stack=function(/* array? */arr){
+	//	summary
+	//	returns an object of type dojox.collections.Stack
+	var q=[];
+	if (arr) q=q.concat(arr);
+	this.count=q.length;
+	this.clear=function(){
+		//	summary
+		//	Clear the internal array and reset the count
+		q=[];
+		this.count=q.length;
+	};
+	this.clone=function(){
+		//	summary
+		//	Create and return a clone of this Stack
+		return new dojox.collections.Stack(q);
+	};
+	this.contains=function(/* object */o){
+		//	summary
+		//	check to see if the stack contains object o
+		for (var i=0; i<q.length; i++){
+			if (q[i] == o){
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.copyTo=function(/* array */ arr, /* int */ i){
+		//	summary
+		//	copy the stack into array arr at index i
+		arr.splice(i,0,q);
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		dojo.forEach(q, fn, scope);
+	};
+	this.getIterator=function(){
+		//	summary
+		//	get an iterator for this collection
+		return new dojox.collections.Iterator(q);	//	dojox.collections.Iterator
+	};
+	this.peek=function(){
+		//	summary
+		//	Return the next item without altering the stack itself.
+		return q[(q.length-1)];	//	object
+	};
+	this.pop=function(){
+		//	summary
+		//	pop and return the next item on the stack
+		var r=q.pop();
+		this.count=q.length;
+		return r;	//	object
+	};
+	this.push=function(/* object */ o){
+		//	summary
+		//	Push object o onto the stack
+		this.count=q.push(o);
+	};
+	this.toArray=function(){
+		//	summary
+		//	create and return an array based on the internal collection
+		return [].concat(q);	//	array
+	};
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,100 @@
+if(!dojo._hasResource["dojox.collections._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections._base"] = true;
+dojo.provide("dojox.collections._base");
+
+dojox.collections.DictionaryEntry=function(/* string */k, /* object */v){
+	//	summary
+	//	return an object of type dojox.collections.DictionaryEntry
+	this.key=k;
+	this.value=v;
+	this.valueOf=function(){ 
+		return this.value; 	//	object
+	};
+	this.toString=function(){ 
+		return String(this.value);	//	string 
+	};
+}
+
+/*	Iterators
+ *	The collections.Iterators (Iterator and DictionaryIterator) are built to
+ *	work with the Collections included in this module.  However, they *can*
+ *	be used with arrays and objects, respectively, should one choose to do so.
+ */
+dojox.collections.Iterator=function(/* array */arr){
+	//	summary
+	//	return an object of type dojox.collections.Iterator
+	var a=arr;
+	var position=0;
+	this.element=a[position]||null;
+	this.atEnd=function(){
+		//	summary
+		//	Test to see if the internal cursor has reached the end of the internal collection.
+		return (position>=a.length);	//	bool
+	};
+	this.get=function(){
+		//	summary
+		//	Get the next member in the collection.
+		if(this.atEnd()){
+			return null;		//	object
+		}
+		this.element=a[position++];
+		return this.element;	//	object
+	};
+	this.map=function(/* function */fn, /* object? */scope){
+		//	summary
+		//	Functional iteration with optional scope.
+		return dojo.map(a, fn, scope);
+	};
+	this.reset=function(){
+		//	summary
+		//	reset the internal cursor.
+		position=0;
+		this.element=a[position];
+	};
+}
+
+/*	Notes:
+ *	The DictionaryIterator no longer supports a key and value property;
+ *	the reality is that you can use this to iterate over a JS object
+ *	being used as a hashtable.
+ */
+dojox.collections.DictionaryIterator=function(/* object */obj){
+	//	summary
+	//	return an object of type dojox.collections.DictionaryIterator
+	var a=[];	//	Create an indexing array
+	var testObject={};
+	for(var p in obj){
+		if(!testObject[p]){
+			a.push(obj[p]);	//	fill it up
+		}
+	}
+	var position=0;
+	this.element=a[position]||null;
+	this.atEnd=function(){
+		//	summary
+		//	Test to see if the internal cursor has reached the end of the internal collection.
+		return (position>=a.length);	//	bool
+	};
+	this.get=function(){
+		//	summary
+		//	Get the next member in the collection.
+		if(this.atEnd()){
+			return null;		//	object
+		}
+		this.element=a[position++];
+		return this.element;	//	object
+	};
+	this.map=function(/* function */fn, /* object? */scope){
+		//	summary
+		//	Functional iteration with optional scope.
+		return dojo.map(a, fn, scope);
+	};
+	this.reset=function() { 
+		//	summary
+		//	reset the internal cursor.
+		position=0; 
+		this.element=a[position];
+	};
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/collections.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/collections.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/collections.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+if(!dojo._hasResource["dojox.collections"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.collections"] = true;
+dojo.provide("dojox.collections");
+dojo.require("dojox.collections._base");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/color/Colorspace.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/color/Colorspace.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/color/Colorspace.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,556 @@
+if(!dojo._hasResource["dojox.color.Colorspace"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.color.Colorspace"] = true;
+dojo.provide("dojox.color.Colorspace");
+dojo.require("dojox.math.matrix");
+
+dojox.color.Colorspace=new (function(){
+	var dxc=dojox.color;
+	var dxm=dojox.math.matrix;
+	var self=this;
+	var wpMap={
+		"2":{
+			"E":	{ x:1/3,     y:1/3,     t:5400 },
+			"D50":	{ x:0.34567, y:0.3585,  t:5000 },
+			"D55":	{ x:0.33242, y:0.34743, t:5500 },
+			"D65":	{ x:0.31271, y:0.32902, t:6500 },
+			"D75":	{ x:0.29902, y:0.31485, t:7500 },
+			"A":	{ x:0.44757, y:0.40745, t:2856 },
+			"B":	{ x:0.34842, y:0.35161, t:4874 },
+			"C":	{ x:0.31006, y:0.31616, t:6774 },
+			"9300":	{ x:0.2848,  y:0.2932,  t:9300 },
+			"F2":	{ x:0.37207, y:0.37512, t:4200 },
+			"F7":	{ x:0.31285, y:0.32918, t:6500 },
+			"F11":	{ x:0.38054, y:0.37691, t:4000 }
+		},
+		"10":{
+			"E":	{ x:1/3,     y:1/3,     t:5400 },
+			"D50":	{ x:0.34773, y:0.35952, t:5000 },
+			"D55":	{ x:0.33411, y:0.34877, t:5500 },
+			"D65":	{ x:0.31382, y:0.331,   t:6500 },
+			"D75":	{ x:0.29968, y:0.3174,  t:7500 },
+			"A":	{ x:0.45117, y:0.40594, t:2856 },
+			"B":	{ x:0.3498,  y:0.3527,  t:4874 },
+			"C":	{ x:0.31039, y:0.31905, t:6774 },
+			"F2":	{ x:0.37928, y:0.36723, t:4200 },
+			"F7":	{ x:0.31565, y:0.32951, t:6500 },
+			"F11":	{ x:0.38543, y:0.3711,  t:4000 }
+		}
+	};
+
+	var profiles={
+		"Adobe RGB 98":[2.2, "D65", 0.64, 0.33, 0.297361, 0.21, 0.71, 0.627355, 0.15, 0.06, 0.075285],
+		"Apple RGB":[1.8, "D65", 0.625, 0.34, 0.244634, 0.28, 0.595, 0.672034, 0.155, 0.07, 0.083332],
+		"Best RGB":[2.2, "D50", 0.7347, 0.2653, 0.228457, 0.215, 0.775, 0.737352, 0.13, 0.035, 0.034191],
+		"Beta RGB":[2.2, "D50", 0.6888, 0.3112, 0.303273, 0.1986, 0.7551, 0.663786, 0.1265, 0.0352, 0.032941],
+		"Bruce RGB":[2.2, "D65", 0.64, 0.33, 0.240995, 0.28, 0.65, 0.683554, 0.15, 0.06, 0.075452],
+		"CIE RGB":[2.2, "E", 0.735, 0.265, 0.176204, 0.274, 0.717, 0.812985, 0.167, 0.009, 0.010811],
+		"ColorMatch RGB":[1.8, "D50", 0.63, 0.34, 0.274884, 0.295, 0.605, 0.658132, 0.15, 0.075, 0.066985],
+		"DON RGB 4":[2.2, "D50", 0.696, 0.3, 0.27835, 0.215, 0.765, 0.68797, 0.13, 0.035, 0.03368],
+		"ECI RGB":[1.8, "D50", 0.67, 0.33, 0.32025, 0.21, 0.71, 0.602071, 0.14, 0.08, 0.077679],
+		"EktaSpace PS5":[2.2, "D50", 0.695, 0.305, 0.260629, 0.26, 0.7, 0.734946, 0.11, 0.005, 0.004425],
+		"NTSC RGB":[2.2, "C", 0.67, 0.33, 0.298839, 0.21, 0.71, 0.586811, 0.14, 0.08, 0.11435],
+		"PAL/SECAM RGB":[2.2, "D65", 0.64, 0.33, 0.222021, 0.29, 0.6, 0.706645, 0.15, 0.06, 0.071334],
+		"Pro Photo RGB":[1.8, "D50", 0.7347, 0.2653, 0.28804, 0.1596, 0.8404, 0.711874, 0.0366, 0.0001, 0.000086],
+		"SMPTE/C RGB":[2.2, "D65", 0.63, 0.34, 0.212395, 0.31, 0.595, 0.701049, 0.155, 0.07, 0.086556],
+		"sRGB":[2.2, "D65", 0.64, 0.33, 0.212656, 0.3, 0.6, 0.715158, 0.15, 0.06, 0.072186],
+		"Wide Gamut RGB":[2.2, "D50", 0.735, 0.265, 0.258187, 0.115, 0.826, 0.724938, 0.157, 0.018, 0.016875]
+	};
+
+	var adaptors={
+		"XYZ scaling":{
+			ma:  [[1,0,0], [0,1,0], [0,0,1]],
+			mai: [[1,0,0], [0,1,0], [0,0,1]]
+		},
+		"Bradford":{
+			ma:  [[0.8951, -0.7502, 0.0389], [0.2664, 1.7135, -0.0685], [-0.1614, 0.0367, 1.0296]],
+			mai: [[0.986993, 0.432305, -0.008529], [-0.147054, 0.51836, 0.040043], [0.159963, 0.049291, 0.968487]]
+		},
+		"Von Kries":{
+			ma:  [[0.40024, -0.2263, 0], [0.7076, 1.16532, 0], [-0.08081, 0.0457, 0.91822]],
+			mai: [[1.859936, 0.361191, 0], [-1.129382, 0.638812, 0], [0.219897, -0.000006, 1.089064]]
+		}
+	};
+
+	var cMaps={
+		"XYZ":{
+			"xyY":function(xyz, kwArgs){
+				kwArgs=dojo.mixin({
+					whitepoint:"D65",
+					observer:"10",
+					useApproximation:true
+				}, kwArgs||{});
+				var wp=self.whitepoint(kwArgs.whitepoint, kwArgs.observer);
+				var sum=xyz.X+xyz.Y+xyz.Z;
+				if(sum==0){ var x=wp.x, y=wp.y; }
+				else{ var x=xyz.X/sum, y=xyz.Y/sum; }
+				return { x:x, y:y, Y:xyz.Y };
+			},
+			"Lab":function(xyz, kwArgs){
+				kwArgs=dojo.mixin({
+					whitepoint:"D65",
+					observer:"10",
+					useApproximation:true
+				}, kwArgs||{});
+
+				var kappa=self.kappa(kwArgs.useApproximation), epsilon=self.epsilon(kwArgs.useApproximation);
+				var wp=self.whitepoint(kwArgs.whitepoint, kwArgs.observer);
+				var xr=xyz.X/wp.x, yr=xyz.Y/wp.y, zr=xyz.z/wp.z;
+				var fx=(xr>epsilon)?Math.pow(xr,1/3):(kappa*xr+16)/116;
+				var fy=(yr>epsilon)?Math.pow(yr,1/3):(kappa*yr+16)/116;
+				var fz=(zr>epsilon)?Math.pow(zr,1/3):(kappa*zr+16)/116;
+				var L=116*fy-16, a=500*(fx-fy), b=200*(fy-fz);
+				return { L:L, a:a, b:b };
+			},
+			"Luv": function(xyz, kwArgs){
+				kwArgs=dojo.mixin({
+					whitepoint:"D65",
+					observer:"10",
+					useApproximation:true
+				}, kwArgs||{});
+
+				var kappa=self.kappa(kwArgs.useApproximation), epsilon=self.epsilon(kwArgs.useApproximation);
+				var wp=self.whitepoint(kwArgs.whitepoint, kwArgs.observer);
+				var ud=(4*xyz.X)/(xyz.X+15*xyz.Y+3*xyz.Z);
+				var vd=(9*xyz.Y)/(xyz.X+15*xyz.Y+3*xyz.Z);
+				var udr=(4*wp.x)/(wp.x+15*wp.y+3*wp.z);
+				var vdr=(9*wp.y)/(wp.x+15*wp.y+3*wp.z);
+				var yr=xyz.Y/wp.y;
+				var L=(yr>epsilon)?116*Math.pow(yr, 1/3)-16:kappa*yr;
+				var u=13*L*(ud-udr);
+				var v=13*L*(vd-vdr);
+				return { L:L, u:u, v:v };
+			}
+		},
+		"xyY":{
+			"XYZ":function(xyY){
+				if(xyY.y==0){ var X=0, Y=0, Z=0; }
+				else{
+					var X=(xyY.x*xyY.Y)/xyY.y;
+					var Y=xyY.Y;
+					var Z=((1-xyY.x-xyY.y)*xyY.Y)/xyY.y;
+				}
+				return { X:X, Y:Y, Z:Z };
+			}
+		},
+		"Lab":{
+			"XYZ": function(lab, kwArgs){
+				kwArgs=dojo.mixin({
+					whitepoint:"D65",
+					observer:"10",
+					useApproximation:true
+				}, kwArgs||{});
+
+				var b=kwArgs.useApproximation, kappa=self.kappa(b), epsilon=self.epsilon(b);
+				var wp=self.whitepoint(kwArgs.whitepoint, kwArgs.observer);
+				var yr=(lab.L>(kappa*epsilon))?Math.pow((lab.L+16)/116, 3):lab.L/kappa;
+				var fy=(yr>epsilon)?(lab.L+16)/116:(kappa*yr+16)/116;
+				var fx=(lab.a/500)+fy;
+				var fz=fy-(lab.b/200);
+				var fxcube=Math.pow(fx, 3), fzcube=Math.pow(fz, 3);
+				var xr=(fxcube>epsilon)?fxcube:(116*fx-16)/kappa;
+				var zr=(fzcube>epsilon)?fzcube:(116*fz-16)/kappa;
+				return { X: xr*wp.x, Y: yr*wp.y, Z: zr*wp.z };
+			},
+			"LCHab": function(lab){
+				var L=lab.L, C=Math.pow(lab.a*lab.a+lab.b*lab.b, 0.5), H=Math.atan(lab.b, lab.a)*(180/Math.PI);
+				if(H<0){ H+=360; }
+				if(H<360){ H-=360; }
+				return { L:L, C:C, H:H };
+			}
+		},
+		"LCHab":{
+			"Lab":function(lch){
+				var hRad=lch.H*(Math.PI/180), L=lch.L, a=lch.C/Math.pow(Math.pow(Math.tan(hRad),2)+1, 0.5);
+				if(90<lchH && lch.H<270){ a = -a; }
+				var b=Math.pow(Math.pow(lch.C,2)-Math.pow(a, 2), 0.5);
+				if(lch.H>180){ b = -b; }
+				return { L: L, a:a, b:b };
+			}
+		},
+		"Luv":{
+			"XYZ": function(Luv, kwArgs){
+				kwArgs=dojo.mixin({
+					whitepoint:"D65",
+					observer:"10",
+					useApproximation:true
+				}, kwArgs||{});
+
+				var b=kwArgs.useApproximation, kappa=self.kappa(b), epsilon=self.epsilon(b);
+				var wp=self.whitepoint(kwArgs.whitepoint, kwArgs.observer);
+				var uz=(4*wp.x)/(wp.x+15*wp.y+3*wp.z);
+				var vz=(9*wp.y)/(wp.x+15*wp.y+3*wp.z);
+				var Y=(Luv.L>kappa*epsilon)?Math.pow((Luv.L+16)/116, 3):Luv.L/kappa;
+				var a=(1/3)*(((52*Luv.L)/(Luv.u+13*Luv.L*uz))-1);
+				var b=-5*Y, c=-(1/3), d=Y*(((39*Luv.L)/(Luv.v+13*Luv.L*vz))-5);
+				var X=(d-b)/(a-c), Z=X*a+b;
+				return { X:X, Y:Y, Z:Z };
+			},
+			"LCHuv": function(Luv){
+				var L=Luv.L, C=Math.pow(Luv.u*Luv.u+Luv.v*Luv*v, 0.5), H=Math.atan(Luv.v, Luv.u)*(180/Math.PI);
+				if(H<0){ H+=360; }
+				if(H>360){ H-=360; }
+				return { L:L, C:C, H:H };
+			}
+		},
+		"LCHuv":{
+			"Luv": function(LCH){
+				var hRad=LCH.H*(Math.PI/180);
+				var L=LCH.L, u=LCH.C/Math.pow(Math.pow(Math.tan(hRad),2)+1, 0.5);
+				var v=Math.pow(LCH.C*LCH.C-u*u, 0.5);
+				if(90<LCH.H && LCH.H>270){ u*=-1; }
+				if(LCH.H>180){ v*=-1; }
+				return { L:L, u:u, v:v };
+			}
+		}
+	};
+	var converters={
+		"CMY":{ 
+			"CMYK":function(obj, kwArgs){ return dxc.fromCmy(obj).toCmyk(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromCmy(obj).toHsl(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromCmy(obj).toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["XYZ"]["Lab"](dxc.fromCmy(obj).toXYZ(kwArgs)); },
+			"LCHab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](converters["CMY"]["Lab"](obj)); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["LCHuv"]["Luv"](cMaps["Luv"]["XYZ"](dxc.fromCmy(obj).toXYZ(kwArgs))); },
+			"Luv":function(obj, kwArgs){ return cMaps["Luv"]["XYZ"](dxc.fromCmy(obj).toXYZ(kwArgs)); },
+			"RGB":function(obj, kwArgs){ return dxc.fromCmy(obj); },
+			"XYZ":function(obj, kwArgs){ return dxc.fromCmy(obj).toXYZ(kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](dxc.fromCmy(obj).toXYZ(kwArgs)); }
+		},
+		"CMYK":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromCmyk(obj).toCmy(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromCmyk(obj).toHsl(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromCmyk(obj).toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["XYZ"]["Lab"](dxc.fromCmyk(obj).toXYZ(kwArgs)); },
+			"LCHab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](converters["CMYK"]["Lab"](obj)); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["LCHuv"]["Luv"](cMaps["Luv"]["XYZ"](dxc.fromCmyk(obj).toXYZ(kwArgs))); },
+			"Luv":function(obj, kwArgs){ return cMaps["Luv"]["XYZ"](dxc.fromCmyk(obj).toXYZ(kwArgs)); },
+			"RGB":function(obj, kwArgs){ return dxc.fromCmyk(obj); },
+			"XYZ":function(obj, kwArgs){ return dxc.fromCmyk(obj).toXYZ(kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](dxc.fromCmyk(obj).toXYZ(kwArgs)); }
+		},
+		"HSL":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromHsl(obj).toCmy(); },
+			"CMYK":function(obj, kwArgs){ return dxc.fromHsl(obj).toCmyk(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromHsl(obj).toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["XYZ"]["Lab"](dxc.fromHsl(obj).toXYZ(kwArgs)); },
+			"LCHab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](converters["CMYK"]["Lab"](obj)); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["LCHuv"]["Luv"](cMaps["Luv"]["XYZ"](dxc.fromHsl(obj).toXYZ(kwArgs))); },
+			"Luv":function(obj, kwArgs){ return cMaps["Luv"]["XYZ"](dxc.fromHsl(obj).toXYZ(kwArgs)); },
+			"RGB":function(obj, kwArgs){ return dxc.fromHsl(obj); },
+			"XYZ":function(obj, kwArgs){ return dxc.fromHsl(obj).toXYZ(kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](dxc.fromHsl(obj).toXYZ(kwArgs)); }
+		},
+		"HSV":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromHsv(obj).toCmy(); },
+			"CMYK":function(obj, kwArgs){ return dxc.fromHsv(obj).toCmyk(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromHsv(obj).toHsl(); },
+			"Lab":function(obj, kwArgs){ return cMaps["XYZ"]["Lab"](dxc.fromHsv(obj).toXYZ(kwArgs)); },
+			"LCHab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](converters["CMYK"]["Lab"](obj)); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["LCHuv"]["Luv"](cMaps["Luv"]["XYZ"](dxc.fromHsv(obj).toXYZ(kwArgs))); },
+			"Luv":function(obj, kwArgs){ return cMaps["Luv"]["XYZ"](dxc.fromHsv(obj).toXYZ(kwArgs)); },
+			"RGB":function(obj, kwArgs){ return dxc.fromHsv(obj); },
+			"XYZ":function(obj, kwArgs){ return dxc.fromHsv(obj).toXYZ(kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](dxc.fromHsv(obj).toXYZ(kwArgs)); }
+		},
+		"Lab":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](obj, kwArgs)).toCmy(); },
+			"CMYK":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](obj, kwArgs)).toCmyk(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](obj, kwArgs)).toHsl(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](obj, kwArgs)).toHsv(); },
+			"LCHab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](obj, kwArgs); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["Luv"]["LCHuv"](cMaps["Lab"]["XYZ"](obj, kwArgs), kwArgs); },
+			"Luv":function(obj, kwArgs){ return cMaps["XYZ"]["Luv"](cMaps["Lab"]["XYZ"](obj, kwArgs), kwArgs); },
+			"RGB":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](obj, kwArgs)); },
+			"XYZ":function(obj, kwArgs){ return cMaps["Lab"]["XYZ"](obj, kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](cMaps["Lab"]["XYZ"](obj, kwArgs), kwArgs); }
+		},
+		"LCHab":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj), kwArgs), kwArgs).toCmy(); },
+			"CMYK":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj), kwArgs), kwArgs).toCmyk(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj), kwArgs), kwArgs).toHsl(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj), kwArgs), kwArgs).toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](obj, kwArgs); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["Luv"]["LCHuv"](cMaps["XYZ"]["Luv"](cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj), kwArgs), kwArgs), kwArgs);},
+			"Luv":function(obj, kwArgs){ return cMaps["XYZ"]["Luv"](cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj), kwArgs), kwArgs);},
+			"RGB":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj), kwArgs), kwArgs); },
+			"XYZ":function(obj, kwArgs){ return cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj, kwArgs), kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](cMaps["Lab"]["XYZ"](cMaps["LCHab"]["Lab"](obj), kwArgs), kwArgs); }
+		},
+		"LCHuv":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs), kwArgs).toCmy(); },
+			"CMYK":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs), kwArgs).toCmyk(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs), kwArgs).toHsl(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs), kwArgs).toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["XYZ"]["Lab"](cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs), kwArgs); },
+			"LCHab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](cMaps["XYZ"]["Lab"](cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs), kwArgs), kwArgs); },
+			"Luv":function(obj, kwArgs){ return cMaps["LCHuv"]["Luv"](obj, kwArgs); },
+			"RGB":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs), kwArgs); },
+			"XYZ":function(obj, kwArgs){ return cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](cMaps["Luv"]["XYZ"](cMaps["LCHuv"]["Luv"](obj), kwArgs), kwArgs); },
+		},
+		"Luv":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](obj, kwArgs), kwArgs).toCmy(); },
+			"CMYK":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](obj, kwArgs), kwArgs).toCmyk(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](obj, kwArgs), kwArgs).toHsl(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](obj, kwArgs), kwArgs).toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["XYZ"]["Lab"](cMaps["Luv"]["XYZ"](obj, kwArgs), kwArgs); },
+			"LCHab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](cMaps["XYZ"]["Lab"](cMaps["Luv"]["XYZ"](obj, kwArgs), kwArgs), kwArgs); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["Luv"]["LCHuv"](obj, kwArgs); },
+			"RGB":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["Luv"]["XYZ"](obj, kwArgs), kwArgs); },
+			"XYZ":function(obj, kwArgs){ return cMaps["Luv"]["XYZ"](obj, kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](cMaps["Luv"]["XYZ"](obj, kwArgs), kwArgs); },
+		},
+		"RGB":{ 
+			"CMY":function(obj, kwArgs){ return obj.toCmy(); },
+			"CMYK":function(obj, kwArgs){ return obj.toCmyk(); },
+			"HSL":function(obj, kwArgs){ return obj.toHsl(); },
+			"HSV":function(obj, kwArgs){ return obj.toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["XYZ"]["Lab"](obj.toXYZ(kwArgs), kwArgs); },
+			"LCHab":function(obj, kwArgs){ return cMaps["LCHab"]["Lab"](cMaps["XYZ"]["Lab"](obj.toXYZ(kwArgs), kwArgs), kwArgs);},
+			"LCHuv":function(obj, kwArgs){ return cMaps["LCHuv"]["Luv"](cMaps["XYZ"]["Luv"](obj.toXYZ(kwArgs), kwArgs), kwArgs);},
+			"Luv":function(obj, kwArgs){ return cMaps["XYZ"]["Luv"](obj.toXYZ(kwArgs), kwArgs); },
+			"XYZ":function(obj, kwArgs){ return obj.toXYZ(kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](obj.toXYZ(kwArgs), kwArgs); }
+		},
+		"XYZ":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromXYZ(obj, kwArgs).toCmy(); },
+			"CMYK":function(obj, kwArgs){ return dxc.fromXYZ(obj, kwArgs).toCmyk(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromXYZ(obj, kwArgs).toHsl(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromXYZ(obj, kwArgs).toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["XYZ"]["Lab"](obj, kwArgs); },
+			"LCHab":function(obj, kwArgs){ return cMaps["Lab"]["LCHab"](cMaps["XYZ"]["Lab"](obj, kwArgs), kwArgs); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["Luv"]["LCHuv"](cMaps["XYZ"]["Luv"](obj, kwArgs), kwArgs); },
+			"Luv":function(obj, kwArgs){ return cMaps["XYZ"]["Luv"](obj, kwArgs); },
+			"RGB":function(obj, kwArgs){ return dxc.fromXYZ(obj, kwArgs); },
+			"xyY":function(obj, kwArgs){ return cMaps["XYZ"]["xyY"](dxc.fromXYZ(obj, kwArgs), kwArgs); }
+		},
+		// TODO: revisit this. xyY represents a single color, not a spectrum of colors.
+		"xyY":{ 
+			"CMY":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs).toCmy(); },
+			"CMYK":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs).toCmyk(); },
+			"HSL":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs).toHsl(); },
+			"HSV":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs).toHsv(); },
+			"Lab":function(obj, kwArgs){ return cMaps["Lab"]["XYZ"](cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs); },
+			"LCHab":function(obj, kwArgs){ return cMaps["LCHab"]["Lab"](cMaps["Lab"]["XYZ"](cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs), kwArgs); },
+			"LCHuv":function(obj, kwArgs){ return cMaps["LCHuv"]["Luv"](cMaps["Luv"]["XYZ"](cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs), kwArgs); },
+			"Luv":function(obj, kwArgs){ return cMaps["Luv"]["XYZ"](cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs); },
+			"RGB":function(obj, kwArgs){ return dxc.fromXYZ(cMaps["xyY"]["XYZ"](obj, kwArgs), kwArgs); },
+			"XYZ":function(obj, kwArgs){ return cMaps["xyY"]["XYZ"](obj, kwArgs); }
+		}
+	};
+
+	this.whitepoint=function(/* String */wpName, /* String? */observer){
+		observer=observer||"10";
+		var x=0, y=0, t=0;
+		if(wpMap[observer] && wpMap[observer][wpName]){
+			x=wpMap[observer][wpName].x;
+			y=wpMap[observer][wpName].y;
+			t=wpMap[observer][wpName].t;
+		} else {
+			console.warn(
+				"dojox.color.Colorspace::whitepoint: either the observer or the whitepoint name was not found. ", 
+				observer, wpName
+			);
+		}
+		var wp={ x:x, y:y, z:(1-x-y), t:t, Y:1 };
+		return this.convert(wp, "xyY", "XYZ");
+	};
+
+	this.tempToWhitepoint=function(/* Number */t){
+		if(t<4000){
+			console.warn("dojox.color.Colorspace::tempToWhitepoint: can't find a white point for temperatures less than 4000K. (Passed ", t, ").");
+			return { x:0, y:0 };
+		}
+		if(t>25000){
+			console.warn("dojox.color.Colorspace::tempToWhitepoint: can't find a white point for temperatures greater than 25000K. (Passed ", t, ").");
+			return { x:0, y:0 };
+		}
+		var t1=t, t2=t*t, t3=t2*t;
+		var ten9=Math.pow(10, 9), ten6=Math.pow(10, 6), ten3=Math.pow(10,3);
+		if(t<=7000){
+			var x=(-4.607*ten9/t3)+(2.9678*ten6/t2)+(0.09911*ten3/t)+0.2444063;
+		} else {
+			var x=(-2.0064*ten9/t3)+(1.9018*ten6/t2)+(0.24748*ten3/t)+0.23704;
+		}
+		var y=-3*x*x+2.87*x-0.275;
+		return { x:x, y:y };
+	};
+
+	this.primaries=function(/* Object */kwArgs){
+		//	mix in the defaults.
+		kwArgs=dojo.mixin({
+			profile:"sRGB",
+			whitepoint:"D65",
+			observer:"10",
+			adaptor:"Bradford"
+		}, kwArgs||{});
+
+		var m=[];
+		if(profiles[kwArgs.profile]){
+			m=profiles[kwArgs.profile].slice(0);
+		} else {
+			console.warn(
+				"dojox.color.Colorspace::primaries: the passed profile was not found.  ",
+				"Available profiles include: ", profiles, 
+				".  The profile passed was ", kwArgs.profile
+			);
+		}
+		var primary={
+			name:kwArgs.profile,
+			gamma:m[0], whitepoint:m[1], 
+			xr:m[2], yr:m[3], Yr:m[4],
+			xg:m[5], yg:m[6], Yg:m[7],
+			xb:m[8], yb:m[9], Yb:m[10]
+		};
+		
+		//	convert for the whitepoint
+		if(kwArgs.whitepoint!=primary.whitepoint){
+			var r=this.convert(
+				this.adapt({
+					color:this.convert({ x:xr, y:yr, Y:Yr }, "xyY", "XYZ"),
+					adaptor:kwArgs.adaptor, 
+					source:primary.whitepoint, 
+					destination:kwArgs.whitepoint
+				}),
+				"XYZ",
+				"xyY"
+			);
+			var g=this.convert(
+				this.adapt({
+					color:this.convert({ x:xg, y:yg, Y:Yg }, "xyY", "XYZ"),
+					adaptor:kwArgs.adaptor, 
+					source:primary.whitepoint, 
+					destination:kwArgs.whitepoint
+				}),
+				"XYZ",
+				"xyY"
+			);
+			var b=this.convert(
+				this.adapt({
+					color:this.convert({ x:xb, y:yb, Y:Yb }, "xyY", "XYZ"),
+					adaptor:kwArgs.adaptor, 
+					source:primary.whitepoint, 
+					destination:kwArgs.whitepoint
+				}),
+				"XYZ",
+				"xyY"
+			);
+			primary=dojo.mixin(primary, {
+				xr: r.x, yr: r.y, Yr: r.Y,
+				xg: g.x, yg: g.y, Yg: g.Y,
+				xb: b.x, yb: b.y, Yb: b.Y,
+				whitepoint: kwArgs.whitepoint
+			});
+		}
+		return dojo.mixin(primary, {
+			zr: 1-primary.xr-primary.yr,
+			zg: 1-primary.xg-primary.yg,
+			zb: 1-primary.xb-primary.yb
+		});		//	Object
+	};
+
+	this.adapt=function(/* Object */kwArgs){
+		//	color is required in the form of XYZ, source whitepoint name is required.
+		if(!kwArgs.color || !kwArgs.source){
+			console.error("dojox.color.Colorspace::adapt: color and source arguments are required. ", kwArgs);
+		}
+
+		//	defaults
+		kwArgs=dojo.mixin({
+			adaptor:"Bradford",
+			destination:"D65"
+		}, kwArgs);
+
+		//	adapt
+		var swp = this.whitepoint(kwArgs.source);
+		var dwp = this.whitepoint(kwArgs.destination);
+		if(adaptors[kwArgs.adaptor]){
+			var ma=adaptors[kwArgs.adaptor].ma;
+			var mai=adaptors[kwArgs.adaptor].mai;
+		}else{
+			console.warn("dojox.color.Colorspace::adapt: the passed adaptor '", kwArgs.adaptor, "' was not found.");
+		}
+		var dSrc=dxm.multiply([[swp.x, swp.y, swp.z]], ma);
+		var dDest=dxm.multiply([[dwp.x, dwp.y, dwp.z]], ma);
+		var center=[
+			[dDest[0][0]/dSrc[0][0], 0, 0],
+			[0, dDest[0][1]/dSrc[0][1], 0],
+			[0, 0, dDest[0][2]/dSrc[0][2]]
+		];
+		var m=dxm.multiply(dxm.multiply(ma, center), mai);
+		var r=dxm.multiply([[ kwArgs.color.X, kwArgs.color.Y, kwArgs.color.Z ]], m)[0];
+		return { X:r[0], Y:r[1], Z:r[2] };
+	};
+
+	this.matrix=function(/* String */to, /* Object */primary){
+		var wp=this.whitepoint(primary.whitepoint);
+		var Xr = p.xr/p.yr, Yr = 1, Zr = (1-p.xr-p.yr)/p.yr;
+		var Xg = p.xg/p.yg, Yg = 1, Zg = (1-p.xg-p.yg)/p.yg;
+		var Xb = p.xb/p.yb, Yb = 1, Zr = (1-p.xb-p.yb)/p.yb;
+
+		var m1 = [[ Xr, Yr, Zr ], [ Xg, Yg, Zg ], [ Xb, Yb, Zb ]];
+		var m2 = [[ wp.X, wp.Y, wp.Z ]];
+		var sm = dojox.math.matrix.multiply(m2, dojox.math.matrix.inverse(m1));
+		var Sr = sm[0][0], Sg = sm[0][1], Sb = sm[0][2];
+		var result=[
+			[Sr*Xr, Sr*Yr, Sr*Zr],
+			[Sg*Xg, Sg*Yg, Sg*Zg],
+			[Sb*Xb, Sb*Yb, Sb*Zb]
+		];
+		if(to=="RGB"){ return dojox.math.inverse(result); }
+		return result;
+	};
+
+	this.epsilon=function(/* bool? */useApprox){
+		return (useApprox || typeof(useApprox)=="undefined")? 0.008856: 216/24289;
+	};
+	this.kappa=function(/* bool? */useApprox){
+		return (useApprox || typeof(useApprox)=="undefined")? 903.3: 24389/27;
+	};
+
+	this.convert=function(/* Object */color, /* string */from, /* string */to, /* Object? */kwArgs){
+		if(converters[from] && converters[from][to]){
+			return converters[from][to](obj, kwArgs);
+		}
+		console.warn("dojox.color.Colorspace::convert: Can't convert ", color, " from ", from, " to ", to, ".");
+	};
+})();
+
+//	More dojox.color and dojox.color.Color extensions
+dojo.mixin(dojox.color, {
+	fromXYZ: function(/* Object */xyz, /* Object?*/kwArgs){
+		kwArgs=kwArgs||{};
+		var p=dojox.color.Colorspace.primaries(kwArgs);
+		var m=dojox.color.Colorspace.matrix("RGB", p);
+		var rgb=dojox.math.matrix.mutliply([[ xyz.X, xyz.Y, xyz.Z ]], m);
+		var r=rgb[0][0], g=rgb[0][1], b=rgb[0][2];
+		if(p.profile=="sRGB"){
+			var R = (r>0.0031308)?(1.055*Math.pow(r, 1/2.4))-0.055: 12.92*r;
+			var G = (g>0.0031308)?(1.055*Math.pow(g, 1/2.4))-0.055: 12.92*g;
+			var B = (b>0.0031308)?(1.055*Math.pow(b, 1/2.4))-0.055: 12.92*b;
+		}else{
+			var R=Math.pow(r, 1/p.gamma), G=Math.pow(g, 1/p.gamma), B=Math.pow(b, 1/p.gamma);
+		}
+		return new dojox.color.Color({ r:Math.floor(R*255), g:Math.floor(G*255), b:Math.floor(B*255) });
+	}
+});
+
+dojo.extend(dojox.color.Color, {
+	toXYZ: function(/* Object */kwArgs){
+		kwArgs=kwArgs||{};
+		var p=dojox.color.Colorspace.primaries(kwArgs);
+		var m=dojox.color.Colorspace.matrix("XYZ", p);
+		var _r=this.r/255, _g=this.g/255, _b=this.b/255;
+		if(p.profile=="sRGB"){
+			var r=(_r>0.04045) ? Math.pow(((_r+0.055)/1.055), 2.4):_r/12.92;
+			var g=(_g>0.04045) ? Math.pow(((_g+0.055)/1.055), 2.4):_g/12.92;
+			var b=(_b>0.04045) ? Math.pow(((_b+0.055)/1.055), 2.4):_b/12.92;
+		} else {
+			var r=Math.pow(_r, p.gamma), g=Math.pow(_g, p.gamma), b=Math.pow(_b, p.gamma);
+		}
+		var xyz=dojox.math.matrix([[ r, g, b ]], m);
+		return { X: xyz[0][0], Y: xyz[0][1], Z: xyz[0][2] };	//	Object
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/color/Generator.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/color/Generator.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/color/Generator.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,261 @@
+if(!dojo._hasResource["dojox.color.Generator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.color.Generator"] = true;
+dojo.provide("dojox.color.Generator");
+
+dojox.color.Generator = new (function(){
+	var dxc=dojox.color;
+
+	//	common helper functions
+	var prep=function(obj){
+		if(!obj){
+			console.warn("dojox.color.Generator:: no base color was passed. ", obj);
+			return null;
+		}
+		if(!obj.toHsv){
+			//	either a raw string or object, return a Color.
+			obj=new dxc.Color(obj);
+		}
+		return obj;
+	};
+
+	var factors=function(n, high, low){
+		var ret=[], i, step=(high-low)/n, cur=high;
+		for(i=0; i<n; i++,cur-=step){ ret.push(cur); }
+		return ret;
+	};
+
+	var fill=function(color, num, factors){
+		var c=factors.length-1, a=[], r, g, b;
+		for(var i=0; i<num; i++){
+			if(i<factors.length){
+				 r=color.r+(255-color.r)*factors[i], 
+				 g=color.g+(255-color.g)*factors[i], 
+				 b=color.b+(255-color.b)*factors[i];
+				 a.push(new dxc.Color({ r:r, g:g, b:b }));
+			}
+			else if(i==factors.length){
+				a.push(color);
+			}
+			else {
+				if(c<0){ c=factors.length-1; }	//	just in case.
+				r=color.r*(1-factors[c]), 
+				g=color.g*(1-factors[c]), 
+				b=color.b*(1-factors[c--]);
+				a.push(new dxc.Color({ r:r, g:g, b:b }));
+			}
+		}
+		return a;
+	};
+	
+	var flatten=function(matrix, limit){
+		var ret=[];
+		for(var i=0; i<matrix[0].length; i++){
+			for(var j=0; j<matrix.length; j++){
+				ret.push(matrix[j][i]);
+			}
+		}
+		return ret.slice(0, limit);
+	};
+
+	//	the color generator
+	this.analogous= function(/* Object */kwArgs){
+		//	summary
+		//	generates n colors based on a base color, based on a fixed hue angle delta
+		//	(relative to the base hue) with slight variations in saturation.
+		kwArgs=dojo.mixin({
+			series:4,				//	number of analogous lines to generate
+			num:32,					//	number of colors to derive
+			angleHigh:30,			//	the angle of difference to use, subtracted
+			angleLow:8,				//	the angle of difference to use, added
+			high:0.5,				//	high part of range to generate tints and shades
+			low:0.15				//	low part of range to generate tints and shades
+		}, kwArgs||{});
+		
+		var base=prep(kwArgs.base, "analogous");
+		if(!base){ return []; }
+
+		//	let start the generation.  We use series to move further away from the center.
+		var num=kwArgs.num, hsv=base.toHsv();
+		var rows=kwArgs.series+1, cols=Math.ceil(num/rows);
+		var fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
+
+		//	generate the angle differences
+		var ang=[];
+		var gen=Math.floor(kwArgs.series/2);
+		for(var i=1; i<=gen; i++){
+			var a=hsv.h+((kwArgs.angleLow*i)+1);
+			if(a>=360){ a-=360; }
+			ang.push(a);
+		}
+		ang.push(0);
+		for(i=1; i<=gen; i++){
+			a=hsv.h-(kwArgs.angleHigh*i);
+			if(a<0){ a+=360; }
+			ang.push(a);
+		}
+
+		var m=[], cur=0;
+		for(i=0; i<rows; i++){
+			m.push(fill(dxc.fromHsv({ h: ang[cur++], s:hsv.s, v:hsv.v }), cols, fs));
+		}
+		return flatten(m, num);	//	Array
+	};
+	
+	this.monochromatic = function(/* Object */kwArgs){
+		//	summary
+		//	generates n colors based on a base color, using alterations to the RGB model only.
+		kwArgs=dojo.mixin({
+			num:32,					//	number of colors to derive
+			high:0.5,				//	high factor to generate tints and shades
+			low:0.15				//	low factor to generate tints and shades
+		}, kwArgs||{});
+		
+		var base=prep(kwArgs.base, "monochromatic");
+		if(!base){ return []; }
+
+		var fs=factors(Math.floor(kwArgs.num/2), kwArgs.high, kwArgs.low);
+		var a=fill(base, kwArgs.num, fs);
+		return a;	// Array
+	};
+	
+	this.triadic = function(/* Object */kwArgs){
+		//	summary
+		//	generates n colors from a base color, using the triadic rules, rough
+		//	approximation from kuler.adobe.com.
+		kwArgs=dojo.mixin({
+			num:32,					//	number of colors to derive
+			high:0.5,				//	high factor to generate tints and shades
+			low:0.15				//	low factor to generate tints and shades
+		}, kwArgs||{});
+		
+		var base=prep(kwArgs.base, "triadic");
+		if(!base){ return []; }
+
+		var num=kwArgs.num, rows=3, cols=Math.ceil(num/rows), fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
+		var m=[], hsv=base.toHsv();
+
+		//	hue calculations
+		var h1=hsv.h+57, h2=hsv.h-157;
+		if(h1>360){ h1-=360; }
+		if(h2<0){ h2+=360; }
+
+		//	sat calculations
+		var s1=(hsv.s>=20) ? hsv.s-10 : hsv.s+10;
+		var s2=(hsv.s>=95) ? hsv.s-5 : hsv.s+5;
+
+		//	value calcs
+		var v2=(hsv.v>=70) ? hsv.v-30 : hsv.v+30;
+		
+		m.push(fill(dojox.color.fromHsv({ h:h1, s:s1, v:hsv.v }), cols, fs));
+		m.push(fill(base, cols, fs));
+		m.push(fill(dojox.color.fromHsv({ h:h2, s:s2, v:v2 }), cols, fs));
+		return flatten(m, num);	//	Array
+	};
+	
+	this.complementary = function(/* Object */kwArgs){
+		//	summary
+		//	generates n colors from a base color, using complimentary rules.
+		kwArgs=dojo.mixin({
+			num:32,					//	number of colors to derive
+			high:0.5,				//	high factor to generate tints and shades
+			low:0.15				//	low factor to generate tints and shades
+		}, kwArgs||{});
+		
+		var base=prep(kwArgs.base, "complimentary");
+		if(!base){ return []; }
+
+		var num=kwArgs.num, rows=2, cols=Math.ceil(num/rows), fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
+		var m=[], hsv=base.toHsv();
+		var compliment=(hsv.h+120)%360;
+		m.push(fill(base, cols, fs));
+		m.push(fill(dojox.color.fromHsv({ h:compliment, s:hsv.s, v:hsv.v }), cols, fs));
+		return flatten(m, num);	//	Array
+	};
+	
+	this.splitComplementary = function(/* Object */kwArgs){
+		//	summary
+		//	generates n colors from a base color, using split complimentary rules.
+		kwArgs=dojo.mixin({
+			num:32,					//	number of colors to derive
+			angle:30,				//	the angle of difference to use
+			high:0.5,				//	high factor to generate tints and shades
+			low:0.15				//	low factor to generate tints and shades
+		}, kwArgs||{});
+		
+		var base=prep(kwArgs.base, "splitComplementary");
+		if(!base){ return []; }
+
+		var num=kwArgs.num, rows=3, cols=Math.ceil(num/rows), fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
+		var m=[], hsv=base.toHsv();
+		var compliment=(hsv.h+120)%360;
+		var comp1=compliment-kwArgs.angle, comp2=(compliment+kwArgs.angle)%360;
+		if(comp1<0){ comp1+=360; }
+		
+		m.push(fill(base, cols, fs));
+		m.push(fill(dojox.color.fromHsv({ h:comp1, s:hsv.s, v:hsv.v }), cols, fs));
+		m.push(fill(dojox.color.fromHsv({ h:comp2, s:hsv.s, v:hsv.v }), cols, fs));
+		return flatten(m, num);	//	Array
+	};
+	
+	this.compound = function(/* Object */kwArgs){
+		//	summary
+		//	generates n colors from a base color, using a *very* rough approximation
+		//	of the Compound rules at http://kuler.adobe.com
+		kwArgs=dojo.mixin({
+			num:32,					//	number of colors to derive
+			angle:30,				//	the angle of difference to use
+			high:0.5,				//	high factor to generate tints and shades
+			low:0.15				//	low factor to generate tints and shades
+		}, kwArgs||{});
+		
+		var base=prep(kwArgs.base, "compound");
+		if(!base){ return []; }
+
+		var num=kwArgs.num, rows=4, cols=Math.ceil(num/rows), fs=factors(Math.floor(cols/2), kwArgs.high, kwArgs.low);
+		var m=[], hsv=base.toHsv();
+		var comp=(hsv.h+120)%360;		//	other base angle.
+
+		//	hue calculations
+		var h1=(hsv.h+kwArgs.angle)%360, h2=comp-kwArgs.angle, h3=comp-(kwArgs.angle/2);
+		if(h2<0){ h2+=360; }
+		if(h3<0){ h3+=360; }
+
+		//	saturation calculations
+		var s1=(hsv.s>=90 && hsv.s<=100)? hsv.s-10 : hsv.s+10;
+		var s2=(hsv.s<=35) ? hsv.s+25 : hsv.s-25;
+
+		//	value calculations
+		var v1=hsv.v-20;
+		var v2=hsv.v;
+		
+		m.push(fill(base, cols, fs));
+		m.push(fill(dojox.color.fromHsv({ h:h1, s:s1, v:v1 }), cols, fs));
+		m.push(fill(dojox.color.fromHsv({ h:h2, s:s1, v:v1 }), cols, fs));
+		m.push(fill(dojox.color.fromHsv({ h:h3, s:s2, v:v2 }), cols, fs));
+		return flatten(m, num);	//	Array
+	};
+	
+	this.shades = function(/* Object */kwArgs){
+		//	summary
+		//	generates n colors based on a base color using only changes
+		//	in value.  Similar to monochromatic but a bit more linear.
+		kwArgs=dojo.mixin({
+			num:32,					//	number of colors to derive
+			high:1.5,				//	high factor to generate tints and shades
+			low:0.5					//	low factor to generate tints and shades
+		}, kwArgs||{});
+		
+		var base=prep(kwArgs.base, "shades");
+		if(!base){ return []; }
+
+		var num=kwArgs.num, hsv=base.toHsv();
+		var step=(kwArgs.high-kwArgs.low)/num, cur=kwArgs.low;
+		var a=[];
+		for(var i=0; i<num; i++,cur+=step){
+			a.push(dxc.fromHsv({ h:hsv.h, s:hsv.s, v:Math.min(Math.round(hsv.v*cur),100) }));
+		}
+		return a;	// Array
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/color/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/color/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/color/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,41 @@
+-------------------------------------------------------------------------------
+DojoX Color
+-------------------------------------------------------------------------------
+Version 0.9
+Release date: 10/20/2007
+-------------------------------------------------------------------------------
+Project state:
+dojox.color._base: 			stable
+dojox.color.Colorspace:		experimental
+dojox.color.Generator:		beta
+-------------------------------------------------------------------------------
+Credits
+	Cal Henderson
+	Tom Trenka (ttrenka AT gmail.com)
+-------------------------------------------------------------------------------
+Project description
+
+Both a port of the older dojo.gfx.color work (Cal Henderson) as well as some
+new additions (Generator, Tom Trenka).  Everything is applied to an alias of
+dojo.Color or dojo.color, so that you can just use dojox.color.Color instead
+with extended methods.
+-------------------------------------------------------------------------------
+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/color.js
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/color/*
+
+Install into the following directory structure:
+/dojox/color/
+
+...which should be at the same level as your Dojo checkout.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/color/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/color/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/color/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,197 @@
+if(!dojo._hasResource["dojox.color._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.color._base"] = true;
+dojo.provide("dojox.color._base");
+dojo.require("dojo.colors");
+
+//	alias all the dojo.Color mechanisms
+dojox.color.Color=dojo.Color;
+dojox.color.blend=dojo.blendColors;
+dojox.color.fromRgb=dojo.colorFromRgb;
+dojox.color.fromHex=dojo.colorFromHex;
+dojox.color.fromArray=dojo.colorFromArray;
+dojox.color.fromString=dojo.colorFromString;
+
+//	alias the dojo.colors mechanisms
+dojox.color.greyscale=dojo.colors.makeGrey;
+
+//	static methods
+dojo.mixin(dojox.color, {
+	fromCmy: function(/* Object|Array|int */cyan, /*int*/magenta, /*int*/yellow){
+		//	summary
+		//	Create a dojox.color.Color from a CMY defined color.
+		//	All colors should be expressed as 0-100 (percentage)
+
+		if(dojo.isArray(cyan)){
+			magenta=cyan[1], yellow=cyan[2], cyan=cyan[0];
+		} else if(dojo.isObject(cyan)){
+			magenta=cyan.m, yellow=cyan.y, cyan=cyan.c;
+		}
+		cyan/=100, magenta/=100, yellow/=100;
+
+		var r=1-cyan, g=1-magenta, b=1-yellow;
+		return new dojox.color.Color({ r:Math.round(r*255), g:Math.round(g*255), b:Math.round(b*255) });	//	dojox.color.Color
+	},
+
+	fromCmyk: function(/* Object|Array|int */cyan, /*int*/magenta, /*int*/yellow, /*int*/black){
+		//	summary
+		//	Create a dojox.color.Color from a CMYK defined color.
+		//	All colors should be expressed as 0-100 (percentage)
+
+		if(dojo.isArray(cyan)){
+			magenta=cyan[1], yellow=cyan[2], black=cyan[3], cyan=cyan[0];
+		} else if(dojo.isObject(cyan)){
+			magenta=cyan.m, yellow=cyan.y, black=cyan.b, cyan=cyan.c;
+		}
+		cyan/=100, magenta/=100, yellow/=100, black/=100;
+		var r,g,b;
+		r = 1-Math.min(1, cyan*(1-black)+black);
+		g = 1-Math.min(1, magenta*(1-black)+black);
+		b = 1-Math.min(1, yellow*(1-black)+black);
+		return new dojox.color.Color({ r:Math.round(r*255), g:Math.round(g*255), b:Math.round(b*255) });	//	dojox.color.Color
+	},
+	
+	fromHsl: function(/* Object|Array|int */hue, /* int */saturation, /* int */luminosity){
+		//	summary
+		//	Create a dojox.color.Color from an HSL defined color.
+		//	hue from 0-359 (degrees), saturation and luminosity 0-100.
+
+		if(dojo.isArray(hue)){
+			saturation=hue[1], luminosity=hue[2], hue=hue[0];
+		} else if(dojo.isObject(hue)){
+			saturation=hue.s, luminosity=hue.l, hue=hue.h;
+		}
+		saturation/=100;
+		luminosity/=100;
+
+		while(hue<0){ hue+=360; }
+		while(hue>=360){ hue-=360; }
+		
+		var r, g, b;
+		if(hue<120){
+			r=(120-hue)/60, g=hue/60, b=0;
+		} else if (hue<240){
+			r=0, g=(240-hue)/60, b=(hue-120)/60;
+		} else {
+			r=(hue-240)/60, g=0, b=(360-hue)/60;
+		}
+		
+		r=2*saturation*Math.min(r, 1)+(1-saturation);
+		g=2*saturation*Math.min(g, 1)+(1-saturation);
+		b=2*saturation*Math.min(b, 1)+(1-saturation);
+		if(luminosity<0.5){
+			r*=luminosity, g*=luminosity, b*=luminosity;
+		}else{
+			r=(1-luminosity)*r+2*luminosity-1;
+			g=(1-luminosity)*g+2*luminosity-1;
+			b=(1-luminosity)*b+2*luminosity-1;
+		}
+		return new dojox.color.Color({ r:Math.round(r*255), g:Math.round(g*255), b:Math.round(b*255) });	//	dojox.color.Color
+	},
+	
+	fromHsv: function(/* Object|Array|int */hue, /* int */saturation, /* int */value){
+		//	summary
+		//	Create a dojox.color.Color from an HSV defined color.
+		//	hue from 0-359 (degrees), saturation and value 0-100.
+
+		if(dojo.isArray(hue)){
+			saturation=hue[1], value=hue[2], hue=hue[0];
+		} else if (dojo.isObject(hue)){
+			saturation=hue.s, value=hue.v, hue=hue.h;
+		}
+		
+		if(hue==360){ hue=0; }
+		saturation/=100;
+		value/=100;
+		
+		var r, g, b;
+		if(saturation==0){
+			r=value, b=value, g=value;
+		}else{
+			var hTemp=hue/60, i=Math.floor(hTemp), f=hTemp-i;
+			var p=value*(1-saturation);
+			var q=value*(1-(saturation*f));
+			var t=value*(1-(saturation*(1-f)));
+			switch(i){
+				case 0:{ r=value, g=t, b=p; break; }
+				case 1:{ r=q, g=value, b=p; break; }
+				case 2:{ r=p, g=value, b=t; break; }
+				case 3:{ r=p, g=q, b=value; break; }
+				case 4:{ r=t, g=p, b=value; break; }
+				case 5:{ r=value, g=p, b=q; break; }
+			}
+		}
+		return new dojox.color.Color({ r:Math.round(r*255), g:Math.round(g*255), b:Math.round(b*255) });	//	dojox.color.Color
+	}
+});
+
+//	Conversions directly on dojox.color.Color
+dojo.extend(dojox.color.Color, {
+	toCmy: function(){
+		//	summary
+		//	Convert this Color to a CMY definition.
+		var cyan=1-(this.r/255), magenta=1-(this.g/255), yellow=1-(this.b/255);
+		return { c:Math.round(cyan*100), m:Math.round(magenta*100), y:Math.round(yellow*100) };		//	Object
+	},
+	
+	toCmyk: function(){
+		//	summary
+		//	Convert this Color to a CMYK definition.
+		var cyan, magenta, yellow, black;
+		var r=this.r/255, g=this.g/255, b=this.b/255;
+		black = Math.min(1-r, 1-g, 1-b);
+		cyan = (1-r-black)/(1-black);
+		magenta = (1-g-black)/(1-black);
+		yellow = (1-b-black)/(1-black);
+		return { c:Math.round(cyan*100), m:Math.round(magenta*100), y:Math.round(yellow*100), b:Math.round(black*100) };	//	Object
+	},
+	
+	toHsl: function(){
+		//	summary
+		//	Convert this Color to an HSL definition.
+		var r=this.r/255, g=this.g/255, b=this.b/255;
+		var min = Math.min(r, b, g), max = Math.max(r, g, b);
+		var delta = max-min;
+		var h=0, s=0, l=(min+max)/2;
+		if(l>0 && l<1){
+			s = delta/((l<0.5)?(2*l):(2-2*l));
+		}
+		if(delta>0){
+			if(max==r && max!=g){
+				h+=(g-b)/delta;
+			}
+			if(max==g && max!=b){
+				h+=(2+(b-r)/delta);
+			}
+			if(max==b && max!=r){
+				h+=(4+(r-g)/delta);
+			}
+			h*=60;
+		}
+		return { h:h, s:Math.round(s*100), l:Math.round(l*100) };	//	Object
+	},
+
+	toHsv: function(){
+		//	summary
+		//	Convert this Color to an HSV definition.
+		var r=this.r/255, g=this.g/255, b=this.b/255;
+		var min = Math.min(r, b, g), max = Math.max(r, g, b);
+		var delta = max-min;
+		var h = null, s = (max==0)?0:(delta/max);
+		if(s==0){
+			h = 0;
+		}else{
+			if(r==max){
+				h = 60*(g-b)/delta;
+			}else if(g==max){
+				h = 120 + 60*(b-r)/delta;
+			}else{
+				h = 240 + 60*(r-g)/delta;
+			}
+
+			if(h<0){ h+=360; }
+		}
+		return { h:h, s:Math.round(s*100), v:Math.round(max*100) };	//	Object
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/color.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/color.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/color.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+if(!dojo._hasResource["dojox.color"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.color"] = true;
+dojo.provide("dojox.color");
+dojo.require("dojox.color._base");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/cometd/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/cometd/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/cometd/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,29 @@
+-------------------------------------------------------------------------------
+Cometd (client)
+-------------------------------------------------------------------------------
+Version 0.4
+Release date: May 29, 2007
+-------------------------------------------------------------------------------
+Project state: beta 
+-------------------------------------------------------------------------------
+Project authors
+	Alex Russell (alex@xxxxxxxxxxxxxxx)
+	Greg Wilkins
+-------------------------------------------------------------------------------
+Project description
+
+Low-latency data transfer from servers to clients. dojox.cometd implements a
+Bayeux protocol client for use with most Bayeux servers. See cometd.com for
+details on Cometd or on the Bayeux protocol.
+-------------------------------------------------------------------------------
+Dependencies:
+
+Needs a cooperating Bayeux server
+-------------------------------------------------------------------------------
+Documentation
+
+See http://cometd.com
+-------------------------------------------------------------------------------
+Installation instructions
+
+Use this library with (preferably through) an existing Cometd server.

Added: branches/vhffs-design/vhffs-panel/js/dojox/cometd/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/cometd/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/cometd/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,950 @@
+if(!dojo._hasResource["dojox.cometd._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.cometd._base"] = true;
+dojo.provide("dojox.cometd._base");
+dojo.require("dojo.AdapterRegistry");
+dojo.require("dojo.io.script");
+
+
+/*
+ * this file defines Comet protocol client. Actual message transport is
+ * deferred to one of several connection type implementations. The default is a
+ * long-polling implementation. A single global object named "dojox.cometd" is
+ * used to mediate for these connection types in order to provide a stable
+ * interface.
+ *
+ * extensions modules may be loaded (eg "dojox.cometd.timestamp", that use
+ * the cometd._extendInList and cometd._extendOutList fields to provide functions
+ * that extend and handling incoming and outgoing messages.
+ */
+
+dojox.cometd = new function(){
+	
+	// cometd states:
+
+	// alex; OMG, these "constants" need to die. Java truly is a degenerative disease.
+ 	this.DISCONNECTED = "DISCONNECTED";		// _initialized==false 	&& _connected==false
+ 	this.CONNECTING = "CONNECTING";			// _initialized==true	&& _connected==false (handshake sent)
+ 	this.CONNECTED = "CONNECTED";			// _initialized==true	&& _connected==true (first successful connect)
+ 	this.DISCONNECTING = "DISCONNECING";	// _initialized==false 	&& _connected==true (disconnect sent)
+ 	
+	this._initialized = false;
+	this._connected = false;
+	this._polling = false;
+
+	this.expectedNetworkDelay = 5000; // expected max network delay
+	this.connectTimeout = 0;    // If set, used as ms to wait for a connect response and sent as the advised timeout
+
+	this.connectionTypes = new dojo.AdapterRegistry(true);
+
+	this.version =	"1.0";
+	this.minimumVersion = "0.9";
+	this.clientId = null;
+	this.messageId = 0;
+	this.batch = 0;
+
+	this._isXD = false;
+	this.handshakeReturn = null;
+	this.currentTransport = null;
+	this.url = null;
+	this.lastMessage = null;
+	this._messageQ = [];
+	this.handleAs = "json-comment-optional";
+	this._advice = {};
+	this._backoffInterval = 0;
+	this._backoffIncrement = 1000;
+	this._backoffMax = 60000;
+	this._deferredSubscribes = {};
+	this._deferredUnsubscribes = {};
+	this._subscriptions = [];
+	this._extendInList = [];	// List of functions invoked before delivering messages
+	this._extendOutList = [];	// List of functions invoked before sending messages
+
+	this.state = function() {
+		return this._initialized ? 
+			(this._connected ? "CONNECTED" : "CONNECTING") : 
+			( this._connected ? "DISCONNECTING" : "DISCONNECTED");
+	}
+
+	this.init = function(	/*String*/	root,
+				/*Object?*/ props,
+				/*Object?*/ bargs){	// return: dojo.Deferred
+		//	summary:
+		//		Initialize the cometd implementation of the Bayeux protocol
+		//	description:
+		//		Initialize the cometd implementation of the Bayeux protocol by
+		//		sending a handshake message. The cometd state will be changed to CONNECTING
+		//		until a handshake response is received and the first successful connect message
+		//		has returned.
+		//		The protocol state changes may be monitored
+		//		by subscribing to the dojo topic "/cometd/meta" where events are
+		//		published in the form {cometd:this,action:"handshake",successful:true,state:this.state()}
+		//	root:
+		//		The URL of the cometd server. If the root is absolute, the host
+		//		is examined to determine if xd transport is needed. Otherwise the
+		//		same domain is assumed.
+		//	props:
+		//		An optional object that is used as the basis of the handshake message
+		//	bargs:
+		//		An optional object of bind args mixed in with the send of the handshake
+		//	example:
+		//	|	dojox.cometd.init("/cometd");
+		//	|	dojox.cometd.init("http://xdHost/cometd",{ext:{user:"fred",pwd:"secret"}});
+
+
+		// FIXME: if the root isn't from the same host, we should automatically
+		// try to select an XD-capable transport
+		props = props||{};
+		// go ask the short bus server what we can support
+		props.version = this.version;
+		props.minimumVersion = this.minimumVersion;
+		props.channel = "/meta/handshake";
+		props.id = ""+this.messageId++;
+
+		this.url = root||dojo.config["cometdRoot"];
+		if(!this.url){
+			console.debug("no cometd root specified in djConfig and no root passed");
+			return null;
+		}
+
+		// Are we x-domain? borrowed from dojo.uri.Uri in lieu of fixed host and port properties
+		var regexp = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";
+		var parts = (""+window.location).match(new RegExp(regexp));
+		if(parts[4]){
+			var tmp = parts[4].split(":");
+			var thisHost = tmp[0];
+			var thisPort = tmp[1]||"80"; // FIXME: match 443
+
+			parts = this.url.match(new RegExp(regexp));
+			if(parts[4]){
+				tmp = parts[4].split(":");
+				var urlHost = tmp[0];
+				var urlPort = tmp[1]||"80";
+				this._isXD = ((urlHost != thisHost)||(urlPort != thisPort));
+			}
+		}
+
+		if(!this._isXD){
+			if(props.ext){
+				if(props.ext["json-comment-filtered"]!==true && props.ext["json-comment-filtered"]!==false){
+					props.ext["json-comment-filtered"] = true;
+				}
+			}else{
+				props.ext = { "json-comment-filtered": true };
+			}
+			props.supportedConnectionTypes = dojo.map(this.connectionTypes.pairs, "return item[0]");
+		}
+
+		props = this._extendOut(props);
+
+		var bindArgs = {
+			url: this.url,
+			handleAs: this.handleAs,
+			content: { "message": dojo.toJson([props]) },
+			load: dojo.hitch(this,function(msg){
+				this._backon();
+				this._finishInit(msg);
+			}),
+			error: dojo.hitch(this,function(e){
+				console.debug("handshake error!:",e);
+				this._backoff();
+				this._finishInit([{}]);
+			})
+		};
+
+		if(bargs){
+			dojo.mixin(bindArgs, bargs);
+		}
+		this._props = props;
+		for(var tname in this._subscriptions){
+			for(var sub in this._subscriptions[tname]){
+				if(this._subscriptions[tname][sub].topic){
+		 			dojo.unsubscribe(this._subscriptions[tname][sub].topic);
+				}
+			}
+		}
+		this._messageQ = [];
+		this._subscriptions = [];
+		this._initialized = true;
+		this.batch = 0;
+		this.startBatch();
+		
+		var r;
+		// if xdomain, then we assume jsonp for handshake
+		if(this._isXD){
+			bindArgs.callbackParamName = "jsonp";
+			r = dojo.io.script.get(bindArgs);
+		}else{
+			r = dojo.xhrPost(bindArgs);
+		}
+		dojo.publish("/cometd/meta", [
+			{
+				cometd: this,
+				action: "handshake",
+				successful: true,
+				state: this.state()
+			}
+		]);
+		return r;
+	}
+	
+	
+	this.publish = function(/*String*/ channel, /*Object*/ data, /*Object?*/ props){
+		// summary:
+		//		publishes the passed message to the cometd server for delivery
+		//		on the specified topic
+		// channel:
+		//		the destination channel for the message
+		// data:
+		//		a JSON object containing the message "payload"
+		// properties:
+		//		Optional. Other meta-data to be mixed into the top-level of the
+		//		message
+		var message = {
+			data: data,
+			channel: channel
+		};
+		if(props){
+			dojo.mixin(message, props);
+		}
+		this._sendMessage(message);
+	}
+
+	
+	this.subscribe = function(	/*String */	channel,
+					/*Object */	objOrFunc,
+					/*String */	funcName,
+					/*Object?*/ props){ // return: dojo.Deferred
+		//	summary:
+		//		inform the server of this client's interest in channel
+		//	description:
+		//		`dojox.cometd.subscribe()` handles all the hard work of telling
+		//		the server that we want to be notified when events are
+		//		published on a particular topic. `subscribe` accepts a function
+		//		to handle messages and returns a `dojo.Deferred` object which
+		//		has an extra property added to it which makes it suitable for
+		//		passing to `dojox.cometd.unsubscribe()` as a "subscription
+		//		handle" (much like the handle object that `dojo.connect()`
+		//		produces and which `dojo.disconnect()` expects).
+		//		
+		//		Note that of a subscription is registered before a connection
+		//		with the server is established, events sent before the
+		//		connection is established will not be delivered to this client.
+		//		The deferred object which `subscribe` returns will callback
+		//		when the server successfuly acknolwedges receipt of our
+		//		"subscribe" request.
+		//	channel:
+		//		name of the cometd channel to subscribe to
+		//	objOrFunc:
+		//		an object scope for funcName or the name or reference to a
+		//		function to be called when messages are delivered to the
+		//		channel
+		//	funcName:
+		//		the second half of the objOrFunc/funcName pair for identifying
+		//		a callback function to notifiy upon channel message delivery
+		//	example:
+		//		Simple subscribe use-case
+		//	|	dojox.cometd.init("http://myserver.com:8080/cometd";);
+		//	|	// log out all incoming messages on /foo/bar
+		//	|	dojox.cometd.subscribe("/foo/bar", console, "debug");
+		//	example:
+		//		Subscribe before connection is initialized
+		//	|	dojox.cometd.subscribe("/foo/bar", console, "debug");
+		//	|	dojox.cometd.init("http://myserver.com:8080/cometd";);
+		//	example:
+		//		Subscribe an unsubscribe
+		//	|	dojox.cometd.init("http://myserver.com:8080/cometd";);
+		//	|	var h = dojox.cometd.subscribe("/foo/bar", console, "debug");
+		//	|	dojox.cometd.unsubscribe(h);
+		//	example:
+		//		Listen for successful subscription:
+		//	|	dojox.cometd.init("http://myserver.com:8080/cometd";);
+		//	|	var h = dojox.cometd.subscribe("/foo/bar", console, "debug");
+		//	|	h.addCallback(function(){
+		//	|		console.debug("subscription to /foo/bar established");
+		//	|	});
+
+		props = props||{};
+		if(objOrFunc){
+			var tname = "/cometd"+channel;
+			var subs = this._subscriptions[tname];
+			if(!subs || subs.length==0){
+				subs = [];
+				props.channel = "/meta/subscribe";
+				props.subscription = channel;
+				this._sendMessage(props);
+				
+				var _ds = this._deferredSubscribes;
+				if(_ds[channel]){
+					_ds[channel].cancel();
+					delete _ds[channel];
+				}
+				_ds[channel] = new dojo.Deferred();
+			}
+			
+			for(var i in subs){
+				if( subs[i].objOrFunc === objOrFunc && (!subs[i].funcName&&!funcName||subs[i].funcName==funcName) ){
+					return null;
+				}
+			}
+			
+			var topic = dojo.subscribe(tname, objOrFunc, funcName);
+			subs.push({ 
+				topic: topic, 
+				objOrFunc: objOrFunc, 
+				funcName: funcName
+			});
+			this._subscriptions[tname] = subs;
+		}
+		var ret = this._deferredSubscribes[channel]||{};
+		ret.args = dojo._toArray(arguments);
+		return ret; // dojo.Deferred
+	}
+
+
+
+	this.unsubscribe = function(	/*String*/	channel,
+					/*Object?*/ objOrFunc,
+					/*String?*/ funcName,
+					/*Object?*/ props){
+		// summary:
+		//		inform the server of this client's disinterest in channel
+		// channel:
+		//		name of the cometd channel to unsubscribe from
+		// objOrFunc:
+		//		an object scope for funcName or the name or reference to a
+		//		function to be called when messages are delivered to the
+		//		channel. If null then all subscribers to the channel are unsubscribed.
+		// funcName:
+		//		the second half of the objOrFunc/funcName pair for identifying
+		//		a callback function to notifiy upon channel message delivery
+
+		if(
+			(arguments.length == 1) &&
+			(!dojo.isString(channel)) &&
+			(channel.args)
+		){
+			// it's a subscription handle, unroll
+			return this.unsubscribe.apply(this, channel.args);
+		}
+		
+		var tname = "/cometd"+channel;
+		var subs = this._subscriptions[tname];
+		if(!subs || subs.length==0){
+			return null;
+		}
+
+		var s=0;
+		for(var i in subs){
+			var sb = subs[i];
+			if( (!objOrFunc) ||
+				(
+					sb.objOrFunc===objOrFunc &&
+					(!sb.funcName && !funcName || sb.funcName==funcName)
+				)
+			){
+				dojo.unsubscribe(subs[i].topic);
+				delete subs[i];
+			}else{
+				s++;
+			}
+		}
+		
+		if(s==0){
+			props = props||{};
+			props.channel = "/meta/unsubscribe";
+			props.subscription = channel;
+			delete this._subscriptions[tname];
+			this._sendMessage(props);
+			this._deferredUnsubscribes[channel] = new dojo.Deferred();
+			if (this._deferredSubscribes[channel]){
+				this._deferredSubscribes[channel].cancel();
+				delete this._deferredSubscribes[channel];
+			}
+		}
+		return this._deferredUnsubscribes[channel]; // dojo.Deferred
+	}
+	
+	
+	this.disconnect = function(){
+		//	summary:
+		//		Disconnect from the server.
+		//	description:
+		//		Disconnect from the server by sending a disconnect message
+		//	example:
+		//	|	dojox.cometd.disconnect();
+
+		for(var tname in this._subscriptions){
+			for(var sub in this._subscriptions[tname]){
+				if(this._subscriptions[tname][sub].topic){
+					dojo.unsubscribe(this._subscriptions[tname][sub].topic);
+				}
+			}
+		}
+		this._subscriptions = [];
+		this._messageQ = [];
+		if(this._initialized && this.currentTransport){
+			this._initialized=false;
+			this.currentTransport.disconnect();
+		}
+		if(!this._polling) {
+			this._connected=false;
+			dojo.publish("/cometd/meta", [{cometd:this,action:"connect",successful:false,state:this.state()}]);
+		}
+		this._initialized=false;
+		dojo.publish("/cometd/meta", [{cometd:this,action:"disconnect",successful:true,state:this.state()}]);
+	}
+
+	
+	// public extension points
+	
+	this.subscribed = function(	/*String*/channel, /*Object*/message){ }
+
+	this.unsubscribed = function(/*String*/channel, /*Object*/message){ }
+
+
+	// private methods (TODO name all with leading _)
+
+	this.tunnelInit = function(childLocation, childDomain){
+		// placeholder - replaced by _finishInit
+	}
+	
+	this.tunnelCollapse = function(){
+		// placeholder - replaced by _finishInit
+	}
+	
+	this._backoff = function(){
+		if(!this._advice){
+			this._advice={reconnect:"retry",interval:0};
+		}
+		else if(!this._advice.interval){
+			this._advice.interval=0;
+		}
+		if(this._backoffInterval<this._backoffMax){
+			this._backoffInterval+=this._backoffIncrement;
+		}
+	}
+	
+	this._backon = function(){
+		this._backoffInterval=0;
+	}
+
+	this._interval = function(){
+		var i=this._backoffInterval+(this._advice?(this._advice.interval?this._advice.interval:0):0);
+		if (i>0)
+			console.debug("Retry in interval+backoff="+this._advice.interval+"+"+this._backoffInterval+"="+i+"ms");
+		return i;
+	}
+
+	this._finishInit = function(data){
+		//	summary:
+		//		Handle the handshake return from the server and initialize
+		//		connection if all is OK
+		data = data[0];
+		this.handshakeReturn = data;
+		
+		// remember any advice
+		if(data["advice"]){
+			this._advice = data.advice;
+		}
+
+		var successful=data.successful?data.successful:false;
+		
+		// check version
+		if(data.version < this.minimumVersion){
+			console.debug("cometd protocol version mismatch. We wanted", this.minimumVersion, "but got", data.version);
+			successful=false;
+			this._advice.reconnect="none";
+		}
+		
+		// If all OK
+		if(successful){
+			// pick a transport
+			this.currentTransport = this.connectionTypes.match(
+				data.supportedConnectionTypes,
+				data.version,
+				this._isXD
+			);
+			// initialize the transport
+			this.currentTransport._cometd = this;
+			this.currentTransport.version = data.version;
+			this.clientId = data.clientId;
+			this.tunnelInit = dojo.hitch(this.currentTransport, "tunnelInit");
+			this.tunnelCollapse = dojo.hitch(this.currentTransport, "tunnelCollapse");
+			this.currentTransport.startup(data);
+		}
+
+		dojo.publish("/cometd/meta", [{cometd:this,action:"handshook",successful:successful,state:this.state()}]);
+
+		// If there is a problem
+		if(!successful){
+			console.debug("cometd init failed");
+			// follow advice
+			if(this._advice && this._advice["reconnect"]=="none"){
+				console.debug("cometd reconnect: none");
+			}else{
+				setTimeout(dojo.hitch(this, "init", this.url, this._props),this._interval());
+			}
+		}
+	}
+
+	// fixme: lots of repeated code...why?
+
+	this._extendIn = function(message){
+		// Handle extensions for inbound messages
+		dojo.forEach(dojox.cometd._extendInList, function(f){
+			message = f(message)||message;
+		});
+		return message;
+	}
+
+	this._extendOut = function(message){
+		// Handle extensions for inbound messages
+		dojo.forEach(dojox.cometd._extendOutList, function(f){
+			message = f(message)||message;
+		});
+		return message;
+	}
+
+
+	this.deliver = function(messages){
+		dojo.forEach(messages, this._deliver, this);
+		return messages;
+	}
+
+	this._deliver = function(message){
+		// dipatch events along the specified path
+		
+		message=this._extendIn(message);
+
+		if(!message["channel"]){
+			if(message["success"] !== true){
+				console.debug("cometd error: no channel for message!", message);
+				return;
+			}
+		}
+		this.lastMessage = message;
+
+		if(message.advice){
+			this._advice = message.advice; // TODO maybe merge?
+		}
+
+		// check to see if we got a /meta channel message that we care about
+		var deferred=null;
+		if(	(message["channel"]) &&
+			(message.channel.length > 5)&&
+			(message.channel.substr(0, 5) == "/meta")){
+			// check for various meta topic actions that we need to respond to
+			switch(message.channel){
+				case "/meta/connect":
+					if(message.successful && !this._connected){
+						this._connected = this._initialized;
+						this.endBatch();
+					}else if(!this._initialized){
+						this._connected = false; // finish disconnect
+					}
+					dojo.publish("/cometd/meta",[{cometd:this,action:"connect",successful:message.successful,state:this.state()}]);
+					break;
+				case "/meta/subscribe":
+					deferred = this._deferredSubscribes[message.subscription];
+					if(!message.successful){
+						if(deferred){
+							deferred.errback(new Error(message.error));
+						}
+						this.currentTransport.cancelConnect();
+						return;
+					}
+					dojox.cometd.subscribed(message.subscription, message);
+					if(deferred){
+						deferred.callback(true);
+					}
+					break;
+				case "/meta/unsubscribe":
+					deferred = this._deferredUnsubscribes[message.subscription];
+					if(!message.successful){
+						if(deferred){
+							deferred.errback(new Error(message.error));
+						}
+						this.currentTransport.cancelConnect();
+						return;
+					}
+					this.unsubscribed(message.subscription, message);
+					if(deferred){
+						deferred.callback(true);
+					}
+					break;
+				default:
+					if(message.successful && !message.successful){
+						this.currentTransport.cancelConnect();
+						return;
+					}
+			}
+		}
+		
+		// send the message down for processing by the transport
+		this.currentTransport.deliver(message);
+
+		if(message.data){
+			// dispatch the message to any locally subscribed listeners
+			try {
+                                var messages=[message];
+
+				// Determine target topic
+				var tname="/cometd"+message.channel;
+
+				// Deliver to globs that apply to target topic
+				var tnameParts=message.channel.split("/");
+				var tnameGlob="/cometd";
+				for (var i=1;i<tnameParts.length-1;i++) {
+					dojo.publish(tnameGlob+"/**",messages);
+					tnameGlob+="/"+tnameParts[i];
+				}
+				dojo.publish(tnameGlob+"/**",messages);
+				dojo.publish(tnameGlob+"/*",messages);
+	
+				// deliver to target topic
+				dojo.publish(tname,messages);
+			}catch(e){
+				console.debug(e);
+			}
+		}
+	}
+
+	this._sendMessage = function(/* object */ message){
+		// console.debug(this.currentTransport, this._connected, this.batch);
+		// if(this.currentTransport && this._connected && !this.batch){
+		if(this.currentTransport && !this.batch){
+			return this.currentTransport.sendMessages([message]);
+		}else{
+			this._messageQ.push(message);
+			return null;
+		}
+	}
+
+	this.startBatch = function(){
+		this.batch++;
+	}
+
+	this.endBatch = function(){
+		if(--this.batch <= 0 && this.currentTransport && this._connected){
+			this.batch=0;
+
+			var messages=this._messageQ;
+			this._messageQ=[];
+			if(messages.length>0){
+				this.currentTransport.sendMessages(messages);
+			}
+		}
+	}
+	
+	this._onUnload = function(){
+		// make this the last of the onUnload method
+		dojo.addOnUnload(dojox.cometd,"disconnect");
+	}
+
+	this._connectTimeout = function(){
+		// return the connect timeout in ms, calculated as the minimum of the advised timeout
+		// and the configured timeout.  Else 0 to indicate no client side timeout
+		var _advised=0;
+		if (this._advice && this._advice.timeout && this.expectedNetworkDelay>0)
+			_advised=this._advice.timeout + this.expectedNetworkDelay;
+		
+		if (this.connectTimeout>0 && this.connectTimeout<_advised)
+			return this.connectTimeout;
+		
+		return 0;
+	}
+}
+
+/*
+transport objects MUST expose the following methods:
+	- check
+	- startup
+	- sendMessages
+	- deliver
+	- disconnect
+optional, standard but transport dependent methods are:
+	- tunnelCollapse
+	- tunnelInit
+
+Transports SHOULD be namespaced under the cometd object and transports MUST
+register themselves with cometd.connectionTypes
+
+here's a stub transport defintion:
+
+cometd.blahTransport = new function(){
+	this._connectionType="my-polling";
+	this._cometd=null;
+	this.lastTimestamp = null;
+
+	this.check = function(types, version, xdomain){
+		// summary:
+		//		determines whether or not this transport is suitable given a
+		//		list of transport types that the server supports
+		return dojo.lang.inArray(types, "blah");
+	}
+
+	this.startup = function(){
+		if(dojox.cometd._polling){ return; }
+		// FIXME: fill in startup routine here
+		dojox.cometd._polling = true;
+	}
+
+	this.sendMessages = function(message){
+		// FIXME: fill in message array sending logic
+	}
+
+	this.deliver = function(message){
+	}
+
+	this.disconnect = function(){
+		// send orderly disconnect message
+	}
+
+	this.cancelConnect = function(){
+		// cancel the current connection
+	}
+}
+cometd.connectionTypes.register("blah", cometd.blahTransport.check, cometd.blahTransport);
+*/
+
+dojox.cometd.longPollTransport = new function(){
+	this._connectionType="long-polling";
+	this._cometd=null;
+
+	this.check = function(types, version, xdomain){
+		return ((!xdomain)&&(dojo.indexOf(types, "long-polling") >= 0));
+	}
+
+	this.tunnelInit = function(){
+		var message = {
+			channel:	"/meta/connect",
+			clientId:	this._cometd.clientId,
+			connectionType: this._connectionType,
+			id:	""+this._cometd.messageId++
+		};
+		message=this._cometd._extendOut(message);
+		this.openTunnelWith({message: dojo.toJson([message])});
+	}
+
+	this.tunnelCollapse = function(){
+		// TODO handle transport specific advice
+		
+		if(!this._cometd._initialized){ return; }
+			
+		if(this._cometd._advice && this._cometd._advice["reconnect"]=="none"){
+			console.debug("cometd reconnect: none");
+			return;
+		}
+		setTimeout(dojo.hitch(this,function(){ this._connect(); }),this._cometd._interval());
+	}
+
+	this._connect = function(){
+		if(!this._cometd._initialized){ return; }
+		if(this._cometd._polling) {
+			console.debug("wait for poll to complete or fail");
+			return;
+		}
+			
+		if((this._cometd._advice) && (this._cometd._advice["reconnect"]=="handshake")){
+			this._cometd._connected=false;
+			this._initialized = false;
+			this._cometd.init(this._cometd.url,this._cometd._props);
+ 		}else if(this._cometd._connected){
+			var message={
+				channel:	"/meta/connect",
+				connectionType: this._connectionType,
+				clientId:	this._cometd.clientId,
+				id:	""+this._cometd.messageId++
+			};
+			if (this._cometd.connectTimeout>this._cometd.expectedNetworkDelay)
+				message.advice={timeout:(this._cometd.connectTimeout-this._cometd.expectedNetworkDelay)};
+			                    
+			message=this._cometd._extendOut(message);
+			this.openTunnelWith({message: dojo.toJson([message])});
+		}
+	}
+
+	this.deliver = function(message){
+		// Nothing to do
+	}
+
+	this.openTunnelWith = function(content, url){
+		this._cometd._polling = true;
+		var post = {
+			url: (url||this._cometd.url),
+			content: content,
+			handleAs: this._cometd.handleAs,
+			load: dojo.hitch(this, function(data){
+				this._cometd._polling=false;
+				this._cometd.deliver(data);
+				this._cometd._backon();
+				this.tunnelCollapse();
+			}),
+			error: dojo.hitch(this, function(err){
+				this._cometd._polling=false;
+				console.debug("tunnel opening failed:", err);
+				dojo.publish("/cometd/meta", [{cometd:this._cometd,action:"connect",successful:false,state:this._cometd.state()}]);
+				this._cometd._backoff();
+				this.tunnelCollapse();
+			})
+		};
+
+		var connectTimeout=this._cometd._connectTimeout();
+		if (connectTimeout>0)
+			post.timeout=connectTimeout;
+
+		this._poll = dojo.xhrPost(post);
+	}
+
+	this.sendMessages = function(messages){
+		for(var i=0; i<messages.length; i++){
+			messages[i].clientId = this._cometd.clientId;
+			messages[i].id = ""+this._cometd.messageId++;
+			messages[i]=this._cometd._extendOut(messages[i]);
+		}
+		return dojo.xhrPost({
+			url: this._cometd.url||dojo.config["cometdRoot"],
+			handleAs: this._cometd.handleAs,
+			load: dojo.hitch(this._cometd, "deliver"),
+			error: dojo.hitch(this, function(err){
+				console.debug('dropped messages: ',messages);
+			}),
+			content: {
+				message: dojo.toJson(messages)
+			}
+		});
+	}
+
+	this.startup = function(handshakeData){
+		if(this._cometd._connected){ return; }
+		this.tunnelInit();
+	}
+
+	this.disconnect = function(){
+		var message={
+			channel:	"/meta/disconnect",
+			clientId:	this._cometd.clientId,
+			id:	""+this._cometd.messageId++
+		};
+		message=this._cometd._extendOut(message);
+		dojo.xhrPost({
+			url: this._cometd.url||dojo.config["cometdRoot"],
+			handleAs: this._cometd.handleAs,
+			content: {
+				message: dojo.toJson([message])
+			}
+		});
+	}
+
+	this.cancelConnect = function(){
+		if (this._poll) {
+			this._poll.cancel();
+			this._cometd._polling=false;
+			dojo.debug("tunnel opening cancelled");
+			dojo.event.topic.publish("/cometd/meta", {cometd:this._cometd,action:"connect",successful:false,state:this._cometd.state(),cancel:true});
+			this._cometd._backoff();
+			this.disconnect();
+			this.tunnelCollapse();
+		}
+	}
+
+}
+
+dojox.cometd.callbackPollTransport = new function(){
+	this._connectionType = "callback-polling";
+	this._cometd = null;
+
+	this.check = function(types, version, xdomain){
+		// we handle x-domain!
+		return (dojo.indexOf(types, "callback-polling") >= 0);
+	}
+
+	this.tunnelInit = function(){
+		var message = {
+			channel:	"/meta/connect",
+			clientId:	this._cometd.clientId,
+			connectionType: this._connectionType,
+			id:	""+this._cometd.messageId++
+		};
+		message = this._cometd._extendOut(message);		
+		this.openTunnelWith({
+			message: dojo.toJson([message])
+		});
+	}
+
+	this.tunnelCollapse = dojox.cometd.longPollTransport.tunnelCollapse;
+	this._connect = dojox.cometd.longPollTransport._connect;
+	this.deliver = dojox.cometd.longPollTransport.deliver;
+
+	this.openTunnelWith = function(content, url){
+		this._cometd._polling = true;
+		var script = {
+			load: dojo.hitch(this, function(data){
+				this._cometd._polling=false;
+				this._cometd.deliver(data);
+				this._cometd._backon();
+				this.tunnelCollapse();
+			}),
+			error: dojo.hitch(this, function(err){
+				this._cometd._polling=false;
+				console.debug("tunnel opening failed:", err);
+				dojo.publish("/cometd/meta", [{cometd:this._cometd,action:"connect",successful:false,state:this._cometd.state()}]);
+				this._cometd._backoff();
+				this.tunnelCollapse();
+			}),
+			url: (url||this._cometd.url),
+			content: content,
+			callbackParamName: "jsonp"
+		};
+		var connectTimeout=this._cometd._connectTimeout();
+		if (connectTimeout>0)
+			script.timeout=connectTimeout;
+		dojo.io.script.get(script);
+	}
+
+	this.sendMessages = function(/*array*/ messages){
+		for(var i=0; i<messages.length; i++){
+			messages[i].clientId = this._cometd.clientId;
+			messages[i].id = ""+this._cometd.messageId++;
+			messages[i]=this._cometd._extendOut(messages[i]);
+		}
+		var bindArgs = {
+			url: this._cometd.url||dojo.config["cometdRoot"],
+			load: dojo.hitch(this._cometd, "deliver"),
+			callbackParamName: "jsonp",
+			content: { message: dojo.toJson( messages ) }
+		};
+		return dojo.io.script.get(bindArgs);
+	}
+
+	this.startup = function(handshakeData){
+		if(this._cometd._connected){ return; }
+		this.tunnelInit();
+	}
+
+	this.disconnect = dojox.cometd.longPollTransport.disconnect;
+	
+	this.disconnect = function(){
+		var message={
+			channel:"/meta/disconnect",
+			clientId:this._cometd.clientId,
+			id:""+this._cometd.messageId++
+		};
+		message=this._cometd._extendOut(message);		
+		dojo.io.script.get({
+			url: this._cometd.url||dojo.config["cometdRoot"],
+			callbackParamName: "jsonp",
+			content: {
+				message: dojo.toJson([message])
+			}
+		});
+	}
+
+	this.cancelConnect = function(){}
+}
+dojox.cometd.connectionTypes.register("long-polling", dojox.cometd.longPollTransport.check, dojox.cometd.longPollTransport);
+dojox.cometd.connectionTypes.register("callback-polling", dojox.cometd.callbackPollTransport.check, dojox.cometd.callbackPollTransport);
+
+dojo.addOnUnload(dojox.cometd,"_onUnload");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/cometd/timestamp.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/cometd/timestamp.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/cometd/timestamp.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dojox.cometd.timestamp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.cometd.timestamp"] = true;
+dojo.provide("dojox.cometd.timestamp");
+dojo.require("dojox.cometd");
+
+// A cometd extension that adds a timestamp to every message
+dojox.cometd._extendOutList.push(function(msg){msg.timestamp=new Date().toUTCString();return msg});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/cometd/timesync.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/cometd/timesync.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/cometd/timesync.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,126 @@
+if(!dojo._hasResource["dojox.cometd.timesync"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.cometd.timesync"] = true;
+dojo.provide("dojox.cometd.timesync");
+dojo.require("dojox.cometd");
+
+/**
+ * this file provides the time synchronization extension to cometd.
+ * Timesync allows the client and server to exchange time information on every 
+ * handshake and connect message so that the client may calculate an approximate
+ * offset from it's own clock epoch to that of the server.
+ *
+ * With each handshake or connect, the extension sends timestamps within the 
+ * ext field like: {ext:{timesync:{tc:12345567890},...},...}
+ * where ts is the timestamp in ms since 1970 of when the message was sent.
+ *
+ * A cometd server that supports timesync, should respond with and ext field
+ * like: {ext:{timesync:{tc:12345567890,ts:1234567900,p:123},...},...}
+ * where ts is the timestamp sent by the client, te is the timestamp on the server
+ * of when the message was received and p is the poll duration in ms - ie the
+ * time the server took before sending the response.
+ *
+ * On receipt of the response, the client is able to use current time to determine
+ * the total trip time, from which p is subtracted to determine an approximate
+ * two way network traversal time. The assumption is made that the network is
+ * symmetric for traversal time, so the offset between the two clocks is 
+ * ts-tc-(now-tc-p)/2. In practise networks (and the cometd client/server software)
+ * is never perfectly symmetric, so accuracy is limited by the difference, which 
+ * can be 10s of milliseconds.
+ *
+ * In order to smooth over any transient fluctuations, the extension keeps a sliding
+ * average of the offsets received. By default this is over 10 messages, but this can
+ * be changed with the dojox.cometd.timesync._window element.
+ */
+dojox.cometd.timesync= new function(){
+
+	this._window=10;// The window size for the sliding average of offset samples.
+	this._minWindow=4;// The window size for the sliding average of offset samples.
+	this._offsets=new Array(); // The samples used to calculate the average offset.
+	this.offset=0;	// The offset in ms between the clients clock and the servers clock. Add this to the local
+			// time epoch to obtain server time.
+	this.samples=0; // The number of samples used to calculate the offset. If 0, the offset is not valid.
+	
+	this.getServerTime=function(){ // return: long
+		// Summary:
+		//	Calculate the current time on the server
+		// 
+		return new Date().getTime()+this.offset;
+	}
+	
+	this.getServerDate=function(){ // return: Date
+		// Summary:
+		//	Calculate the current time on the server
+		// 
+		return new Date(this.getServerTime());
+	}
+	
+	this.setTimeout=function(/*function*/call,/*long|Date*/atTimeOrDate){
+		// Summary:
+		//	Set a timeout function relative to server time
+		// call:
+		//	the function to call when the timeout occurs
+		// atTimeOrTime: 
+		//	a long timestamp or a Date representing the server time at
+		//	which the timeout should occur.
+		
+		var ts=(atTimeOrDate instanceof Date)?atTimeOrDate.getTime():(0+atTimeOrDate);
+		var tc=ts-this.offset;
+		var interval=tc-new Date().getTime();
+		if (interval<=0)
+			interval=1;
+		return setTimeout(call,interval);
+	}
+
+	this._in=function(/*Object*/msg){
+		// Summary:
+		//	Handle incoming messages for the timesync extension.
+		// description:
+		//	Look for ext:{timesync:{}} field and calculate offset if present.
+		// msg: 
+		//	The incoming bayeux message
+		
+		var channel=msg.channel;
+		if (channel &&  channel.indexOf('/meta/')==0){
+			if (msg.ext && msg.ext.timesync){
+				var sync=msg.ext.timesync;
+				var now=new Date().getTime();
+				
+				this._offsets.push(sync.ts-sync.tc-(now-sync.tc-sync.p)/2);
+				if (this._offsets.length>this._window)
+					this._offsets.shift();		
+				this.samples++;
+				var total=0;
+				for (var i in this._offsets)
+					total+=this._offsets[i];
+				this.offset=parseInt((total/this._offsets.length).toFixed());
+				
+				if (this.samples<this._minWindow)
+					setTimeout(dojox._scopeName + ".cometd.publish('/meta/ping',null)",100);
+			}
+		}
+		return msg;
+	}
+
+	this._out=function(msg){
+		// Summary:
+		//	Handle outgoing messages for the timesync extension.
+		// description:
+		//	Look for handshake and connect messages and add the ext:{timesync:{}} fields
+		// msg: 
+		//	The outgoing bayeux message
+		
+		var channel=msg.channel;
+		if (channel &&  channel.indexOf('/meta/')==0){
+			var now=new Date().getTime();
+			if (!msg.ext)
+				msg.ext={};
+			msg.ext.timesync={tc: now};
+		}
+		return msg;
+	}
+};
+
+dojox.cometd._extendInList.push(dojo.hitch(dojox.cometd.timesync,"_in"));
+dojox.cometd._extendOutList.push(dojo.hitch(dojox.cometd.timesync,"_out"));
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/cometd.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/cometd.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/cometd.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+if(!dojo._hasResource["dojox.cometd"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.cometd"] = true;
+// stub loader for the cometd module since no implementation code is allowed to live in top-level files
+dojo.provide("dojox.cometd");
+dojo.require("dojox.cometd._base");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/crypto/Blowfish.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/crypto/Blowfish.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/crypto/Blowfish.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,10 @@
+if(!dojo._hasResource["dojox.crypto.Blowfish"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.crypto.Blowfish"] = true;
+dojo.provide("dojox.crypto.Blowfish");
+dojo.require("dojox.encoding.crypto.Blowfish");
+
+dojo.deprecated("dojox.crypto.Blowfish", "DojoX cryptography has been merged into DojoX Encoding. To use Blowfish, include dojox.encoding.crypto.Blowfish.", "1.2");
+
+dojox.crypto.Blowfish=dojox.encoding.crypto.Blowfish;
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/crypto/MD5.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/crypto/MD5.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/crypto/MD5.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,10 @@
+if(!dojo._hasResource["dojox.crypto.MD5"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.crypto.MD5"] = true;
+dojo.provide("dojox.crypto.MD5");
+dojo.require("dojox.encoding.digests.MD5");
+
+dojo.deprecated("dojox.crypto.MD5.compute", "DojoX cryptography has been merged into DojoX Encoding. To use MD5, include dojox.encoding.digests.MD5.", "1.2");
+
+dojox.crypto.MD5.compute=dojox.encoding.digests.MD5;
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/crypto/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/crypto/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/crypto/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+-------------------------------------------------------------------------------
+DojoX Cryptography
+-------------------------------------------------------------------------------
+Project state:
+deprecated
+-------------------------------------------------------------------------------
+This project will be removed in the near future in favor of dojox.encoding. If
+you are using this code, please follow the upgrade path:
+
+Digests (MD5): dojox.encoding.digests.MD5
+Crypto (Blowfish): dojox.encoding.crypto.Blowfish
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/crypto/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/crypto/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/crypto/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+if(!dojo._hasResource["dojox.crypto._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.crypto._base"] = true;
+dojo.provide("dojox.crypto._base");
+
+dojo.require("dojox.encoding.crypto._base");
+dojo.require("dojox.encoding.digests._base");
+
+dojo.deprecated("dojox.crypto._base", "DojoX cryptography has been merged into DojoX Encoding. To use, include dojox.encoding.digests and/or dojox.encoding.crypto.", "1.2");
+
+//	unfortunately there's no way of pointing at two files with an alias, particularly 
+//	when both have similarly named things; but we'll try anyways.
+dojox.crypto._base=dojo.mixin(dojox.encoding.crypto._base, dojox.encoding.digests._base);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/crypto.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/crypto.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/crypto.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+if(!dojo._hasResource["dojox.crypto"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.crypto"] = true;
+dojo.provide("dojox.crypto");
+dojo.require("dojox.crypto._base");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/AtomReadStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/AtomReadStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/AtomReadStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,543 @@
+if(!dojo._hasResource["dojox.data.AtomReadStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.AtomReadStore"] = true;
+dojo.provide("dojox.data.AtomReadStore");
+
+dojo.require("dojo.data.util.simpleFetch");
+dojo.require("dojo.data.util.filter");
+dojo.require("dojo.date.stamp");
+
+dojo.experimental("dojox.data.AtomReadStore");
+
+dojo.declare("dojox.data.AtomReadStore", null, {
+	//	summary:
+	//		A read only data store for Atom XML based services or documents
+	//	description:
+	//		A data store for Atom XML based services or documents.  This store is still under development
+	//		and doesn't support wildcard filtering yet.  Attribute filtering is limited to category or id.
+
+	constructor: function(/* object */ args) {
+		//	summary:
+		//		Constructor for the AtomRead store.
+		//	args:
+		//		An anonymous object to initialize properties.  It expects the following values:
+		//		url:			The url to a service or an XML document that represents the store
+		//		unescapeHTML:	A boolean to specify whether or not to unescape HTML text
+		//		sendQuery:		A boolean indicate to add a query string to the service URL
+
+		if(args){
+			this.url = args.url;
+			this.rewriteUrl = args.rewriteUrl;
+			this.label = args.label || this.label;
+			this.sendQuery = (args.sendQuery || args.sendquery || this.sendQuery);
+			this.unescapeHTML = args.unescapeHTML;
+		}
+		if(!this.url){
+			throw new Error("AtomReadStore: a URL must be specified when creating the data store");
+		}
+	},
+
+	//Values that may be set by the parser.
+	//Ergo, have to be instantiated to something
+	//So the parser knows how to set them.
+	url: "",
+
+	label: "title",
+
+	sendQuery: false,
+
+	unescapeHTML: false,
+
+	/* dojo.data.api.Read */
+
+	getValue: function(/* item */ item, /* attribute || attribute-name-string */ attribute, /* value? */ defaultValue){
+		//	summary:
+		//		Return an attribute value
+		//	description:
+		//		'item' must be an instance of an object created by the AtomReadStore instance.
+		//		Accepted attributes are id, subtitle, title, summary, content, author, updated,
+		//		published, category, link and alternate
+		//	item:
+		//		An item returned by a call to the 'fetch' method.
+		//	attribute:
+		//		A attribute of the Atom Entry
+		//	defaultValue:
+		//		A default value
+		//	returns:
+		//		An attribute value found, otherwise 'defaultValue'
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		this._initItem(item);
+		attribute = attribute.toLowerCase();
+		//If the attribute has previously been retrieved, then return it
+		if(!item._attribs[attribute] && !item._parsed){
+			this._parseItem(item);
+			item._parsed = true;
+		}
+		var retVal = item._attribs[attribute];
+
+		if(!retVal && attribute=="summary") {
+			var content = this.getValue(item, "content");
+			var regexp = new RegExp("/(<([^>]+)>)/g", "i");
+			var text = content.text.replace(regexp,"");
+			retVal = {
+				text: text.substring(0, Math.min(400, text.length)),
+				type: "text"
+			};
+			item._attribs[attribute] = retVal;
+		}
+
+		if(retVal && this.unescapeHTML){
+			if ((attribute == "content" || attribute == "summary" || attribute == "subtitle") && !item["_"+attribute+"Escaped"]) {
+				retVal.text = this._unescapeHTML(retVal.text);
+				item["_"+attribute+"Escaped"] = true;
+			}
+		}
+		return retVal ? dojo.isArray(retVal) ? retVal[0]: retVal : undefined;
+	},
+
+	getValues: function(/* item */ item, /* attribute || attribute-name-string */ attribute){
+		//	summary:
+		//		Return an attribute value
+		//	description:
+		//		'item' must be an instance of an object created by the AtomReadStore instance.
+		//		Accepted attributes are id, subtitle, title, summary, content, author, updated,
+		//		published, category, link and alternate
+		//	item:
+		//		An item returned by a call to the 'fetch' method.
+		//	attribute:
+		//		A attribute of the Atom Entry
+		//	defaultValue:
+		//		A default value
+		//	returns:
+		//		An array of values for the attribute value found, otherwise 'defaultValue'
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		this._initItem(item);
+		attribute = attribute.toLowerCase();
+		//If the attribute has previously been retrieved, then return it
+		if(!item._attribs[attribute]){
+			this._parseItem(item);
+		}
+		var retVal = item._attribs[attribute];
+		return retVal ? ((retVal.length !== undefined && typeof(retVal) !== "string") ? retVal : [retVal]) : undefined;
+	},
+
+	getAttributes: function(/* item */ item) {
+		//	summary:
+		//		Return an array of attribute names
+		// 	description:
+		//		'item' must be have been created by the AtomReadStore instance.
+		//		tag names of child elements and XML attribute names of attributes
+		//		specified to the element are returned along with special attribute
+		//		names applicable to the element including "tagName", "childNodes"
+		//		if the element has child elements, "text()" if the element has
+		//		child text nodes, and attribute names in '_attributeMap' that match
+		//		the tag name of the element.
+		//	item:
+		//		An XML element
+		//	returns:
+		//		An array of attributes found
+		this._assertIsItem(item);
+		if(!item._attribs){
+			this._initItem(item);
+			this._parseItem(item);
+		}
+		var attrNames = [];
+		for(var x in item._attribs){
+			attrNames.push(x);
+		}
+		return attrNames; //array
+	},
+
+	hasAttribute: function(/* item */ item, /* attribute || attribute-name-string */ attribute){
+		//	summary:
+		//		Check whether an element has the attribute
+		//	item:
+		//		'item' must be created by the AtomReadStore instance.
+		//	attribute:
+		//		An attribute of an Atom Entry item.
+		//	returns:
+		//		True if the element has the attribute, otherwise false
+		return (this.getValue(item, attribute) !== undefined); //boolean
+	},
+
+	containsValue: function(/* item */ item, /* attribute || attribute-name-string */ attribute, /* anything */ value){
+		//	summary:
+		//		Check whether the attribute values contain the value
+		//	item:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//	attribute:
+		//		A tag name of a child element, An XML attribute name or one of
+		//		special names
+		//	returns:
+		//		True if the attribute values contain the value, otherwise false
+		var values = this.getValues(item, attribute);
+		for(var i = 0; i < values.length; i++){
+			if((typeof value === "string")){
+				if(values[i].toString && values[i].toString() === value){
+					return true;
+				}
+			}else if (values[i] === value){
+				return true; //boolean
+			}
+		}
+		return false;//boolean
+	},
+
+	isItem: function(/* anything */ something){
+		//	summary:
+		//		Check whether the object is an item (XML element)
+		//	item:
+		//		An object to check
+		// 	returns:
+		//		True if the object is an XML element, otherwise false
+		if(something && something.element && something.store && something.store === this){
+			return true; //boolean
+		}
+		return false; //boolran
+	},
+
+	isItemLoaded: function(/* anything */ something){
+		//	summary:
+		//		Check whether the object is an item (XML element) and loaded
+		//	item:
+		//		An object to check
+		//	returns:
+		//		True if the object is an XML element, otherwise false
+		return this.isItem(something); //boolean
+	},
+
+	loadItem: function(/* object */ keywordArgs){
+		//	summary:
+		//		Load an item (XML element)
+		//	keywordArgs:
+		//		object containing the args for loadItem.  See dojo.data.api.Read.loadItem()
+	},
+
+	getFeatures: function() {
+		//	summary:
+		//		Return supported data APIs
+		//	returns:
+		//		"dojo.data.api.Read" and "dojo.data.api.Write"
+		var features = {
+			"dojo.data.api.Read": true
+		};
+		return features; //array
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary:
+		//		See dojo.data.api.Read.getLabel()
+		if((this.label !== "") && this.isItem(item)){
+			var label = this.getValue(item,this.label);
+			if(label && label.text){
+				return label.text;
+			}else if (label){
+				return label.toString();
+			}else{
+				return undefined;
+			}
+		}
+		return undefined; //undefined
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary:
+		//		See dojo.data.api.Read.getLabelAttributes()
+		if(this.label !== ""){
+			return [this.label]; //array
+		}
+		return null; //null
+	},
+
+	getFeedValue: function(attribute, defaultValue){
+		// summary:
+		//		Non-API method for retrieving values regarding the Atom feed,
+		//		rather than the Atom entries.
+		var values = this.getFeedValues(attribute, defaultValue);
+		if(dojo.isArray(values)){
+			return values[0];
+		}
+		return values;
+	},
+
+	getFeedValues: function(attribute, defaultValue){
+		// summary:
+		//		Non-API method for retrieving values regarding the Atom feed,
+		//		rather than the Atom entries.
+		if(!this.doc){
+			return defaultValue;
+		}
+		if(!this._feedMetaData){
+			this._feedMetaData = {
+				element: this.doc.getElementsByTagName("feed")[0],
+				store: this,
+				_attribs: {}
+			};
+			this._parseItem(this._feedMetaData);
+		}
+		return this._feedMetaData._attribs[attribute] || defaultValue;
+	},
+
+	_initItem: function(item){
+		// summary:
+		//		Initializes an item before it can be parsed.
+		if(!item._attribs){
+			item._attribs = {};
+		}
+	},
+
+	_fetchItems: function(request, fetchHandler, errorHandler) {
+		// summary:
+		//		Retrieves the items from the Atom XML document.
+		var url = this._getFetchUrl(request);
+		if(!url){
+			errorHandler(new Error("No URL specified."));
+			return;
+		}
+		var localRequest = (!this.sendQuery ? request : null); // use request for _getItems()
+
+		var _this = this;
+		var docHandler = function(data){
+			_this.doc = data;
+			var items = _this._getItems(data, localRequest);
+			var query = request.query;
+			if(query) {
+				if(query.id) {
+					items = dojo.filter(items, function(item){
+						return (_this.getValue(item, "id") == query.id);
+					});
+				} else if(query.category){
+					items = dojo.filter(items, function(entry) {
+						var cats = _this.getValues(entry, "category");
+						if(!cats){
+							return false;
+						}
+						return dojo.some(cats, "return item.term=='"+query.category+"'");
+					});
+				}
+			}
+
+			if (items && items.length > 0) {
+				fetchHandler(items, request);
+			}
+			else {
+				fetchHandler([], request);
+			}
+		};
+
+		if (this.doc) {
+			docHandler(this.doc);
+		}else{
+			var getArgs = {
+				url: url,
+				handleAs: "xml"//,
+			//	preventCache: true
+			};
+			var getHandler = dojo.xhrGet(getArgs);
+			getHandler.addCallback(docHandler);
+
+			getHandler.addErrback(function(data){
+				errorHandler(data, request);
+			});
+		}
+	},
+
+	_getFetchUrl: function(request){
+		if(!this.sendQuery){
+			return this.url;
+		}
+		var query = request.query;
+		if(!query){
+			return this.url;
+		}
+		if(dojo.isString(query)){
+			return this.url + query;
+		}
+		var queryString = "";
+		for(var name in query){
+			var value = query[name];
+			if(value){
+				if(queryString){
+					queryString += "&";
+				}
+				queryString += (name + "=" + value);
+			}
+		}
+		if(!queryString){
+			return this.url;
+		}
+		//Check to see if the URL already has query params or not.
+		var fullUrl = this.url;
+		if(fullUrl.indexOf("?") < 0){
+			fullUrl += "?";
+		}else{
+			fullUrl += "&";
+		}
+		return fullUrl + queryString;
+	},
+
+	_getItems: function(document, request) {
+		// summary:
+		//		Parses the document in a first pass
+		if(this._items){
+			return this._items;
+		}
+		var items = [];
+		var nodes = [];
+		
+		if(document.childNodes.length < 1){
+			this._items = items;
+			console.log("dojox.data.AtomReadStore: Received an invalid Atom document. Check the content type header");
+			return items;
+		}
+		
+		var feedNodes = dojo.filter(document.childNodes, "return item.tagName && item.tagName.toLowerCase() == 'feed'");
+
+		var query = request.query;
+
+		if(!feedNodes || feedNodes.length != 1){
+			console.log("dojox.data.AtomReadStore: Received an invalid Atom document, number of feed tags = " + (feedNodes? feedNodes.length : 0));
+			return items;
+		}
+
+		nodes = dojo.filter(feedNodes[0].childNodes, "return item.tagName && item.tagName.toLowerCase() == 'entry'");
+
+		if(request.onBegin){
+			request.onBegin(nodes.length);
+		}
+
+		for(var i = 0; i < nodes.length; i++){
+			var node = nodes[i];
+			if(node.nodeType != 1 /*ELEMENT_NODE*/){
+				continue;
+			}
+			items.push(this._getItem(node));
+		}
+		this._items = items;
+		return items;
+	},
+
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		 //	summary:
+		 //		See dojo.data.api.Read.close()
+	},
+
+/* internal API */
+
+	_getItem: function(element){
+		return {
+			element: element,
+			store: this
+		};
+	},
+
+	_parseItem: function(item) {
+		var attribs = item._attribs;
+		var _this = this;
+		var text, type;
+
+		function getNodeText(node){
+			var txt = node.textContent || node.innerHTML || node.innerXML;			
+			if(!txt && node.childNodes[0]){
+				var child = node.childNodes[0];
+				if (child && (child.nodeType == 3 || child.nodeType == 4)) {
+					txt = node.childNodes[0].nodeValue;
+				}
+			}
+			return txt;
+		}
+		function parseTextAndType(node) {
+			return {text: getNodeText(node),type: node.getAttribute("type")};
+		}
+		dojo.forEach(item.element.childNodes, function(node){
+			var tagName = node.tagName ? node.tagName.toLowerCase() : "";
+			switch(tagName){
+				case "title":
+					attribs[tagName] = {
+						text: getNodeText(node),
+						type: node.getAttribute("type")
+					}; break;
+				case "subtitle":
+				case "summary":
+				case "content":
+					attribs[tagName] = parseTextAndType(node);
+					break;
+				case "author":
+					var nameNode ,uriNode;
+					dojo.forEach(node.childNodes, function(child){
+						if(!child.tagName){
+							return;
+						}
+						switch(child.tagName.toLowerCase()){
+							case "name":nameNode = child;break;
+							case "uri": uriNode = child; break;
+						}
+					});
+					var author = {};
+					if(nameNode && nameNode.length == 1){
+						author.name = getNodeText(nameNode[0]);
+					}
+					if(uriNode && uriNode.length == 1){
+						author.uri = getNodeText(uriNode[0]);
+					}
+					attribs[tagName] = author;
+					break;
+				case "id": attribs[tagName] = getNodeText(node); break;
+				case "updated": attribs[tagName] = dojo.date.stamp.fromISOString(getNodeText(node) );break;
+				case "published": attribs[tagName] = dojo.date.stamp.fromISOString(getNodeText(node));break;
+				case "category":
+					if(!attribs[tagName]){
+						attribs[tagName] = [];
+					}
+					attribs[tagName].push({scheme:node.getAttribute("scheme"), term: node.getAttribute("term")});
+					break;
+				case "link":
+					if(!attribs[tagName]){
+						attribs[tagName] = [];
+					}
+					var link = {
+						rel: node.getAttribute("rel"),
+						href: node.getAttribute("href"),
+						type: node.getAttribute("type")};
+					attribs[tagName].push(link);
+
+					if(link.rel == "alternate") {
+						attribs["alternate"] = link;
+					}
+					break;
+				default:
+					break;
+			}
+		});
+	},
+
+	_unescapeHTML : function(text) {
+		//Replace HTML character codes with their unencoded equivalents, e.g. &#8217; with '
+		text = text.replace(/&#8217;/m , "'").replace(/&#8243;/m , "\"").replace(/&#60;/m,">").replace(/&#62;/m,"<").replace(/&#38;/m,"&");
+		return text;
+	},
+
+	_assertIsItem: function(/* item */ item){
+		//	summary:
+		//		This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojox.data.AtomReadStore: Invalid item argument.");
+		}
+	},
+
+	_assertIsAttribute: function(/* attribute-name-string */ attribute){
+		//	summary:
+		//		This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		if(typeof attribute !== "string"){ 
+			throw new Error("dojox.data.AtomReadStore: Invalid attribute argument.");
+		}
+	}
+});
+dojo.extend(dojox.data.AtomReadStore,dojo.data.util.simpleFetch);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/CsvStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/CsvStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/CsvStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,561 @@
+if(!dojo._hasResource["dojox.data.CsvStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.CsvStore"] = true;
+dojo.provide("dojox.data.CsvStore");
+
+dojo.require("dojo.data.util.filter");
+dojo.require("dojo.data.util.simpleFetch");
+
+dojo.declare("dojox.data.CsvStore", null, {
+	//	summary:
+	//		The CsvStore implements the dojo.data.api.Read API and reads
+	//		data from files in CSV (Comma Separated Values) format.
+	//		All values are simple string values. References to other items
+	//		are not supported as attribute values in this datastore.
+	//
+	//		Example data file:
+	//		name, color, age, tagline
+	//		Kermit, green, 12, "Hi, I'm Kermit the Frog."
+	//		Fozzie Bear, orange, 10, "Wakka Wakka Wakka!"
+	//		Miss Piggy, pink, 11, "Kermie!"
+	//
+	//		Note that values containing a comma must be enclosed with quotes ("")
+	//		Also note that values containing quotes must be escaped with two consecutive quotes (""quoted"")
+	
+	/* examples:
+	 *   var csvStore = new dojox.data.CsvStore({url:"movies.csv");
+	 *   var csvStore = new dojox.data.CsvStore({url:"http://example.com/movies.csv";);
+	 */
+
+	constructor: function(/* Object */ keywordParameters){
+		// summary: initializer
+		// keywordParameters: {url: String}
+		// keywordParameters: {data: String}
+		// keywordParameters: {label: String} The column label for the column to use for the label returned by getLabel.
+		
+		this._attributes = [];			// e.g. ["Title", "Year", "Producer"]
+		this._attributeIndexes = {};	// e.g. {Title: 0, Year: 1, Producer: 2}
+ 		this._dataArray = [];			// e.g. [[<Item0>],[<Item1>],[<Item2>]]
+ 		this._arrayOfAllItems = [];		// e.g. [{_csvId:0,_csvStore:store},...]
+		this._loadFinished = false;
+		if(keywordParameters.url){
+			this.url = keywordParameters.url;
+		}
+		this._csvData = keywordParameters.data;
+		if(keywordParameters.label){
+			this.label = keywordParameters.label;
+		}else if(this.label === ""){
+			this.label = undefined;
+		}
+		this._storeProp = "_csvStore";	// Property name for the store reference on every item.
+		this._idProp = "_csvId"; 		// Property name for the Item Id on every item.
+		this._features = {	
+			'dojo.data.api.Read': true,
+			'dojo.data.api.Identity': true 
+		};
+		this._loadInProgress = false;	//Got to track the initial load to prevent duelling loads of the dataset.
+		this._queuedFetches = [];
+	},
+
+	url: "", //Declarative hook for setting Csv source url.
+
+	label: "", //Declarative hook for setting the label attribute. 
+	
+	_assertIsItem: function(/* item */ item){
+		//	summary:
+		//      This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojox.data.CsvStore: a function was passed an item argument that was not an item");
+		}
+	},
+	
+	_assertIsAttribute: function(/* item || String */ attribute){
+		//	summary:
+		//      This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		if(!dojo.isString(attribute)){ 
+			throw new Error("dojox.data.CsvStore: a function was passed an attribute argument that was not an attribute object nor an attribute name string");
+		}
+	},
+
+/***************************************
+     dojo.data.api.Read API
+***************************************/
+	getValue: function(	/* item */ item, 
+						/* attribute || attribute-name-string */ attribute, 
+						/* value? */ defaultValue){
+		//	summary: 
+		//      See dojo.data.api.Read.getValue()
+		//		Note that for the CsvStore, an empty string value is the same as no value, 
+		// 		so the defaultValue would be returned instead of an empty string.
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		var itemValue = defaultValue;
+		if(this.hasAttribute(item, attribute)){
+			var itemData = this._dataArray[this.getIdentity(item)];
+			itemValue = itemData[this._attributeIndexes[attribute]];
+		}
+		return itemValue; //String
+	},
+
+	getValues: function(/* item */ item, 
+						/* attribute || attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.getValues()
+		// 		CSV syntax does not support multi-valued attributes, so this is just a
+		// 		wrapper function for getValue().
+		var value = this.getValue(item, attribute);
+		return (value ? [value] : []); //Array
+	},
+
+	getAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getAttributes()
+		this._assertIsItem(item);
+		var attributes = [];
+		var itemData = this._dataArray[this.getIdentity(item)];
+		for(var i=0; i<itemData.length; i++){
+			// Check for empty string values. CsvStore treats empty strings as no value.
+			if(itemData[i] != ""){
+				attributes.push(this._attributes[i]);
+			}
+		}
+		return attributes; //Array
+	},
+
+	hasAttribute: function(	/* item */ item,
+							/* attribute || attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.hasAttribute()
+		// 		The hasAttribute test is true if attribute has an index number within the item's array length
+		// 		AND if the item has a value for that attribute. Note that for the CsvStore, an
+		// 		empty string value is the same as no value.
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		var attributeIndex = this._attributeIndexes[attribute];
+		var itemData = this._dataArray[this.getIdentity(item)];
+		return (typeof attributeIndex != "undefined" && attributeIndex < itemData.length && itemData[attributeIndex] != ""); //Boolean
+	},
+
+	containsValue: function(/* item */ item, 
+							/* attribute || attribute-name-string */ attribute, 
+							/* anything */ value){
+		//	summary: 
+		//		See dojo.data.api.Read.containsValue()
+		var regexp = undefined;
+		if(typeof value === "string"){
+		   regexp = dojo.data.util.filter.patternToRegExp(value, false);
+		}
+		return this._containsValue(item, attribute, value, regexp); //boolean.
+	},
+
+	_containsValue: function(	/* item */ item, 
+								/* attribute || attribute-name-string */ attribute, 
+								/* anything */ value,
+								/* RegExp?*/ regexp){
+		//	summary: 
+		//		Internal function for looking at the values contained by the item.
+		//	description: 
+		//		Internal function for looking at the values contained by the item.  This 
+		//		function allows for denoting if the comparison should be case sensitive for
+		//		strings or not (for handling filtering cases where string case should not matter)
+		//	
+		//	item:
+		//		The data item to examine for attribute values.
+		//	attribute:
+		//		The attribute to inspect.
+		//	value:	
+		//		The value to match.
+		//	regexp:
+		//		Optional regular expression generated off value if value was of string type to handle wildcarding.
+		//		If present and attribute values are string, then it can be used for comparison instead of 'value'
+		var values = this.getValues(item, attribute);
+		for(var i = 0; i < values.length; ++i){
+			var possibleValue = values[i];
+			if(typeof possibleValue === "string" && regexp){
+				return (possibleValue.match(regexp) !== null);
+			}else{
+				//Non-string matching.
+				if(value === possibleValue){
+					return true; // Boolean
+				}
+			}
+		}
+		return false; // Boolean
+	},
+
+	isItem: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItem()
+		if(something && something[this._storeProp] === this){
+			var identity = something[this._idProp];
+			if(identity >= 0 && identity < this._dataArray.length){
+				return true; //Boolean
+			}
+		}
+		return false; //Boolean
+	},
+
+	isItemLoaded: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItemLoaded()
+		//		The CsvStore always loads all items, so if it's an item, then it's loaded.
+		return this.isItem(something); //Boolean
+	},
+
+	loadItem: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.loadItem()
+		//	description:
+		//		The CsvStore always loads all items, so if it's an item, then it's loaded.
+		//		From the dojo.data.api.Read.loadItem docs:
+		//			If a call to isItemLoaded() returns true before loadItem() is even called,
+		//			then loadItem() need not do any work at all and will not even invoke
+		//			the callback handlers.
+	},
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return this._features; //Object
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabel()
+		if(this.label && this.isItem(item)){
+			return this.getValue(item,this.label); //String
+		}
+		return undefined; //undefined
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabelAttributes()
+		if(this.label){
+			return [this.label]; //array
+		}
+		return null; //null
+	},
+
+
+	// The dojo.data.api.Read.fetch() function is implemented as
+	// a mixin from dojo.data.util.simpleFetch.
+	// That mixin requires us to define _fetchItems().
+	_fetchItems: function(	/* Object */ keywordArgs, 
+							/* Function */ findCallback, 
+							/* Function */ errorCallback){
+		//	summary: 
+		//		See dojo.data.util.simpleFetch.fetch()
+		
+		var self = this;
+
+		var filter = function(requestArgs, arrayOfAllItems){
+			var items = null;
+			if(requestArgs.query){
+				items = [];
+				var ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false; 
+
+				//See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+				//same value for each item examined.  Much more efficient.
+				var regexpList = {};
+				for(var key in requestArgs.query){
+					var value = requestArgs.query[key];
+					if(typeof value === "string"){
+						regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
+					}
+				}
+
+				for(var i = 0; i < arrayOfAllItems.length; ++i){
+					var match = true;
+					var candidateItem = arrayOfAllItems[i];
+					for(var key in requestArgs.query){
+						var value = requestArgs.query[key];
+						if(!self._containsValue(candidateItem, key, value, regexpList[key])){
+							match = false;
+						}
+					}
+					if(match){
+						items.push(candidateItem);
+					}
+				}
+			}else{
+				// We want a copy to pass back in case the parent wishes to sort the array.  We shouldn't allow resort 
+				// of the internal list so that multiple callers can get lists and sort without affecting each other.
+				if(arrayOfAllItems.length> 0){
+					items = arrayOfAllItems.slice(0,arrayOfAllItems.length); 
+				}
+			}
+			findCallback(items, requestArgs);
+		};
+
+		if(this._loadFinished){
+			filter(keywordArgs, this._arrayOfAllItems);
+		}else{
+			if(this.url !== ""){
+				//If fetches come in before the loading has finished, but while
+				//a load is in progress, we have to defer the fetching to be 
+				//invoked in the callback.
+				if(this._loadInProgress){
+					this._queuedFetches.push({args: keywordArgs, filter: filter});
+				}else{
+					this._loadInProgress = true;
+					var getArgs = {
+							url: self.url, 
+							handleAs: "text"
+						};
+					var getHandler = dojo.xhrGet(getArgs);
+					getHandler.addCallback(function(data){
+						self._processData(data);
+						filter(keywordArgs, self._arrayOfAllItems);
+						self._handleQueuedFetches();
+					});
+					getHandler.addErrback(function(error){
+						self._loadInProgress = false;
+						if(errorCallback){
+							errorCallback(error, keywordArgs);
+						}else{
+							throw error;
+						}
+					});
+				}
+			}else if(this._csvData){
+				this._processData(this._csvData);
+				this._csvData = null;
+				filter(keywordArgs, this._arrayOfAllItems);
+			}else{
+				var error = new Error("dojox.data.CsvStore: No CSV source data was provided as either URL or String data input.");
+				if(errorCallback){
+					errorCallback(error, keywordArgs);
+				}else{
+					throw error;
+				}
+			}
+		}
+	},
+	
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		 //	summary: 
+		 //		See dojo.data.api.Read.close()
+	},
+	
+	
+	// -------------------------------------------------------------------
+	// Private methods
+	_getArrayOfArraysFromCsvFileContents: function(/* string */ csvFileContents){
+		/* summary:
+		 *   Parses a string of CSV records into a nested array structure.
+		 * description:
+		 *   Given a string containing CSV records, this method parses
+		 *   the string and returns a data structure containing the parsed
+		 *   content.  The data structure we return is an array of length
+		 *   R, where R is the number of rows (lines) in the CSV data.  The 
+		 *   return array contains one sub-array for each CSV line, and each 
+		 *   sub-array contains C string values, where C is the number of 
+		 *   columns in the CSV data.
+		 */
+		 
+		/* example:
+		 *   For example, given this CSV string as input:
+		 *     "Title, Year, Producer \n Alien, 1979, Ridley Scott \n Blade Runner, 1982, Ridley Scott"
+		 *   this._dataArray will be set to:
+		 *     [["Alien", "1979", "Ridley Scott"],
+		 *      ["Blade Runner", "1982", "Ridley Scott"]]
+		 *   And this._attributes will be set to:
+		 *     ["Title", "Year", "Producer"]
+		 *   And this._attributeIndexes will be set to:
+		 *     { "Title":0, "Year":1, "Producer":2 }
+		 */
+		if(dojo.isString(csvFileContents)){
+			var lineEndingCharacters = new RegExp("\r\n|\n|\r");
+			var leadingWhiteSpaceCharacters = new RegExp("^\\s+",'g');
+			var trailingWhiteSpaceCharacters = new RegExp("\\s+$",'g');
+			var doubleQuotes = new RegExp('""','g');
+			var arrayOfOutputRecords = [];
+			
+			var arrayOfInputLines = csvFileContents.split(lineEndingCharacters);
+			for(var i = 0; i < arrayOfInputLines.length; ++i){
+				var singleLine = arrayOfInputLines[i];
+				if(singleLine.length > 0){
+					var listOfFields = singleLine.split(',');
+					var j = 0;
+					while(j < listOfFields.length){
+						var space_field_space = listOfFields[j];
+						var field_space = space_field_space.replace(leadingWhiteSpaceCharacters, ''); // trim leading whitespace
+						var field = field_space.replace(trailingWhiteSpaceCharacters, ''); // trim trailing whitespace
+						var firstChar = field.charAt(0);
+						var lastChar = field.charAt(field.length - 1);
+						var secondToLastChar = field.charAt(field.length - 2);
+						var thirdToLastChar = field.charAt(field.length - 3);
+						if(field.length === 2 && field == "\"\""){
+							listOfFields[j] = "";  //Special case empty string field.
+						}else if((firstChar == '"') && 
+								((lastChar != '"') || 
+								 ((lastChar == '"') && (secondToLastChar == '"') && (thirdToLastChar != '"')))){
+							if(j+1 === listOfFields.length){
+								// alert("The last field in record " + i + " is corrupted:\n" + field);
+								return null; //null
+							}
+							var nextField = listOfFields[j+1];
+							listOfFields[j] = field_space + ',' + nextField;
+							listOfFields.splice(j+1, 1); // delete element [j+1] from the list
+						}else{
+							if((firstChar == '"') && (lastChar == '"')){
+								field = field.slice(1, (field.length - 1)); // trim the " characters off the ends
+								field = field.replace(doubleQuotes, '"');   // replace "" with "
+							}
+							listOfFields[j] = field;
+							j += 1;
+						}
+					}
+					arrayOfOutputRecords.push(listOfFields);
+				}
+			}
+			
+			// The first item of the array must be the header row with attribute names.
+			this._attributes = arrayOfOutputRecords.shift();
+			for(var i=0; i<this._attributes.length; i++){
+				// Store the index of each attribute 
+				this._attributeIndexes[this._attributes[i]] = i;
+			}
+			this._dataArray = arrayOfOutputRecords; //Array
+		}
+	},
+	
+	_processData: function(/* String */ data){
+		this._getArrayOfArraysFromCsvFileContents(data);
+		this._arrayOfAllItems = [];
+		for(var i=0; i<this._dataArray.length; i++){
+			this._arrayOfAllItems.push(this._createItemFromIdentity(i));
+		}
+		this._loadFinished = true;
+		this._loadInProgress = false;
+	},
+	
+	_createItemFromIdentity: function(/* String */ identity){
+		var item = {};
+		item[this._storeProp] = this;
+		item[this._idProp] = identity;
+		return item; //Object
+	},
+	
+	
+/***************************************
+     dojo.data.api.Identity API
+***************************************/
+	getIdentity: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Identity.getIdentity()
+		if(this.isItem(item)){
+			return item[this._idProp]; //String
+		}
+		return null; //null
+	},
+
+	fetchItemByIdentity: function(/* Object */ keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Identity.fetchItemByIdentity()
+
+		//Hasn't loaded yet, we have to trigger the load.
+		
+
+		if(!this._loadFinished){
+			var self = this;
+			if(this.url !== ""){
+				//If fetches come in before the loading has finished, but while
+				//a load is in progress, we have to defer the fetching to be 
+				//invoked in the callback.
+				if(this._loadInProgress){
+					this._queuedFetches.push({args: keywordArgs});
+				}else{
+					this._loadInProgress = true;
+					var getArgs = {
+							url: self.url, 
+							handleAs: "text"
+						};
+					var getHandler = dojo.xhrGet(getArgs);
+					getHandler.addCallback(function(data){
+						var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+						try{
+							self._processData(data);
+							var item = self._createItemFromIdentity(keywordArgs.identity);
+							if(!self.isItem(item)){
+								item = null;
+							}
+							if(keywordArgs.onItem){
+								keywordArgs.onItem.call(scope, item);
+							}
+							self._handleQueuedFetches();
+						}catch(error){
+							if(keywordArgs.onError){
+								keywordArgs.onError.call(scope, error);
+							}
+						}
+					});
+					getHandler.addErrback(function(error){
+						this._loadInProgress = false;
+						if(keywordArgs.onError){
+							var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+							keywordArgs.onError.call(scope, error);
+						}
+					});
+				}
+			}else if(this._csvData){
+				self._processData(self._csvData);
+				self._csvData = null;
+				var item = self._createItemFromIdentity(keywordArgs.identity);
+				if(!self.isItem(item)){
+					item = null;
+				}
+				if(keywordArgs.onItem){
+					var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+					keywordArgs.onItem.call(scope, item);
+				}
+			}
+		}else{
+			//Already loaded.  We can just look it up and call back.
+			var item = this._createItemFromIdentity(keywordArgs.identity);
+			if(!this.isItem(item)){
+				item = null;
+			}
+			if(keywordArgs.onItem){
+				var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+				keywordArgs.onItem.call(scope, item);
+			}
+		}
+	},
+
+	getIdentityAttributes: function(/* item */ item){
+		 //	summary: 
+		 //		See dojo.data.api.Identity.getIdentifierAttributes()
+		 
+		 //Identity isn't a public attribute in the item, it's the row position index.
+		 //So, return null.
+		 return null;
+	},
+
+	_handleQueuedFetches: function(){
+		//	summary: 
+		//		Internal function to execute delayed request in the store.
+		//Execute any deferred fetches now.
+		if (this._queuedFetches.length > 0) {
+			for(var i = 0; i < this._queuedFetches.length; i++){
+				var fData = this._queuedFetches[i];
+				var delayedFilter = fData.filter;
+				var delayedQuery = fData.args;
+				if(delayedFilter){
+					delayedFilter(delayedQuery, this._arrayOfAllItems); 
+				}else{
+					this.fetchItemByIdentity(fData.args);
+				}
+			}
+			this._queuedFetches = [];
+		}
+	}
+});
+//Mix in the simple fetch implementation to this class.
+dojo.extend(dojox.data.CsvStore,dojo.data.util.simpleFetch);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/FlickrRestStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/FlickrRestStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/FlickrRestStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,471 @@
+if(!dojo._hasResource["dojox.data.FlickrRestStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.FlickrRestStore"] = true;
+dojo.provide("dojox.data.FlickrRestStore");
+
+dojo.require("dojox.data.FlickrStore");
+
+dojo.declare("dojox.data.FlickrRestStore",
+	dojox.data.FlickrStore, {
+	constructor: function(/*Object*/args){ 
+		// summary:
+		//	Initializer for the FlickrRestStore store.  
+		// description:
+		//	The FlickrRestStore is a Datastore interface to one of the basic services
+		//	of the Flickr service, the public photo feed.  This does not provide
+		//	access to all the services of Flickr.
+		//	This store cannot do * and ? filtering as the flickr service 
+		//	provides no interface for wildcards.
+		if(args && args.label){
+			if(args.label) {
+				this.label = args.label;
+			}
+			if(args.apikey) {
+				this._apikey = args.apikey;
+			}
+		}
+		this._cache = [];
+		this._prevRequests = {};
+		this._handlers = {};
+		this._prevRequestRanges = [];
+		this._maxPhotosPerUser = {};
+		this._id = dojox.data.FlickrRestStore.prototype._id++;
+	},
+	
+	// _id: Integer
+	// A unique identifier for this store.
+	_id: 0,
+	
+	// _requestCount: Integer
+	// A counter for the number of requests made. This is used to define
+	// the callback function that Flickr will use.
+	_requestCount: 0,
+	
+	// _flickrRestUrl: String
+	//	The URL to the Flickr REST services.
+	_flickrRestUrl: "http://www.flickr.com/services/rest/";,
+	
+	// _apikey: String
+	//	The users API key to be used when accessing Flickr REST services.
+	_apikey: null,
+	
+	// _storeRef: String
+	//	A key used to mark an data store item as belonging to this store.
+	_storeRef: "_S",
+	
+	// _cache: Array
+	//	An Array of all previously downloaded picture info.
+	_cache: null,
+	
+	// _prevRequests: Object
+	//	A HashMap used to record the signature of a request to prevent duplicate 
+	//	request being made.
+	_prevRequests: null,
+	
+	// _handlers: Object
+	//	A HashMap used to record the handlers registered for a single remote request.  Multiple 
+	//	requests may be made for the same information before the first request has finished. 
+	//	Each element of this Object is an array of handlers to call back when the request finishes.
+	//	This prevents multiple requests being made for the same information.  
+	_handlers: null,
+	
+	// _sortAttributes: Object
+	// A quick lookup of valid attribute names in a sort query.
+	_sortAttributes: {
+		"date-posted": true,
+		"date-taken": true,
+		"interestingness": true
+	},
+			
+	_fetchItems: function(request, fetchHandler, errorHandler){
+		// summary: Fetch flickr items that match to a query
+		// request:
+		//	A request object
+		// fetchHandler:
+		//	A function to call for fetched items
+		// errorHandler:
+		//	A function to call on error
+		var query = {};
+		if(!request.query){
+			request.query = query = {};
+		} else {
+			dojo.mixin(query, request.query);	
+		}
+		
+		var primaryKey = [];
+		var secondaryKey = [];
+		
+		//Generate a unique function to be called back
+		var callbackFn = "FlickrRestStoreCallback_" + this._id + "_" + (++this._requestCount);
+		//Build up the content to send the request for.
+		var content = {
+			format: "json",
+			method: "flickr.photos.search",
+			api_key: this._apikey,
+			extras: "owner_name,date_upload,date_taken",
+			jsoncallback: callbackFn
+		};
+		var isRest = false;
+		if(query.userid){
+			isRest = true;
+			content.user_id = request.query.userid;
+			primaryKey.push("userid"+request.query.userid);
+		}
+		if(query.apikey){
+			isRest = true;
+			content.api_key = request.query.apikey;
+			secondaryKey.push("api"+request.query.apikey);
+		} else{
+			throw Error("dojox.data.FlickrRestStore: An API key must be specified.");
+		}
+		request._curCount = request.count;
+		if(query.page){
+			content.page = request.query.page;
+			secondaryKey.push("page" + content.page);
+		}else if(typeof(request.start) != "undefined" && request.start != null) {
+			if(!request.count){
+				request.count = 20;
+			}
+			var diff = request.start % request.count;
+			var start = request.start, count = request.count;
+			//If the count does not divide cleanly into the start number,
+			//more work has to be done to figure out the best page to request
+			if(diff != 0) {
+				if(start < count / 2) {
+					//If the first record requested is less than half the amount requested,
+					//then request from 0 to the count record
+					count = start + count;
+					start = 0; 
+				} else {
+					var divLimit = 20, div = 2;
+					for(var i = divLimit; i > 0; i--) {
+						if(start % i == 0 && (start/i) >= count){
+							div = i;
+							break;
+						}
+					}
+					count = start/div;
+				}
+				request._realStart = request.start;
+				request._realCount = request.count;
+				request._curStart = start;
+				request._curCount = count;
+			} else {
+				request._realStart = request._realCount = null;
+				request._curStart = request.start;
+				request._curCount = request.count;
+			}
+			
+			content.page = (start / count) + 1;
+			secondaryKey.push("page" + content.page);
+		}
+		if(request._curCount){
+			content.per_page = request._curCount;
+			secondaryKey.push("count" + request._curCount);
+		}
+		
+		if(query.lang){
+			content.lang = request.query.lang;
+			primaryKey.push("lang" + request.lang);
+		}
+		var url = this._flickrRestUrl;
+		
+		if(query.setid){
+			content.method = "flickr.photosets.getPhotos";
+			content.photoset_id = request.query.set; 
+			primaryKey.push("set" + request.query.set);
+		}
+		
+		if(query.tags){
+			if(query.tags instanceof Array){
+				content.tags = query.tags.join(",");
+			} else {
+				content.tags=query.tags;				
+			}
+			primaryKey.push("tags" + content.tags);
+			
+			if(query["tag_mode"] && (query.tag_mode.toLowerCase() == "any"
+				|| query.tag_mode.toLowerCase() == "all")){
+				content.tag_mode = query.tag_mode;
+			}
+		}
+		if(query.text){
+			content.text=query.text;
+			primaryKey.push("text:"+query.text);
+		}
+		
+		//The store only supports a single sort attribute, even though the
+		//Read API technically allows multiple sort attributes
+		if(query.sort && query.sort.length > 0){			
+			//The default sort attribute is 'date-posted'
+			if(!query.sort[0].attribute){
+				query.sort[0].attribute = "date-posted";
+			}
+			
+			//If the sort attribute is valid, check if it is ascending or
+			//descending.
+			if(this._sortAttributes[query.sort[0].attribute]) {
+				if(query.sort[0].descending){
+					content.sort = query.sort[0].attribute + "-desc";
+				} else {
+					content.sort = query.sort[0].attribute + "-asc";
+				}
+			}
+		} else {
+			//The default sort in the Dojo Data API is ascending.
+			content.sort = "date-posted-asc";
+		}
+		primaryKey.push("sort:"+content.sort);
+	
+		//Generate a unique key for this request, so the store can 
+		//detect duplicate requests.
+		primaryKey = primaryKey.join(".");
+		secondaryKey = secondaryKey.length > 0 ? "." + secondaryKey.join(".") : "";
+		var requestKey = primaryKey + secondaryKey;
+		
+		//Make a copy of the request, in case the source object is modified
+		//before the request completes
+		request = {
+			query: query,
+			count: request._curCount,
+			start: request._curStart,
+			_realCount: request._realCount,
+			_realStart: request._realStart,
+			onBegin: request.onBegin,
+			onComplete: request.onComplete,
+			onItem: request.onItem
+		};
+
+		var thisHandler = {
+			request: request,
+	    	fetchHandler: fetchHandler,
+	    	errorHandler: errorHandler
+	   	};
+
+	   	//If the request has already been made, but not yet completed,
+	   	//then add the callback handler to the list of handlers
+	   	//for this request, and finish.
+	   	if(this._handlers[requestKey]){
+	    	this._handlers[requestKey].push(thisHandler);
+	    	return;
+	   	}
+
+  		this._handlers[requestKey] = [thisHandler];
+
+  		//Linking this up to Flickr is a PAIN!
+  		var self = this;
+  		var handle = null;
+  		var getArgs = {
+			url: this._flickrRestUrl,
+			preventCache: true,
+			content: content
+		};
+		
+  		var doHandle = function(processedData, data, handler){
+			var onBegin = handler.request.onBegin;
+			handler.request.onBegin = null;
+			var maxPhotos;
+			var req = handler.request;
+			
+			if(typeof(req._realStart) != undefined && req._realStart != null) {
+				req.start = req._realStart;
+				req.count = req._realCount;
+				req._realStart = req._realCount = null;
+			}
+
+			//If the request contains an onBegin method, the total number
+			//of photos must be calculated.
+			if(onBegin){
+				if(data && typeof(data.photos.perpage) != "undefined" && typeof(data.photos.pages) != "undefined"){
+						if(data.photos.perpage * data.photos.pages <= handler.request.start + handler.request.count){
+							//If the final page of results has been received, it is possible to 
+							//know exactly how many photos there are
+							maxPhotos = handler.request.start + data.photos.photo.length;                
+						}else{
+							//If the final page of results has not yet been received,
+							//it is not possible to tell exactly how many photos exist, so
+							//return the number of pages multiplied by the number of photos per page.
+							maxPhotos = data.photos.perpage * data.photos.pages;
+						}
+						self._maxPhotosPerUser[primaryKey] = maxPhotos;
+						onBegin(maxPhotos, handler.request);
+				} else if(self._maxPhotosPerUser[primaryKey]) {
+					onBegin(self._maxPhotosPerUser[primaryKey], handler.request);
+				}
+			}
+			//Call whatever functions the caller has defined on the request object, except for onBegin
+			handler.fetchHandler(processedData, handler.request);
+			if(onBegin){
+				//Replace the onBegin function, if it existed.
+				handler.request.onBegin = onBegin;
+			}
+		};
+		
+		//Define a callback for the script that iterates through a list of 
+		//handlers for this piece of data.  Multiple requests can come into
+		//the store for the same data.
+		var myHandler = function(data){
+			//The handler should not be called more than once, so disconnect it.
+			//if(handle !== null){ dojo.disconnect(handle); }
+			if(data.stat != "ok"){
+				errorHandler(null, request);
+			}else{ //Process the items...
+				var handlers = self._handlers[requestKey];
+				if(!handlers){
+					console.log("FlickrRestStore: no handlers for data", data);
+					return;
+				}
+
+				self._handlers[requestKey] = null;
+				self._prevRequests[requestKey] = data;
+
+				//Process the data once.
+				var processedData = self._processFlickrData(data, request, primaryKey);
+				if(!self._prevRequestRanges[primaryKey]) {
+					self._prevRequestRanges[primaryKey] = [];
+				}
+				self._prevRequestRanges[primaryKey].push({
+					start: request.start,
+					end: request.start + data.photos.photo.length
+				});
+
+				//Iterate through the array of handlers, calling each one.
+				for(var i = 0; i < handlers.length; i++ ){
+					doHandle(processedData, data, handlers[i]);
+				}
+			}
+		};
+
+		var data = this._prevRequests[requestKey];
+		
+		//If the data was previously retrieved, there is no need to fetch it again.
+		if(data){
+			this._handlers[requestKey] = null;
+			doHandle(this._cache[primaryKey], data, thisHandler);
+			return;
+		} else if(this._checkPrevRanges(primaryKey, request.start, request.count)) {
+			//If this range of data has already been retrieved, reuse it.
+			this._handlers[requestKey] = null;
+			doHandle(this._cache[primaryKey], null, thisHandler);
+			return;
+		}
+		
+		dojo.global[callbackFn] = function(data){
+			myHandler(data);
+			//Clean up the function, it should never be called again
+			dojo.global[callbackFn] = null;
+		};
+				
+		var deferred = dojo.io.script.get(getArgs);
+		
+		//We only set up the errback, because the callback isn't ever really used because we have
+		//to link to the jsonFlickrFeed function....
+		deferred.addErrback(function(error){
+			dojo.disconnect(handle);
+			errorHandler(error, request);
+		});
+	},
+	
+	getAttributes: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.getAttributes()
+		return ["title", "author", "imageUrl", "imageUrlSmall", 
+					"imageUrlMedium", "imageUrlThumb", "link",
+					"dateTaken", "datePublished"]; 
+	},
+	
+	getValues: function(item, attribute){
+		//	summary:
+		//      See dojo.data.api.Read.getValue()
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		if(attribute === "title"){
+			return [this._unescapeHtml(item.title)]; // String
+		}else if(attribute === "author"){
+			return [item.ownername]; // String
+		}else if(attribute === "imageUrlSmall"){
+			return [item.media.s]; // String
+		}else if(attribute === "imageUrl"){
+			return [item.media.l]; // String
+		}else if(attribute === "imageUrlMedium"){
+			return [item.media.m]; // String
+		}else if(attribute === "imageUrlThumb"){
+			return [item.media.t]; // String
+		}else if(attribute === "link"){
+			return ["http://www.flickr.com/photos/"; + item.owner + "/" + item.id]; // String
+		}else if(attribute === "dateTaken"){
+			return item.datetaken;
+		}else if(attribute === "datePublished"){
+			return item.datepublished;
+		}
+		
+		return undefined;
+	},
+
+	_processFlickrData: function(/* Object */data, /* Object */request, /* String */ cacheKey){
+		// summary: Processes the raw data from Flickr and updates the internal cache.
+		// data: 
+		//		Data returned from Flickr
+		// request: 
+		//		The original dojo.data.Request object passed in by the user.
+		
+		//If the data contains an 'item' object, it has not come from the REST services,
+		//so process it using the FlickrStore.
+		if(data.items){
+			return dojox.data.FlickrStore.prototype._processFlickrData.apply(this,arguments);
+		}
+
+		var template = ["http://farm";, null, ".static.flickr.com/", null, "/", null, "_", null];
+		
+		var items = [];
+		if(data.stat == "ok" && data.photos && data.photos.photo){
+			items = data.photos.photo;
+			
+			//Add on the store ref so that isItem can work.
+			for(var i = 0; i < items.length; i++){
+				var item = items[i];
+				item[this._storeRef] = this;
+				
+				template[1] = item.farm;
+				template[3] = item.server;
+				template[5] = item.id;
+				template[7] = item.secret;
+				 
+				var base = template.join("");
+				item.media = {
+					s: base + "_s.jpg",
+				 	m: base + "_m.jpg",
+				 	l: base + ".jpg",
+				 	t: base + "_t.jpg"
+				};
+			}
+		}
+		var start = request.start ? request.start : 0;
+		var arr = this._cache[cacheKey];
+		if(!arr) {
+			this._cache[cacheKey] = arr = [];
+		}
+		for(var count = 0; count < items.length; count++){
+			arr[count + start] = items[count];
+		}
+
+		return arr; // Array
+	},
+	
+	_checkPrevRanges: function(primaryKey, start, count) {
+		var end = start + count;
+		var arr = this._prevRequestRanges[primaryKey];
+		if(!arr) {
+			return false;
+		}
+		for(var i = 0; i< arr.length; i++) {
+			if(start >= arr[i].start &&
+			   end <= arr[i].end) {
+				return true;
+			}
+		}
+		return false;
+	}
+});
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/FlickrStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/FlickrStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/FlickrStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,257 @@
+if(!dojo._hasResource["dojox.data.FlickrStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.FlickrStore"] = true;
+dojo.provide("dojox.data.FlickrStore");
+
+dojo.require("dojo.data.util.simpleFetch");
+dojo.require("dojo.io.script");
+dojo.require("dojo.date.stamp");
+
+dojo.declare("dojox.data.FlickrStore", null, {
+	constructor: function(/*Object*/args){
+		//	summary:
+		//		Initializer for the FlickrStore store.  
+		//	description:
+		//		The FlickrStore is a Datastore interface to one of the basic services
+		//		of the Flickr service, the public photo feed.  This does not provide
+		//		access to all the services of Flickr.
+		//		This store cannot do * and ? filtering as the flickr service 
+		//		provides no interface for wildcards.
+		if(args && args.label){
+			this.label = args.label;
+		}
+	},
+
+	_flickrUrl: "http://api.flickr.com/services/feeds/photos_public.gne";,
+
+	_storeRef: "_S",
+
+	label: "title",
+
+	_assertIsItem: function(/* item */ item){
+		//	summary:
+		//      This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojox.data.FlickrStore: a function was passed an item argument that was not an item");
+		}
+	},
+
+	_assertIsAttribute: function(/* attribute-name-string */ attribute){
+		//	summary:
+		//		This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		if(typeof attribute !== "string"){ 
+			throw new Error("dojox.data.FlickrStore: a function was passed an attribute argument that was not an attribute name string");
+		}
+	},
+
+	getFeatures: function(){
+		//	summary: 
+		//      See dojo.data.api.Read.getFeatures()
+		return {
+			'dojo.data.api.Read': true
+		};
+	},
+
+	getValue: function(item, attribute){
+		//	summary: 
+		//      See dojo.data.api.Read.getValue()
+		var values = this.getValues(item, attribute);
+		if(values){
+			return values[0];
+		}
+		return undefined;
+	},
+
+	getAttributes: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.getAttributes()
+		return ["title", "description", "author", "datePublished", "dateTaken", "imageUrl", "imageUrlSmall", "imageUrlMedium", "tags", "link"]; 
+	},
+
+	hasAttribute: function(item, attribute){
+		//	summary: 
+		//      See dojo.data.api.Read.hasAttributes()
+		if(this.getValue(item,attribute)){
+			return true;
+		}
+		return false;
+	},
+
+	isItemLoaded: function(item){
+		 //	summary: 
+		 //      See dojo.data.api.Read.isItemLoaded()
+		 return this.isItem(item);
+	},
+
+	loadItem: function(keywordArgs){
+		//	summary: 
+		//      See dojo.data.api.Read.loadItem()
+	},
+
+	getLabel: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.getLabel()
+		return this.getValue(item,this.label);
+	},
+	
+	getLabelAttributes: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.getLabelAttributes()
+		return [this.label];
+	},
+
+	containsValue: function(item, attribute, value){
+		//	summary: 
+		//      See dojo.data.api.Read.containsValue()
+		var values = this.getValues(item,attribute);
+		for(var i = 0; i < values.length; i++){
+			if(values[i] === value){
+				return true;
+			}
+		}
+		return false;
+	},
+
+	getValues: function(item, attribute){
+		//	summary: 
+		//      See dojo.data.api.Read.getValue()
+
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		if(attribute === "title"){
+			return [this._unescapeHtml(item.title)];
+		}else if(attribute === "author"){
+			return [this._unescapeHtml(item.author)];
+		}else if(attribute === "datePublished"){
+			return [dojo.date.stamp.fromISOString(item.published)];
+		}else if(attribute === "dateTaken"){
+			return [dojo.date.stamp.fromISOString(item.date_taken)];
+		}else if(attribute === "imageUrlSmall"){
+			return [item.media.m.replace(/_m\./, "_s.")];
+		}else if(attribute === "imageUrl"){
+			return [item.media.m.replace(/_m\./, ".")];
+		}else if(attribute === "imageUrlMedium"){
+			return [item.media.m];
+		}else if(attribute === "link"){
+			return [item.link];
+		}else if(attribute === "tags"){
+			return item.tags.split(" ");
+		}else if(attribute === "description"){
+			return [this._unescapeHtml(item.description)];
+		}
+		return undefined;
+	},
+
+	isItem: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.isItem()
+		if(item && item[this._storeRef] === this){
+			return true;
+		}
+		return false;
+	},
+	
+	close: function(request){
+		//	summary: 
+		//      See dojo.data.api.Read.close()
+	},
+
+	_fetchItems: function(request, fetchHandler, errorHandler){
+		//	summary:
+		//		Fetch flickr items that match to a query
+		//	request:
+		//		A request object
+		//	fetchHandler:
+		//		A function to call for fetched items
+		//	errorHandler:
+		//		A function to call on error
+
+		if(!request.query){
+			request.query={};
+		}
+
+		//Build up the content to send the request for.
+		var content = {format: "json", tagmode:"any"};
+		if (request.query.tags) {
+			content.tags = request.query.tags;
+		}
+		if (request.query.tagmode) {
+			content.tagmode = request.query.tagmode;
+		}
+		if (request.query.userid) {
+			content.id = request.query.userid;
+		}
+		if (request.query.userids) {
+			content.ids = request.query.userids;
+		}
+		if (request.query.lang) {
+			content.lang = request.query.lang;
+		}
+
+		//Linking this up to Flickr is a PAIN!
+		var self = this;
+		var handle = null;
+		var getArgs = {
+			url: this._flickrUrl,
+			preventCache: true,
+			content: content
+		};
+		var myHandler = function(data){
+			if(handle !== null){
+				dojo.disconnect(handle);
+			}
+
+			//Process the items...
+			fetchHandler(self._processFlickrData(data), request);
+		};
+        handle = dojo.connect("jsonFlickrFeed", myHandler);
+		var deferred = dojo.io.script.get(getArgs);
+		
+		//We only set up the errback, because the callback isn't ever really used because we have
+		//to link to the jsonFlickrFeed function....
+		deferred.addErrback(function(error){
+			dojo.disconnect(handle);
+			errorHandler(error, request);
+		});
+	},
+
+	_processFlickrData: function(data){
+		 var items = [];
+		 if(data.items){
+			 items = data.items;
+			 //Add on the store ref so that isItem can work.
+			 for(var i = 0; i < data.items.length; i++){
+				 var item = data.items[i];
+				 item[this._storeRef] = this;
+			 }
+		 }
+		 return items;
+	},
+
+	_unescapeHtml: function(str){
+		// summary: Utility function to un-escape XML special characters in an HTML string.
+		// description: Utility function to un-escape XML special characters in an HTML string.
+		//
+		// str: String.
+		//   The string to un-escape
+		// returns: HTML String converted back to the normal text (unescaped) characters (<,>,&, ", etc,).
+		//
+		//TODO: Check to see if theres already compatible escape() in dojo.string or dojo.html
+		str = str.replace(/&amp;/gm, "&").replace(/&lt;/gm, "<").replace(/&gt;/gm, ">").replace(/&quot;/gm, "\"");
+		str = str.replace(/&#39;/gm, "'"); 
+		return str;
+	}
+});
+dojo.extend(dojox.data.FlickrStore,dojo.data.util.simpleFetch);										  
+										  
+//We have to define this because of how the Flickr API works.  
+//This somewhat stinks, but what can you do?
+if (!jsonFlickrFeed) {
+	var jsonFlickrFeed = function(data){};
+}
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/HtmlStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/HtmlStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/HtmlStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,531 @@
+if(!dojo._hasResource["dojox.data.HtmlStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.HtmlStore"] = true;
+dojo.provide("dojox.data.HtmlStore");
+
+dojo.require("dojox.data.dom");
+dojo.require("dojo.data.util.simpleFetch");
+dojo.require("dojo.data.util.filter");
+
+dojo.declare("dojox.data.HtmlStore", null, {
+	constructor: function(/*Object*/args){
+		//	summary:
+		//		Initializer for the HTML table store.  
+		//	description:
+		//		The HtmlStore can be created in one of two ways: a) by parsing an existing
+		//		table or list DOM node on the current page or b) by referencing an external url and giving
+		//		the id of the table or listin that page.  The remote url will be parsed as an html page.
+		//
+		//		The HTML table or list should be of the following form:
+		//
+		//		|	<table id="myTable">
+		//		|		<thead>
+		//		|			<tr>
+		//		|				<th>Attribute1</th>
+		//		|				<th>Attribute2</th>
+		//		|			</tr>
+		//		|		</thead>
+		//		|		<tbody>
+		//		|			<tr>
+		//		|				<td>Value1.1</td>
+		//		|				<td>Value1.2</td>
+		//		|			</tr>
+		//		|			<tr>
+		//		|				<td>Value2.1</td>
+		//		|				<td>Value2.2</td>
+		//		|			</tr>
+		//		|		</tbody>
+		//		|	</table>
+		//
+		// -or-
+		//
+		//		|	<ul id="myUnorderedList">
+		//		|		<li>Value.1</li>
+		//		|		<li>Value.2</li>
+		//		|	</ul>
+		//
+		// -or-
+		//
+		//		|	<ol id="myOrderedList">
+		//		|		<li>Value.1</li>
+		//		|		<li>Value.2</li>
+		//		|	</ol>
+		//
+		//	args:
+		//		An anonymous object to initialize properties.  It expects the following values:
+		//		dataId:	The id of the HTML table to use.
+		//		OR
+		//		url:	The url of the remote page to load
+		//		dataId:	The id of the table element in the remote page
+		
+		if(args.url){
+			if(!args.dataId)
+				throw new Error("dojo.data.HtmlStore: Cannot instantiate using url without an id!");
+			this.url = args.url;
+			this.dataId = args.dataId;
+		}else{
+			if(args.dataId){
+				this._rootNode = dojo.byId(args.dataId);
+				this.dataId = this._rootNode.id;
+			}else{
+				this._rootNode = dojo.byId(this.dataId);
+			}
+			this._indexItems();
+		}
+	},
+
+	url: "",     // So the parser can instantiate the store via markup.
+	dataId: "", // So the parser can instantiate the store via markup.
+	
+	_indexItems: function(){
+		this._getHeadings();
+		if (this._rootNode.rows){//tables
+			if(this._rootNode.tBodies && this._rootNode.tBodies.length > 0) {
+				this._rootNode = this._rootNode.tBodies[0];
+			}
+			var i;
+			for(i=0; i<this._rootNode.rows.length; i++){
+				this._rootNode.rows[i].store = this;
+				this._rootNode.rows[i]._ident = i+1;
+			}
+		}else{//lists
+			var c=1;
+			for(i=0; i<this._rootNode.childNodes.length; i++){
+				if(this._rootNode.childNodes[i].nodeType===1){
+					this._rootNode.childNodes[i].store = this;
+					this._rootNode.childNodes[i]._ident = c;
+					c++;
+				}
+			}
+		}
+	},
+
+	_getHeadings: function(){
+		//	summary:
+		//		Function to load the attribute names from the table header so that the 
+		//		attributes (cells in a row), can have a reasonable name.
+		//      For list items, returns single implicit heading, ["name"]
+		this._headings = [];
+		if(this._rootNode.tHead){
+			dojo.forEach(this._rootNode.tHead.rows[0].cells, dojo.hitch(this, function(th){
+				this._headings.push(dojox.data.dom.textContent(th));
+			}));
+		}else{
+			this._headings = ["name"];
+		}
+	},
+	
+	_getAllItems: function(){
+		//	summary:
+		//		Function to return all rows in the table as an array of items.
+		var items = [];
+                var i;
+		if(this._rootNode.rows){//table
+			for(i=0; i<this._rootNode.rows.length; i++){
+				items.push(this._rootNode.rows[i]);
+			}
+		}else{ //list
+			for(i=0; i<this._rootNode.childNodes.length; i++){
+				if (this._rootNode.childNodes[i].nodeType===1){
+					items.push(this._rootNode.childNodes[i]);
+				}
+			}
+		}
+		return items; //array
+	},
+	
+	_assertIsItem: function(/* item */ item){
+		//	summary:
+		//      This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojo.data.HtmlStore: a function was passed an item argument that was not an item");
+		}
+	},
+
+	_assertIsAttribute: function(/* String */ attribute){
+		//	summary:
+		//      This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		//
+		//	returns:
+		//		Returns the index (column) that the attribute resides in the row.
+		if(typeof attribute !== "string"){ 
+			throw new Error("dojo.data.HtmlStore: a function was passed an attribute argument that was not an attribute name string");
+			return -1;
+		}
+		return dojo.indexOf(this._headings, attribute); //int
+	},
+
+/***************************************
+     dojo.data.api.Read API
+***************************************/
+	
+	getValue: function(	/* item */ item, 
+						/* attribute-name-string */ attribute, 
+						/* value? */ defaultValue){
+		//	summary: 
+		//      See dojo.data.api.Read.getValue()
+		var values = this.getValues(item, attribute);
+		return (values.length > 0)?values[0]:defaultValue; //Object || int || Boolean
+	},
+
+	getValues: function(/* item */ item, 
+						/* attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.getValues()
+
+		this._assertIsItem(item);
+		var index = this._assertIsAttribute(attribute);
+
+		if(index>-1){
+			if (item.cells){
+			  return [dojox.data.dom.textContent(item.cells[index])];
+			}else{//return Value for lists
+			    return [dojox.data.dom.textContent(item)];
+			}
+		}
+		return []; //Array
+	},
+
+	getAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getAttributes()
+		this._assertIsItem(item);
+		var attributes = [];
+		for(var i=0; i<this._headings.length; i++){
+			if(this.hasAttribute(item, this._headings[i]))
+				attributes.push(this._headings[i]);
+		}
+		return attributes; //Array
+	},
+
+	hasAttribute: function(	/* item */ item,
+							/* attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.hasAttribute()
+		return this.getValues(item, attribute).length > 0;
+	},
+
+	containsValue: function(/* item */ item, 
+							/* attribute-name-string */ attribute, 
+							/* anything */ value){
+		//	summary: 
+		//		See dojo.data.api.Read.containsValue()
+		var regexp = undefined;
+		if(typeof value === "string"){
+		   regexp = dojo.data.util.filter.patternToRegExp(value, false);
+		}
+		return this._containsValue(item, attribute, value, regexp); //boolean.
+	},
+
+	_containsValue: function(	/* item */ item, 
+								/* attribute-name-string */ attribute, 
+								/* anything */ value,
+								/* RegExp?*/ regexp){
+		//	summary: 
+		//		Internal function for looking at the values contained by the item.
+		//	description: 
+		//		Internal function for looking at the values contained by the item.  This 
+		//		function allows for denoting if the comparison should be case sensitive for
+		//		strings or not (for handling filtering cases where string case should not matter)
+		//	
+		//	item:
+		//		The data item to examine for attribute values.
+		//	attribute:
+		//		The attribute to inspect.
+		//	value:	
+		//		The value to match.
+		//	regexp:
+		//		Optional regular expression generated off value if value was of string type to handle wildcarding.
+		//		If present and attribute values are string, then it can be used for comparison instead of 'value'
+		var values = this.getValues(item, attribute);
+		for(var i = 0; i < values.length; ++i){
+			var possibleValue = values[i];
+			if(typeof possibleValue === "string" && regexp){
+				return (possibleValue.match(regexp) !== null);
+			}else{
+				//Non-string matching.
+				if(value === possibleValue){
+					return true; // Boolean
+				}
+			}
+		}
+		return false; // Boolean
+	},
+
+	isItem: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItem()
+		if(something && something.store && something.store === this){
+			return true; //boolean
+		}
+		return false; //boolean
+	},
+
+	isItemLoaded: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItemLoaded()
+		return this.isItem(something);
+	},
+
+	loadItem: function(/* Object */ keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Read.loadItem()
+		this._assertIsItem(keywordArgs.item);
+	},
+	
+	_fetchItems: function(request, fetchHandler, errorHandler){
+		//	summary:
+		//		Fetch items (XML elements) that match to a query
+		//	description:
+		//		If '_fetchUrl' is specified, it is used to load an XML document
+		//		with a query string.
+		//		Otherwise and if 'url' is specified, the XML document is
+		//		loaded and list XML elements that match to a query (set of element
+		//		names and their text attribute values that the items to contain).
+		//		A wildcard, "*" can be used to query values to match all
+		//		occurrences.
+		//		If '_rootItem' is specified, it is used to fetch items.
+		//	request:
+		//		A request object
+		//	fetchHandler:
+		//		A function to call for fetched items
+		//	errorHandler:
+		//		A function to call on error
+		
+		if(this._rootNode){
+			this._finishFetchItems(request, fetchHandler, errorHandler);
+		}else{
+			if(!this.url){
+				this._rootNode = dojo.byId(this.dataId);
+			}else{
+				var getArgs = {
+						url: this.url,
+						handleAs: "text"
+					};
+				var self = this;
+				var getHandler = dojo.xhrGet(getArgs);
+				getHandler.addCallback(function(data){
+					var findNode = function(node, id){
+						if(node.id == id){
+							return node; //object
+						}
+						if(node.childNodes){
+							for(var i=0; i<node.childNodes.length; i++){
+								var returnNode = findNode(node.childNodes[i], id);
+								if(returnNode){
+									return returnNode; //object
+								}
+							}
+						}
+						return null; //null
+					}
+
+					var d = document.createElement("div");
+					d.innerHTML = data;
+					self._rootNode = findNode(d, self.dataId);
+					self._indexItems();
+					self._finishFetchItems(request, fetchHandler, errorHandler);
+				});
+				getHandler.addErrback(function(error){
+					errorHandler(error, request);
+				});
+			}
+		}
+	},
+	
+	_finishFetchItems: function(request, fetchHandler, errorHandler){
+		//	summary:
+		//		Internal function for processing the passed in request and locating the requested items.
+		var items = null;
+		var arrayOfAllItems = this._getAllItems();
+		if(request.query){
+			var ignoreCase = request.queryOptions ? request.queryOptions.ignoreCase : false; 
+			items = [];
+
+			//See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+			//same value for each item examined.  Much more efficient.
+			var regexpList = {};
+			var key;
+                        var value;
+			for(key in request.query){
+				value = request.query[key]+'';
+				if(typeof value === "string"){
+					regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
+				}
+			}
+
+			for(var i = 0; i < arrayOfAllItems.length; ++i){
+				var match = true;
+				var candidateItem = arrayOfAllItems[i];
+				for(key in request.query){
+					value = request.query[key]+'';
+					if (!this._containsValue(candidateItem, key, value, regexpList[key])){
+						match = false;
+					}
+				}
+				if(match){
+					items.push(candidateItem);
+				}
+			}
+			fetchHandler(items, request);
+		}else{
+			// We want a copy to pass back in case the parent wishes to sort the array.  We shouldn't allow resort 
+			// of the internal list so that multiple callers can get listsand sort without affecting each other.
+			if(arrayOfAllItems.length> 0){
+				items = arrayOfAllItems.slice(0,arrayOfAllItems.length); 
+			}
+			fetchHandler(items, request);
+		}
+	},
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return {
+			'dojo.data.api.Read': true,
+			'dojo.data.api.Identity': true
+		};
+	},
+	
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		//	summary:
+		//		See dojo.data.api.Read.close()
+		// nothing to do here!
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabel()
+		if(this.isItem(item)){
+			if(item.cells){
+				return "Item #" + this.getIdentity(item);
+			}else{
+				return this.getValue(item,"name");
+			}
+		}
+		return undefined;
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabelAttributes()
+		if(item.cells){
+			return null;
+		}else{
+			return ["name"];
+		}
+	},
+
+/***************************************
+     dojo.data.api.Identity API
+***************************************/
+
+	getIdentity: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Identity.getIdentity()
+		this._assertIsItem(item);
+		if(this.hasAttribute(item, "name")){
+		 	return this.getValue(item,"name");
+		}else{
+			return item._ident;
+		}
+	},
+
+	getIdentityAttributes: function(/* item */ item){
+		 //	summary: 
+		 //		See dojo.data.api.Identity.getIdentityAttributes()
+		 //Identity isn't taken from a public attribute.
+		 return null;
+	},
+
+	fetchItemByIdentity: function(keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Identity.fetchItemByIdentity()
+		var identity = keywordArgs.identity;
+		var self = this;
+		var item = null;
+		var scope = null;
+
+		if(!this._rootNode){
+			if(!this.url){
+				this._rootNode = dojo.byId(this.dataId);
+				this._indexItems();
+				if(self._rootNode.rows){ //Table
+					item = this._rootNode.rows[identity + 1];
+				}else{ //Lists
+					for(var i = 0; i < self._rootNode.childNodes.length; i++){
+						if(self._rootNode.childNodes[i].nodeType === 1 && identity === dojox.data.dom.textContent(self._rootNode.childNodes[i])) {
+								item = self._rootNode.childNodes[i];
+						}
+					}
+				}
+				if(keywordArgs.onItem){
+					scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+					keywordArgs.onItem.call(scope, item);
+				}
+
+			}else{
+				var getArgs = {
+						url: this.url,
+						handleAs: "text"
+					};
+				var getHandler = dojo.xhrGet(getArgs);
+				getHandler.addCallback(function(data){
+					var findNode = function(node, id){
+						if(node.id == id){
+							return node; //object
+						}
+						if(node.childNodes){
+							for(var i=0; i<node.childNodes.length; i++){
+								var returnNode = findNode(node.childNodes[i], id);
+								if(returnNode){
+									return returnNode; //object
+								}
+							}
+						}
+						return null; //null
+					}
+					var d = document.createElement("div");
+					d.innerHTML = data;
+					self._rootNode = findNode(d, self.dataId);
+					self._indexItems();
+					if(self._rootNode.rows && identity <= self._rootNode.rows.length){ //Table
+						item = self._rootNode.rows[identity-1];
+					}else{ //List
+						for(var i = 0; i < self._rootNode.childNodes.length; i++){
+							if(self._rootNode.childNodes[i].nodeType === 1 && identity === dojox.data.dom.textContent(self._rootNode.childNodes[i])) {
+									item = self._rootNode.childNodes[i];
+									break;
+							}
+						}
+					}
+					if(keywordArgs.onItem){
+						scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+						keywordArgs.onItem.call(scope, item);
+					}
+				});
+				getHandler.addErrback(function(error){
+					if(keywordArgs.onError){
+						scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+						keywordArgs.onError.call(scope, error);
+
+					}
+				});
+			}
+		}else{
+			if(this._rootNode.rows[identity+1]){
+				item = this._rootNode.rows[identity+1];
+				if(keywordArgs.onItem){
+					scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+					keywordArgs.onItem.call(scope, item);
+				}
+			}
+		}
+	}
+});
+dojo.extend(dojox.data.HtmlStore,dojo.data.util.simpleFetch);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/HtmlTableStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/HtmlTableStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/HtmlTableStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,469 @@
+if(!dojo._hasResource["dojox.data.HtmlTableStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.HtmlTableStore"] = true;
+dojo.provide("dojox.data.HtmlTableStore");
+
+dojo.require("dojox.data.dom");
+dojo.require("dojo.data.util.simpleFetch");
+dojo.require("dojo.data.util.filter");
+
+dojo.declare("dojox.data.HtmlTableStore", null, {
+	constructor: function(/*Object*/args){
+		dojo.deprecated("dojox.data.HtmlTableStore", "Please use dojox.data.HtmlStore");
+		//	summary:
+		//		Initializer for the HTML table store.  
+		//	description:
+		//		The HtmlTableStore can be created in one of two ways: a) by parsing an existing
+		//		table DOM node on the current page or b) by referencing an external url and giving
+		//		the id of the table in that page.  The remote url will be parsed as an html page.
+		//
+		//		The HTML table should be of the following form:
+		//		<table id="myTable">
+		//			<thead>
+		//				<tr>
+		//					<th>Attribute1</th>
+		//					<th>Attribute2</th>
+		//				</tr>
+		//			</thead>
+		//			<tbody>
+		//				<tr>
+		//					<td>Value1.1</td>
+		//					<td>Value1.2</td>
+		//				</tr>
+		//				<tr>
+		//					<td>Value2.1</td>
+		//					<td>Value2.2</td>
+		//				</tr>
+		//			</tbody>
+		//		</table>
+		//
+		//	args:
+		//		An anonymous object to initialize properties.  It expects the following values:
+		//		tableId:	The id of the HTML table to use.
+		//		OR
+		//		url:		The url of the remote page to load
+		//		tableId:	The id of the table element in the remote page
+		
+		if(args.url){
+			if(!args.tableId)
+				throw new Error("dojo.data.HtmlTableStore: Cannot instantiate using url without an id!");
+			this.url = args.url;
+			this.tableId = args.tableId;
+		}else{
+			if(args.tableId){
+				this._rootNode = dojo.byId(args.tableId);
+				this.tableId = this._rootNode.id;
+			}else{
+				this._rootNode = dojo.byId(this.tableId);
+			}
+			this._getHeadings();
+			for(var i=0; i<this._rootNode.rows.length; i++){
+				this._rootNode.rows[i].store = this;
+			}
+		}
+	},
+
+	url: "",     // So the parser can instantiate the store via markup.
+	tableId: "", // So the parser can instantiate the store via markup.
+
+	_getHeadings: function(){
+		//	summary:
+		//		Function to load the attribute names from the table header so that the 
+		//		attributes (cells in a row), can have a reasonable name.
+		this._headings = [];
+		dojo.forEach(this._rootNode.tHead.rows[0].cells, dojo.hitch(this, function(th){
+			this._headings.push(dojox.data.dom.textContent(th));
+		}));
+	},
+	
+	_getAllItems: function(){
+		//	summary:
+		//		Function to return all rows in the table as an array of items.
+		var items = [];
+		for(var i=1; i<this._rootNode.rows.length; i++){
+			items.push(this._rootNode.rows[i]);
+		}
+		return items; //array
+	},
+	
+	_assertIsItem: function(/* item */ item){
+		//	summary:
+		//      This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojo.data.HtmlTableStore: a function was passed an item argument that was not an item");
+		}
+	},
+
+	_assertIsAttribute: function(/* String */ attribute){
+		//	summary:
+		//      This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		//
+		//	returns:
+		//		Returns the index (column) that the attribute resides in the row.
+		if(typeof attribute !== "string"){ 
+			throw new Error("dojo.data.HtmlTableStore: a function was passed an attribute argument that was not an attribute name string");
+			return -1;
+		}
+		return dojo.indexOf(this._headings, attribute); //int
+	},
+
+/***************************************
+     dojo.data.api.Read API
+***************************************/
+	
+	getValue: function(	/* item */ item, 
+						/* attribute-name-string */ attribute, 
+						/* value? */ defaultValue){
+		//	summary: 
+		//      See dojo.data.api.Read.getValue()
+		var values = this.getValues(item, attribute);
+		return (values.length > 0)?values[0]:defaultValue; //Object || int || Boolean
+	},
+
+	getValues: function(/* item */ item, 
+						/* attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.getValues()
+
+		this._assertIsItem(item);
+		var index = this._assertIsAttribute(attribute);
+
+		if(index>-1){
+			return [dojox.data.dom.textContent(item.cells[index])] ;
+		}
+		return []; //Array
+	},
+
+	getAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getAttributes()
+		this._assertIsItem(item);
+		var attributes = [];
+		for(var i=0; i<this._headings.length; i++){
+			if(this.hasAttribute(item, this._headings[i]))
+				attributes.push(this._headings[i]);
+		}
+		return attributes; //Array
+	},
+
+	hasAttribute: function(	/* item */ item,
+							/* attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.hasAttribute()
+		return this.getValues(item, attribute).length > 0;
+	},
+
+	containsValue: function(/* item */ item, 
+							/* attribute-name-string */ attribute, 
+							/* anything */ value){
+		//	summary: 
+		//		See dojo.data.api.Read.containsValue()
+		var regexp = undefined;
+		if(typeof value === "string"){
+		   regexp = dojo.data.util.filter.patternToRegExp(value, false);
+		}
+		return this._containsValue(item, attribute, value, regexp); //boolean.
+	},
+
+	_containsValue: function(	/* item */ item, 
+								/* attribute-name-string */ attribute, 
+								/* anything */ value,
+								/* RegExp?*/ regexp){
+		//	summary: 
+		//		Internal function for looking at the values contained by the item.
+		//	description: 
+		//		Internal function for looking at the values contained by the item.  This 
+		//		function allows for denoting if the comparison should be case sensitive for
+		//		strings or not (for handling filtering cases where string case should not matter)
+		//	
+		//	item:
+		//		The data item to examine for attribute values.
+		//	attribute:
+		//		The attribute to inspect.
+		//	value:	
+		//		The value to match.
+		//	regexp:
+		//		Optional regular expression generated off value if value was of string type to handle wildcarding.
+		//		If present and attribute values are string, then it can be used for comparison instead of 'value'
+		var values = this.getValues(item, attribute);
+		for(var i = 0; i < values.length; ++i){
+			var possibleValue = values[i];
+			if(typeof possibleValue === "string" && regexp){
+				return (possibleValue.match(regexp) !== null);
+			}else{
+				//Non-string matching.
+				if(value === possibleValue){
+					return true; // Boolean
+				}
+			}
+		}
+		return false; // Boolean
+	},
+
+	isItem: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItem()
+		if(something && something.store && something.store === this){
+			return true; //boolean
+		}
+		return false; //boolean
+	},
+
+	isItemLoaded: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItemLoaded()
+		return this.isItem(something);
+	},
+
+	loadItem: function(/* Object */ keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Read.loadItem()
+		this._assertIsItem(keywordArgs.item);
+	},
+	
+	_fetchItems: function(request, fetchHandler, errorHandler) {
+		//	summary:
+		//		Fetch items (XML elements) that match to a query
+		//	description:
+		//		If '_fetchUrl' is specified, it is used to load an XML document
+		//		with a query string.
+		//		Otherwise and if 'url' is specified, the XML document is
+		//		loaded and list XML elements that match to a query (set of element
+		//		names and their text attribute values that the items to contain).
+		//		A wildcard, "*" can be used to query values to match all
+		//		occurrences.
+		//		If '_rootItem' is specified, it is used to fetch items.
+		//	request:
+		//		A request object
+		//	fetchHandler:
+		//		A function to call for fetched items
+		//	errorHandler:
+		//		A function to call on error
+		
+		if(this._rootNode){
+			this._finishFetchItems(request, fetchHandler, errorHandler);
+		}else{
+			if(!this.url){
+				this._rootNode = dojo.byId(this.tableId);
+				this._getHeadings();
+				for(var i=0; i<this._rootNode.rows.length; i++){
+					this._rootNode.rows[i].store = this;
+				}
+			}else{
+				var getArgs = {
+						url: this.url,
+						handleAs: "text"
+					};
+				var self = this;
+				var getHandler = dojo.xhrGet(getArgs);
+				getHandler.addCallback(function(data){
+					var findNode = function(node, id){
+						if(node.id == id){
+							return node; //object
+						}
+						if(node.childNodes){
+							for(var i=0; i<node.childNodes.length; i++){
+								var returnNode = findNode(node.childNodes[i], id);
+								if(returnNode){
+									return returnNode; //object
+								}
+							}
+						}
+						return null; //null
+					}
+
+					var d = document.createElement("div");
+					d.innerHTML = data;
+					self._rootNode = findNode(d, self.tableId);
+					self._getHeadings.call(self);
+					for(var i=0; i<self._rootNode.rows.length; i++) {
+						self._rootNode.rows[i].store = self;
+					}
+					self._finishFetchItems(request, fetchHandler, errorHandler);
+				});
+				getHandler.addErrback(function(error){
+					errorHandler(error, request);
+				});
+			}
+		}
+	},
+	
+	_finishFetchItems: function(request, fetchHandler, errorHandler){
+		//	summary:
+		//		Internal function for processing the passed in request and locating the requested items.
+		var items = null;
+		var arrayOfAllItems = this._getAllItems();
+		if(request.query){
+			var ignoreCase = request.queryOptions ? request.queryOptions.ignoreCase : false; 
+			items = [];
+
+			//See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+			//same value for each item examined.  Much more efficient.
+			var regexpList = {};
+                        var value;
+                        var key;
+			for(key in request.query){
+				value = request.query[key]+'';
+				if(typeof value === "string"){
+					regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
+				}
+			}
+
+			for(var i = 0; i < arrayOfAllItems.length; ++i){
+				var match = true;
+				var candidateItem = arrayOfAllItems[i];
+				for(key in request.query){
+					value = request.query[key]+'';
+					if (!this._containsValue(candidateItem, key, value, regexpList[key])){
+						match = false;
+					}
+				}
+				if(match){
+					items.push(candidateItem);
+				}
+			}
+			fetchHandler(items, request);
+		}else{
+			// We want a copy to pass back in case the parent wishes to sort the array.  We shouldn't allow resort 
+			// of the internal list so that multiple callers can get listsand sort without affecting each other.
+			if(arrayOfAllItems.length> 0){
+				items = arrayOfAllItems.slice(0,arrayOfAllItems.length); 
+			}
+			fetchHandler(items, request);
+		}
+	},
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return {
+			'dojo.data.api.Read': true,
+			'dojo.data.api.Identity': true
+		};
+	},
+	
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		//	summary:
+		//		See dojo.data.api.Read.close()
+		// nothing to do here!
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabel()
+		if(this.isItem(item))
+			return "Table Row #" + this.getIdentity(item);
+		return undefined;
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabelAttributes()
+		return null;
+	},
+
+/***************************************
+     dojo.data.api.Identity API
+***************************************/
+
+	getIdentity: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Identity.getIdentity()
+		this._assertIsItem(item);
+		//Opera doesn't support the sectionRowIndex, 
+		//So, have to call the indexOf to locate it. 
+		//Blah.
+		if(!dojo.isOpera){
+			return item.sectionRowIndex; // int	
+		}else{
+			return (dojo.indexOf(this._rootNode.rows, item) - 1) // int
+		}
+	},
+
+	getIdentityAttributes: function(/* item */ item){
+		 //	summary: 
+		 //		See dojo.data.api.Identity.getIdentityAttributes()
+		 //Identity isn't taken from a public attribute.
+		 return null;
+	},
+
+	fetchItemByIdentity: function(keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Identity.fetchItemByIdentity()
+		var identity = keywordArgs.identity;
+		var self = this;
+		var item = null;
+                var scope = null;
+
+		if(!this._rootNode){
+			if(!this.url){
+				this._rootNode = dojo.byId(this.tableId);
+				this._getHeadings();
+				for(var i=0; i<this._rootNode.rows.length; i++){
+					this._rootNode.rows[i].store = this;
+				}
+				item = this._rootNode.rows[identity+1];
+				if (keywordArgs.onItem){
+					scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+					keywordArgs.onItem.call(scope, item);
+				}
+
+			}else{
+				var getArgs = {
+						url: this.url,
+						handleAs: "text"
+					};
+				var getHandler = dojo.xhrGet(getArgs);
+				getHandler.addCallback(function(data){
+					var findNode = function(node, id){
+						if(node.id == id){
+							return node; //object
+						}
+						if(node.childNodes) {
+							for(var i=0; i<node.childNodes.length; i++){
+								var returnNode = findNode(node.childNodes[i], id);
+								if(returnNode){
+									return returnNode; //object
+								}
+							}
+						}
+						return null; //null
+					}
+					var d = document.createElement("div");
+					d.innerHTML = data;
+					self._rootNode = findNode(d, self.tableId);
+					self._getHeadings.call(self);
+					for(var i=0; i<self._rootNode.rows.length; i++){
+						self._rootNode.rows[i].store = self;
+					}
+					item = self._rootNode.rows[identity+1];
+					if (keywordArgs.onItem){
+						scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+						keywordArgs.onItem.call(scope, item);
+					}
+				});
+				getHandler.addErrback(function(error){
+					if(keywordArgs.onError){
+						scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+						keywordArgs.onError.call(scope, error);
+
+					}
+				});
+			}
+		}else{
+			if(this._rootNode.rows[identity+1]){
+				item = this._rootNode.rows[identity+1];
+				if (keywordArgs.onItem){
+					scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+					keywordArgs.onItem.call(scope, item);
+				}
+			}
+		}
+	}
+});
+dojo.extend(dojox.data.HtmlTableStore,dojo.data.util.simpleFetch);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/KeyValueStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/KeyValueStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/KeyValueStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,381 @@
+if(!dojo._hasResource["dojox.data.KeyValueStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.KeyValueStore"] = true;
+dojo.provide("dojox.data.KeyValueStore");
+
+dojo.require("dojo.data.util.filter");
+dojo.require("dojo.data.util.simpleFetch");
+
+dojo.declare("dojox.data.KeyValueStore", null, {
+	//	summary:
+	//		This is a dojo.data store implementation.  It can take in either a Javascript
+	//		array, JSON string, or URL as the data source.  Data is expected to be in the 
+	//		following format:
+	//			[
+	//				{ "key1": "value1" },
+	//				{ "key2": "value2" }
+	//			]
+	//		This is to mimic the Java Properties file format.  Each 'item' from this store 
+	//		is a JS object representing a key-value pair.  If an item in the above array has 
+	//		more than one key/value pair, only the first will be used/accessed.
+	constructor: function(/* Object */ keywordParameters){
+		//	summary: constructor
+		//	keywordParameters: {url: String}
+		//	keywordParameters: {data: string}
+		//	keywordParameters: {dataVar: jsonObject}
+		if(keywordParameters.url){
+			this.url = keywordParameters.url;
+		}
+		this._keyValueString = keywordParameters.data;
+		this._keyValueVar = keywordParameters.dataVar;
+		this._keyAttribute = "key";
+		this._valueAttribute = "value";
+		this._storeProp = "_keyValueStore";
+		this._features = {	
+			'dojo.data.api.Read': true,
+			'dojo.data.api.Identity': true 
+		};
+		this._loadInProgress = false;	//Got to track the initial load to prevent duelling loads of the dataset.
+		this._queuedFetches = [];
+	},
+	
+	url: "",
+	data: "",
+	
+	_assertIsItem: function(/* item */ item){
+		//	summary:
+		//      This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojox.data.KeyValueStore: a function was passed an item argument that was not an item");
+		}
+	},
+	
+	_assertIsAttribute: function(/* item */ item, /* String */ attribute){
+		//	summary:
+		//      This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		if(!dojo.isString(attribute)){
+			throw new Error("dojox.data.KeyValueStore: a function was passed an attribute argument that was not an attribute object nor an attribute name string");
+		}
+	},
+
+/***************************************
+     dojo.data.api.Read API
+***************************************/
+	getValue: function(	/* item */ item, 
+						/* attribute-name-string */ attribute, 
+						/* value? */ defaultValue){
+		//	summary: 
+		//		See dojo.data.api.Read.getValue()
+		this._assertIsItem(item);
+		this._assertIsAttribute(item, attribute);
+		if(attribute == this._keyAttribute){ // Looking for key
+			return item[this._keyAttribute];
+		}
+		return item[this._valueAttribute]; // Otherwise, attribute == ('value' || the actual key )
+	},
+
+	getValues: function(/* item */ item,
+						/* attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.getValues()
+		// 		Key/Value syntax does not support multi-valued attributes, so this is just a
+		// 		wrapper function for getValue().
+		var value = this.getValue(item, attribute);
+		return (value ? [value] : []); //Array
+	},
+
+	getAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getAttributes()
+		return [this._keyAttribute, this._valueAttribute, item[this._keyAttribute]];
+	},
+
+	hasAttribute: function(	/* item */ item,
+							/* attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.hasAttribute()
+		this._assertIsItem(item);
+		this._assertIsAttribute(item, attribute);
+		return (attribute == this._keyAttribute || attribute == this._valueAttribute || attribute == item[this._keyAttribute]);
+	},
+
+	containsValue: function(/* item */ item,
+							/* attribute-name-string */ attribute, 
+							/* anything */ value){
+		//	summary: 
+		//		See dojo.data.api.Read.containsValue()
+		var regexp = undefined;
+		if(typeof value === "string"){
+		   regexp = dojo.data.util.filter.patternToRegExp(value, false);
+		}
+		return this._containsValue(item, attribute, value, regexp); //boolean.
+	},
+
+	_containsValue: function(	/* item */ item, 
+								/* attribute || attribute-name-string */ attribute, 
+								/* anything */ value,
+								/* RegExp?*/ regexp){
+		//	summary: 
+		//		Internal function for looking at the values contained by the item.
+		//	description: 
+		//		Internal function for looking at the values contained by the item.  This 
+		//		function allows for denoting if the comparison should be case sensitive for
+		//		strings or not (for handling filtering cases where string case should not matter)
+		//	
+		//	item:
+		//		The data item to examine for attribute values.
+		//	attribute:
+		//		The attribute to inspect.
+		//	value:	
+		//		The value to match.
+		//	regexp:
+		//		Optional regular expression generated off value if value was of string type to handle wildcarding.
+		//		If present and attribute values are string, then it can be used for comparison instead of 'value'
+		var values = this.getValues(item, attribute);
+		for(var i = 0; i < values.length; ++i){
+			var possibleValue = values[i];
+			if(typeof possibleValue === "string" && regexp){
+				return (possibleValue.match(regexp) !== null);
+			}else{
+				//Non-string matching.
+				if(value === possibleValue){
+					return true; // Boolean
+				}
+			}
+		}
+		return false; // Boolean
+	},
+
+	isItem: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItem()
+		if (something && something[this._storeProp] === this) {
+			return true; //Boolean
+		}
+		return false; //Boolean
+	},
+
+	isItemLoaded: function(/* anything */ something) {
+		//	summary: 
+		//		See dojo.data.api.Read.isItemLoaded()
+		//		The KeyValueStore always loads all items, so if it's an item, then it's loaded.
+		return this.isItem(something); //Boolean
+	},
+
+	loadItem: function(/* object */ keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Read.loadItem()
+		//	description:
+		//		The KeyValueStore always loads all items, so if it's an item, then it's loaded.
+		//		From the dojo.data.api.Read.loadItem docs:
+		//			If a call to isItemLoaded() returns true before loadItem() is even called,
+		//			then loadItem() need not do any work at all and will not even invoke
+		//			the callback handlers.
+	},
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return this._features; //Object
+	},
+
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		//	summary: 
+		//		See dojo.data.api.Read.close()
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabel()
+		return item[this._keyAttribute];
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabelAttributes()
+		return [this._keyAttribute];
+	},
+	
+	// The dojo.data.api.Read.fetch() function is implemented as
+	// a mixin from dojo.data.util.simpleFetch.
+	// That mixin requires us to define _fetchItems().
+	_fetchItems: function(	/* Object */ keywordArgs,
+							/* Function */ findCallback,
+							/* Function */ errorCallback){
+		//	summary: 
+		//		See dojo.data.util.simpleFetch.fetch()
+		
+		var self = this;
+
+		var filter = function(requestArgs, arrayOfAllItems){
+			var items = null;
+			if(requestArgs.query){
+				items = [];
+				var ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false; 
+
+				//See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+				//same value for each item examined.  Much more efficient.
+				var regexpList = {};
+				for(var key in requestArgs.query){
+					var value = requestArgs.query[key];
+					if(typeof value === "string"){
+						regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
+					}
+				}
+
+				for(var i = 0; i < arrayOfAllItems.length; ++i){
+					var match = true;
+					var candidateItem = arrayOfAllItems[i];
+					for(var key in requestArgs.query){
+						var value = requestArgs.query[key];
+						if(!self._containsValue(candidateItem, key, value, regexpList[key])){
+							match = false;
+						}
+					}
+					if(match){
+						items.push(candidateItem);
+					}
+				}
+			}else if(requestArgs.identity){
+				items = [];
+				var item;
+				for(var key in arrayOfAllItems){
+					item = arrayOfAllItems[key];
+					if(item[self._keyAttribute] == requestArgs.identity){
+						items.push(item);
+						break;
+					}
+				}
+			}else{
+				// We want a copy to pass back in case the parent wishes to sort the array.  We shouldn't allow resort 
+				// of the internal list so that multiple callers can get lists and sort without affecting each other.
+				if(arrayOfAllItems.length> 0){
+					items = arrayOfAllItems.slice(0,arrayOfAllItems.length); 
+				}
+			}
+			findCallback(items, requestArgs);
+		};
+
+		if(this._loadFinished){
+			filter(keywordArgs, this._arrayOfAllItems);
+		}else{
+			if(this.url !== ""){
+				//If fetches come in before the loading has finished, but while
+				//a load is in progress, we have to defer the fetching to be 
+				//invoked in the callback.
+				if(this._loadInProgress){
+					this._queuedFetches.push({args: keywordArgs, filter: filter});
+				}else{
+					this._loadInProgress = true;
+					var getArgs = {
+							url: self.url, 
+							handleAs: "json-comment-filtered"
+						};
+					var getHandler = dojo.xhrGet(getArgs);
+					getHandler.addCallback(function(data){
+						self._processData(data);
+						filter(keywordArgs, self._arrayOfAllItems);
+						self._handleQueuedFetches();
+					});
+					getHandler.addErrback(function(error){
+						self._loadInProgress = false;
+						throw error;
+					});
+				}
+			}else if(this._keyValueString){
+				this._processData(eval(this._keyValueString));
+				this._keyValueString = null;
+				filter(keywordArgs, this._arrayOfAllItems);
+			}else if(this._keyValueVar){
+				this._processData(this._keyValueVar);
+				this._keyValueVar = null;
+				filter(keywordArgs, this._arrayOfAllItems);
+			}else{
+				throw new Error("dojox.data.KeyValueStore: No source data was provided as either URL, String, or Javascript variable data input.");
+			}
+		}
+		
+	},
+
+	_handleQueuedFetches: function(){
+		//	summary: 
+		//		Internal function to execute delayed request in the store.
+		//Execute any deferred fetches now.
+		if(this._queuedFetches.length > 0){
+			for(var i = 0; i < this._queuedFetches.length; i++){
+				var fData = this._queuedFetches[i];
+				var delayedFilter = fData.filter;
+				var delayedQuery = fData.args;
+				if(delayedFilter){
+					delayedFilter(delayedQuery, this._arrayOfAllItems); 
+				}else{
+					this.fetchItemByIdentity(fData.args);
+				}
+			}
+			this._queuedFetches = [];
+		}
+	},
+	
+	_processData: function(/* Array */ data){
+		this._arrayOfAllItems = [];
+		for(var i=0; i<data.length; i++){
+			this._arrayOfAllItems.push(this._createItem(data[i]));
+		}
+		this._loadFinished = true;
+		this._loadInProgress = false;
+	},
+	
+	_createItem: function(/* Object */ something){
+		var item = {};
+		item[this._storeProp] = this;
+		for(var i in something){
+			item[this._keyAttribute] = i;
+			item[this._valueAttribute] = something[i];
+			break;
+		}
+		return item; //Object
+	},
+
+/***************************************
+     dojo.data.api.Identity API
+***************************************/
+	getIdentity: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Identity.getIdentity()
+		if(this.isItem(item)){
+			return item[this._keyAttribute]; //String
+		}
+		return null; //null
+	},
+
+	getIdentityAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Identity.getIdentifierAttributes()
+		return [this._keyAttribute];
+	},
+
+	fetchItemByIdentity: function(/* object */ keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Identity.fetchItemByIdentity()
+		keywordArgs.oldOnItem = keywordArgs.onItem;
+		keywordArgs.onItem = null;
+		keywordArgs.onComplete = this._finishFetchItemByIdentity ;
+		this.fetch(keywordArgs);
+	},
+	
+	_finishFetchItemByIdentity: function(/* Array */ items, /* object */ request) {
+		var scope = request.scope || dojo.global;
+		if(items.length){
+			request.oldOnItem.call(scope, items[0]);
+		}else{
+			request.oldOnItem.call(scope, null);
+		}
+	}
+});
+//Mix in the simple fetch implementation to this class.
+dojo.extend(dojox.data.KeyValueStore,dojo.data.util.simpleFetch);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/OpmlStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/OpmlStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/OpmlStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,515 @@
+if(!dojo._hasResource["dojox.data.OpmlStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.OpmlStore"] = true;
+dojo.provide("dojox.data.OpmlStore");
+
+dojo.require("dojo.data.util.filter");
+dojo.require("dojo.data.util.simpleFetch");
+
+dojo.declare("dojox.data.OpmlStore", null, {
+	/* summary:
+	 *   The OpmlStore implements the dojo.data.api.Read API.  
+	 */
+	 
+	/* examples:
+	 *   var opmlStore = new dojo.data.OpmlStore({url:"geography.xml"});
+	 *   var opmlStore = new dojo.data.OpmlStore({url:"http://example.com/geography.xml"});
+	 */
+	constructor: function(/* Object */ keywordParameters){
+		// summary: constructor
+		// keywordParameters: {url: String, label: String}  Where label is optional and configures what should be used as the return from getLabel()
+		this._xmlData = null;
+		this._arrayOfTopLevelItems = [];
+		this._arrayOfAllItems = [];
+		this._metadataNodes = null;
+		this._loadFinished = false;
+		this.url = keywordParameters.url;
+		this._opmlData = keywordParameters.data;  // XML DOM Document
+		if(keywordParameters.label){
+			this.label = keywordParameters.label;
+		}
+		this._loadInProgress = false;	//Got to track the initial load to prevent duelling loads of the dataset.
+		this._queuedFetches = [];
+		this._identityMap = {};
+		this._identCount = 0;
+		this._idProp = "_I";
+	},
+
+	label: "text",
+
+	url: "",
+
+	_assertIsItem: function(/* item */ item){
+		if(!this.isItem(item)){ 
+			throw new Error("dojo.data.OpmlStore: a function was passed an item argument that was not an item");
+		}
+	},
+	
+	_assertIsAttribute: function(/* item || String */ attribute){
+		//	summary:
+		//      This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		if(!dojo.isString(attribute)){
+			throw new Error("dojox.data.OpmlStore: a function was passed an attribute argument that was not an attribute object nor an attribute name string");
+		}
+	},
+	
+	_removeChildNodesThatAreNotElementNodes: function(/* node */ node, /* boolean */ recursive){
+		var childNodes = node.childNodes;
+		if(childNodes.length === 0){
+			return;
+		}
+		var nodesToRemove = [];
+		var i, childNode;
+		for(i = 0; i < childNodes.length; ++i){
+			childNode = childNodes[i];
+			if(childNode.nodeType != 1){ 
+				nodesToRemove.push(childNode); 
+			}
+		}
+		for(i = 0; i < nodesToRemove.length; ++i){
+			childNode = nodesToRemove[i];
+			node.removeChild(childNode);
+		}
+		if(recursive){
+			for(i = 0; i < childNodes.length; ++i){
+				childNode = childNodes[i];
+				this._removeChildNodesThatAreNotElementNodes(childNode, recursive);
+			}
+		}
+	},
+	
+	_processRawXmlTree: function(/* xmlDoc */ rawXmlTree){
+		this._loadFinished = true;
+		this._xmlData = rawXmlTree;
+		var headNodes = rawXmlTree.getElementsByTagName('head');
+		var headNode = headNodes[0];
+		if(headNode){
+			this._removeChildNodesThatAreNotElementNodes(headNode);
+			this._metadataNodes = headNode.childNodes;
+		}
+		var bodyNodes = rawXmlTree.getElementsByTagName('body');
+		var bodyNode = bodyNodes[0];
+		if(bodyNode){
+			this._removeChildNodesThatAreNotElementNodes(bodyNode, true);
+			
+			var bodyChildNodes = bodyNodes[0].childNodes;
+			for(var i = 0; i < bodyChildNodes.length; ++i){
+				var node = bodyChildNodes[i];
+				if(node.tagName == 'outline'){
+					this._identityMap[this._identCount] = node;
+					this._identCount++;
+					this._arrayOfTopLevelItems.push(node);
+					this._arrayOfAllItems.push(node);
+					this._checkChildNodes(node);
+				}
+			}
+		}
+	},
+
+	_checkChildNodes: function(node /*Node*/){
+		//	summary:
+		//		Internal function to recurse over all child nodes from the store and add them
+		//		As non-toplevel items
+		//	description:
+		//		Internal function to recurse over all child nodes from the store and add them
+		//		As non-toplevel items
+		//
+		//	node:
+		//		The child node to walk.
+		if(node.firstChild){
+			for(var i = 0; i < node.childNodes.length; i++){
+				var child = node.childNodes[i];
+				if(child.tagName == 'outline'){
+					this._identityMap[this._identCount] = child;
+					this._identCount++;
+					this._arrayOfAllItems.push(child);
+					this._checkChildNodes(child);
+				}
+			}
+		}
+	},
+
+	_getItemsArray: function(/*object?*/queryOptions){
+		//	summary: 
+		//		Internal function to determine which list of items to search over.
+		//	queryOptions: The query options parameter, if any.
+		if(queryOptions && queryOptions.deep) {
+			return this._arrayOfAllItems; 
+		}
+		return this._arrayOfTopLevelItems;
+	},
+
+/***************************************
+     dojo.data.api.Read API
+***************************************/
+	getValue: function( /* item */ item,
+						/* attribute || attribute-name-string */ attribute,
+						/* value? */ defaultValue){
+		//	summary: 
+		//      See dojo.data.api.Read.getValue()
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		if(attribute == 'children'){
+			return (item.firstChild || defaultValue); //Object
+		} else {
+			var value = item.getAttribute(attribute);
+			return (value !== undefined) ? value : defaultValue; //Object
+		}
+	},
+	
+	getValues: function(/* item */ item,
+						/* attribute || attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.getValues()
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		var array = [];
+		if(attribute == 'children'){
+			for(var i = 0; i < item.childNodes.length; ++i){
+				array.push(item.childNodes[i]);
+			}
+		} else if(item.getAttribute(attribute) !== null){
+				array.push(item.getAttribute(attribute));
+		}
+		return array; // Array
+	},
+	
+	getAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getAttributes()
+		this._assertIsItem(item);
+		var attributes = [];
+		var xmlNode = item;
+		var xmlAttributes = xmlNode.attributes;
+		for(var i = 0; i < xmlAttributes.length; ++i){
+			var xmlAttribute = xmlAttributes.item(i);
+			attributes.push(xmlAttribute.nodeName);
+		}
+		if(xmlNode.childNodes.length > 0){
+			attributes.push('children');
+		}
+		return attributes; //Array
+	},
+	
+	hasAttribute: function( /* item */ item,
+							/* attribute || attribute-name-string */ attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.hasAttribute()
+		return (this.getValues(item, attribute).length > 0); //Boolean
+	},
+	
+	containsValue: function(/* item */ item, 
+							/* attribute || attribute-name-string */ attribute, 
+							/* anything */ value){
+		//	summary: 
+		//		See dojo.data.api.Read.containsValue()
+		var regexp = undefined;
+		if(typeof value === "string"){
+		   regexp = dojo.data.util.filter.patternToRegExp(value, false);
+		}
+		return this._containsValue(item, attribute, value, regexp); //boolean.
+	},
+
+	_containsValue: function(	/* item */ item, 
+								/* attribute || attribute-name-string */ attribute, 
+								/* anything */ value,
+								/* RegExp?*/ regexp){
+		//	summary: 
+		//		Internal function for looking at the values contained by the item.
+		//	description: 
+		//		Internal function for looking at the values contained by the item.  This 
+		//		function allows for denoting if the comparison should be case sensitive for
+		//		strings or not (for handling filtering cases where string case should not matter)
+		//	
+		//	item:
+		//		The data item to examine for attribute values.
+		//	attribute:
+		//		The attribute to inspect.
+		//	value:	
+		//		The value to match.
+		//	regexp:
+		//		Optional regular expression generated off value if value was of string type to handle wildcarding.
+		//		If present and attribute values are string, then it can be used for comparison instead of 'value'
+		var values = this.getValues(item, attribute);
+		for(var i = 0; i < values.length; ++i){
+			var possibleValue = values[i];
+			if(typeof possibleValue === "string" && regexp){
+				return (possibleValue.match(regexp) !== null);
+			}else{
+				//Non-string matching.
+				if(value === possibleValue){
+					return true; // Boolean
+				}
+			}
+		}
+		return false; // Boolean
+	},
+			
+	isItem: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItem()
+		//	description:
+		//		Four things are verified to ensure that "something" is an item:
+		//		something can not be null, the nodeType must be an XML Element,
+		//		the tagName must be "outline", and the node must be a member of
+		//		XML document for this datastore. 
+		return (something && 
+				something.nodeType == 1 && 
+				something.tagName == 'outline' &&
+				something.ownerDocument === this._xmlData); //Boolean
+	},
+	
+	isItemLoaded: function(/* anything */ something){
+		//	summary: 
+		//		See dojo.data.api.Read.isItemLoaded()
+		// 		OpmlStore loads every item, so if it's an item, then it's loaded.
+		return this.isItem(something); //Boolean
+	},
+	
+	loadItem: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.loadItem()
+		//	description:
+		//		The OpmlStore always loads all items, so if it's an item, then it's loaded.
+		//		From the dojo.data.api.Read.loadItem docs:
+		//			If a call to isItemLoaded() returns true before loadItem() is even called,
+		//			then loadItem() need not do any work at all and will not even invoke the callback handlers.
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabel()
+		if(this.isItem(item)){
+			return this.getValue(item,this.label); //String
+		}
+		return undefined; //undefined
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabelAttributes()
+		return [this.label]; //array
+	},
+
+	// The dojo.data.api.Read.fetch() function is implemented as
+	// a mixin from dojo.data.util.simpleFetch.
+	// That mixin requires us to define _fetchItems().
+	_fetchItems: function(	/* Object */ keywordArgs, 
+							/* Function */ findCallback, 
+							/* Function */ errorCallback){
+		//	summary: 
+		//		See dojo.data.util.simpleFetch.fetch()
+		
+		var self = this;
+		var filter = function(requestArgs, arrayOfItems){
+			var items = null;
+			if(requestArgs.query){
+				items = [];
+				var ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false; 
+
+				//See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+				//same value for each item examined.  Much more efficient.
+				var regexpList = {};
+				for(var key in requestArgs.query){
+					var value = requestArgs.query[key];
+					if(typeof value === "string"){
+						regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
+					}
+				}
+
+				for(var i = 0; i < arrayOfItems.length; ++i){
+					var match = true;
+					var candidateItem = arrayOfItems[i];
+					for(var key in requestArgs.query){
+						var value = requestArgs.query[key];
+						if(!self._containsValue(candidateItem, key, value, regexpList[key])){
+							match = false;
+						}
+					}
+					if(match){
+						items.push(candidateItem);
+					}
+				}
+			}else{
+				// We want a copy to pass back in case the parent wishes to sort the array.  We shouldn't allow resort 
+				// of the internal list so that multiple callers can get lists and sort without affecting each other.
+				if(arrayOfItems.length> 0){
+					items = arrayOfItems.slice(0,arrayOfItems.length); 
+				}
+			}
+			findCallback(items, requestArgs);
+		};
+
+		if(this._loadFinished){
+			filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
+		}else{
+
+			//If fetches come in before the loading has finished, but while
+			//a load is in progress, we have to defer the fetching to be 
+			//invoked in the callback.
+			if(this._loadInProgress){
+				this._queuedFetches.push({args: keywordArgs, filter: filter});
+			}else{
+				if(this.url !== ""){
+					this._loadInProgress = true;
+					var getArgs = {
+							url: self.url, 
+							handleAs: "xml"
+						};
+					var getHandler = dojo.xhrGet(getArgs);
+					getHandler.addCallback(function(data){
+						self._processRawXmlTree(data);
+						filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions));
+						self._handleQueuedFetches();
+					});
+					getHandler.addErrback(function(error){
+						throw error;
+					});
+				}else if(this._opmlData){
+					this._processRawXmlTree(this._opmlData);
+					this._opmlData = null;
+					filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
+				}else{
+					throw new Error("dojox.data.OpmlStore: No OPML source data was provided as either URL or XML data input.");
+				}
+			}
+		}
+	},
+	
+	getFeatures: function(){
+		// summary: See dojo.data.api.Read.getFeatures()
+		var features = {
+			'dojo.data.api.Read': true,
+			'dojo.data.api.Identity': true
+		};
+		return features; //Object
+	},
+
+/***************************************
+     dojo.data.api.Identity API
+***************************************/
+	getIdentity: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Identity.getIdentity()
+		if(this.isItem(item)){
+			//No ther way to do this other than O(n) without
+			//complete rework of how the tree stores nodes.
+			for(var i in this._identityMap){
+				if(this._identityMap[i] === item){
+					return i;
+				}
+			}
+		}
+		return null; //null
+	},
+
+	fetchItemByIdentity: function(/* Object */ keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Identity.fetchItemByIdentity()
+
+		//Hasn't loaded yet, we have to trigger the load.
+		if(!this._loadFinished){
+			var self = this;
+			if(this.url !== ""){
+				//If fetches come in before the loading has finished, but while
+				//a load is in progress, we have to defer the fetching to be 
+				//invoked in the callback.
+				if(this._loadInProgress){
+					this._queuedFetches.push({args: keywordArgs});
+				}else{
+					this._loadInProgress = true;
+					var getArgs = {
+							url: self.url, 
+							handleAs: "xml"
+						};
+					var getHandler = dojo.xhrGet(getArgs);
+					getHandler.addCallback(function(data){
+						var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+						try{
+							self._processRawXmlTree(data);
+							var item = self._identityMap[keywordArgs.identity];
+							if(!self.isItem(item)){
+								item = null;
+							}
+							if(keywordArgs.onItem){
+								keywordArgs.onItem.call(scope, item);
+							}
+							self._handleQueuedFetches();
+						}catch(error){
+							if(keywordArgs.onError){
+								keywordArgs.onError.call(scope, error);
+							}
+						}
+					});
+					getHandler.addErrback(function(error){
+						this._loadInProgress = false;
+						if(keywordArgs.onError){
+							var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+							keywordArgs.onError.call(scope, error);
+						}
+					});
+				}
+			}else if(this._opmlData){
+				this._processRawXmlTree(this._opmlData);
+				this._opmlData = null;
+				var item = this._identityMap[keywordArgs.identity];
+				if(!self.isItem(item)){
+					item = null;
+				}
+				if(keywordArgs.onItem){
+					var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+					keywordArgs.onItem.call(scope, item);
+				}
+			}
+		}else{
+			//Already loaded.  We can just look it up and call back.
+			var item = this._identityMap[keywordArgs.identity];
+			if(!this.isItem(item)){
+				item = null;
+			}
+			if(keywordArgs.onItem){
+				var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+				keywordArgs.onItem.call(scope, item);
+			}
+		}
+	},
+
+	getIdentityAttributes: function(/* item */ item){
+		 //	summary: 
+		 //		See dojo.data.api.Identity.getIdentifierAttributes()
+		 
+		 //Identity isn't a public attribute in the item, it's the node count.
+		 //So, return null.
+		 return null;
+	},
+
+	_handleQueuedFetches: function(){
+		//	summary: 
+		//		Internal function to execute delayed request in the store.
+		//Execute any deferred fetches now.
+		if (this._queuedFetches.length > 0) {
+			for(var i = 0; i < this._queuedFetches.length; i++){
+				var fData = this._queuedFetches[i];
+				var delayedQuery = fData.args;
+				var delayedFilter = fData.filter;
+				if(delayedFilter){
+					delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions)); 
+				}else{
+					this.fetchItemByIdentity(delayedQuery);
+				}
+			}
+			this._queuedFetches = [];
+		}
+	},
+
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		 //	summary: 
+		 //		See dojo.data.api.Read.close()
+	}
+});
+//Mix in the simple fetch implementation to this class.
+dojo.extend(dojox.data.OpmlStore,dojo.data.util.simpleFetch);
+	
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/PicasaStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/PicasaStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/PicasaStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,254 @@
+if(!dojo._hasResource["dojox.data.PicasaStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.PicasaStore"] = true;
+dojo.provide("dojox.data.PicasaStore");
+
+dojo.require("dojo.data.util.simpleFetch");
+dojo.require("dojo.io.script");
+dojo.require("dojo.date.stamp");
+
+dojo.declare("dojox.data.PicasaStore", null, {
+	constructor: function(/*Object*/args){
+		//	summary:
+		//		Initializer for the PicasaStore store.  
+		//	description:
+		//		The PicasaStore is a Datastore interface to one of the basic services
+		//		of the Picasa service, the public photo feed.  This does not provide
+		//		access to all the services of Picasa.
+		//		This store cannot do * and ? filtering as the picasa service 
+		//		provides no interface for wildcards.
+		if(args && args.label){
+			this.label = args.label;
+		}
+	},
+
+	_picasaUrl: "http://picasaweb.google.com/data/feed/api/all";,
+
+	_storeRef: "_S",
+
+	label: "title",
+
+	_assertIsItem: function(/* item */ item){
+		//	summary:
+		//      This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojox.data.PicasaStore: a function was passed an item argument that was not an item");
+		}
+	},
+
+	_assertIsAttribute: function(/* attribute-name-string */ attribute){
+		//	summary:
+		//		This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		if(typeof attribute !== "string"){ 
+			throw new Error("dojox.data.PicasaStore: a function was passed an attribute argument that was not an attribute name string");
+		}
+	},
+
+	getFeatures: function(){
+		//	summary: 
+		//      See dojo.data.api.Read.getFeatures()
+		return {
+			'dojo.data.api.Read': true
+		};
+	},
+
+	getValue: function(item, attribute){
+		//	summary: 
+		//      See dojo.data.api.Read.getValue()
+		var values = this.getValues(item, attribute);
+		if(values){
+			return values[0];
+		}
+		return undefined;
+	},
+
+	getAttributes: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.getAttributes()
+		return ["id", "published", "updated", "category", "title$type", "title", "summary$type", "summary", "rights$type", "rights", "link", "author", "gphoto$id", "gphoto$name", "location"]; 
+	},
+
+	hasAttribute: function(item, attribute){
+		//	summary: 
+		//      See dojo.data.api.Read.hasAttributes()
+		if(this.getValue(item,attribute)){
+			return true;
+		}
+		return false;
+	},
+
+	isItemLoaded: function(item){
+		 //	summary: 
+		 //      See dojo.data.api.Read.isItemLoaded()
+		 return this.isItem(item);
+	},
+
+	loadItem: function(keywordArgs){
+		//	summary: 
+		//      See dojo.data.api.Read.loadItem()
+	},
+
+	getLabel: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.getLabel()
+		return this.getValue(item,this.label);
+	},
+	
+	getLabelAttributes: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.getLabelAttributes()
+		return [this.label];
+	},
+
+	containsValue: function(item, attribute, value){
+		//	summary: 
+		//      See dojo.data.api.Read.containsValue()
+		var values = this.getValues(item,attribute);
+		for(var i = 0; i < values.length; i++){
+			if(values[i] === value){
+				return true;
+			}
+		}
+		return false;
+	},
+
+	getValues: function(item, attribute){
+		//	summary: 
+		//      See dojo.data.api.Read.getValue()
+
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		if(attribute === "title"){
+			return [this._unescapeHtml(item.title)];
+		}else if(attribute === "author"){
+			return [this._unescapeHtml(item.author[0].name)];
+		}else if(attribute === "datePublished"){
+			return [dojo.date.stamp.fromISOString(item.published)];
+		}else if(attribute === "dateTaken"){
+			return [dojo.date.stamp.fromISOString(item.date_taken)];
+		}else if(attribute === "imageUrlSmall"){
+			return [item.media.thumbnail[1].url];
+		}else if(attribute === "imageUrl"){
+			return [item.content$src];
+		}else if(attribute === "imageUrlMedium"){
+			return [item.media.thumbnail[2].url];
+		}else if(attribute === "link"){
+			return [item.link[1]];
+		}else if(attribute === "tags"){
+			return item.tags.split(" ");
+		}else if(attribute === "description"){
+			return [this._unescapeHtml(item.summary)];
+		}
+		return undefined;
+	},
+
+	isItem: function(item){
+		//	summary: 
+		//      See dojo.data.api.Read.isItem()
+		if(item && item[this._storeRef] === this){
+			return true;
+		}
+		return false;
+	},
+	
+	close: function(request){
+		//	summary: 
+		//      See dojo.data.api.Read.close()
+	},
+
+	_fetchItems: function(request, fetchHandler, errorHandler){
+		//	summary:
+		//		Fetch picasa items that match to a query
+		//	request:
+		//		A request object
+		//	fetchHandler:
+		//		A function to call for fetched items
+		//	errorHandler:
+		//		A function to call on error
+
+		if(!request.query){
+			request.query={};
+		}
+
+		//Build up the content to send the request for.
+		var content = {alt: "jsonm", pp: "1", psc: "G"};
+		content['start-index'] = "1";
+		if(request.query.start){
+			content['start-index'] = request.query.start;
+		}
+		if(request.query.tags){
+			content.q = request.query.tags;
+		}
+		if(request.query.userid){
+			content.uname = request.query.userid;
+		}
+		if(request.query.userids){
+			content.ids = request.query.userids;
+		}
+		if(request.query.lang){
+			content.hl = request.query.lang;
+		}
+		if(request.count){
+			content['max-results'] = request.count;
+		}else{
+			content['max-results'] = "20";
+		}
+
+		//Linking this up to Picasa is a JOY!
+		var self = this;
+		var handle = null;
+		var myHandler = function(data){
+			if(handle !== null){
+				dojo.disconnect(handle);
+			}
+
+			//Process the items...
+			fetchHandler(self._processPicasaData(data), request);
+		};
+		var getArgs = {
+			url: this._picasaUrl,
+			// preventCache: true,
+			content: content,
+			callbackParamName: 'callback',
+			handle: myHandler
+		};
+		var deferred = dojo.io.script.get(getArgs);
+		
+		deferred.addErrback(function(error){
+			dojo.disconnect(handle);
+			errorHandler(error, request);
+		});
+	},
+
+	_processPicasaData: function(data){
+		var items = [];
+		if(data.feed){
+			items = data.feed.entry;
+			//Add on the store ref so that isItem can work.
+			for(var i = 0; i < items.length; i++){
+				var item = items[i];
+				item[this._storeRef] = this;
+			}
+		}
+		return items;
+	},
+
+	_unescapeHtml: function(str){
+		// summary: Utility function to un-escape XML special characters in an HTML string.
+		// description: Utility function to un-escape XML special characters in an HTML string.
+		// str: String.
+		//   The string to un-escape
+		// returns: HTML String converted back to the normal text (unescaped) characters (<,>,&, ", etc,).
+		//
+		//TODO: Check to see if theres already compatible escape() in dojo.string or dojo.html
+		str = str.replace(/&amp;/gm, "&").replace(/&lt;/gm, "<").replace(/&gt;/gm, ">").replace(/&quot;/gm, "\"");
+		str = str.replace(/&#39;/gm, "'"); 
+		return str;
+	}
+});
+dojo.extend(dojox.data.PicasaStore,dojo.data.util.simpleFetch);										  
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/QueryReadStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/QueryReadStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/QueryReadStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,513 @@
+if(!dojo._hasResource["dojox.data.QueryReadStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.QueryReadStore"] = true;
+dojo.provide("dojox.data.QueryReadStore");
+
+dojo.require("dojo.string");
+
+dojo.declare("dojox.data.QueryReadStore",
+	null,
+	{
+		//	summary:
+		//		This class provides a store that is mainly intended to be used
+		//		for loading data dynamically from the server, used i.e. for
+		//		retreiving chunks of data from huge data stores on the server (by server-side filtering!).
+		//		Upon calling the fetch() method of this store the data are requested from
+		//		the server if they are not yet loaded for paging (or cached).
+		//
+		//		For example used for a combobox which works on lots of data. It
+		//		can be used to retreive the data partially upon entering the
+		//		letters "ac" it returns only items like "action", "acting", etc.
+		//
+		// note:
+		//		The field name "id" in a query is reserved for looking up data
+		//		by id. This is necessary as before the first fetch, the store
+		//		has no way of knowing which field the server will declare as
+		//		identifier.
+		//
+		//	examples:
+		// |	// The parameter "query" contains the data that are sent to the server.
+		// |	var store = new dojox.data.QueryReadStore({url:'/search.php'});
+		// |	store.fetch({query:{name:'a'}, queryOptions:{ignoreCase:false}});
+		//
+		// |	// Since "serverQuery" is given, it overrules and those data are
+		// |	// sent to the server.
+		// |	var store = new dojox.data.QueryReadStore({url:'/search.php'});
+		// |	store.fetch({serverQuery:{name:'a'}, queryOptions:{ignoreCase:false}});
+		//
+		// |	<div dojoType="dojox.data.QueryReadStore"
+		// |		jsId="store2"
+		// |		url="../tests/stores/QueryReadStore.php"
+		// |		requestMethod="post"></div>
+		// |	<div dojoType="dojox.grid.data.DojoData"
+		// |		jsId="model2"
+		// |		store="store2"
+		// |		sortFields="[{attribute: 'name', descending: true}]"
+		// |		rowsPerPage="30"></div>
+		// |	<div dojoType="dojox.Grid" id="grid2"
+		// |		model="model2"
+		// |		structure="gridLayout"
+		// |		style="height:300px; width:800px;"></div>
+	
+		//
+		//	todo:
+		//		- there is a bug in the paging, when i set start:2, count:5 after an initial fetch() and doClientPaging:true
+		//		  it returns 6 elemetns, though count=5, try it in QueryReadStore.html
+		//		- add optional caching
+		//		- when the first query searched for "a" and the next for a subset of
+		//		  the first, i.e. "ab" then we actually dont need a server request, if
+		//		  we have client paging, we just need to filter the items we already have
+		//		  that might also be tooo much logic
+		
+		url:"",
+		requestMethod:"get",
+		//useCache:false,
+		
+		// We use the name in the errors, once the name is fixed hardcode it, may be.
+		_className:"dojox.data.QueryReadStore",
+		
+		// This will contain the items we have loaded from the server.
+		// The contents of this array is optimized to satisfy all read-api requirements
+		// and for using lesser storage, so the keys and their content need some explaination:
+		// 		this._items[0].i - the item itself 
+		//		this._items[0].r - a reference to the store, so we can identify the item
+		//			securly. We set this reference right after receiving the item from the
+		//			server.
+		_items:[],
+		
+		// Store the last query that triggered xhr request to the server.
+		// So we can compare if the request changed and if we shall reload 
+		// (this also depends on other factors, such as is caching used, etc).
+		_lastServerQuery:null,
+		
+		
+		// Store a hash of the last server request. Actually I introduced this
+		// for testing, so I can check if no unnecessary requests were issued for
+		// client-side-paging.
+		lastRequestHash:null,
+		
+		// summary:
+		//		By default every request for paging is sent to the server.
+		doClientPaging:false,
+	
+		// summary:
+		//		By default all the sorting is done serverside before the data is returned
+		//		which is the proper place to be doing it for really large datasets.
+		doClientSorting:false,
+	
+		// Items by identify for Identify API
+		_itemsByIdentity:null,
+		
+		// Identifier used
+		_identifier:null,
+	
+		_features: {'dojo.data.api.Read':true, 'dojo.data.api.Identity':true},
+	
+		_labelAttr: "label",
+		
+		constructor: function(/* Object */ params){
+			dojo.mixin(this,params);
+		},
+		
+		getValue: function(/* item */ item, /* attribute-name-string */ attribute, /* value? */ defaultValue){
+			//	According to the Read API comments in getValue() and exception is
+			//	thrown when an item is not an item or the attribute not a string!
+			this._assertIsItem(item);
+			if (!dojo.isString(attribute)) {
+				throw new Error(this._className+".getValue(): Invalid attribute, string expected!");
+			}
+			if(!this.hasAttribute(item, attribute)){
+				// read api says: return defaultValue "only if *item* does not have a value for *attribute*." 
+				// Is this the case here? The attribute doesn't exist, but a defaultValue, sounds reasonable.
+				if(defaultValue){
+					return defaultValue;
+				}
+				console.log(this._className+".getValue(): Item does not have the attribute '"+attribute+"'.");
+			}
+			return item.i[attribute];
+		},
+		
+		getValues: function(/* item */ item, /* attribute-name-string */ attribute){
+			this._assertIsItem(item);
+			var ret = [];
+			if(this.hasAttribute(item, attribute)){
+				ret.push(item.i[attribute]);
+			}
+			return ret;
+		},
+		
+		getAttributes: function(/* item */ item){
+			this._assertIsItem(item);
+			var ret = [];
+			for(var i in item.i){
+				ret.push(i);
+			}
+			return ret;
+		},
+	
+		hasAttribute: function(/* item */ item,	/* attribute-name-string */ attribute) {
+			//	summary: 
+			//		See dojo.data.api.Read.hasAttribute()
+			return this.isItem(item) && typeof item.i[attribute]!="undefined";
+		},
+		
+		containsValue: function(/* item */ item, /* attribute-name-string */ attribute, /* anything */ value){
+			var values = this.getValues(item, attribute);
+			var len = values.length;
+			for(var i=0; i<len; i++){
+				if(values[i]==value){
+					return true;
+				}
+			}
+			return false;
+		},
+		
+		isItem: function(/* anything */ something){
+			// Some basic tests, that are quick and easy to do here.
+			// >>> var store = new dojox.data.QueryReadStore({});
+			// >>> store.isItem("");
+			// false
+			//
+			// >>> var store = new dojox.data.QueryReadStore({});
+			// >>> store.isItem({});
+			// false
+			//
+			// >>> var store = new dojox.data.QueryReadStore({});
+			// >>> store.isItem(0);
+			// false
+			//
+			// >>> var store = new dojox.data.QueryReadStore({});
+			// >>> store.isItem({name:"me", label:"me too"});
+			// false
+			//
+			if(something){
+				return typeof something.r!="undefined" && something.r==this;
+			}
+			return false;
+		},
+		
+		isItemLoaded: function(/* anything */ something) {
+			// Currently we dont have any state that tells if an item is loaded or not
+			// if the item exists its also loaded.
+			// This might change when we start working with refs inside items ...
+			return this.isItem(something);
+		},
+	
+		loadItem: function(/* object */ args){
+			if(this.isItemLoaded(args.item)){
+				return;
+			}
+			// Actually we have nothing to do here, or at least I dont know what to do here ...
+		},
+	
+		fetch:function(/* Object? */ request){
+			//	summary:
+			//		See dojo.data.util.simpleFetch.fetch() this is just a copy and I adjusted
+			//		only the paging, since it happens on the server if doClientPaging is
+			//		false, thx to http://trac.dojotoolkit.org/ticket/4761 reporting this.
+			//		Would be nice to be able to use simpleFetch() to reduce copied code,
+			//		but i dont know how yet. Ideas please!
+			request = request || {};
+			if(!request.store){
+				request.store = this;
+			}
+			var self = this;
+		
+			var _errorHandler = function(errorData, requestObject){
+				if(requestObject.onError){
+					var scope = requestObject.scope || dojo.global;
+					requestObject.onError.call(scope, errorData, requestObject);
+				}
+			};
+		
+			var _fetchHandler = function(items, requestObject, numRows){
+				var oldAbortFunction = requestObject.abort || null;
+				var aborted = false;
+				
+				var startIndex = requestObject.start?requestObject.start:0;
+				if (self.doClientPaging==false) {
+					// For client paging we dont need no slicing of the result.
+					startIndex = 0;
+				}
+				var endIndex   = requestObject.count?(startIndex + requestObject.count):items.length;
+		
+				requestObject.abort = function(){
+					aborted = true;
+					if(oldAbortFunction){
+						oldAbortFunction.call(requestObject);
+					}
+				};
+		
+				var scope = requestObject.scope || dojo.global;
+				if(!requestObject.store){
+					requestObject.store = self;
+				}
+				if(requestObject.onBegin){
+					requestObject.onBegin.call(scope, numRows, requestObject);
+				}
+				if(requestObject.sort && this.doClientSorting){
+					items.sort(dojo.data.util.sorter.createSortFunction(requestObject.sort, self));
+				}
+				if(requestObject.onItem){
+					for(var i = startIndex; (i < items.length) && (i < endIndex); ++i){
+						var item = items[i];
+						if(!aborted){
+							requestObject.onItem.call(scope, item, requestObject);
+						}
+					}
+				}
+				if(requestObject.onComplete && !aborted){
+					var subset = null;
+					if (!requestObject.onItem) {
+						subset = items.slice(startIndex, endIndex);
+					}
+					requestObject.onComplete.call(scope, subset, requestObject);   
+				}
+			};
+			this._fetchItems(request, _fetchHandler, _errorHandler);
+			return request;	// Object
+		},
+	
+		getFeatures: function(){
+			return this._features;
+		},
+	
+		close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+			// I have no idea if this is really needed ... 
+		},
+	
+		getLabel: function(/* item */ item){
+			//	summary:
+			//		See dojo.data.api.Read.getLabel()
+			if(this._labelAttr && this.isItem(item)){
+				return this.getValue(item, this._labelAttr); //String
+			}
+			return undefined; //undefined
+		},
+	
+		getLabelAttributes: function(/* item */ item){
+			//	summary:
+			//		See dojo.data.api.Read.getLabelAttributes()
+			if(this._labelAttr){
+				return [this._labelAttr]; //array
+			}
+			return null; //null
+		},
+		
+		_fetchItems: function(request, fetchHandler, errorHandler){
+			//	summary:
+			// 		The request contains the data as defined in the Read-API.
+			// 		Additionally there is following keyword "serverQuery".
+			//
+			//	The *serverQuery* parameter, optional.
+			//		This parameter contains the data that will be sent to the server.
+			//		If this parameter is not given the parameter "query"'s
+			//		data are sent to the server. This is done for some reasons:
+			//		- to specify explicitly which data are sent to the server, they
+			//		  might also be a mix of what is contained in "query", "queryOptions"
+			//		  and the paging parameters "start" and "count" or may be even
+			//		  completely different things.
+			//		- don't modify the request.query data, so the interface using this
+			//		  store can rely on unmodified data, as the combobox dijit currently
+			//		  does it, it compares if the query has changed
+			//		- request.query is required by the Read-API
+			//
+			// 		I.e. the following examples might be sent via GET:
+			//		  fetch({query:{name:"abc"}, queryOptions:{ignoreCase:true}})
+			//		  the URL will become:   /url.php?name=abc
+			//
+			//		  fetch({serverQuery:{q:"abc", c:true}, query:{name:"abc"}, queryOptions:{ignoreCase:true}})
+			//		  the URL will become:   /url.php?q=abc&c=true
+			//		  // The serverQuery-parameter has overruled the query-parameter
+			//		  // but the query parameter stays untouched, but is not sent to the server!
+			//		  // The serverQuery contains more data than the query, so they might differ!
+			//
+	
+			var serverQuery = request.serverQuery || request.query || {};
+			//Need to add start and count
+			if(!this.doClientPaging){
+				serverQuery.start = request.start || 0;
+				// Count might not be sent if not given.
+				if (request.count) {
+					serverQuery.count = request.count;
+				}
+			}
+			if(!this.doClientSorting){
+				if(request.sort){
+					var sort = request.sort[0];
+					if(sort && sort.attribute){
+						var sortStr = sort.attribute;
+						if(sort.descending){
+							sortStr = "-" + sortStr;
+						}
+						serverQuery.sort = sortStr;
+					}
+				}
+			}
+			// Compare the last query and the current query by simply json-encoding them,
+			// so we dont have to do any deep object compare ... is there some dojo.areObjectsEqual()???
+			if(this.doClientPaging && this._lastServerQuery!==null &&
+				dojo.toJson(serverQuery)==dojo.toJson(this._lastServerQuery)
+				){
+				fetchHandler(this._items, request);
+			}else{
+				var xhrFunc = this.requestMethod.toLowerCase()=="post" ? dojo.xhrPost : dojo.xhrGet;
+				var xhrHandler = xhrFunc({url:this.url, handleAs:"json-comment-optional", content:serverQuery});
+				xhrHandler.addCallback(dojo.hitch(this, function(data){
+					data = this._filterResponse(data);
+					if (data.label){
+						this._labelAttr = data.label;
+					}
+					var numRows = data.numRows || -1;
+	
+					this._items = [];
+					// Store a ref to "this" in each item, so we can simply check if an item
+					// really origins form here (idea is from ItemFileReadStore, I just don't know
+					// how efficient the real storage use, garbage collection effort, etc. is).
+					dojo.forEach(data.items,function(e){ 
+						this._items.push({i:e, r:this}); 
+					},this); 
+					
+					var identifier = data.identifier;
+					this._itemsByIdentity = {};
+					if(identifier){
+						this._identifier = identifier;
+						for(i = 0; i < this._items.length; ++i){
+							var item = this._items[i].i;
+							var identity = item[identifier];
+							if(!this._itemsByIdentity[identity]){
+								this._itemsByIdentity[identity] = item;
+							}else{
+								throw new Error(this._className+":  The json data as specified by: [" + this.url + "] is malformed.  Items within the list have identifier: [" + identifier + "].  Value collided: [" + identity + "]");
+							}
+						}
+					}else{
+						this._identifier = Number;
+						for(i = 0; i < this._items.length; ++i){
+							this._items[i].n = i;
+						}
+					}
+					
+					// TODO actually we should do the same as dojo.data.ItemFileReadStore._getItemsFromLoadedData() to sanitize
+					// (does it really sanititze them) and store the data optimal. should we? for security reasons???
+					numRows = (numRows === -1) ? this._items.length : numRows;
+					fetchHandler(this._items, request, numRows);
+				}));
+				xhrHandler.addErrback(function(error){
+					errorHandler(error, request);
+				});
+				// Generate the hash using the time in milliseconds and a randon number.
+				// Since Math.randon() returns something like: 0.23453463, we just remove the "0."
+				// probably just for esthetic reasons :-).
+				this.lastRequestHash = new Date().getTime()+"-"+String(Math.random()).substring(2);
+				this._lastServerQuery = dojo.mixin({}, serverQuery);
+			}
+		},
+		
+		_filterResponse: function(data){
+			//	summary:
+			//		If the data from servers needs to be processed before it can be processed by this
+			//		store, then this function should be re-implemented in subclass. This default 
+			//		implementation just return the data unchanged.
+			//	data:
+			//		The data received from server
+			return data;
+		},
+	
+		_assertIsItem: function(/* item */ item){
+			//	summary:
+			//		It throws an error if item is not valid, so you can call it in every method that needs to
+			//		throw an error when item is invalid.
+			//	item: 
+			//		The item to test for being contained by the store.
+			if(!this.isItem(item)){
+				throw new Error(this._className+": Invalid item argument.");
+			}
+		},
+	
+		_assertIsAttribute: function(/* attribute-name-string */ attribute){
+			//	summary:
+			//		This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+			//	attribute: 
+			//		The attribute to test for being contained by the store.
+			if(typeof attribute !== "string"){ 
+				throw new Error(this._className+": Invalid attribute argument ('"+attribute+"').");
+			}
+		},
+	
+		fetchItemByIdentity: function(/* Object */ keywordArgs){
+			//	summary: 
+			//		See dojo.data.api.Identity.fetchItemByIdentity()
+	
+			// See if we have already loaded the item with that id
+			// In case there hasn't been a fetch yet, _itemsByIdentity is null
+			// and thus a fetch will be triggered below.
+			if(this._itemsByIdentity){
+				var item = this._itemsByIdentity[keywordArgs.identity];
+				if(!(item === undefined)){
+					if(keywordArgs.onItem){
+						var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+						keywordArgs.onItem.call(scope, {i:item, r:this});
+					}
+					return;
+				}
+			}
+	
+			// Otherwise we need to go remote
+			// Set up error handler
+			var _errorHandler = function(errorData, requestObject){
+				var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+				if(keywordArgs.onError){
+					keywordArgs.onError.call(scope, error);
+				}
+			};
+			
+			// Set up fetch handler
+			var _fetchHandler = function(items, requestObject){
+				var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;
+				try{
+					// There is supposed to be only one result
+					var item = null;
+					if(items && items.length == 1){
+						item = items[0];
+					}
+					
+					// If no item was found, item is still null and we'll
+					// fire the onItem event with the null here
+					if(keywordArgs.onItem){
+						keywordArgs.onItem.call(scope, item);
+					}
+				}catch(error){
+					if(keywordArgs.onError){
+						keywordArgs.onError.call(scope, error);
+					}
+				}
+			};
+			
+			// Construct query
+			var request = {serverQuery:{id:keywordArgs.identity}};
+			
+			// Dispatch query
+			this._fetchItems(request, _fetchHandler, _errorHandler);
+		},
+		
+		getIdentity: function(/* item */ item){
+			//	summary: 
+			//		See dojo.data.api.Identity.getIdentity()
+			var identifier = null;
+			if(this._identifier === Number){
+				identifier = item.n; // Number
+			}else{
+				identifier = item.i[this._identifier];
+			}
+			return identifier;
+		},
+		
+		getIdentityAttributes: function(/* item */ item){
+			//	summary:
+			//		See dojo.data.api.Identity.getIdentityAttributes()
+			return [this._identifier];
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,89 @@
+-------------------------------------------------------------------------------
+DojoX Data
+-------------------------------------------------------------------------------
+Version 1.1
+Release date: 03/18/2008
+-------------------------------------------------------------------------------
+Project state: stable
+-------------------------------------------------------------------------------
+Project authors
+	Jared Jurkiewicz (jared.jurkiewicz@xxxxxxxxx)
+	Shane O'Sullivan (shaneosullivan1@xxxxxxxxx) (FlickrRestStore, AtomReadStore)
+	Wolfram Kriesing (wolfram@xxxxxxxxxxx) (QueryReadStore)
+	Dustin Machi (dmachi@xxxxxxxxxxxxxx) (jsonPathStore);
+	Russell Jones (KeyValueStore) (CLA)
+	Benjamin Schell (KeyValueStore) (Corporate CLA)
+	Kurt Stutsman (kurt@xxxxxxxxxxxxx) (SnapLogicStore)
+
+-------------------------------------------------------------------------------
+Project description
+
+The DojoX Data project is a container for extensions and extra example stores
+that implement the dojo.data APIs.  It may also contain utility functions for
+working with specific types of data.
+
+-------------------------------------------------------------------------------
+Dependencies:
+
+DojoX Data has dependencies on core dojo (dojo.data) and the D.O.H. unit test 
+framework.
+-------------------------------------------------------------------------------
+Documentation:
+
+See the Dojo API tool (http://dojotoolkit.org/api)
+-------------------------------------------------------------------------------
+Contributions:
+
+For contributions to be committed into the dojox repository, the datastore 
+should have basic unit tests that exercise the API's that the store declares it
+implements.  Documentation and demos are a plus, but unit tests are required
+to be committed into this sub-package.  This is necessary to help keep the 
+provided datastores as stable as possible.
+
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/data/*
+
+Install into the following directory structure:
+/dojox/data/
+
+...which should be at the same level as your Dojo checkout.
+
+/dojox/data/*
+
+Require in the dojox.data stores you wish to use.
+-------------------------------------------------------------------------------
+Additional Notes: 
+	dojox.data.AtomReadStore - Reads Atom XML documents.
+
+	dojox.data.CvsStore - comma-separated (spreadsheet output)
+	datastore implementation 
+	
+	dojox.data.FlickrRestStore - advanced version of: dojox.data.FlickrStore 
+	(Caching + user key support) 
+	
+	dojox.data.FlickrStore - data store driven by Flickr.com public API. 
+	
+	dojox.data.HtmlTableStore - Implementation of an HTML Table reading 
+	datastore
+	
+	dojox.data.HtmlStore - Implementation of an HTML reading datastore.  Can 
+	handle tables, ordered and un-ordered lists, and lists of divs.
+	
+	dojox.data.OpmlStore - Store for reading OMPL formatted data
+	
+	dojox.data.XmlStore - datastore for XML based services or  
+	documents.
+
+	dojox.data.QueryReadStore - datastore to provide serverside URL query
+	matching.  Similar to the 0.4.X ComboBox dataUrl parameter.	         
+
+	dojox.data.jsonPathStore - datastore that takes an arbitrary js object
+	and uses it as the store. Pre-Alpha at the moment.
+
+	dojox.data.KeyValueStore - datastore that mimics a key/value property
+	file format.
+
+	dojox.data.SnapLogicStore - Store to interface to SnapLogic data services.

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/SnapLogicStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/SnapLogicStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/SnapLogicStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,332 @@
+if(!dojo._hasResource["dojox.data.SnapLogicStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.SnapLogicStore"] = true;
+dojo.provide("dojox.data.SnapLogicStore");
+
+dojo.require("dojo.io.script");
+dojo.require("dojo.data.util.sorter");
+
+dojo.declare("dojox.data.SnapLogicStore", null, {
+	Parts: {
+		DATA: "data",
+		COUNT: "count"
+	},
+
+	url: "",
+
+	constructor: function(/* Object */args){
+		//	summary:
+		//		Initialize a SnapLogicStore object.
+		//	args:
+		//		An object that contains properties for initializing the new data store object. The
+		//		following properties are understood:
+		//			url:
+		//				A URL to the SnapLogic pipeline's output routed through PipeToHttp. Typically, this
+		//				will look like "http://<server-host>:<port>/pipe/<pipeline-url>/<pipeline-output-view>".
+		//			parameters:
+		//				An object whose properties define parameters to the pipeline. The values of these
+		//				properties will be sent to the pipeline as parameters when it run.
+		//
+		if(args.url){
+			this.url = args.url;
+		}
+		this._parameters = args.parameters;
+	},
+
+	_assertIsItem: function(/* item */item){
+		//	summary:
+		//		This function tests whether the item passed in is indeed an item in the store.
+		//	item: 
+		//		The item to test for being contained by the store.
+		if(!this.isItem(item)){ 
+			throw new Error("dojox.data.SnapLogicStore: a function was passed an item argument that was not an item");
+		}
+	},
+
+	_assertIsAttribute: function(/* attribute-name-string */ attribute){
+		//	summary:
+		//		This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+		//	attribute: 
+		//		The attribute to test for being contained by the store.
+		if(typeof attribute !== "string"){ 
+			throw new Error("dojox.data.SnapLogicStore: a function was passed an attribute argument that was not an attribute name string");
+		}
+	},
+
+	getFeatures: function(){
+		//	summary: 
+		//		See dojo.data.api.Read.getFeatures()
+		return {
+			'dojo.data.api.Read': true
+		};
+	},
+
+	getValue: function(item, attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.getValue()
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		i = dojo.indexOf(item.attributes, attribute);
+		if(i !== -1){
+			return item.values[i];
+		}
+		return undefined;
+	},
+
+	getAttributes: function(item){
+		//	summary: 
+		//		See dojo.data.api.Read.getAttributes()
+		this._assertIsItem(item);
+		return item.attributes;
+	},
+
+	hasAttribute: function(item, attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.hasAttributes()
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		for(var i = 0; i < item.attributes.length;  ++i){
+			if(attribute == item.attributes[i]){
+				return true;
+			}
+		}
+		return false;
+	},
+
+	isItemLoaded: function(item){
+		 //	summary: 
+		 //		 See dojo.data.api.Read.isItemLoaded()
+		 return this.isItem(item);		// Boolean
+	},
+
+	loadItem: function(keywordArgs){
+		//	summary: 
+		//		See dojo.data.api.Read.loadItem()
+	},
+
+	getLabel: function(item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabel()
+		return undefined;
+	},
+	
+	getLabelAttributes: function(item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabelAttributes()
+		return null;
+	},
+
+	containsValue: function(item, attribute, value){
+		//	summary: 
+		//		See dojo.data.api.Read.containsValue()
+		return this.getValue(item, attribute) === value;		// Boolean
+	},
+
+	getValues: function(item, attribute){
+		//	summary: 
+		//		See dojo.data.api.Read.getValue()
+		this._assertIsItem(item);
+		this._assertIsAttribute(attribute);
+		i = dojo.indexOf(item.attributes, attribute);
+		if(i !== -1){
+			return [item.values[i]];	// Array
+		}
+		return undefined;
+	},
+
+	isItem: function(item){
+		//	summary: 
+		//		See dojo.data.api.Read.isItem()
+		if(item && item._store === this){
+			return true;
+		}
+		return false;
+	},
+	
+	close: function(request){
+		//	summary: 
+		//		See dojo.data.api.Read.close()
+	},
+
+	_fetchHandler: function(/* Object */request){
+		//	summary: 
+		//		Process data retrieved via fetch and send it back to requester.
+		//	response:
+		//		The data returend from the I/O transport. In the normal case, it will be an array of result rows
+		//		from the pipeline. In the special case for record count optimization, response will be an array
+		//		with a single element containing the total pipeline result row count. See fetch() for details
+		//		on this optimization.
+
+		var scope = request.scope || dojo.global;
+
+		if(request.onBegin){
+			// Check for the record count optimization
+			request.onBegin.call(scope, request._countResponse[0], request);
+		}
+		
+		if(request.onItem || request.onComplete){
+			response = request._dataResponse;
+
+			if (!response.length){
+				request.onError.call(scope, 
+									 new Error("dojox.data.SnapLogicStore: invalid response of length 0"),
+									 request);
+				return;
+			}else if(request.query != 'record count'){
+				//If this was not a record count request, the first element returned will contain
+				//the field names.
+				field_names = response.shift();
+				
+				var items = [];
+				for(var i = 0; i < response.length; ++i){
+					if(request._aborted){
+						break;
+					}
+
+					items.push({attributes: field_names, values: response[i], _store: this});
+				}
+
+				if(request.sort && !request._aborted){
+					items.sort(dojo.data.util.sorter.createSortFunction(request.sort, self));
+				}
+			}else{
+				//This is a record count request, so manually set the field names.
+				items = [({attributes: ['count'], values: response, _store: this})];
+			}
+
+			if(request.onItem){
+				for(var i = 0; i < items.length; ++i){
+					if (request._aborted) {
+						break;
+					}
+					request.onItem.call(scope, items[i], request);
+				}
+				items = null;
+			}
+
+			if(request.onComplete && !request._aborted){
+				request.onComplete.call(scope, items, request);
+			}
+		}
+	},
+		
+	_partHandler: function(/* Object */request, /* String */part, /* Object */response){
+		//	summary: 
+		//		Handle the individual replies for both data and length requests.
+		//	request:
+		//		The request/handle object used with the original fetch() call.
+		//  part:
+		//		A value indicating which request this handler call is for (this.Parts).
+		//	response:
+		//		Response received from the underlying IO transport.
+
+		if(response instanceof Error){
+			if(part == this.Parts.DATA){
+				request._dataHandle = null;
+			}else{
+				request._countHandle = null;
+			}
+			request._aborted = true;
+			if(request.onError){
+				request.onError.call(request.scope, response, request);
+			}
+		}else{
+			if(request._aborted){
+				return;
+			}
+			if(part == this.Parts.DATA){
+				request._dataResponse = response;
+			}else{
+				request._countResponse = response;
+			}
+			if((!request._dataHandle || request._dataResponse !== null) && 
+			   (!request._countHandle || request._countResponse !== null)){
+				this._fetchHandler(request);
+			}
+		}
+	},
+
+	fetch: function(/* Object */request){
+		//	summary: 
+		//		See dojo.data.api.Read.close()
+		//	request:
+		//		See dojo.data.api.Read.close() for generic interface.
+		//
+		//		In addition to the standard Read API fetch support, this store supports an optimization for
+		//		for retrieving the total count of records in the Pipeline without retrieving the data. To
+		//		use this optimization, simply provide an onBegin handler without an onItem or onComplete handler.
+
+		request._countResponse = null;
+		request._dataResponse = null;
+		request._aborted = false;
+		request.abort = function(){
+			if(!request._aborted){
+				request._aborted = true;
+				if(request._dataHandle && request._dataHandle.cancel){
+					request._dataHandle.cancel();
+				}
+				if(request._countHandle && request._countHandle.cancel){
+					request._countHandle.cancel();
+				}
+			}
+		};
+
+		// Only make the call for data if onItem or onComplete is used. Otherwise, onBegin will only
+	    // require the total row count.
+		if(request.onItem || request.onComplete){
+			var content = this._parameters || {};
+			if(request.start){
+				if(request.start < 0){
+					throw new Error("dojox.data.SnapLogicStore: request start value must be 0 or greater");
+				}
+				content['sn.start'] = request.start + 1;
+			}
+			if(request.count){
+				if(request.count < 0){
+					throw new Error("dojox.data.SnapLogicStore: request count value 0 or greater");
+				}
+				content['sn.limit'] = request.count;
+			}
+			
+			content['sn.content_type'] = 'application/javascript';
+
+			var store = this;
+			var handler = function(response, ioArgs){
+				if(response instanceof Error){
+					store._fetchHandler(response, request);
+				}
+			};
+
+			var getArgs = {
+				url: this.url,
+				content: content,
+				// preventCache: true,
+				timeout: 60000,								//Starting a pipeline can take a long time.
+				callbackParamName: "sn.stream_header",
+				handle: dojo.hitch(this, "_partHandler", request, this.Parts.DATA)
+			};
+
+			request._dataHandle = dojo.io.script.get(getArgs);
+		}
+		
+		if(request.onBegin){
+			var content = {};
+			content['sn.count'] = 'records';
+			content['sn.content_type'] = 'application/javascript';
+
+			var getArgs = {
+				url: this.url,
+				content: content,
+				timeout: 60000,
+				callbackParamName: "sn.stream_header",
+				handle: dojo.hitch(this, "_partHandler", request, this.Parts.COUNT)
+			};
+
+			request._countHandle = dojo.io.script.get(getArgs);
+		}
+			
+		return request;			// Object
+	}
+});
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/XmlStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/XmlStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/XmlStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,1141 @@
+if(!dojo._hasResource["dojox.data.XmlStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.XmlStore"] = true;
+dojo.provide("dojox.data.XmlStore");
+dojo.provide("dojox.data.XmlItem");
+
+dojo.require("dojo.data.util.simpleFetch");
+dojo.require("dojo.data.util.filter");
+dojo.require("dojox.data.dom");
+
+dojo.declare("dojox.data.XmlStore", null, {
+	//	summary:
+	//		A data store for XML based services or documents
+	//	description:
+	//		A data store for XML based services or documents
+	
+	constructor: function(/* object */ args) {
+		//	summary:
+		//		Constructor for the XML store.  
+		//	args:
+		//		An anonymous object to initialize properties.  It expects the following values:
+		//		url:		The url to a service or an XML document that represents the store
+		//		rootItem:	A tag name for root items
+		//		keyAttribute:	An attribute name for a key or an indentify
+		// 		attributeMap:   An anonymous object contains properties for attribute mapping,
+		//						{"tag_name.item_attribute_name": "@xml_attribute_name", ...}
+		//		sendQuery:		A boolean indicate to add a query string to the service URL 
+		console.log("XmlStore()");
+		if(args){
+			this.url = args.url;
+			this.rootItem = (args.rootItem || args.rootitem || this.rootItem);
+			this.keyAttribute = (args.keyAttribute || args.keyattribute || this.keyAttribute);
+			this._attributeMap = (args.attributeMap || args.attributemap);
+			this.label = args.label || this.label;
+			this.sendQuery = (args.sendQuery || args.sendquery || this.sendQuery);
+		}
+		this._newItems = [];
+		this._deletedItems = [];
+		this._modifiedItems = [];
+	},
+
+	//Values that may be set by the parser.  
+	//Ergo, have to be instantiated to something
+	//So the parser knows how to set them.
+	url: "",
+
+	rootItem: "",
+
+	keyAttribute: "",
+
+	label: "",
+
+	sendQuery: false,
+
+/* dojo.data.api.Read */
+
+	getValue: function(/* item */ item, /* attribute || attribute-name-string */ attribute, /* value? */ defaultValue){
+		//	summary:
+		//		Return an attribute value
+		//	description:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//		If 'attribute' specifies "tagName", the tag name of the element is
+		//		returned.
+		//		If 'attribute' specifies "childNodes", the first element child is
+		//		returned.
+		//		If 'attribute' specifies "text()", the value of the first text
+		//		child is returned.
+		//		For generic attributes, if '_attributeMap' is specified,
+		//		an actual attribute name is looked up with the tag name of
+		//		the element and 'attribute' (concatenated with '.').
+		//		Then, if 'attribute' starts with "@", the value of the XML
+		//		attribute is returned.
+		//		Otherwise, the first child element of the tag name specified with
+		//		'attribute' is returned.
+		//	item:
+		//		An XML element that holds the attribute
+		//	attribute:
+		//		A tag name of a child element, An XML attribute name or one of
+		// 		special names
+		//	defaultValue:
+		//		A default value
+		//	returns:
+		//		An attribute value found, otherwise 'defaultValue'
+		var element = item.element;
+		if(attribute === "tagName"){
+			return element.nodeName;
+		}else if (attribute === "childNodes"){
+			for (var i = 0; i < element.childNodes.length; i++) {
+				var node = element.childNodes[i];
+				if (node.nodeType === 1 /*ELEMENT_NODE*/) {
+					return this._getItem(node); //object
+				}
+			}
+			return defaultValue;
+		}else if(attribute === "text()"){
+			for(var i = 0; i < element.childNodes.length; i++){
+				var node = element.childNodes[i];
+				if(node.nodeType === 3 /*TEXT_NODE*/ ||
+					node.nodeType === 4 /*CDATA_SECTION_NODE*/){
+					return node.nodeValue; //string
+				}
+			}
+			return defaultValue;
+		}else{
+			attribute = this._getAttribute(element.nodeName, attribute);
+			if(attribute.charAt(0) === '@'){
+				var name = attribute.substring(1);
+				var value = element.getAttribute(name);
+				return (value !== undefined) ? value : defaultValue; //object
+			}else{
+				for(var i = 0; i < element.childNodes.length; i++){
+					var node = element.childNodes[i];
+					if(	node.nodeType === 1 /*ELEMENT_NODE*/ &&
+						node.nodeName === attribute){
+						return this._getItem(node); //object
+					}
+				}
+				return defaultValue; //object
+			}
+		}
+	},
+
+	getValues: function(/* item */ item, /* attribute || attribute-name-string */ attribute){
+		//	summary:
+		//		Return an array of attribute values
+		//	description:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//		If 'attribute' specifies "tagName", the tag name of the element is
+		//		returned.
+		//		If 'attribute' specifies "childNodes", child elements are returned.
+		//		If 'attribute' specifies "text()", the values of child text nodes
+		//		are returned.
+		//		For generic attributes, if '_attributeMap' is specified,
+		//		an actual attribute name is looked up with the tag name of
+		//		the element and 'attribute' (concatenated with '.').
+		//		Then, if 'attribute' starts with "@", the value of the XML
+		//		attribute is returned.
+		//		Otherwise, child elements of the tag name specified with
+		//		'attribute' are returned.
+		//	item:
+		//		An XML element that holds the attribute
+		//	attribute:
+		//		A tag name of child elements, An XML attribute name or one of
+		//		special names
+		//	returns:
+		//		An array of attribute values found, otherwise an empty array
+		var element = item.element;
+		if(attribute === "tagName"){
+			return [element.nodeName];
+		}else if(attribute === "childNodes"){
+			var values = [];
+			for(var i = 0; i < element.childNodes.length; i++){
+				var node = element.childNodes[i];
+				if(node.nodeType === 1 /*ELEMENT_NODE*/){
+					values.push(this._getItem(node));
+				}
+			}
+			return values; //array
+		}else if(attribute === "text()"){
+			var values = [];
+			for(var i = 0; i < element.childNodes.length; i++){
+				var node = childNodes[i];
+				if(node.nodeType === 3){
+					values.push(node.nodeValue);
+				}
+			}
+			return values; //array
+		}else{
+			attribute = this._getAttribute(element.nodeName, attribute);
+			if(attribute.charAt(0) === '@'){
+				var name = attribute.substring(1);
+				var value = element.getAttribute(name);
+				return (value !== undefined) ? [value] : []; //array
+			}else{
+				var values = [];
+				for(var i = 0; i < element.childNodes.length; i++){
+					var node = element.childNodes[i];
+					if(	node.nodeType === 1 /*ELEMENT_NODE*/ &&
+						node.nodeName === attribute){
+						values.push(this._getItem(node));
+					}
+				}
+				return values; //array
+			}
+		}
+	},
+
+	getAttributes: function(/* item */ item) {
+		//	summary:
+		//		Return an array of attribute names
+		// 	description:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//		tag names of child elements and XML attribute names of attributes
+		//		specified to the element are returned along with special attribute
+		//		names applicable to the element including "tagName", "childNodes"
+		//		if the element has child elements, "text()" if the element has
+		//		child text nodes, and attribute names in '_attributeMap' that match
+		//		the tag name of the element.
+		//	item:
+		//		An XML element
+		//	returns:
+		//		An array of attributes found
+		var element = item.element;
+		var attributes = [];
+		attributes.push("tagName");
+		if(element.childNodes.length > 0){
+			var names = {};
+			var childNodes = true;
+			var text = false;
+			for(var i = 0; i < element.childNodes.length; i++){
+				var node = element.childNodes[i];
+				if (node.nodeType === 1 /*ELEMENT_NODE*/) {
+					var name = node.nodeName;
+					if(!names[name]){
+						attributes.push(name);
+						names[name] = name;
+					}
+					childNodes = true;
+				}else if(node.nodeType === 3){
+					text = true;
+				}
+			}
+			if(childNodes){
+				attributes.push("childNodes");
+			}
+			if(text){
+				attributes.push("text()");
+			}
+		}
+		for(var i = 0; i < element.attributes.length; i++){
+			attributes.push("@" + element.attributes[i].nodeName);
+		}
+		if(this._attributeMap){
+			for (var key in this._attributeMap){
+				var i = key.indexOf('.');
+				if(i > 0){
+					var tagName = key.substring(0, i);
+					if (tagName === element.nodeName){
+						attributes.push(key.substring(i + 1));
+					}
+				}else{ // global attribute
+					attributes.push(key);
+				}
+			}
+		}
+		return attributes; //array
+	},
+
+	hasAttribute: function(/* item */ item, /* attribute || attribute-name-string */ attribute){
+		//	summary:
+		//		Check whether an element has the attribute
+		//	item:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//	attribute:
+		//		A tag name of a child element, An XML attribute name or one of
+		//		special names
+		//	returns:
+		//		True if the element has the attribute, otherwise false
+		return (this.getValue(item, attribute) !== undefined); //boolean
+	},
+
+	containsValue: function(/* item */ item, /* attribute || attribute-name-string */ attribute, /* anything */ value){
+		//	summary:
+		//		Check whether the attribute values contain the value
+		//	item:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//	attribute:
+		//		A tag name of a child element, An XML attribute name or one of
+		//		special names
+		//	returns:
+		//		True if the attribute values contain the value, otherwise false
+		var values = this.getValues(item, attribute);
+		for(var i = 0; i < values.length; i++){
+			if((typeof value === "string")){
+				if(values[i].toString && values[i].toString() === value){
+					return true;
+				}
+			}else if (values[i] === value){
+				return true; //boolean
+			}
+		}
+		return false;//boolean
+	},
+
+	isItem: function(/* anything */ something){
+		//	summary:
+		//		Check whether the object is an item (XML element)
+		//	item:
+		//		An object to check
+		// 	returns:
+		//		True if the object is an XML element, otherwise false
+		if(something && something.element && something.store && something.store === this){
+			return true; //boolean
+		}
+		return false; //boolran
+	},
+
+	isItemLoaded: function(/* anything */ something){
+		//	summary:
+		//		Check whether the object is an item (XML element) and loaded
+		//	item:
+		//		An object to check
+		//	returns:
+		//		True if the object is an XML element, otherwise false
+		return this.isItem(something); //boolean
+	},
+
+	loadItem: function(/* object */ keywordArgs){
+		//	summary:
+		//		Load an item (XML element)
+		//	keywordArgs:
+		//		object containing the args for loadItem.  See dojo.data.api.Read.loadItem()
+	},
+
+	getFeatures: function() {
+		//	summary:
+		//		Return supported data APIs
+		//	returns:
+		//		"dojo.data.api.Read" and "dojo.data.api.Write"
+		var features = {
+			"dojo.data.api.Read": true,
+			"dojo.data.api.Write": true
+		};
+		return features; //array
+	},
+
+	getLabel: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabel()
+		if((this.label !== "") && this.isItem(item)){
+			var label = this.getValue(item,this.label);
+			if(label){
+				return label.toString();
+			}
+		}
+		return undefined; //undefined
+	},
+
+	getLabelAttributes: function(/* item */ item){
+		//	summary: 
+		//		See dojo.data.api.Read.getLabelAttributes()
+		if(this.label !== ""){
+			return [this.label]; //array
+		}
+		return null; //null
+	},
+
+	_fetchItems: function(request, fetchHandler, errorHandler) {
+		//	summary:
+		//		Fetch items (XML elements) that match to a query
+		//	description:
+		//		If 'sendQuery' is true, an XML document is loaded from
+		//		'url' with a query string.
+		//		Otherwise, an XML document is loaded and list XML elements that
+		//		match to a query (set of element names and their text attribute
+		//		values that the items to contain).
+		//		A wildcard, "*" can be used to query values to match all
+		//		occurrences.
+		//		If 'rootItem' is specified, it is used to fetch items.
+		//	request:
+		//		A request object
+		//	fetchHandler:
+		//		A function to call for fetched items
+		//	errorHandler:
+		//		A function to call on error
+		var url = this._getFetchUrl(request);
+		console.log("XmlStore._fetchItems(): url=" + url);
+		if(!url){
+			errorHandler(new Error("No URL specified."));
+			return;
+		}
+		var localRequest = (!this.sendQuery ? request : null); // use request for _getItems()
+
+		var self = this;
+		var getArgs = {
+				url: url,
+				handleAs: "xml",
+				preventCache: true
+			};
+		var getHandler = dojo.xhrGet(getArgs);
+		getHandler.addCallback(function(data){
+			var items = self._getItems(data, localRequest);
+			console.log("XmlStore._fetchItems(): length=" + (items ? items.length : 0));
+			if (items && items.length > 0) {
+				fetchHandler(items, request);
+			}
+			else {
+				fetchHandler([], request);
+			}
+		});
+		getHandler.addErrback(function(data){
+			errorHandler(data, request);
+		});
+	},
+
+	_getFetchUrl: function(request){
+		//	summary:
+		//		Generate a URL for fetch
+		//	description:
+		//		This default implementation generates a query string in the form of
+		//		"?name1=value1&name2=value2..." off properties of 'query' object
+		//		specified in 'request' and appends it to 'url', if 'sendQuery'
+		//		is set to false.
+		//		Otherwise, 'url' is returned as is.
+		//		Sub-classes may override this method for the custom URL generation.
+		//	request:
+		//		A request object
+		//	returns:
+		//		A fetch URL
+		if(!this.sendQuery){
+			return this.url;
+		}
+		var query = request.query;
+		if(!query){
+			return this.url;
+		}
+		if(dojo.isString(query)){
+			return this.url + query;
+		}
+		var queryString = "";
+		for(var name in query){
+			var value = query[name];
+			if(value){
+				if(queryString){
+					queryString += "&";
+				}
+				queryString += (name + "=" + value);
+			}
+		}
+		if(!queryString){
+			return this.url;
+		}
+		//Check to see if the URL already has query params or not.
+		var fullUrl = this.url;
+		if(fullUrl.indexOf("?") < 0){
+			fullUrl += "?";
+		}else{
+			fullUrl += "&";
+		}
+		return fullUrl + queryString;
+	},
+
+	_getItems: function(document, request) {
+		//	summary:
+		//		Fetch items (XML elements) in an XML document based on a request
+		//	description:
+		//		This default implementation walks through child elements of
+		//		the document element to see if all properties of 'query' object
+		//		match corresponding attributes of the element (item).
+		//		If 'request' is not specified, all child elements are returned.
+		//		Sub-classes may override this method for the custom search in
+		//		an XML document.
+		//	document:
+		//		An XML document
+		//	request:
+		//		A request object
+		//	returns:
+		//		An array of items
+		var query = null;
+		if(request){
+			query = request.query;
+		}
+		var items = [];
+		var nodes = null;
+
+		console.log("Looking up root item: " + this.rootItem);
+		if(this.rootItem !== ""){
+			
+			nodes = document.getElementsByTagName(this.rootItem);
+		}
+		else{
+			nodes = document.documentElement.childNodes;
+		}
+		for(var i = 0; i < nodes.length; i++){
+			var node = nodes[i];
+			if(node.nodeType != 1 /*ELEMENT_NODE*/){
+				continue;
+			}
+            var item = this._getItem(node);
+			if(query){
+				var found = true;
+				var ignoreCase = request.queryOptions ? request.queryOptions.ignoreCase : false; 
+
+				//See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+				//same value for each item examined.  Much more efficient.
+				var regexpList = {};
+				for(var key in query){
+					var value = query[key];
+					if(typeof value === "string"){
+						regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
+					}
+				}
+
+				for(var attribute in query){
+					var value = this.getValue(item, attribute);
+					if(value){
+						var queryValue = query[attribute];
+						if ((typeof value) === "string" && 
+							(regexpList[attribute])){
+							if((value.match(regexpList[attribute])) !== null){
+								continue;
+							}
+						}else if((typeof value) === "object"){
+							if(	value.toString && 
+								(regexpList[attribute])){
+								var stringValue = value.toString();
+								if((stringValue.match(regexpList[attribute])) !== null){
+									continue;
+								}
+							}else{
+								if(queryValue === "*" || queryValue === value){
+									continue;
+								}
+							}
+						}
+					}
+					found = false;
+					break;
+				}
+				if(!found){
+					continue;
+				}
+			}
+			items.push(item);
+		}
+		dojo.forEach(items,function(item){ 
+			item.element.parentNode.removeChild(item.element); // make it root
+		},this); 
+		return items;
+	},
+
+	close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+		 //	summary: 
+		 //		See dojo.data.api.Read.close()
+	},
+
+/* dojo.data.api.Write */
+
+	newItem: function(/* object? */ keywordArgs){
+		//	summary:
+		//		Return a new dojox.data.XmlItem
+		//	description:
+		//		At least, 'keywordArgs' must contain "tagName" to be used for
+		//		the new	element.
+		//		Other attributes in 'keywordArgs' are set to the new element,
+		//		including "text()", but excluding "childNodes".
+		// 	keywordArgs:
+		//		An object containing initial attributes
+		//	returns:
+		//		An XML element
+		console.log("XmlStore.newItem()");
+		keywordArgs = (keywordArgs || {});
+		var tagName = keywordArgs.tagName;
+		if(!tagName){
+			tagName = this.rootItem;
+			if(tagName === ""){
+				return null;
+			}
+		}
+
+		var document = this._getDocument();
+		var element = document.createElement(tagName);
+		for(var attribute in keywordArgs){
+			if(attribute === "tagName"){
+				continue;
+			}else if(attribute === "text()"){
+				var text = document.createTextNode(keywordArgs[attribute]);
+				element.appendChild(text);
+			}else{
+				attribute = this._getAttribute(tagName, attribute);
+				if(attribute.charAt(0) === '@'){
+					var name = attribute.substring(1);
+					element.setAttribute(name, keywordArgs[attribute]);
+				}else{
+					var child = document.createElement(attribute);
+					var text = document.createTextNode(keywordArgs[attribute]);
+					child.appendChild(text);
+					element.appendChild(child);
+				}
+			}
+		}
+
+		var item = this._getItem(element);
+		this._newItems.push(item);
+		return item; //object
+	},
+	
+	deleteItem: function(/* item */ item){
+		//	summary:
+		//		Delete an dojox.data.XmlItem (wrapper to a XML element).
+		//	item:
+		//		An XML element to delete
+		//	returns:
+		//		True
+		console.log("XmlStore.deleteItem()");
+		var element = item.element;
+		if(element.parentNode){
+			this._backupItem(item);
+			element.parentNode.removeChild(element);
+			return true;
+		}
+		this._forgetItem(item);
+		this._deletedItems.push(item);
+		return true; //boolean
+	},
+	
+	setValue: function(/* item */ item, /* attribute || string */ attribute, /* almost anything */ value){
+		//	summary:
+		//		Set an attribute value
+		//	description:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//		If 'attribute' specifies "tagName", nothing is set and false is
+		//		returned.
+		//		If 'attribute' specifies "childNodes", the value (XML element) is
+		//		added to the element.
+		//		If 'attribute' specifies "text()", a text node is created with
+		//		the value and set it to the element as a child.
+		//		For generic attributes, if '_attributeMap' is specified,
+		//		an actual attribute name is looked up with the tag name of
+		//		the element and 'attribute' (concatenated with '.').
+		//		Then, if 'attribute' starts with "@", the value is set to the XML
+		//		attribute.
+		//		Otherwise, a text node is created with the value and set it to
+		//		the first child element of the tag name specified with 'attribute'.
+		//		If the child element does not exist, it is created.
+		//	item:
+		//		An XML element that holds the attribute
+		//	attribute:
+		//		A tag name of a child element, An XML attribute name or one of
+		//		special names
+		//	value:
+		//		A attribute value to set
+		//	returns:
+		//		False for "tagName", otherwise true
+		if(attribute === "tagName"){
+			return false; //boolean
+		}
+
+		this._backupItem(item);
+
+		var element = item.element;
+		if(attribute === "childNodes"){
+			var child = value.element;
+			element.appendChild(child);
+		}else if(attribute === "text()"){
+			while (element.firstChild){
+				element.removeChild(element.firstChild);
+			}
+			var text = this._getDocument(element).createTextNode(value);
+			element.appendChild(text);
+		}else{
+			attribute = this._getAttribute(element.nodeName, attribute);
+			if(attribute.charAt(0) === '@'){
+				var name = attribute.substring(1);
+				element.setAttribute(name, value);
+			}else{
+				var child = null;
+				for(var i = 0; i < element.childNodes.length; i++){
+					var node = element.childNodes[i];
+					if(	node.nodeType === 1 /*ELEMENT_NODE*/&&
+						node.nodeName === attribute){
+						child = node;
+						break;
+					}
+				}
+				var document = this._getDocument(element);
+				if(child){
+					while(child.firstChild){
+						child.removeChild(child.firstChild);
+					}
+				}else{
+					child = document.createElement(attribute);
+					element.appendChild(child);
+				}
+				var text = document.createTextNode(value);
+				child.appendChild(text);
+			}
+		}
+		return true; //boolean
+	},
+	
+	setValues: function(/* item */ item, /* attribute || string */ attribute, /* array */ values){
+		//	summary:
+		//		Set attribute values
+		//	description:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//		If 'attribute' specifies "tagName", nothing is set and false is
+		//		returned.
+		//		If 'attribute' specifies "childNodes", the value (array of XML
+		//		elements) is set to the element's childNodes.
+		//		If 'attribute' specifies "text()", a text node is created with
+		//		the values and set it to the element as a child.
+		//		For generic attributes, if '_attributeMap' is specified,
+		//		an actual attribute name is looked up with the tag name of
+		//		the element and 'attribute' (concatenated with '.').
+		//		Then, if 'attribute' starts with "@", the first value is set to
+		//		the XML attribute.
+		//		Otherwise, child elements of the tag name specified with
+		//		'attribute' are replaced with new child elements and their
+		//		child text nodes of values.
+		//	item:
+		//		An XML element that holds the attribute
+		//	attribute:
+		//		A tag name of child elements, an XML attribute name or one of
+		//		special names
+		//	value:
+		//		A attribute value to set
+		//	returns:
+		//		False for "tagName", otherwise true
+		if(attribute === "tagName"){
+			return false; //boolean
+		}
+
+		this._backupItem(item);
+
+		var element = item.element;
+		if(attribute === "childNodes"){
+			while(element.firstChild){
+				element.removeChild(element.firstChild);
+			}
+			for(var i = 0; i < values.length; i++){
+				var child = values[i].element;
+				element.appendChild(child);
+			}
+		}else if(attribute === "text()"){
+			while (element.firstChild){
+				element.removeChild(element.firstChild);
+			}
+			var value = "";
+			for(var i = 0; i < values.length; i++){
+				value += values[i];
+			}
+			var text = this._getDocument(element).createTextNode(value);
+			element.appendChild(text);
+		}else{
+			attribute = this._getAttribute(element.nodeName, attribute);
+			if(attribute.charAt(0) === '@'){
+				var name = attribute.substring(1);
+				element.setAttribute(name, values[0]);
+			}else{
+				for(var i = element.childNodes.length - 1; i >= 0; i--){
+					var node = element.childNodes[i];
+					if(	node.nodeType === 1 /*ELEMENT_NODE*/ &&
+						node.nodeName === attribute){
+						element.removeChild(node);
+					}
+				}
+				var document = this._getDocument(element);
+				for(var i = 0; i < values.length; i++){
+					var child = document.createElement(attribute);
+					var text = document.createTextNode(values[i]);
+					child.appendChild(text);
+					element.appendChild(child);
+				}
+			}
+		}
+		return true; //boolean
+	},
+	
+	unsetAttribute: function(/* item */ item, /* attribute || string */ attribute){
+		//	summary:
+		//		Remove an attribute
+		//	description:
+		//		'item' must be an instance of a dojox.data.XmlItem from the store instance.
+		//		'attribute' can be an XML attribute name of the element or one of
+		//		special names described below.
+		//		If 'attribute' specifies "tagName", nothing is removed and false is
+		//		returned.
+		//		If 'attribute' specifies "childNodes" or "text()", all child nodes
+		//		are removed.
+		//		For generic attributes, if '_attributeMap' is specified,
+		//		an actual attribute name is looked up with the tag name of
+		//		the element and 'attribute' (concatenated with '.').
+		//		Then, if 'attribute' starts with "@", the XML attribute is removed.
+		//		Otherwise, child elements of the tag name specified with
+		//		'attribute' are removed.
+		//	item:
+		//		An XML element that holds the attribute
+		//	attribute:
+		//		A tag name of child elements, an XML attribute name or one of
+		//		special names
+		//	returns:
+		//		False for "tagName", otherwise true
+		if(attribute === "tagName"){
+			return false; //boolean
+		}
+
+		this._backupItem(item);
+
+		var element = item.element;
+		if(attribute === "childNodes" || attribute === "text()"){
+			while(element.firstChild){
+				element.removeChild(element.firstChild);
+			}
+		}else{
+			attribute = this._getAttribute(element.nodeName, attribute);
+			if(attribute.charAt(0) === '@'){
+				var name = attribute.substring(1);
+				element.removeAttribute(name);
+			}else{
+				for(var i = element.childNodes.length - 1; i >= 0; i--){
+					var node = element.childNodes[i];
+					if(	node.nodeType === 1 /*ELEMENT_NODE*/ &&
+						node.nodeName === attribute){
+						element.removeChild(node);
+					}
+				}
+			}
+		}
+		return true; //boolean
+	},
+	
+	save: function(/* object */ keywordArgs){
+		//	summary:
+		//		Save new and/or modified items (XML elements)
+		// 	description:
+		//		'url' is used to save XML documents for new, modified and/or
+		//		deleted XML elements.
+		// 	keywordArgs:
+		//		An object for callbacks
+		if(!keywordArgs){
+			keywordArgs = {};
+		}
+		for(var i = 0; i < this._modifiedItems.length; i++){
+			this._saveItem(this._modifiedItems[i], keywordArgs, "PUT");
+		}
+		for(var i = 0; i < this._newItems.length; i++){
+			var item = this._newItems[i];
+			if(item.element.parentNode){ // reparented
+				this._newItems.splice(i, 1);
+				i--;
+				continue;
+			}
+			this._saveItem(this._newItems[i], keywordArgs, "POST");
+		}
+		for(var i = 0; i < this._deletedItems.length; i++){
+			this._saveItem(this._deletedItems[i], keywordArgs, "DELETE");
+		}
+	},
+
+	revert: function(){
+		// summary:
+		//	Invalidate changes (new and/or modified elements)
+		// returns:
+		//	True
+		console.log("XmlStore.revert() _newItems=" + this._newItems.length);
+		console.log("XmlStore.revert() _deletedItems=" + this._deletedItems.length);
+		console.log("XmlStore.revert() _modifiedItems=" + this._modifiedItems.length);
+		this._newItems = [];
+		this._restoreItems(this._deletedItems);
+		this._deletedItems = [];
+		this._restoreItems(this._modifiedItems);
+		this._modifiedItems = [];
+		return true; //boolean
+	},
+	
+	isDirty: function(/* item? */ item){
+		//	summary:
+		//		Check whether an item is new, modified or deleted
+		//	description:
+		//		If 'item' is specified, true is returned if the item is new,
+		//		modified or deleted.
+		//		Otherwise, true is returned if there are any new, modified
+		//		or deleted items.
+		//	item:
+		//		An item (XML element) to check
+		//	returns:
+		//		True if an item or items are new, modified or deleted, otherwise
+		//		false
+		if (item) {
+			var element = this._getRootElement(item.element);
+			return (this._getItemIndex(this._newItems, element) >= 0 ||
+				this._getItemIndex(this._deletedItems, element) >= 0 ||
+				this._getItemIndex(this._modifiedItems, element) >= 0); //boolean
+		}
+		else {
+			return (this._newItems.length > 0 ||
+				this._deletedItems.length > 0 ||
+				this._modifiedItems.length > 0); //boolean
+		}
+	},
+
+	_saveItem: function(item, keywordArgs, method){
+		if(method === "PUT"){
+			url = this._getPutUrl(item);
+		}else if(method === "DELETE"){
+			url = this._getDeleteUrl(item);
+		}else{ // POST
+			url = this._getPostUrl(item);
+		}
+		if(!url){
+			if(keywordArgs.onError){
+				keywordArgs.onError.call(scope, new Error("No URL for saving content: " + postContent));
+			}
+			return;
+		}
+
+		var saveArgs = {
+			url: url,
+			method: (method || "POST"),
+			contentType: "text/xml",
+			handleAs: "xml"
+		};
+		var saveHander;
+		if(method === "PUT"){
+			saveArgs.putData = this._getPutContent(item);
+			saveHandler = dojo.rawXhrPut(saveArgs);
+		}else if(method === "DELETE"){
+			saveHandler = dojo.xhrDelete(saveArgs);
+		}else{ // POST
+			saveArgs.postData = this._getPostContent(item);
+			saveHandler = dojo.rawXhrPost(saveArgs);
+		}
+		var scope = (keywordArgs.scope || dojo.global);
+		var self = this;
+		saveHandler.addCallback(function(data){
+			self._forgetItem(item);
+			if(keywordArgs.onComplete){
+				keywordArgs.onComplete.call(scope);
+			}
+		});
+		saveHandler.addErrback(function(error){
+			if(keywordArgs.onError){
+				keywordArgs.onError.call(scope, error);
+			}
+		});
+	},
+
+	_getPostUrl: function(item){
+		//	summary:
+		//		Generate a URL for post
+		//	description:
+		//		This default implementation just returns 'url'.
+		//		Sub-classes may override this method for the custom URL.
+		//	item:
+		//		An item to save
+		//	returns:
+		//		A post URL
+		return this.url; //string
+	},
+
+	_getPutUrl: function(item){
+		//	summary:
+		//		Generate a URL for put
+		//	description:
+		//		This default implementation just returns 'url'.
+		//		Sub-classes may override this method for the custom URL.
+		//	item:
+		//		An item to save
+		//	returns:
+		//		A put URL
+		return this.url; //string
+	},
+
+	_getDeleteUrl: function(item){
+		//	summary:
+		//		Generate a URL for delete
+		// 	description:
+		//		This default implementation returns 'url' with 'keyAttribute'
+		//		as a query string.
+		//		Sub-classes may override this method for the custom URL based on
+		//		changes (new, deleted, or modified).
+		// 	item:
+		//		An item to delete
+		// 	returns:
+		//		A delete URL
+		var url = this.url;
+		if (item && this.keyAttribute !== "") {
+			var value = this.getValue(item, this.keyAttribute);
+			if (value) {
+				var key = this.keyAttribute.charAt(0) ==='@' ? this.keyAttribute.substring(1): this.keyAttribute;
+				url += url.indexOf('?') < 0 ? '?' : '&';
+				url += key + '=' + value;
+			}
+		}
+		return url;	//string
+	},
+
+	_getPostContent: function(item){
+		//	summary:
+		//		Generate a content to post
+		// 	description:
+		//		This default implementation generates an XML document for one
+		//		(the first only) new or modified element.
+		//		Sub-classes may override this method for the custom post content
+		//		generation.
+		//	item:
+		//		An item to save
+		//	returns:
+		//		A post content
+		var element = item.element;
+		var declaration = "<?xml version=\"1.0\"?>"; // FIXME: encoding?
+		return declaration + dojox.data.dom.innerXML(element); //XML string
+	},
+
+	_getPutContent: function(item){
+		//	summary:
+		//		Generate a content to put
+		// 	description:
+		//		This default implementation generates an XML document for one
+		//		(the first only) new or modified element.
+		//		Sub-classes may override this method for the custom put content
+		//		generation.
+		//	item:
+		//		An item to save
+		//	returns:
+		//		A post content
+		var element = item.element;
+		var declaration = "<?xml version=\"1.0\"?>"; // FIXME: encoding?
+		return declaration + dojox.data.dom.innerXML(element); //XML string
+	},
+
+/* internal API */
+
+	_getAttribute: function(tagName, attribute){
+		if(this._attributeMap){
+			var key = tagName + "." + attribute;
+			var value = this._attributeMap[key];
+			if(value){
+				attribute = value;
+			}else{ // look for global attribute
+				value = this._attributeMap[attribute];
+				if(value){
+					attribute = value;
+				}
+			}
+		}
+		return attribute; //object
+	},
+
+	_getItem: function(element){
+		return new dojox.data.XmlItem(element, this); //object
+	},
+
+	_getItemIndex: function(items, element){
+		for(var i = 0; i < items.length; i++){
+			if(items[i].element === element){
+				return i; //int
+			}
+		}
+		return -1; //int
+	},
+
+	_backupItem: function(item){
+		var element = this._getRootElement(item.element);
+		if(	this._getItemIndex(this._newItems, element) >= 0 ||
+			this._getItemIndex(this._modifiedItems, element) >= 0){
+			return; // new or already modified
+		}
+		if(element != item.element){
+			item = this._getItem(element);
+		}
+		item._backup = element.cloneNode(true);
+		this._modifiedItems.push(item);
+	},
+
+	_restoreItems: function(items){
+
+		dojo.forEach(items,function(item){ 
+			if(item._backup){
+				item.element = item._backup;
+				item._backup = null;
+			}
+		},this); 
+	},
+
+	_forgetItem: function(item){
+		var element = item.element;
+		var index = this._getItemIndex(this._newItems, element);
+		if(index >= 0){
+			this._newItems.splice(index, 1);
+		}
+		index = this._getItemIndex(this._deletedItems, element);
+		if(index >= 0){
+			this._deletedItems.splice(index, 1);
+		}
+		index = this._getItemIndex(this._modifiedItems, element);
+		if(index >= 0){
+			this._modifiedItems.splice(index, 1);
+		}
+	},
+
+	_getDocument: function(element){
+		if(element){
+			return element.ownerDocument;  //DOMDocument
+		}else if(!this._document){
+			return dojox.data.dom.createDocument(); // DOMDocument
+		}
+	},
+
+	_getRootElement: function(element){
+		while(element.parentNode){
+			element = element.parentNode;
+		}
+		return element; //DOMElement
+	}
+
+});
+
+//FIXME: Is a full class here really needed for containment of the item or would
+//an anon object work fine?
+dojo.declare("dojox.data.XmlItem", null, {
+	constructor: function(element, store) {
+		//	summary:
+		//		Initialize with an XML element
+		//	element:
+		//		An XML element
+		//	store:
+		//		The containing store, if any.
+		this.element = element;
+		this.store = store;
+	}, 
+	//	summary:
+	//		A data item of 'XmlStore'
+	//	description:
+	//		This class represents an item of 'XmlStore' holding an XML element.
+	//		'element'
+	//	element:
+	//		An XML element
+
+	toString: function() {
+		//	summary:
+		//		Return a value of the first text child of the element
+		// 	returns:
+		//		a value of the first text child of the element
+		var str = "";
+		if (this.element) {
+			for (var i = 0; i < this.element.childNodes.length; i++) {
+				var node = this.element.childNodes[i];
+				if (node.nodeType === 3) {
+					str = node.nodeValue;
+					break;
+				}
+			}
+		}
+		return str;	//String
+	}
+
+});
+dojo.extend(dojox.data.XmlStore,dojo.data.util.simpleFetch);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_DataDemoTable.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_DataDemoTable.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_DataDemoTable.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+        "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Dojo Visual Loader Test</title>
+	<style type="text/css">
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dijit/themes/dijit.css";
+		@import "../../../dijit/tests/css/dijitTests.css"; 
+
+		.oddRow { background-color: #f2f5f9; }
+		.population { text-align: right; }
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" 
+		djConfig="isDebug: false, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dijit.dijit");
+		dojo.require("dojo.parser");
+		dojo.require("dijit.Declaration");
+		dojo.require("dojo.data.ItemFileReadStore");
+		dojo.require("dojox.data.FlickrStore");
+	</script>
+</head>
+<body class="tundra">
+	<span dojoType="dojo.data.ItemFileReadStore" 
+		jsId="continentStore"
+		url="../../../dijit/tests/_data/countries.json"></span>
+	<span dojoType="dojox.data.FlickrStore" jsId="flickrStore"></span>
+
+
+	<h1 class="testTitle">Dojox Data Demo Table</h1>
+
+	<table dojoType="dijit.Declaration" 
+		widgetClass="demo.Table" class="dojoTabular" 
+		defaults="{ store: null, query: { query: { name: '*' } }, columns: [ { name: 'Name', attribute: 'name' } ] }">
+		<thead dojoAttachPoint="head">
+			<tr dojoAttachPoint="headRow"></tr>
+		</thead>
+		<tbody dojoAttachPoint="body">
+			<tr dojoAttachPoint="row">
+			</tr>
+		</tbody>
+
+		<script type="dojo/method">
+			dojo.forEach(this.columns, function(item, idx){
+				var icn = item.className||"";
+				// add a header for each column
+				var tth = document.createElement("th");
+				tth.innerHTML = item.name;
+				tth.className = icn;
+				dojo.connect(tth, "onclick", dojo.hitch(this, "onSort", idx));
+				this.headRow.appendChild(tth);
+
+				// and fill in the column cell in the template row
+				this.row.appendChild(document.createElement("td"));
+				this.row.lastChild.className = icn;
+			}, this);
+			this.runQuery();
+		</script>
+		<script type="dojo/method" event="onSort" args="index">
+			var ca = this.columns[index].attribute;
+			var qs = this.query.sort;
+			// clobber an existing sort arrow
+			dojo.query("> th", this.headRow).style("background", "").style("paddingRight", "");
+			if(qs && qs[0].attribute == ca){
+				qs[0].descending = !qs[0].descending;
+			}else{
+				this.query.sort = [{
+					attribute: ca,
+					descending: false
+				}];
+			}
+			var th = dojo.query("> th", this.headRow)[index];
+			th.style.paddingRight = "16px"; // space for the sort arrow
+			th.style.background = "url(\""+dojo.moduleUrl("dijit", "themes/tundra/images/arrow"+(this.query.sort[0].descending ? "Up" : "Down")+((dojo.isIE == 6) ? ".gif" : ".png")) + "\") no-repeat 98% 4px";
+			this.runQuery();
+		</script>
+		<script type="dojo/method" event="runQuery">
+			this.query.onBegin = dojo.hitch(this, function(){ dojo.query("tr", this.body).orphan(); });
+			this.query.onItem = dojo.hitch(this, "onItem");
+			this.query.onComplete = dojo.hitch(this, function(){
+				dojo.query("tr:nth-child(odd)", this.body).addClass("oddRow");
+				dojo.query("tr:nth-child(even)", this.body).removeClass("oddRow");
+			});
+			this.store.fetch(this.query);
+		</script>
+		<script type="dojo/method" event="onItem" args="item">
+			var tr = this.row.cloneNode(true);
+			dojo.query("td", tr).forEach(function(n, i, a){
+				var tc = this.columns[i];
+				var tv = this.store.getValue(item, tc.attribute)||"";
+				if(tc.format){ tv = tc.format(tv, item, this.store); }
+				n.innerHTML = tv;
+			}, this);
+			this.body.appendChild(tr);
+		</script>
+	</table>
+
+	<span dojoType="demo.Table" store="continentStore"
+		query="{ query: { type: 'country' }, sort: [ { attribute: 'name', descending: true } ]  }" 
+		id="foo">
+		<script type="dojo/method" event="preamble">
+			this.columns = [
+				{ name: "Name", attribute: "name" },
+				{	name: 		"Population",
+					attribute:	"population",
+					className:	"population"
+				}
+			];
+		</script>
+	</span>
+	<span dojoType="demo.Table" store="continentStore"
+		query="{ query: { name: 'A*' } }"></span>
+	<span dojoType="demo.Table" store="flickrStore"
+		query="{ query: { tags: '3dny' } }">
+		<script type="dojo/method" event="preamble">
+			this.columns = [
+				{	name: "", attribute: "imageUrlSmall", 
+					format: function(value, item, store){
+						return (value.length) ? "<img src='"+value+"'>" : "";
+					}
+				},
+				{ name: "Title", attribute: "title" }
+			];
+		</script>
+	</span>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_FlickrRestStore.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_FlickrRestStore.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_FlickrRestStore.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,275 @@
+<!--
+  This file is a demo of the FlickrStore, a simple wrapper to the public feed service
+  of Flickr.  This just does very basic queries against Flickr and loads the results
+  into a list viewing widget.
+-->
+<html>
+<head>
+	<title>Demo of FlickrRestStore</title>
+	<style type="text/css">
+
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+		@import "./flickrDemo.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dijit.form.TextBox");
+		dojo.require("dijit.form.Button");
+		dojo.require("dijit.form.ComboBox");
+		dojo.require("dijit.form.NumberSpinner");
+		dojo.require("dijit.Tree");
+		dojo.require("dojox.data.FlickrStore");
+		dojo.require("dojox.data.FlickrRestStore");
+		dojo.require("dojox.data.demos.widgets.FlickrViewList");
+		dojo.require("dojox.data.demos.widgets.FlickrView");
+
+		function init(){
+			var fViewWidgets = [];
+
+			//Set up an onComplete handler for flickrData
+			function onComplete(items, request){
+				flickrViewsWidget.clearList();
+				if(items.length > 0){
+					for(var i = 0; i < items.length; i++){
+						var flickrData = {
+							title: flickrStore.getValue(items[i],"title"),
+							author: flickrStore.getValue(items[i],"author"),
+							iconUrl: flickrStore.getValue(items[i],"imageUrlSmall"),
+							imageUrl: flickrStore.getValue(items[i],"imageUrl")
+						}
+						flickrViewsWidget.addView(flickrData);
+					}
+				}
+				statusWidget.setValue("PROCESSING COMPLETE.");
+
+			}
+			//What to do if a search fails...
+			function onError(error, request){
+				flickrViewsWidget.clearList();
+				statusWidget.setValue("PROCESSING ERROR.");
+			}
+
+			//Function to invoke the search of the FlickrStore
+			function invokeSearch(){
+				var request = {
+					query: {
+					  apikey: "8c6803164dbc395fb7131c9d54843627"  
+					},
+					onComplete: onComplete,
+					onError: onError
+				};
+
+				if(idWidget){
+					var userid = idWidget.getValue();
+					if(userid && userid !== ""){
+						request.query.userid = userid;
+					}
+				}
+				if(tagsWidget){
+					var tags = tagsWidget.getValue();
+					if(tags && tags !== ""){
+						var tagsArray = tags.split(" ");
+						tags = "";
+						for(var i = 0; i < tagsArray.length; i++){
+							tags = tags + tagsArray[i];
+							if(i < (tagsArray.length - 1)){
+								tags += ","
+							}
+						}
+						request.query.tags = tags;
+					}
+				}
+				if(tagmodeWidget){
+					var tagmode = tagmodeWidget.getValue();
+					if(tagmode !== ""){
+						request.query.tagmode = tagmode;
+					}
+				}
+				
+				if(setIdWidget){
+					var setId = setIdWidget.getValue();
+					if(setId != ""){
+					  request.query.setId = setId;
+					}
+				}
+				
+				if(fullTextWidget){
+					var fullText = fullTextWidget.getValue();
+					if(fullText != ""){
+					  request.query.text = fullText;
+					}
+				}
+				
+				if(sortTypeWidget && sortDirWidget){
+					var sortType = sortTypeWidget.getValue();
+					var sortDirection = sortDirWidget.getValue();
+					
+					if(sortType != "" && sortDirection != ""){
+						request.query.sort = [
+						  {
+							attribute: sortType,
+							descending: (sortDirection.toLowerCase() == "descending")
+						  }					  
+						];
+					}
+				}
+				
+				if(countWidget){
+					request.count = countWidget.getValue();
+				}
+				if(pageWidget){
+					request.start = request.count * (pageWidget.getValue() -1);
+				}
+
+				if(statusWidget){
+					statusWidget.setValue("PROCESSING REQUEST");
+				}
+
+				flickrStore.fetch(request);
+			}
+
+			//Lastly, link up the search event.
+			var button = dijit.byId("searchButton");
+			dojo.connect(button, "onClick", invokeSearch);
+		}
+		dojo.addOnLoad(init);
+	</script>
+</head>
+
+<body class="tundra">
+	<h1>
+		DEMO:  FlickrRestStore Search
+	</h1>
+	<hr>
+	<h3>
+		Description:
+	</h3>
+	<p>
+		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 FlickrRestStore by specifying
+		a series of tags (separated by spaces) to search on.  The results will be displayed below the search box.
+	</p>
+	<p>
+		For fun, search on the 3dny tag!
+	</p>
+
+	<blockquote>
+
+	<!--
+		The store instance used by this demo.
+	-->
+	<table>
+		<tbody>
+			<tr>
+				<td>
+					<b>Status:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="status" jsId="statusWidget" disabled="true"></div>
+				</td>
+				<td></td>
+				<td></td>
+			</tr>
+			<tr>
+				<td>
+					<b>User ID:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="userid" jsId="idWidget" value="44153025@N00"></div>
+				</td>
+				<td>
+					<b>Set ID</b>
+				</td>
+				<td>
+					  <div dojoType="dijit.form.TextBox" size="50" id="setid" jsId="setIdWidget"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Tags:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="tags" jsId="tagsWidget" value="rollingstones,kinsale"></div>
+				</td>
+				<td>
+					<b>Full Text</b>
+				</td>
+				<td>
+					  <div dojoType="dijit.form.TextBox" size="50" id="fulltext" jsId="fullTextWidget"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Tagmode:</b>
+				</td>
+				<td>
+					<select id="tagmode"
+							jsId="tagmodeWidget"
+							dojoType="dijit.form.ComboBox"
+							autocomplete="false"
+							value="any"
+					>
+						<option>any</option>
+						<option>all</option>
+					</select>
+				</td>
+				<td>
+					<b>Sort</b>
+				</td>
+				<td>
+					  <select dojoType="dijit.form.ComboBox" size="15" id="sorttype" jsId="sortTypeWidget">
+						<option>date-posted</option>
+						<option>date-taken</option>
+						<option>interestingness</option>
+					  </select>
+					   <select dojoType="dijit.form.ComboBox" size="15" id="sortdirection" jsId="sortDirWidget">
+						<option>ascending</option>
+						<option>descending</option>
+					  </select>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Number of Pictures:</b>
+				</td>
+				<td>
+					<div   
+						id="count"
+						jsId="countWidget"
+						dojoType="dijit.form.NumberSpinner"
+						value="20"
+						constraints="{min:1,max:20,places:0}" 
+					></div>
+				</td>
+				<td>
+					<b>Page:</b>
+				</td>
+				<td>
+					<div   
+						id="page"
+						jsId="pageWidget"
+						dojoType="dijit.form.NumberSpinner"
+						value="1"
+						constraints="{min:1,max:5,places:0}" 
+					></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+				</td>
+				<td>
+					<div dojoType="dijit.form.Button" label="Search" id="searchButton" jsId="searchButtonWidget"></div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	<hr/>
+	<div dojoType="dojox.data.FlickrRestStore" jsId="flickrStore" label="title"></div>
+	<div dojoType="dojox.data.demos.widgets.FlickrViewList" id="flickrViews" jsId="flickrViewsWidget"></div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_FlickrStore.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_FlickrStore.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_FlickrStore.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,199 @@
+<!--
+  This file is a demo of the FlickrStore, a simple wrapper to the public feed service
+  of Flickr.  This just does very basic queries against Flickr and loads the results
+  into a list viewing widget.
+-->
+<html>
+<head>
+	<title>Demo of FlickrStore</title>
+	<style type="text/css">
+
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+		@import "./flickrDemo.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dijit.form.TextBox");
+		dojo.require("dijit.form.Button");
+		dojo.require("dijit.form.ComboBox");
+		dojo.require("dijit.form.NumberSpinner");
+		dojo.require("dijit.Tree");
+		dojo.require("dojox.data.FlickrStore");
+		dojo.require("dojox.data.demos.widgets.FlickrViewList");
+		dojo.require("dojox.data.demos.widgets.FlickrView");
+
+		function init(){
+			var fViewWidgets = [];
+
+			//Set up an onComplete handler for flickrData
+			function onComplete(items, request){
+				flickrViewsWidget.clearList();
+				if(items.length > 0){
+					for(var i = 0; i < items.length; i++){
+						var flickrData = {
+							title: flickrStore.getValue(items[i],"title"),
+							author: flickrStore.getValue(items[i],"author"),
+							iconUrl: flickrStore.getValue(items[i],"imageUrlSmall"),
+							imageUrl: flickrStore.getValue(items[i],"imageUrl")
+						}
+						flickrViewsWidget.addView(flickrData);
+					}
+				}
+				statusWidget.setValue("PROCESSING COMPLETE.");
+
+			}
+			//What to do if a search fails...
+			function onError(error, request){
+				flickrViewsWidget.clearList();
+				statusWidget.setValue("PROCESSING ERROR.");
+			}
+
+			//Function to invoke the search of the FlickrStore
+			function invokeSearch(){
+				var request = {
+					query: {},
+					onComplete: onComplete,
+					onError: onError
+				};
+
+				if(idWidget){
+					var userid = idWidget.getValue();
+					if(userid && userid !== ""){
+						request.query.userid = userid;
+					}
+				}
+				if(tagsWidget){
+					var tags = tagsWidget.getValue();
+					if(tags && tags !== ""){
+						var tagsArray = tags.split(" ");
+						tags = "";
+						for(var i = 0; i < tagsArray.length; i++){
+							tags = tags + tagsArray[i];
+							if(i < (tagsArray.length - 1)){
+								tags += ","
+							}
+						}
+						request.query.tags = tags;
+					}
+				}
+				if(tagmodeWidget){
+					var tagmode = tagmodeWidget.getValue();
+					if(tagmode !== ""){
+						request.query.tagmode = tagmode;
+					}
+				}
+
+				if(countWidget){
+					request.count = countWidget.getValue();
+				}
+
+				if(statusWidget){
+					statusWidget.setValue("PROCESSING REQUEST");
+				}
+
+				flickrStore.fetch(request);
+			}
+
+			//Lastly, link up the search event.
+			var button = dijit.byId("searchButton");
+			dojo.connect(button, "onClick", invokeSearch);
+		}
+		dojo.addOnLoad(init);
+	</script>
+</head>
+
+<body class="tundra">
+	<h1>
+		DEMO:  FlickrStore Search
+	</h1>
+	<hr>
+	<h3>
+		Description:
+	</h3>
+	<p>
+		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.
+	</p>
+	<p>
+		For fun, search on the 3dny tag!
+	</p>
+
+	<blockquote>
+
+	<!--
+		The store instance used by this demo.
+	-->
+	<table>
+		<tbody>
+			<tr>
+				<td>
+					<b>Status:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="status" jsId="statusWidget" disabled="true"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>ID:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="userid" jsId="idWidget"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Tags:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="tags" jsId="tagsWidget" value="3dny"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Tagmode:</b>
+				</td>
+				<td>
+					<select id="tagmode"
+							jsId="tagmodeWidget"
+							dojoType="dijit.form.ComboBox"
+							autocomplete="false"
+							value="any"
+					>
+						<option>any</option>
+						<option>all</option>
+					</select>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Number of Pictures:</b>
+				</td>
+				<td>
+					<div   
+						id="count"
+						jsId="countWidget"
+						dojoType="dijit.form.NumberSpinner"
+						value="20"
+						constraints="{min:1,max:20,places:0}" 
+					></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+				</td>
+				<td>
+					<div dojoType="dijit.form.Button" label="Search" id="searchButton" jsId="searchButtonWidget"></div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	<hr/>
+	<div dojoType="dojox.data.FlickrStore" jsId="flickrStore" label="title"></div>
+	<div dojoType="dojox.data.demos.widgets.FlickrViewList" id="flickrViews" jsId="flickrViewsWidget"></div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_LazyLoad.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_LazyLoad.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_LazyLoad.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,66 @@
+<!--
+  This file is a simple loader for the Lazy Load demo of a Datastore.  In this
+  Example, a simple extension of ItemFileReadStore that can do rudimentary lazy-loading
+  of items into the store is used to showcase how Datastores can hide how data
+  is loaded from the widget.  As long as the widget implements to the Dojo.data API
+  spec, then it should be able to use most datastores as input sources for its
+  values.
+-->
+<html>
+<head>
+	<title>Demo of Lazy Loading Datastore</title>
+	<style type="text/css">
+
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true, usePlainJson: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dojox.data.demos.stores.LazyLoadJSIStore");
+		dojo.require("dijit.Tree");
+	</script>
+</head>
+
+<body class="tundra">
+	<h1>
+		DEMO:  Lazy Loading Datastore used by dijit.Tree
+	</h1>
+	<hr>
+	<h3>
+		Description:
+	</h3>
+	<p>
+		This simple demo shows how the dijit.Tree widget can work with a Datastore that does lazy-loading of values into the tree.  
+		In this demo, the Datastore is an extension of ItemFileReadStore that overrides the <i>isItemLoaded()</i> and <i>loadItem()</i> functions of
+		with ones that can detect 'stub' items and use the data in the stub item to load the real data for that item when it
+		is required.  In this demo, the real data is required when one of the tree nodes is expanded.
+	</p>
+	<p>
+		The key thing to note is that all the lazy-loading logic (how to locate the data from the backend and so forth) is encapsulated 
+		into the store functions.  The dijit.Tree widget only knows about and uses the dojo.data.Read API interfaces to call to the store to 
+		get items, test if child items are fully loaded or not, and to invoke the <i>loadItem()</i>  function on items that are not yet fully 
+		loaded but have been requested to be expanded into view.  It has no knowledge of how the store actually goes and gets the data.
+	</p>        
+
+	<blockquote>
+
+	<!--
+		The store instance used by this demo.
+	-->
+	<div dojoType="dojox.data.demos.stores.LazyLoadJSIStore" jsId="continentStore"
+		url="geography/root.json"></div>
+
+	<!-- 
+		Display the toplevel tree with items that have an attribute of 'type',
+		with value of 'contintent'
+	-->
+	<b>Continents</b>
+	<div dojoType="dijit.Tree" id=tree label="Continents" store="continentStore" query="{type:'continent'}"
+		labelAttr="name" typeAttr="type"></div>
+	</blockquote>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_MultiStores.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_MultiStores.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_MultiStores.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,72 @@
+<!--
+  This file is a demo of multiple dojo.data aware widgets using different datastore implementations for displaying data.
+-->
+<html>
+<head>
+	<title>Demo of Multiple Widgets using different Datastores</title>
+	<style type="text/css">
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dijit.form.ComboBox");
+		dojo.require("dijit.Tree");
+
+		dojo.require("dojox.data.OpmlStore");
+		dojo.require("dojo.data.ItemFileReadStore");
+
+	</script>
+</head>
+
+<body class="tundra">
+	<h1>
+		DEMO:  Multiple DataStore implementations with dojo.data aware Widgets
+	</h1>
+	<hr>
+	<h3>
+		Description:
+	</h3>
+	<p>
+		This simple demo shows how widgets which know only the dojo.data interfaces can work with data sources of varying formats.  In this case an OpmlStore
+		and a ItemFileReadStore are used to house the same data in different formats.
+	</p>
+
+	<blockquote>
+
+	<!--
+		The store instances used by this demo.
+	-->
+	<div dojoType="dojo.data.ItemFileReadStore" url="geography.json"              jsId="ifrGeoStore"></div>
+	<div dojoType="dojox.data.OpmlStore"        url="geography.xml"  label="text" jsId="opmlGeoStore"></div>
+
+	<h3>
+		Widgets using OpmlStore:
+	</h3>
+	<blockquote>
+	<b>ComboBox:</b><br>
+	<input dojoType="dijit.form.ComboBox" id="combo1" name="combo1" class="medium" store="opmlGeoStore" searchAttr="text" query="{}"></input>
+	<br>
+	<br>
+
+	<b>Tree:</b><br>
+	<div dojoType="dijit.Tree" id="tree1" label="Continents" store="opmlGeoStore"></div>
+	</blockquote>
+
+	<h3>
+		Widgets using ItemFileReadStore:
+	</h3>
+	<blockquote>
+	<b>ComboBox:</b><br>
+	<input dojoType="dijit.form.ComboBox" id="combo2" name="combo2" class="medium" store="ifrGeoStore" searchAttr="name" query="{}"></input>
+	<br>
+	<br>
+
+	<b>Tree:</b><br>
+   	<div dojoType="dijit.Tree" id="tree2" label="Continents" store="ifrGeoStore"></div>
+	</blockquote>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_PicasaStore.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_PicasaStore.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_PicasaStore.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,188 @@
+<!--
+  This file is a demo of the PicasaStore, a simple wrapper to the public feed service
+  of Picasa.  This just does very basic queries against Picasa and loads the results
+  into a list viewing widget.
+-->
+<html>
+<head>
+	<title>Demo of PicasaStore</title>
+	<style type="text/css">
+
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+		@import "./picasaDemo.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dijit.form.TextBox");
+		dojo.require("dijit.form.Button");
+		dojo.require("dijit.form.ComboBox");
+		dojo.require("dijit.form.NumberSpinner");
+		dojo.require("dijit.Tree");
+		dojo.require("dojox.data.PicasaStore");
+		dojo.require("dojox.data.demos.widgets.PicasaViewList");
+		dojo.require("dojox.data.demos.widgets.PicasaView");
+		
+		function init(){
+			var fViewWidgets = [];
+
+			//Set up an onComplete handler for flickrData
+			function onComplete(items, request){
+				flickrViewsWidget.clearList();
+				if(items.length > 0){
+					for(var i = 0; i < items.length; i++){
+						var flickrData = {
+							title: flickrStore.getValue(items[i],"title"),
+							author: flickrStore.getValue(items[i],"author"),
+							description: flickrStore.getValue(items[i],"description"),
+							iconUrl: flickrStore.getValue(items[i],"imageUrlSmall"),
+							imageUrl: flickrStore.getValue(items[i],"imageUrl")
+						}
+						flickrViewsWidget.addView(flickrData);
+					}
+				}
+				statusWidget.setValue("PROCESSING COMPLETE.");
+
+			}
+			//What to do if a search fails...
+			function onError(error, request){
+				flickrViewsWidget.clearList();
+				statusWidget.setValue("PROCESSING ERROR.");
+			}
+
+			//Function to invoke the search of the FlickrStore
+			function invokeSearch(){
+				var request = {
+					query: {},
+					onComplete: onComplete,
+					onError: onError
+				};
+
+				if(idWidget){
+					var userid = idWidget.getValue();
+					if(userid && userid !== ""){
+						request.query.userid = userid;
+					}
+				}
+				if(tagsWidget){
+					var tags = tagsWidget.getValue();
+					if(tags && tags !== ""){
+						var tagsArray = tags.split(" ");
+						tags = "";
+						for(var i = 0; i < tagsArray.length; i++){
+							tags = tags + tagsArray[i];
+							if(i < (tagsArray.length - 1)){
+								tags += ","
+							}
+						}
+						request.query.tags = tags;
+					}
+				}
+				if(countWidget){
+					request.count = countWidget.getValue();
+				}
+
+				if(startWidget){
+					request.query.start = startWidget.getValue();
+				}
+
+				if(statusWidget){
+					statusWidget.setValue("PROCESSING REQUEST");
+				}
+
+				flickrStore.fetch(request);
+			}
+
+			//Lastly, link up the search event.
+			var button = dijit.byId("searchButton");
+			dojo.connect(button, "onClick", invokeSearch);
+		}
+		dojo.addOnLoad(init);
+	</script>
+</head>
+
+<body class="tundra">
+	<h1>
+		DEMO:  PicasaStore Search
+	</h1>
+	<hr>
+	<h3>
+		Description:
+	</h3>
+	<p>
+		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.
+	</p>
+	<p>
+		For fun, search on the 3dny tag!
+	</p>
+
+	<blockquote>
+
+	<!--
+		The store instance used by this demo.
+	-->
+	<table>
+		<tbody>
+			<tr>
+				<td>
+					<b>Status:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="status" jsId="statusWidget" disabled="true"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>ID:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="userid" jsId="idWidget"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Query:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="tags" jsId="tagsWidget" value="flower"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Number of Pictures:</b>
+				</td>
+				<td>
+					<div   
+						id="start"
+						jsId="startWidget"
+						dojoType="dijit.form.NumberSpinner"
+						value="1"
+						constraints="{min:1,places:0}" 
+					></div>
+					<div   
+						id="count"
+						jsId="countWidget"
+						dojoType="dijit.form.NumberSpinner"
+						value="20"
+						constraints="{min:1,max:100,places:0}" 
+					></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+				</td>
+				<td>
+					<div dojoType="dijit.form.Button" label="Search" id="searchButton" jsId="searchButtonWidget"></div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	<hr/>
+	<div dojoType="dojox.data.PicasaStore" jsId="flickrStore" label="title"></div>
+	<div dojoType="dojox.data.demos.widgets.PicasaViewList" id="flickrViews" jsId="flickrViewsWidget"></div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_ComboBox.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_ComboBox.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_ComboBox.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Dojox QueryReadStore+ComboBox Demo</title>
+	<style type="text/css">
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad: true"></script>
+</head>
+<body class="tundra">
+
+	<h1 class="testTitle">Dojox QueryReadStore + ComboBox demo</h1>
+ 
+	<h2>Everything is created ONLY in markup</h2>
+	<div style="float:left;">
+		<div dojoType="dojox.data.QueryReadStore"
+			jsId="store1"
+			url="../tests/stores/QueryReadStore.php"
+			requestMethod="post"></div>
+		<div dojoType="dijit.form.ComboBox" id="cb1" store="store1" pageSize="10"></div>
+		<button dojoType="dijit.form.Button" onclick="dijit.byId('cb1').reset()">reset</button>
+	</div>
+	<div style="float:left; margin-left:5em;">
+		var w = dijit.byId("cb1");
+		<br /><input id="value1" type="text" /> = w.value
+		<br /><input id="itemId1" type="text" /> = w.item ? w.store.getValue(w.item, "id") : "-"
+		<br /><input id="displayedValue1" type="text" /> = w.getDisplayedValue()
+		<br /><input id="isValid1" type="text" /> = w.isValid()
+		<br /><button dojoType="dijit.form.Button" onclick="refresh1()">refresh</button>
+	</div>
+
+	<script type="text/javascript">
+		dojo.require("dojox.data.QueryReadStore");
+		dojo.require("dijit.form.ComboBox");
+		dojo.require("dijit.form.Button");
+		
+		var w = null;
+		var refresh1 = function() {
+			dojo.byId("value1").value = w.value;
+			dojo.byId("itemId1").value = w.item ? w.store.getValue(w.item, "id") : "-";
+			dojo.byId("displayedValue1").value = w.getDisplayedValue();
+			dojo.byId("isValid1").value = w.isValid();
+		};
+		dojo.addOnLoad(function() {
+			w = dijit.byId("cb1");
+			dojo.connect(w.domNode, "onkeyup", refresh1);
+			dojo.connect(w, "onBlur", refresh1);
+			dojo.connect(w, "onChange", refresh1);
+			refresh1();
+		});
+	</script>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_FilteringSelect.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_FilteringSelect.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_FilteringSelect.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Dojox QueryReadStore+FilteringSelect Demo</title>
+	<style type="text/css">
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad: true"></script>
+</head>
+<body class="tundra">
+
+	<h1 class="testTitle">Dojox QueryReadStore + FilteringSelect demo</h1>
+ 
+	<h2>Everything is created ONLY in markup</h2>
+	<div style="float:left;">
+		<div dojoType="dojox.data.QueryReadStore"
+			jsId="store1"
+			url="../tests/stores/QueryReadStore.php"
+			requestMethod="post"></div>
+		<div dojoType="dijit.form.FilteringSelect" id="fs1" store="store1" pageSize="10"></div>
+		<button dojoType="dijit.form.Button" onclick="dijit.byId('fs1').reset()">reset</button>
+	</div>
+	<div style="float:left; margin-left:5em;">
+		var w = dijit.byId("fs1");
+		<br /><input id="value1" type="text" /> = w.value
+		<br /><input id="itemId1" type="text" /> = w.item ? w.store.getValue(w.item, "id") : "-"
+		<br /><input id="displayedValue1" type="text" /> = w.getDisplayedValue()
+		<br /><input id="isValid1" type="text" /> = w.isValid()
+		<br /><button dojoType="dijit.form.Button" onclick="refresh1()">refresh</button>
+	</div>
+
+	<script type="text/javascript">
+		dojo.require("dojox.data.QueryReadStore");
+		dojo.require("dijit.form.FilteringSelect");
+		dojo.require("dijit.form.Button");
+		
+		var w = null;
+		var refresh1 = function() {
+			dojo.byId("value1").value = w.value;
+			dojo.byId("itemId1").value = w.item ? w.store.getValue(w.item, "id") : "-";
+			dojo.byId("displayedValue1").value = w.getDisplayedValue();
+			dojo.byId("isValid1").value = w.isValid();
+		};
+		dojo.addOnLoad(function() {
+			w = dijit.byId("fs1");
+			dojo.connect(w.domNode, "onkeyup", refresh1);
+			dojo.connect(w, "onBlur", refresh1);
+			dojo.connect(w, "onChange", refresh1);
+			refresh1();
+		});
+	</script>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_grid.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_grid.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/demo_QueryReadStore_grid.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+<head>
+	<title>Dojox QueryReadStore+grid Demo</title>
+	<style type="text/css">
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+		/* BE SURE TO NEVER FORGET IMPORTING THE GRID's CSS, or you will wonder why the hell the grid looks so strange (or even think that it doesnt work) */
+		@import "../../../dojox/grid/_grid/tundraGrid.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad: true"></script>
+</head>
+<body class="tundra">
+
+	<h1 class="testTitle">Dojox QueryReadStore + Grid demo - paging, sortable and filterable all server-side</h1>
+ 
+	<h2>The grid is in HTML, store, model, etc. are JS, sorting is added by extending the model class</h2>
+	<b>Capabilities:</b> load data from server, show data, paging (30 rows at a time), sort, filter<br />
+	You can see that data are loaded upon demand by scrolling down in the grid below line #30,
+	open FireBug and you see a server request being issued, to retreive another 30 rows/items.<br />
+	<br /><br />
+	<input type="text" onkeyup="doSearch(this)" />
+	<div id="grid1" dojoType="dojox.Grid" style="height:300px; width:800px;"></div>
+
+	<h2>The store and grid are "generated" and connected in HTML, filtering is done via JS</h2>
+	This store is by default sorted descending by name (not as the one above, which is ascending).
+	<div dojoType="dojox.data.QueryReadStore"
+		jsId="store2"
+		url="../tests/stores/QueryReadStore.php"
+		requestMethod="post"></div>
+	<div dojoType="dojox.grid.data.DojoData"
+		jsId="model2"
+		store="store2"
+		sortFields="[{attribute: 'capital', descending: true}]"
+		rowsPerPage="30"></div>
+	<div dojoType="dojox.Grid" id="grid2"
+		model="model2"
+		structure="gridLayout"
+		style="height:300px; width:800px;"></div>
+
+	<script type="text/javascript">
+		dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+		dojo.require("dojox.grid.Grid");
+		dojo.require("dojox.grid._data.model"); // dojox.grid.data.DojoData is in there
+		dojo.require("dojox.data.QueryReadStore");
+		var gridLayout = [
+			{
+				cells: [[
+					{
+						name: "row #",
+						width:5,
+						styles: "text-align:right;",
+						get:function(inRowIndex) { return inRowIndex+1;} // this auto generates a row num
+					} 
+					,{
+						name: "id",
+						field: "id",
+						styles: "text-align:right;",
+						width:5
+					} 
+					,{
+						name: "Name",
+						field: "name",
+						width:20
+						//formatter: rs.chunk.adminUser.grid.formatUser
+					}
+					,{
+						name: "Capital",
+						field: "capital",
+						width:20
+						//formatter: rs.chunk.adminUser.grid.formatUser
+					}
+					,{
+						name: "Label",
+						width:20,
+						//styles: "text-align:right;",
+						field: "label"
+						//formatter: phpr.grid.formatDate
+					}
+					,{
+						name: "Abbrev.",
+						width:5,
+						//styles: "text-align:right;",
+						field: "abbreviation"
+						//formatter: phpr.grid.formatDate
+					}
+				]]
+			}
+		];
+		// Connect the model and store AFTER the page is loaded, since we can only access
+		// the widget then, since it will be created just before dojo.addOnLoad() is called.
+		var grid = null;
+		dojo.addOnLoad(function() {
+			// Instanciate the store, pass it to the model, connect them to the grid and add the layout ... just some hand work :-)
+			//var store = new dojox.data.QueryReadStore({url:"../tests/stores/QueryReadStore.php", requestMethod:"post", doClientPaging:false});
+			var store = new dojox.data.QueryReadStore({
+				url:"../tests/stores/QueryReadStore.php",
+				requestMethod:"post"
+			});
+			var model = new dojox.grid.data.DojoData(null, null, {
+				store:store,
+				rowsPerPage:30,
+				sortFields:[{attribute: 'name', descending: false}]
+			});
+			grid = dijit.byId("grid1");
+			grid.setModel(model);
+			grid.setStructure(gridLayout);
+			grid2 = dijit.byId("grid2");
+		});
+		
+		var lastSearchValue = "";
+		function doSearch(el) {
+			if (el.value!=lastSearchValue) {
+				grid.model.query = {name:el.value};
+				lastSearchValue = el.value;
+				grid.model.requestRows();
+				
+				// Filter the grid2 too.
+				grid2.model.query = {name:el.value};
+				grid2.model.requestRows();
+			}
+		}
+	</script>
+
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/flickrDemo.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/flickrDemo.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/flickrDemo.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/flickrDemo.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/flickrDemo.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/flickrDemo.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Argentina/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Argentina/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Argentina/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+{ 
+	name:'Argentina', 
+	type:'country', 
+	population:'40 million' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Brazil/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Brazil/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Brazil/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+{ 
+	name:'Brazil', 
+	type:'country', 
+	population:'186 million' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Ottawa/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Ottawa/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Ottawa/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+{ 
+		name:'Ottawa', 
+		type:'city', 
+		population:'0.9 million', 
+		timezone:'-5 UTC'
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Toronto/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Toronto/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/Toronto/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+{ 
+		name:'Toronto', 
+		type:'city', 
+		population:'2.5 million', 
+		timezone:'-5 UTC' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Canada/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,10 @@
+{ 
+	name:'Canada', 
+	type:'country',  
+	population:'33 million', area:'9,984,670 sq km',
+	children:[
+		{stub:'Ottawa'}, 
+		{stub:'Toronto'}
+	] 
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/China/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/China/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/China/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'China', 
+	type:'country' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Commonwealth of Australia/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Commonwealth of Australia/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Commonwealth of Australia/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+{ 
+	name:'Commonwealth of Australia', 
+	type:'country', 
+	population:'21 million'
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Egypt/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Egypt/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Egypt/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+{
+	name:'Egypt', 
+	type:'country' 
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/France/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/France/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/France/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'France', 
+	type:'country' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Germany/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Germany/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Germany/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'Germany', 
+	type:'country' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/India/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/India/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/India/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'India', 
+	type:'country' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Italy/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Italy/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Italy/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'Italy', 
+	type:'country' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Mombasa/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Mombasa/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Mombasa/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+{
+	name:'Mombasa', 
+	type:'city',
+	population: "Unknown"
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Nairobi/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Nairobi/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/Nairobi/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+{
+	name:'Nairobi', 
+	type:'city',
+	population: "Unknown"
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Kenya/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+{ 
+	name:'Kenya', 
+	type:'country',
+	children:[
+		{stub:'Nairobi'}, 
+		{stub:'Mombasa'}
+	] 
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Guadalajara/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Guadalajara/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Guadalajara/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+{ 
+	name:'Guadalajara', 
+	type:'city', 
+	population:'4 million', 
+	timezone:'-6 UTC' 
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Mexico City/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Mexico City/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/Mexico City/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+{ 
+	name:'Mexico City', 
+	type:'city', 
+	population:'19 million', 
+	timezone:'-6 UTC'
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mexico/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,10 @@
+{ 
+	name:'Mexico', 
+	type:'country',  
+	population:'108 million', 
+	area:'1,972,550 sq km',
+	children:[
+		{stub:'Mexico City'}, 
+		{stub:'Guadalajara'}
+	] 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mongolia/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mongolia/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Mongolia/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'Mongolia', 
+	type:'country' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Russia/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Russia/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Russia/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'Russia', 
+	type:'country' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Spain/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Spain/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Spain/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'Spain', 
+	type:'country' 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/Khartoum/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/Khartoum/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/Khartoum/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+{       
+	name:'Khartoum', 
+	type:'city'
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/Sudan/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+{ 
+	name:'Sudan', 
+	type:'country',
+	children:{stub:'Khartoum'} 
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/United States of America/data.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/United States of America/data.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/United States of America/data.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+{ 
+	name:'United States of America', 
+	type:'country'
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/root.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/root.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography/root.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,39 @@
+{  
+	identifier: 'name',
+	label: 'name',
+	items: [
+		{ name:'Africa', type:'continent',
+		children:[{_reference:'Egypt'}, {_reference:'Kenya'}, {_reference:'Sudan'}] },
+		{ name:'Egypt', type:'stub', parent: 'geography'},
+	 	{ name:'Kenya', type:'stub', parent: 'geography'},
+	 	{ name:'Sudan', type:'stub', parent: 'geography'},
+
+		{ name:'Asia', type:'continent',
+		children:[{_reference:'China'}, {_reference:'India'}, {_reference:'Russia'}, {_reference:'Mongolia'}] },
+		{ name:'China',    type:'stub', parent: 'geography'},
+	 	{ name:'India',    type:'stub', parent: 'geography'},
+		{ name:'Russia',   type:'stub', parent: 'geography'},
+		{ name:'Mongolia', type:'stub', parent: 'geography'},
+
+		{ name:'Australia', type:'continent', population:'21 million',
+		 children:{_reference:'Commonwealth of Australia'}},
+		{ name:'Commonwealth of Australia', type:'stub', parent:'geography'},
+
+		{ name:'Europe', type:'continent',
+		children:[{_reference:'Germany'}, {_reference:'France'}, {_reference:'Spain'}, {_reference:'Italy'}] },
+		{ name:'Germany', type:'stub', parent: 'geography'},
+		{ name:'France',  type:'stub', parent: 'geography'},
+		{ name:'Spain',   type:'stub', parent: 'geography'},
+		{ name:'Italy',   type:'stub', parent: 'geography'},
+
+		{ name:'North America', type:'continent',
+		children:[{_reference:'Mexico'}, {_reference:'Canada'}, {_reference:'United States of America'}] },
+		{ name:'Mexico',                   type:'stub', parent: 'geography'},
+		{ name:'Canada',                   type:'stub', parent: 'geography'},
+		{ name:'United States of America', type:'stub', parent: 'geography'},
+
+		{ name:'South America', type:'continent',
+		children:[{_reference:'Brazil'}, {_reference:'Argentina'}] },
+		{ name:'Brazil',    type:'stub', parent: 'geography'},
+		{ name:'Argentina', type:'stub', parent: 'geography'}
+]}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,45 @@
+{ identifier: 'name',
+  label: 'name',
+  items: [
+	{ name:'Africa', type:'continent', children:[
+		{ name:'Egypt', type:'country' }, 
+		{ name:'Kenya', type:'country', children:[
+			{ name:'Nairobi', type:'city' },
+			{ name:'Mombasa', type:'city' } ]
+		},
+		{ name:'Sudan', type:'country', children:
+			{ name:'Khartoum', type:'city' } 
+		} ]
+	},
+	{ name:'Asia', type:'continent', children:[
+		{ name:'China', type:'country' },
+		{ name:'India', type:'country' },
+		{ name:'Russia', type:'country' },
+		{ name:'Mongolia', type:'country' } ]
+	},
+	{ name:'Australia', type:'continent', population:'21 million', children:
+		{ name:'Commonwealth of Australia', type:'country', population:'21 million'}
+	},
+	{ name:'Europe', type:'continent', children:[
+		{ name:'Germany', type:'country' },
+		{ name:'France', type:'country' },
+		{ name:'Spain', type:'country' },
+		{ name:'Italy', type:'country' } ]
+	},
+	{ name:'North America', type:'continent', children:[
+		{ name:'Mexico', type:'country',  population:'108 million', area:'1,972,550 sq km', children:[
+			{ 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:[
+			{ 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:[
+		{ name:'Brazil', type:'country', population:'186 million' },
+		{ name:'Argentina', type:'country', population:'40 million' } ]
+	} ]
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography.xml
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography.xml	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/geography.xml	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<opml version="1.0">
+	<head>
+		<title>geography.opml</title>
+		<dateCreated>2006-11-10</dateCreated>
+		<dateModified>2006-11-13</dateModified>
+		<ownerName>Magellan, Ferdinand</ownerName>
+	</head>
+	<body>
+		<outline text="Africa" type="continent">
+			<outline text="Egypt" type="country"/>
+			<outline text="Kenya" type="country">
+				<outline text="Nairobi" type="city"/>
+				<outline text="Mombasa" type="city"/>
+			</outline>
+			<outline text="Sudan" type="country">
+				<outline text="Khartoum" type="city"/>
+			</outline>
+		</outline>
+		<outline text="Asia" type="continent">
+			<outline text="China" type="country"/>
+			<outline text="India" type="country"/>
+			<outline text="Russia" type="country"/>
+			<outline text="Mongolia" type="country"/>
+		</outline>
+		<outline text="Australia" type="continent" population="21 million">
+			<outline text="Australia" type="country" population="21 million"/>
+		</outline>
+		<outline text="Europe" type="continent">
+			<outline text="Germany" type="country"/>
+			<outline text="France" type="country"/>
+			<outline text="Spain" type="country"/>
+			<outline text="Italy" type="country"/>
+		</outline>
+		<outline text="North America" type="continent">
+			<outline text="Mexico" type="country" population="108 million" area="1,972,550 sq km">
+				<outline text="Mexico City" type="city" population="19 million" timezone="-6 UTC"/>
+				<outline text="Guadalajara" type="city" population="4 million" timezone="-6 UTC"/>
+			</outline>
+			<outline text="Canada" type="country" population="33 million" area="9,984,670 sq km">
+				<outline text="Ottawa" type="city" population="0.9 million" timezone="-5 UTC"/>
+				<outline text="Toronto" type="city" population="2.5 million" timezone="-5 UTC"/>
+			</outline>
+			<outline text="United States of America" type="country"/>
+		</outline>
+		<outline text="South America" type="continent">
+			<outline text="Brazil" type="country" population="186 million"/>
+			<outline text="Argentina" type="country" population="40 million"/>
+		</outline>
+	</body>
+</opml>

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/picasaDemo.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/picasaDemo.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/picasaDemo.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+.picasaView {
+	padding: 3 3 3 3;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #000000;
+	border-collapse: separate;
+        width: 100%;
+}
+.picasaView th {
+	text-align: left;
+} 
+.picasaView tr {
+	padding: 3 3 3 3;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #000000;
+}
+.picasaView tr td {
+	padding: 3 3 3 3;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #000000;
+}
+.picasaView {
+	background-color: #EFEFEF;
+        float: left;
+        width: 250px;
+        height: 250px;
+}
+.picasaSummary { 
+       width: 250px;
+       height: 30px;
+       overflow: hidden;
+ }
+.picasaTitle {
+	background-color: #CCCCCC;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/picasaDemo.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/picasaDemo.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/picasaDemo.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,44 @@
+.picasaView {
+	padding: 3 3 3 3;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #000000;
+	border-collapse: separate;
+        width: 100%;
+}
+
+.picasaView th {
+	text-align: left;
+} 
+
+.picasaView tr {
+	padding: 3 3 3 3;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #000000;
+}
+
+.picasaView tr td {
+	padding: 3 3 3 3;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #000000;
+}
+
+.picasaView {
+	background-color: #EFEFEF;
+        float: left;
+        width: 250px;
+        height: 250px;
+}
+
+.picasaSummary { 
+       width: 250px;
+       height: 30px;
+       overflow: hidden;
+ }
+
+.picasaTitle {
+	background-color: #CCCCCC;
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/stores/LazyLoadJSIStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/stores/LazyLoadJSIStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/stores/LazyLoadJSIStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,142 @@
+if(!dojo._hasResource["dojox.data.demos.stores.LazyLoadJSIStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.demos.stores.LazyLoadJSIStore"] = true;
+dojo.provide("dojox.data.demos.stores.LazyLoadJSIStore");
+dojo.require("dojo.data.ItemFileReadStore");
+
+dojo.declare("dojox.data.demos.stores.LazyLoadJSIStore", dojo.data.ItemFileReadStore, {
+	constructor: function(/* object */ keywordParameters){
+		// LazyLoadJSIStore extends ItemFileReadStore to implement an 
+		// example of lazy-loading/faulting in items on-demand.
+		// Note this is certianly not a perfect implementation, it is 
+		// an example.
+	},
+	
+	isItemLoaded: function(/*object*/ item) {
+		//	summary:
+		//		Overload of the isItemLoaded function to look for items of type 'stub', which indicate
+		//		the data hasn't been loaded in yet.
+		//
+		//	item:
+		//		The item to examine.
+		
+		//For this store, if it has the value of stub for its type attribute, 
+		//then the item basn't been fully loaded yet.  It's just a placeholder.
+		if(this.getValue(item, "type") === "stub"){
+			return false;
+		}
+		return true;
+	},
+		
+	loadItem: function(keywordArgs){
+		//	summary:
+		//		Overload of the loadItem function to fault in items.  This assumes the data for an item is laid out
+		//		in a RESTful sort of pattern name0/name1/data.json and so on and uses that to load the data.
+		//		It will also detect stub items in the newly loaded item and insert the stubs into the ItemFileReadStore
+		//		list so they can also be loaded in on-demand.
+		//
+		//	item:
+		//		The item to examine.
+
+		var item = keywordArgs.item;
+		this._assertIsItem(item);
+
+		//Build the path to the data.json for this item
+		//The path consists of where its parent was loaded from 
+		//plus the item name.
+		var itemName = this.getValue(item, "name");
+		var parent   = this.getValue(item, "parent");
+		var dataUrl  = "";
+		if (parent){
+			dataUrl += (parent + "/");
+		}
+
+		//For this store, all child input data is loaded from a url that ends with data.json
+		dataUrl += itemName + "/data.json";
+
+		//Need a reference to the store to call back to its structures.
+		var self = this;
+
+		// Callback for handling a successful load.
+		var gotData = function(data){
+			//Now we need to modify the existing item a bit to take it out of stub state
+			//Since we extend the store and have knowledge of the internal
+			//structure, this can be done here.  Now, is we extended
+			//a write store, we could call the write APIs to do this too
+			//But for a simple demo the diretc modification in the store function
+			//is sufficient.
+
+			//Clear off the stub indicators.
+			delete item.type;
+			delete item.parent;
+
+			//Set up the loaded values in the format ItemFileReadStore uses for attributes.
+			for (i in data) {
+				if (dojo.isArray(data[i])) {
+					item[i] = data[i];
+				}else{
+					item[i] = [data[i]];
+				}
+			}
+
+			//Reset the item in the reference.
+			self._arrayOfAllItems[item[self._itemNumPropName]] = item;
+
+			//Scan the new values in the item for extra stub items we need to 
+			//add to the items array of the store so they can be lazy-loaded later...
+			var attributes = self.getAttributes(item);
+			for(i in attributes){
+				var values = self.getValues(item, attributes[i]);
+				for (var j = 0; j < values.length; j++) {
+					var value = values[j];
+					
+					if(typeof value === "object"){
+						if(value["stub"] ){
+							//We have a stub reference here, we need to create the stub item
+							var stub = {
+								type: ["stub"],
+								name: [value["stub"]],	//
+								parent: [itemName]		//The child stub item is parented by this item name...
+							};
+							if (parent) {
+								//Add in any parents to your parent so URL construstruction is accurate.
+								stub.parent[0] = parent + "/" + stub.parent[0]; 
+							}
+							//Finalize the addition of the new stub item into the ItemFileReadStore list.
+							self._arrayOfAllItems.push(stub);
+							stub[self._storeRefPropName] = self;
+							stub[self._itemNumPropName] = (self._arrayOfAllItems.length - 1); //Last one pushed in should be the item
+							values[j] = stub; //Set the stub item back in its place and replace the stub notation.
+						}
+					}
+				}
+			}
+
+			//Done processing!  Call the onItem, if any.
+			if(keywordArgs.onItem){
+				var scope = keywordArgs.scope ? keywordArgs.scope : dojo.global;
+				keywordArgs.onItem.call(scope, item);
+			}
+		};
+
+		//Callback for any errors that occur during load.
+		var gotError = function(error){
+			//Call the onComplete, if any
+			if(keywordArgs.onError){
+				var scope = keywordArgs.scope ? keywordArgs.scope : dojo.global;
+				keywordArgs.onError.call(scope, error);
+			}
+		};
+
+		//Fire the get and pass the proper callbacks to the deferred.
+		var xhrArgs = {
+			url: dataUrl,
+			handleAs: "json-comment-optional"
+		};
+		var d = dojo.xhrGet(xhrArgs);
+		d.addCallback(gotData);
+		d.addErrback(gotError);
+	}
+});
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/FlickrView.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/FlickrView.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/FlickrView.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,36 @@
+if(!dojo._hasResource["dojox.data.demos.widgets.FlickrView"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.demos.widgets.FlickrView"] = true;
+dojo.provide("dojox.data.demos.widgets.FlickrView");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Widget");
+
+dojo.declare("dojox.data.demos.widgets.FlickrView", [dijit._Widget, dijit._Templated], {
+	//Simple demo widget for representing a view of a Flickr Item.
+
+	templateString:"<table class=\"flickrView\">\n\t<tbody>\n\t\t<tr class=\"flickrTitle\">\n\t\t\t<td>\n\t\t\t\t<b>\n\t\t\t\t\tTitle:\n\t\t\t\t</b>\n\t\t\t</td>\n\t\t\t<td dojoAttachPoint=\"titleNode\">\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<b>\n\t\t\t\t\tAuthor:\n\t\t\t\t</b>\n\t\t\t</td>\n\t\t\t<td dojoAttachPoint=\"authorNode\">\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td colspan=\"2\">\n\t\t\t\t<b>\n\t\t\t\t\tImage:\n\t\t\t\t</b>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dojoAttachPoint=\"imageNode\" colspan=\"2\">\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n",
+
+	//Attach points for reference.
+	titleNode: null, 
+	descriptionNode: null,
+	imageNode: null,
+	authorNode: null,
+
+	title: "",
+	author: "",
+	imageUrl: "",
+	iconUrl: "",
+
+	postCreate: function(){
+		this.titleNode.appendChild(document.createTextNode(this.title));
+		this.authorNode.appendChild(document.createTextNode(this.author));
+		var href = document.createElement("a");
+		href.setAttribute("href", this.imageUrl);
+		href.setAttribute("target", "_blank");
+        var imageTag = document.createElement("img");
+		imageTag.setAttribute("src", this.iconUrl);
+		href.appendChild(imageTag);
+		this.imageNode.appendChild(href);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/FlickrViewList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/FlickrViewList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/FlickrViewList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+if(!dojo._hasResource["dojox.data.demos.widgets.FlickrViewList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.demos.widgets.FlickrViewList"] = true;
+dojo.provide("dojox.data.demos.widgets.FlickrViewList");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Widget");
+dojo.require("dojox.data.demos.widgets.FlickrView");
+
+dojo.declare("dojox.data.demos.widgets.FlickrViewList", [dijit._Widget, dijit._Templated], {
+	//Simple demo widget that is just a list of FlickrView Widgets.
+
+	templateString:"<div dojoAttachPoint=\"list\"></div>\n\n",
+
+	//Attach points for reference.
+	listNode: null,
+
+	postCreate: function(){
+		this.fViewWidgets = [];
+	},
+
+	clearList: function(){
+		while(this.list.firstChild){
+			this.list.removeChild(this.list.firstChild);
+		}
+		for(var i = 0; i < this.fViewWidgets.length; i++){
+			this.fViewWidgets[i].destroy();
+		}
+		this.fViewWidgets = [];
+	},
+
+	addView: function(viewData){
+		 var newView  = new dojox.data.demos.widgets.FlickrView(viewData);
+		 this.fViewWidgets.push(newView);
+		 this.list.appendChild(newView.domNode);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/PicasaView.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/PicasaView.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/PicasaView.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+if(!dojo._hasResource["dojox.data.demos.widgets.PicasaView"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.demos.widgets.PicasaView"] = true;
+dojo.provide("dojox.data.demos.widgets.PicasaView");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Widget");
+
+dojo.declare("dojox.data.demos.widgets.PicasaView", [dijit._Widget, dijit._Templated], {
+	//Simple demo widget for representing a view of a Picasa Item.
+
+	templateString:"<table class=\"picasaView\">\n\t<tbody>\n\t\t<tr class=\"picasaTitle\">\n\t\t\t<td>\n\t\t\t\t<b>\n\t\t\t\t\tTitle:\n\t\t\t\t</b>\n\t\t\t</td>\n\t\t\t<td dojoAttachPoint=\"titleNode\">\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<b>\n\t\t\t\t\tAuthor:\n\t\t\t\t</b>\n\t\t\t</td>\n\t\t\t<td dojoAttachPoint=\"authorNode\">\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td colspan=\"2\">\n\t\t\t\t<b>\n\t\t\t\t\tSummary:\n\t\t\t\t</b>\n\t\t\t\t<span class=\"picasaSummary\" dojoAttachPoint=\"descriptionNode\"></span>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dojoAttachPoint=\"imageNode\" colspan=\"2\">\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n",
+
+	//Attach points for reference.
+	titleNode: null, 
+	descriptionNode: null,
+	imageNode: null,
+	authorNode: null,
+
+	title: "",
+	author: "",
+	imageUrl: "",
+	iconUrl: "",
+
+	postCreate: function(){
+		this.titleNode.appendChild(document.createTextNode(this.title));
+		this.authorNode.appendChild(document.createTextNode(this.author));
+		this.descriptionNode.appendChild(document.createTextNode(this.description));
+		var href = document.createElement("a");
+		href.setAttribute("href", this.imageUrl);
+		href.setAttribute("target", "_blank");
+        var imageTag = document.createElement("img");
+		imageTag.setAttribute("src", this.iconUrl);
+		href.appendChild(imageTag);
+		this.imageNode.appendChild(href);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/PicasaViewList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/PicasaViewList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/PicasaViewList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+if(!dojo._hasResource["dojox.data.demos.widgets.PicasaViewList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.demos.widgets.PicasaViewList"] = true;
+dojo.provide("dojox.data.demos.widgets.PicasaViewList");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Widget");
+dojo.require("dojox.data.demos.widgets.PicasaView");
+
+dojo.declare("dojox.data.demos.widgets.PicasaViewList", [dijit._Widget, dijit._Templated], {
+	//Simple demo widget that is just a list of PicasaView Widgets.
+
+	templateString:"<div dojoAttachPoint=\"list\"></div>\n\n",
+
+	//Attach points for reference.
+	listNode: null,
+
+	postCreate: function(){
+		this.fViewWidgets = [];
+	},
+
+	clearList: function(){
+		while(this.list.firstChild){
+			this.list.removeChild(this.list.firstChild);
+		}
+		for(var i = 0; i < this.fViewWidgets.length; i++){
+			this.fViewWidgets[i].destroy();
+		}
+		this.fViewWidgets = [];
+	},
+
+	addView: function(viewData){
+		 var newView  = new dojox.data.demos.widgets.PicasaView(viewData);
+		 this.fViewWidgets.push(newView);
+		 this.list.appendChild(newView.domNode);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/FlickrView.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/FlickrView.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/FlickrView.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,34 @@
+<table class="flickrView">
+	<tbody>
+		<tr class="flickrTitle">
+			<td>
+				<b>
+					Title:
+				</b>
+			</td>
+			<td dojoAttachPoint="titleNode">
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<b>
+					Author:
+				</b>
+			</td>
+			<td dojoAttachPoint="authorNode">
+			</td>
+		</tr>
+		<tr>
+			<td colspan="2">
+				<b>
+					Image:
+				</b>
+			</td>
+		</tr>
+		<tr>
+			<td dojoAttachPoint="imageNode" colspan="2">
+			</td>
+		</tr>
+	</tbody>
+</table>
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/FlickrViewList.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/FlickrViewList.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/FlickrViewList.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,2 @@
+<div dojoAttachPoint="list"></div>
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/PicasaView.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/PicasaView.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/PicasaView.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,35 @@
+<table class="picasaView">
+	<tbody>
+		<tr class="picasaTitle">
+			<td>
+				<b>
+					Title:
+				</b>
+			</td>
+			<td dojoAttachPoint="titleNode">
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<b>
+					Author:
+				</b>
+			</td>
+			<td dojoAttachPoint="authorNode">
+			</td>
+		</tr>
+		<tr>
+			<td colspan="2">
+				<b>
+					Summary:
+				</b>
+				<span class="picasaSummary" dojoAttachPoint="descriptionNode"></span>
+			</td>
+		</tr>
+		<tr>
+			<td dojoAttachPoint="imageNode" colspan="2">
+			</td>
+		</tr>
+	</tbody>
+</table>
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/PicasaViewList.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/PicasaViewList.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/demos/widgets/templates/PicasaViewList.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,2 @@
+<div dojoAttachPoint="list"></div>
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/dom.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/dom.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/dom.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,187 @@
+if(!dojo._hasResource["dojox.data.dom"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.dom"] = true;
+dojo.provide("dojox.data.dom");
+
+//DOM type to int value for reference.
+//Ints make for more compact code than full constant names.
+//ELEMENT_NODE                  = 1;
+//ATTRIBUTE_NODE                = 2;
+//TEXT_NODE                     = 3;
+//CDATA_SECTION_NODE            = 4;
+//ENTITY_REFERENCE_NODE         = 5;
+//ENTITY_NODE                   = 6;
+//PROCESSING_INSTRUCTION_NODE   = 7;
+//COMMENT_NODE                  = 8;
+//DOCUMENT_NODE                 = 9;
+//DOCUMENT_TYPE_NODE            = 10;
+//DOCUMENT_FRAGMENT_NODE        = 11;
+//NOTATION_NODE                 = 12;
+
+//FIXME:  Remove this file when possible.
+//This file contains internal/helper APIs as holders until the true DOM apis of Dojo 0.9 are finalized.
+//Therefore, these should not be generally used, they are present only for the use by XmlStore and the
+//wires project until proper dojo replacements are available.  When such exist, XmlStore and the like
+//will be ported off these and this file will be deleted.
+dojo.experimental("dojox.data.dom");
+
+dojox.data.dom.createDocument = function(/*string?*/ str, /*string?*/ mimetype){
+	//	summary:
+	//		cross-browser implementation of creating an XML document object.
+	//
+	//	str:
+	//		Optional text to create the document from.  If not provided, an empty XML document will be created.
+	//	mimetype:
+	//		Optional mimetype of the text.  Typically, this is text/xml.  Will be defaulted to text/xml if not provided.
+	var _document = dojo.doc;
+
+	if(!mimetype){ mimetype = "text/xml"; }
+	if(str && (typeof dojo.global["DOMParser"]) !== "undefined"){
+		var parser = new DOMParser();
+		return parser.parseFromString(str, mimetype);	//	DOMDocument
+	}else if((typeof dojo.global["ActiveXObject"]) !== "undefined"){
+		var prefixes = [ "MSXML2", "Microsoft", "MSXML", "MSXML3" ];
+		for(var i = 0; i<prefixes.length; i++){
+			try{
+				var doc = new ActiveXObject(prefixes[i]+".XMLDOM");
+				if(str){
+					if(doc){
+						doc.async = false;
+						doc.loadXML(str);
+						return doc;	//	DOMDocument
+					}else{
+						console.log("loadXML didn't work?");
+					}
+				}else{
+					if(doc){ 
+						return doc; //DOMDocument
+					}
+				}
+			}catch(e){ /* squelch */ };
+		}
+	}else if((_document.implementation)&&
+		(_document.implementation.createDocument)){
+		if(str){
+			if(_document.createElement){
+				// FIXME: this may change all tags to uppercase!
+				var tmp = _document.createElement("xml");
+				tmp.innerHTML = str;
+				var xmlDoc = _document.implementation.createDocument("foo", "", null);
+				for(var i = 0; i < tmp.childNodes.length; i++) {
+					xmlDoc.importNode(tmp.childNodes.item(i), true);
+				}
+				return xmlDoc;	//	DOMDocument
+			}
+		}else{
+			return _document.implementation.createDocument("", "", null); // DOMDocument
+		}
+	}
+	return null;	//	DOMDocument
+}
+
+dojox.data.dom.textContent = function(/*Node*/node, /*string?*/text){
+	//	summary:
+	//		Implementation of the DOM Level 3 attribute; scan node for text
+	//	description:
+	//		Implementation of the DOM Level 3 attribute; scan node for text
+	//		This function can also update the text of a node by replacing all child 
+	//		content of the node.
+	//	node:
+	//		The node to get the text off of or set the text on.
+	//	text:
+	//		Optional argument of the text to apply to the node.
+	if(arguments.length>1){
+		var _document = node.ownerDocument || dojo.doc;  //Preference is to get the node owning doc first or it may fail
+		dojox.data.dom.replaceChildren(node, _document.createTextNode(text));
+		return text;	//	string
+	} else {
+		if(node.textContent !== undefined){ //FF 1.5
+			return node.textContent;	//	string
+		}
+		var _result = "";
+		if(node == null){
+			return _result; //empty string.
+		}
+		for(var i = 0; i < node.childNodes.length; i++){
+			switch(node.childNodes[i].nodeType){
+				case 1: // ELEMENT_NODE
+				case 5: // ENTITY_REFERENCE_NODE
+					_result += dojox.data.dom.textContent(node.childNodes[i]);
+					break;
+				case 3: // TEXT_NODE
+				case 2: // ATTRIBUTE_NODE
+				case 4: // CDATA_SECTION_NODE
+					_result += node.childNodes[i].nodeValue;
+					break;
+				default:
+					break;
+			}
+		}
+		return _result;	//	string
+	}
+}
+
+dojox.data.dom.replaceChildren = function(/*Element*/node, /*Node || array*/ newChildren){
+	//	summary:
+	//		Removes all children of node and appends newChild. All the existing
+	//		children will be destroyed.
+	//	description:
+	//		Removes all children of node and appends newChild. All the existing
+	//		children will be destroyed.
+	// 	node:
+	//		The node to modify the children on
+	//	newChildren:
+	//		The children to add to the node.  It can either be a single Node or an
+	//		array of Nodes.
+	var nodes = [];
+	
+	if(dojo.isIE){
+		for(var i=0;i<node.childNodes.length;i++){
+			nodes.push(node.childNodes[i]);
+		}
+	}
+
+	dojox.data.dom.removeChildren(node);
+	for(var i=0;i<nodes.length;i++){
+		dojo._destroyElement(nodes[i]);
+	}
+
+	if(!dojo.isArray(newChildren)){
+		node.appendChild(newChildren);
+	}else{
+		for(var i=0;i<newChildren.length;i++){
+			node.appendChild(newChildren[i]);
+		}
+	}
+}
+
+dojox.data.dom.removeChildren = function(/*Element*/node){
+	//	summary:
+	//		removes all children from node and returns the count of children removed.
+	//		The children nodes are not destroyed. Be sure to call dojo._destroyElement on them
+	//		after they are not used anymore.
+	//	node:
+	//		The node to remove all the children from.
+	var count = node.childNodes.length;
+	while(node.hasChildNodes()){
+		node.removeChild(node.firstChild);
+	}
+	return count; // int
+}
+
+
+dojox.data.dom.innerXML = function(/*Node*/node){
+	//	summary:
+	//		Implementation of MS's innerXML function.
+	//	node:
+	//		The node from which to generate the XML text representation.
+	if(node.innerXML){
+		return node.innerXML;	//	string
+	}else if (node.xml){
+		return node.xml;		//	string
+	}else if(typeof XMLSerializer != "undefined"){
+		return (new XMLSerializer()).serializeToString(node);	//	string
+	}
+}
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/data/jsonPathStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/data/jsonPathStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/data/jsonPathStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,1191 @@
+if(!dojo._hasResource["dojox.data.jsonPathStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.jsonPathStore"] = true;
+dojo.provide("dojox.data.jsonPathStore");
+dojo.require("dojox.jsonPath");
+dojo.require("dojo.date");
+dojo.require("dojo.date.locale");
+dojo.require("dojo.date.stamp");
+
+dojox.data.ASYNC_MODE = 0;
+dojox.data.SYNC_MODE = 1;
+
+dojo.declare("dojox.data.jsonPathStore",
+	null,
+	{
+		mode: dojox.data.ASYNC_MODE,
+		metaLabel: "_meta",
+		hideMetaAttributes: false,
+		autoIdPrefix: "_auto_",
+		autoIdentity: true,
+		idAttribute: "_id",
+		indexOnLoad: true,
+		labelAttribute: "",
+		url: "",
+		_replaceRegex: /\'\]/gi,
+		
+		constructor: function(options){
+			//summary:
+			//	jsonPathStore constructor, instantiate a new jsonPathStore 
+			//
+			//	Takes a single optional parameter in the form of a Javascript object
+			//	containing one or more of the following properties. 
+			//
+			//	data: /*JSON String*/ || /* Javascript Object */, 
+			//		JSON String or Javascript object this store will control
+			//		JSON is converted into an object, and an object passed to
+			//		the store will be used directly.  If no data and no url
+			//		is provide, an empty object, {}, will be used as the initial
+			//		store.
+			//
+			//	url: /* string url */ 	
+			//		Load data from this url in JSON format and use the Object
+			//		created from the data as the data source.
+			//
+			//	indexOnLoad: /* boolean */ 
+			//		Defaults to true, but this may change in the near future.
+			//		Parse the data object and set individual objects up as
+			//		appropriate.  This will add meta data and assign
+			//		id's to objects that dont' have them as defined by the
+			//		idAttribute option.  Disabling this option will keep this 
+			//		parsing from happening until a query is performed at which
+			//		time only the top level of an item has meta info stored.
+			//		This might work in some situations, but you will almost
+			//		always want to indexOnLoad or use another option which
+			//		will create an index.  In the future we will support a 
+			//		generated index that maps by jsonPath allowing the
+			//		server to take some of this load for larger data sets. 
+			//
+			//	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. There
+			//		are utility routines for exporting data from the store
+			//		that can clean any generated IDs before exporting and leave
+			//		preexisting id's in tact.
+			//
+			//	metaLabel: /* string */
+			//		Defaults to '_meta' overrides the attribute name that is used by the store
+			//		for attaching meta information to an object while
+			//		in the store's control.  Defaults to '_meta'. 
+			//	
+			//	hideMetaAttributes: /* boolean */
+			//		Defaults to False.  When enabled, calls to getAttributes() will not 
+			//		include the meta attribute.
+			//
+			//	autoIdPrefix: /*string*/
+			//		Defaults to "_auto_".  This string is used as the prefix to any
+			//		objects which have a generated id. A numeric index is appended
+			//		to this string to complete the ID
+			//
+			//	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 (options){
+				dojo.mixin(this,options);
+			}
+
+			this._dirtyItems=[];
+			this._autoId=0;
+			this._referenceId=0;
+			this._references={};
+			this._fetchQueue=[];
+			this.index={};
+
+			//regex to identify when we're travelling down metaObject (which we don't want to do) 
+			var expr="("+this.metaLabel+"\'\])";
+			this.metaRegex = new RegExp(expr);
+
+
+			//no data or url, start with an empty object for a store
+			if (!this.data && !this.url){
+				this.setData({});
+			}	
+
+			//we have data, but no url, set the store as the data
+			if (this.data && !this.url){
+				this.setData(this.data);
+
+				//remove the original refernce, we're now using _data from here on out
+				delete this.data;
+			}
+
+			//given a url, load json data from as the store
+			if (this.url){
+				dojo.xhrGet({
+					url: options.url,
+					handleAs: "json",
+					load: dojo.hitch(this, "setData"),
+					sync: this.mode
+				});
+			}
+		},
+
+		_loadData: function(data){
+			// summary:
+			//	load data into the store. Index it if appropriate.
+			if (this._data){
+				delete this._data;
+			}
+
+			if (dojo.isString(data)){
+				this._data = dojo.fromJson(data);
+			}else{
+				this._data = data;
+			}
+			
+			if (this.indexOnLoad){
+				this.buildIndex();		
+			}	
+
+			this._updateMeta(this._data, {path: "$"});
+
+			this.onLoadData(this._data);
+		},
+
+		onLoadData: function(data){
+			// summary
+			//	Called after data has been loaded in the store.  
+			//	If any requests happened while the startup is happening
+			//	then process them now.
+
+			while (this._fetchQueue.length>0){
+				var req = this._fetchQueue.shift();
+				this.fetch(req);
+			}	
+
+		},
+
+		setData: function(data){
+			// summary:
+			//	set the stores' data to the supplied object and then 
+			//	load and/or setup that data with the required meta info		
+			this._loadData(data);
+		},
+
+		buildIndex: function(path, item){
+			//summary: 
+			//	parse the object structure, and turn any objects into
+			//	jsonPathStore items. Basically this just does a recursive
+			//	series of fetches which itself already examines any items
+			//	as they are retrieved and setups up the required meta information. 
+			//
+			//	path: /* string */
+			//		jsonPath Query for the starting point of this index construction.
+
+			if (!this.idAttribute){
+				throw new Error("buildIndex requires idAttribute for the store");
+			}
+
+			item = item || this._data;
+			var origPath = path;
+			path = path||"$";
+			path += "[*]";
+			var data = this.fetch({query: path,mode: dojox.data.SYNC_MODE});
+			for(var i=0; i<data.length;i++){
+				if(dojo.isObject(data[i])){
+					var newPath = data[i][this.metaLabel]["path"];
+					if (origPath){
+						//console.log("newPath: ", newPath);
+						//console.log("origPath: ", origPath);
+						//console.log("path: ", path);
+						//console.log("data[i]: ", data[i]);
+						var parts = origPath.split("\[\'");
+						var attribute = parts[parts.length-1].replace(this._replaceRegex,'');
+						//console.log("attribute: ", attribute);
+						//console.log("ParentItem: ", item, attribute);
+						if (!dojo.isArray(data[i])){
+							this._addReference(data[i], {parent: item, attribute:attribute});
+							this.buildIndex(newPath, data[i]);
+						}else{
+							this.buildIndex(newPath,item);
+						}
+					}else{
+						var parts = newPath.split("\[\'");
+						var attribute = parts[parts.length-1].replace(this._replaceRegex,'');
+						this._addReference(data[i], {parent: this._data, attribute:attribute});
+						this.buildIndex(newPath, data[i]);
+					}
+				}
+			}
+		},
+
+		_correctReference: function(item){
+			// summary:
+			//	make sure we have an reference to the item in the store
+			//	and not a clone. Takes an item, matches it to the corresponding
+			//	item in the store and if it is the same, returns itself, otherwise
+			//	it returns the item from the store.
+		
+			if (this.index[item[this.idAttribute]][this.metaLabel]===item[this.metaLabel]){
+				return this.index[item[this.idAttribute]];
+			}
+			return item;	
+		},
+
+		getValue: function(item, property){
+			// summary:
+			//	Gets the value of an item's 'property'
+			//
+			//	item: /* object */
+			//	property: /* string */
+			//		property to look up value for	
+			item = this._correctReference(item);
+			return item[property];
+		},
+
+		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	
+	
+			item = this._correctReference(item);
+			return dojo.isArray(item[property]) ? item[property] : [item[property]];
+		},
+
+		getAttributes: function(item){
+			// summary:
+			//	Gets the available attributes of an item's 'property' and returns
+			//	it as an array. If the store has 'hideMetaAttributes' set to true
+			//	the attributed identified by 'metaLabel' will not be included.
+			//
+			//	item: /* object */
+
+			item = this._correctReference(item);
+			var res = [];
+			for (var i in item){
+				if (this.hideMetaAttributes && (i==this.metaLabel)){continue;}
+				res.push(i);
+			}
+			return res;
+		},
+
+		hasAttribute: function(item,attribute){
+			// summary:
+			//	Checks to see if item has attribute
+			//
+			//	item: /* object */
+			//	attribute: /* string */
+		
+			item = this._correctReference(item);
+			if (attribute in item){return true;}
+			return false;	
+		},
+
+		containsValue: function(item, attribute, value){
+			// summary:
+			//	Checks to see if 'item' has 'value' at 'attribute'
+			//
+			//	item: /* object */
+			//	attribute: /* string */
+			//	value: /* anything */
+			item = this._correctReference(item);
+
+			if (item[attribute] && item[attribute]==value){return true}
+			if (dojo.isObject(item[attribute]) || dojo.isObject(value)){
+				if (this._shallowCompare(item[attribute],value)){return true}
+			}
+			return false;	
+		},
+
+		_shallowCompare: function(a, b){
+			//summary does a simple/shallow compare of properties on an object
+			//to the same named properties on the given item. Returns
+			//true if all props match. It will not descend into child objects
+			//but it will compare child date objects
+
+			if ((dojo.isObject(a) && !dojo.isObject(b))|| (dojo.isObject(b) && !dojo.isObject(a))) {
+				return false;
+			}
+
+			if ( a["getFullYear"] || b["getFullYear"] ){
+				//confirm that both are dates
+				if ( (a["getFullYear"] && !b["getFullYear"]) || (b["getFullYear"] && !a["getFullYear"]) ){
+					return false;
+				}else{
+					if (!dojo.date.compare(a,b)){
+						return true;
+					}
+					return false;
+       				}
+			}
+
+			for (var i in b){	
+				if (dojo.isObject(b[i])){
+					if (!a[i] || !dojo.isObject(a[i])){return false}
+
+					if (b[i]["getFullYear"]){
+						if(!a[i]["getFullYear"]){return false}
+						if (dojo.date.compare(a,b)){return false}	
+					}else{
+						if (!this._shallowCompare(a[i],b[i])){return false}
+					}
+				}else{	
+					if (!b[i] || (a[i]!=b[i])){return false}
+				}
+			}
+
+			//make sure there werent props on a that aren't on b, if there aren't, then
+			//the previous section will have already evaluated things.
+
+			for (var i in a){
+				if (!b[i]){return false}
+			}
+			
+			return true;
+		},
+
+		isItem: function(item){
+			// summary:
+			//	Checks to see if a passed 'item'
+			//	is really a jsonPathStore item.  Currently
+			//	it only verifies structure.  It does not verify
+			//	that it belongs to this store at this time.
+			//
+			//	item: /* object */
+			//	attribute: /* string */
+		
+			if (!dojo.isObject(item) || !item[this.metaLabel]){return false}
+			if (this.requireId && this._hasId && !item[this._id]){return false}
+			return true;
+		},
+
+		isItemLoaded: function(item){
+			// summary:
+			//	returns isItem() :)
+			//
+			//	item: /* object */
+
+			item = this._correctReference(item);
+			return this.isItem(item);
+		},
+
+		loadItem: function(item){
+			// summary:
+			//	returns true. Future implementatins might alter this 
+			return true;
+		},
+
+		_updateMeta: function(item, props){
+			// summary:
+			//	verifies that 'item' has a meta object attached
+			//	and if not it creates it by setting it to 'props'
+			//	if the meta attribute already exists, mix 'props'
+			//	into it.
+
+			if (item && item[this.metaLabel]){
+				dojo.mixin(item[this.metaLabel], props);
+				return;
+			}
+
+			item[this.metaLabel]=props;
+		},
+
+		cleanMeta: function(data, options){
+			// summary
+			//	Recurses through 'data' and removes an
+			//	meta information that has been attached. This
+			//	function will also removes any id's that were autogenerated
+			//	from objects.  It will not touch id's that were not generated
+
+			data = data || this._data;
+
+			if (data[this.metaLabel]){
+				if(data[this.metaLabel]["autoId"]){
+					delete data[this.idAttribute];
+				}
+				delete data[this.metaLabel];
+			}
+
+			if (dojo.isArray(data)){
+				for(var i=0; i<data.length;i++){
+					if(dojo.isObject(data[i]) || dojo.isArray(data[i]) ){
+						this.cleanMeta(data[i]);
+					}
+				}
+			} else if (dojo.isObject(data)){
+				for (var i in data){
+					this.cleanMeta(data[i]);
+				}
+			}
+		}, 
+
+		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 "$..*". jsonPath query to be performed 
+			//		on data store. **note that since some widgets
+			//		expect this to be an object, an object in the form
+			//		of {query: '$[*'], queryOptions: "someOptions"} is
+			//		acceptable	
+			//
+			//	mode: dojox.data.SYNC_MODE || dojox.data.ASYNC_MODE
+			//		Override the stores default mode.
+			//
+			//	queryOptions: /* object */
+			//		Options passed on to the underlying jsonPath query
+			//		system.
+			//
+			//	start: /* int */
+			//		Starting item in result set
+			//
+			//	count: /* int */
+			//		Maximum number of items to return
+			//
+			//	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
+
+			// we're not started yet, add this request to a queue and wait till we do	
+			if (!this._data){
+				this._fetchQueue.push(args);
+				return args;
+			}	
+			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.mode) {args.mode = this.mode;}
+			if (!args.queryOptions) {args.queryOptions={};}
+
+			args.queryOptions.resultType='BOTH';
+			var results = dojox.jsonPath.query(this._data, query, args.queryOptions);
+			var tmp=[];
+			var count=0;
+			for (var i=0; i<results.length; i++){
+				if(args.start && i<args.start){continue;}
+				if (args.count && (count >= args.count)) { continue; }
+
+				var item = results[i]["value"];
+				var path = results[i]["path"];
+				if (!dojo.isObject(item)){continue;}
+				if(this.metaRegex.exec(path)){continue;}
+
+				//this automatically records the objects path
+				this._updateMeta(item,{path: results[i].path});
+
+				//if autoIdentity and no id, generate one and add it to the item
+				if(this.autoIdentity && !item[this.idAttribute]){
+					var newId = this.autoIdPrefix + this._autoId++;
+					item[this.idAttribute]=newId;
+					item[this.metaLabel]["autoId"]=true;
+				}
+
+				//add item to the item index if appropriate
+				if(item[this.idAttribute]){this.index[item[this.idAttribute]]=item}
+				count++;
+				tmp.push(item);
+			}
+			results = tmp;
+			var scope = args.scope || dojo.global;
+
+			if ("sort" in args){
+				console.log("TODO::add support for sorting in the fetch");
+			}	
+
+			if (args.mode==dojox.data.SYNC_MODE){ 
+				return results; 
+			};
+
+			if (args.onBegin){	
+				args["onBegin"].call(scope, results.length, args);
+			}
+
+			if (args.onItem){
+				for (var i=0; i<results.length;i++){	
+					args["onItem"].call(scope, results[i], args);
+				}
+			}
+ 
+			if (args.onComplete){
+				args["onComplete"].call(scope, results, args);
+			}
+
+			return args;
+		},
+
+		dump: function(options){
+			// summary:
+			//
+			//	exports the store data set. Takes an options
+			//	object with a number of parameters
+			//
+			//	data: /* object */
+			//		Defaults to the root of the store.
+		 	//		The data to be exported.
+			//	
+			//	clone: /* boolean */
+			//		clone the data set before returning it 
+			//		or modifying it for export
+			//
+			//	cleanMeta: /* boolean */
+			//		clean the meta data off of the data. Note
+			//		that this will happen to the actual
+			//		store data if !clone. If you want
+			//		to continue using the store after
+			//		this operation, it is probably better to export
+			//		it as a clone if you want it cleaned.
+			//
+			//	suppressExportMeta: /* boolean */
+			//		By default, when data is exported from the store
+			//		some information, such as as a timestamp, is
+			//		added to the root of exported data.  This
+			//		prevents that from happening.  It is mainly used
+			//		for making tests easier.
+			//
+			//	type: "raw" || "json"
+			//		Defaults to 'json'. 'json' will convert the data into 
+			//		json before returning it. 'raw' will just return a
+			//		reference to the object	 
+
+			var options = options || {};
+			var d=options.data || this._data;
+	
+			if (!options.suppressExportMeta && options.clone){
+				data = dojo.clone(d);
+				if (data[this.metaLabel]){
+					data[this.metaLabel]["clone"]=true;
+				}
+			}else{
+				var data=d;
+			}
+
+			if (!options.suppressExportMeta &&  data[this.metaLabel]){
+				data[this.metaLabel]["last_export"]=new Date().toString()
+			}
+
+			if(options.cleanMeta){
+				this.cleanMeta(data);
+			}
+
+			//console.log("Exporting: ", options, dojo.toJson(data));	
+			switch(options.type){
+				case "raw":
+					return data;
+				case "json":
+				default:
+					return dojo.toJson(data);
+			}
+		},	
+
+		getFeatures: function(){
+			// summary:
+			// 	return the store feature set
+
+			return { 
+				"dojo.data.api.Read": true,
+				"dojo.data.api.Identity": true,
+				"dojo.data.api.Write": true,
+				"dojo.data.api.Notification": true
+			}
+		},
+
+		getLabel: function(item){
+			// summary
+			//	returns the label for an item. The label
+			//	is created by setting the store's labelAttribute 
+			//	property with either an attribute name	or an array
+			//	of attribute names.  Developers can also
+			//	provide the store with a createLabel function which
+			//	will do the actaul work of creating the label.  If not
+			//	the default will just concatenate any of the identified
+			//	attributes together.
+			item = this._correctReference(item);
+			var label="";
+
+			if (dojo.isFunction(this.createLabel)){
+				return this.createLabel(item);
+			}
+
+			if (this.labelAttribute){
+				if (dojo.isArray(this.labelAttribute))	{
+					for(var i=0; i<this.labelAttribute.length; i++){
+						if (i>0) { label+=" ";}
+						label += item[this.labelAttribute[i]];
+					}
+					return label;
+				}else{
+					return item[this.labelAttribute];
+				}
+			}
+			return item.toString();
+		},
+
+		getLabelAttributes: function(item){
+			// summary:
+			//	returns an array of attributes that are used to create the label of an item
+			item = this._correctReference(item);
+			return dojo.isArray(this.labelAttribute) ? this.labelAttribute : [this.labelAttribute];
+		},
+
+		sort: function(a,b){
+			console.log("TODO::implement default sort algo");
+		},
+
+		//Identity API Support
+
+		getIdentity: function(item){
+			// summary
+			//	returns the identity of an item or throws
+			//	a not found error.
+
+			if (this.isItem(item)){
+				return item[this.idAttribute];
+			}
+			throw new Error("Id not found for item");
+		},
+
+		getIdentityAttributes: function(item){
+			// summary:
+			//	returns the attributes which are used to make up the 
+			//	identity of an item.  Basically returns this.idAttribute
+
+			return [this.idAttribute];
+		},
+
+		fetchItemByIdentity: function(args){
+			// summary: 
+			//	fetch an item by its identity. This store also provides
+			//	a much more finger friendly alias, 'byId' which does the
+			//	same thing as this function.  If provided a string
+			//	this call will be treated as a SYNC request and will 
+			//	return the identified item immediatly.  Alternatively it
+			// 	takes a object as a set of keywordArgs:
+			//	
+			//	identity: /* string */
+			//		the id of the item you want to retrieve
+			//	
+			//	mode: dojox.data.SYNC_MODE || dojox.data.ASYNC_MODE
+			//		overrides the default store fetch mode
+			//	
+			//	onItem: /* function */
+			//		Result call back.  Passed the fetched item.
+			//
+			//	onError: /* function */
+			//		error callback.	
+			var id;	
+			if (dojo.isString(args)){
+				id = args;
+				args = {identity: id, mode: dojox.data.SYNC_MODE}
+			}else{
+				if (args){
+					id = args["identity"];		
+				}
+				if (!args.mode){args.mode = this.mode}	
+			}
+
+			if (this.index && (this.index[id] || this.index["identity"])){
+				
+				if (args.mode==dojox.data.SYNC_MODE){
+					return this.index[id];
+				}
+
+				if (args.onItem){
+					args["onItem"].call(args.scope || dojo.global, this.index[id], args);
+				}
+
+				return args;
+			}else{
+				if (args.mode==dojox.data.SYNC_MODE){
+					return false;
+				}
+			}
+
+
+			if(args.onError){
+				args["onItem"].call(args.scope || dojo.global, new Error("Item Not Found: " + id), args);
+			}
+			
+			return args;
+		},
+
+		//Write API Support
+		newItem: function(data, options){
+			// summary:
+			//	adds a new item to the store at the specified point.
+			//	Takes two parameters, data, and options. 
+			//
+			//	data: /* object */
+			//		The data to be added in as an item.  This could be a
+			//		new javascript object, or it could be an item that 
+			//		already exists in the store.  If it already exists in the 
+			//		store, then this will be added as a reference.  
+			//
+			//	options: /* object */
+			//
+			//		item: /* item */
+			//			reference to an existing store item
+			//
+			//		attribute: /* string */
+			//			attribute to add the item at.  If this is
+			//			not provided, the item's id will be used as the
+			//			attribute name. If specified attribute is an
+			//			array, the new item will be push()d on to the
+			//			end of it.
+			//		oldValue: /* old value of item[attribute]
+			//		newValue: new value item[attribute]
+
+			var meta={};
+
+			//default parent to the store root;
+			var pInfo ={item:this._data};
+
+			if (options){
+				if (options.parent){
+					options.item = options.parent;
+				}
+
+				dojo.mixin(pInfo, options);
+			}
+
+			if (this.idAttribute && !data[this.idAttribute]){
+				if (this.requireId){throw new Error("requireId is enabled, new items must have an id defined to be added");}
+				if (this.autoIdentity){
+					var newId = this.autoIdPrefix + this._autoId++;
+					data[this.idAttribute]=newId;
+					meta["autoId"]=true;
+				}
+			}	
+
+			if (!pInfo && !pInfo.attribute && !this.idAttribute && !data[this.idAttribute]){
+				throw new Error("Adding a new item requires, at a minumum, either the pInfo information, including the pInfo.attribute, or an id on the item in the field identified by idAttribute");
+			}
+
+			//pInfo.parent = this._correctReference(pInfo.parent);
+			//if there is no parent info supplied, default to the store root
+			//and add to the pInfo.attribute or if that doestn' exist create an
+			//attribute with the same name as the new items ID 
+			if(!pInfo.attribute){pInfo.attribute = data[this.idAttribute]}
+
+			pInfo.oldValue = this._trimItem(pInfo.item[pInfo.attribute]);
+			if (dojo.isArray(pInfo.item[pInfo.attribute])){
+				this._setDirty(pInfo.item);
+				pInfo.item[pInfo.attribute].push(data);
+			}else{
+				this._setDirty(pInfo.item);
+				pInfo.item[pInfo.attribute]=data;
+			}
+
+			pInfo.newValue = pInfo.item[pInfo.attribute];
+
+			//add this item to the index
+			if(data[this.idAttribute]){this.index[data[this.idAttribute]]=data}
+
+			this._updateMeta(data, meta)
+
+			//keep track of all references in the store so we can delete them as necessary
+			this._addReference(data, pInfo);
+
+			//mark this new item as dirty
+			this._setDirty(data);
+
+			//Notification API
+			this.onNew(data, pInfo);
+
+			//returns the original item, now decorated with some meta info
+			return data;
+		},
+
+		_addReference: function(item, pInfo){
+			// summary
+			//	adds meta information to an item containing a reference id
+			//	so that references can be deleted as necessary, when passed
+			//	only a string, the string for parent info, it will only
+			//	it will be treated as a string reference
+
+			//console.log("_addReference: ", item, pInfo);	
+			var rid = '_ref_' + this._referenceId++;
+			if (!item[this.metaLabel]["referenceIds"]){
+				item[this.metaLabel]["referenceIds"]=[];
+			}
+
+			item[this.metaLabel]["referenceIds"].push(rid);
+			this._references[rid] = pInfo;				
+		},
+
+		deleteItem: function(item){	
+			// summary
+			//	deletes item and any references to that item from the store.
+			//	If the desire is to delete only one reference, unsetAttribute or
+			//	setValue is the way to go.
+
+			item = this._correctReference(item);
+			console.log("Item: ", item);
+			if (this.isItem(item)){
+				while(item[this.metaLabel]["referenceIds"].length>0){
+					console.log("refs map: " , this._references);
+					console.log("item to delete: ", item);
+					var rid = item[this.metaLabel]["referenceIds"].pop();
+					var pInfo = this._references[rid];
+
+					console.log("deleteItem(): ", pInfo, pInfo.parent);
+					parentItem = pInfo.parent;
+					var attribute = pInfo.attribute;	
+					if(parentItem && parentItem[attribute] && !dojo.isArray(parentItem[attribute])){
+						this._setDirty(parentItem);
+						this.unsetAttribute(parentItem, attribute);
+						delete parentItem[attribute];
+					}
+
+					if (dojo.isArray(parentItem[attribute])){
+						console.log("Parent is array");
+						var oldValue = this._trimItem(parentItem[attribute]);
+						var found=false;
+						for (var i=0; i<parentItem[attribute].length && !found;i++){
+							if (parentItem[attribute][i][this.metaLabel]===item[this.metaLabel]){
+								found=true;	
+							}			
+						}	
+
+						if (found){
+							this._setDirty(parentItem);
+							var del =  parentItem[attribute].splice(i-1,1);
+							delete del;
+						}
+
+						var newValue = this._trimItem(parentItem[attribute]);
+						this.onSet(parentItem,attribute,oldValue,newValue);	
+					}
+					delete this._references[rid];
+
+				}
+				this.onDelete(item);		
+				delete item;
+			}
+		},
+
+		_setDirty: function(item){
+			// summary:
+			//	adds an item to the list of dirty items.  This item
+			//	contains a reference to the item itself as well as a
+			//	cloned and trimmed version of old item for use with
+			//	revert.
+
+			//if an item is already in the list of dirty items, don't add it again
+			//or it will overwrite the premodification data set.
+			for (var i=0; i<this._dirtyItems.length; i++){
+				if (item[this.idAttribute]==this._dirtyItems[i][this.idAttribute]){
+					return; 
+				}	
+			}
+
+			this._dirtyItems.push({item: item, old: this._trimItem(item)});
+			this._updateMeta(item, {isDirty: true});
+		},
+
+		setValue: function(item, attribute, value){
+			// summary:
+			//	sets 'attribute' on 'item' to 'value'
+			item = this._correctReference(item);
+
+			this._setDirty(item);
+			var old = item[attribute] | undefined;
+			item[attribute]=value;
+			this.onSet(item,attribute,old,value);
+
+		},
+
+		setValues: function(item, attribute, values){
+			// summary:
+			//	sets 'attribute' on 'item' to 'value' value
+			//	must be an array.
+
+
+			item = this._correctReference(item);
+			if (!dojo.isArray(values)){throw new Error("setValues expects to be passed an Array object as its value");}
+			this._setDirty(item);
+			var old = item[attribute] || null;
+			item[attribute]=values
+			this.onSet(item,attribute,old,values);
+		},
+
+		unsetAttribute: function(item, attribute){
+			// summary:
+			//	unsets 'attribute' on 'item'
+
+			item = this._correctReference(item);
+			this._setDirty(item);
+			var old = item[attribute];
+			delete item[attribute];
+			this.onSet(item,attribute,old,null);
+		},
+
+		save: function(kwArgs){
+			// summary:
+			//	Takes an optional set of keyword Args with
+			//	some save options.  Currently only format with options
+			//	being "raw" or "json".  This function goes through
+			//	the dirty item lists, clones and trims the item down so that
+			//	the items children are not part of the data (the children are replaced
+			//	with reference objects). This data is compiled into a single array, the dirty objects
+			//	are all marked as clean, and the new data is then passed on to the onSave handler.
+
+			var data = [];
+		
+			if (!kwArgs){kwArgs={}}
+			while (this._dirtyItems.length > 0){
+				var item = this._dirtyItems.pop()["item"];
+				var t = this._trimItem(item);
+				var d;	
+				switch(kwArgs.format){	
+					case "json":
+						d = dojo.toJson(t);	
+						break;
+					case "raw":
+					default:
+						d = t;
+				}
+				data.push(d);
+				this._markClean(item);
+			}
+
+			this.onSave(data);
+		},
+
+		_markClean: function(item){
+			// summary
+			//	remove this meta information marking an item as "dirty"
+
+			if (item && item[this.metaLabel] && item[this.metaLabel]["isDirty"]){
+				delete item[this.metaLabel]["isDirty"];
+			}	
+		},
+
+		revert: function(){
+			// summary
+			//	returns any modified data to its original state prior to a save();
+
+			while (this._dirtyItems.length>0){
+				var d = this._dirtyItems.pop();
+				this._mixin(d.item, d.old);
+			}
+			this.onRevert();
+		},
+
+		_mixin: function(target, data){
+			// summary:
+			//	specialized mixin that hooks up objects in the store where references are identified.
+
+			if (dojo.isObject(data)){
+				if (dojo.isArray(data)){
+					while(target.length>0){target.pop();}
+					for (var i=0; i<data.length;i++){
+						if (dojo.isObject(data[i])){
+							if (dojo.isArray(data[i])){
+								var mix=[];
+							}else{
+								var mix={};
+								if (data[i][this.metaLabel] && data[i][this.metaLabel]["type"] && data[i][this.metaLabel]["type"]=='reference'){
+									target[i]=this.index[data[i][this.idAttribute]];
+									continue;
+								}
+							}
+
+							this._mixin(mix, data[i]);
+							target.push(mix);
+						}else{
+							target.push(data[i]);
+						}
+					}	
+				}else{
+					for (var i in target){
+						if (i in data){continue;}
+						delete target[i];
+					}
+
+					for (var i in data){
+						if (dojo.isObject(data[i])){
+							if (dojo.isArray(data[i])){
+								var mix=[];
+							}else{
+								if (data[i][this.metaLabel] && data[i][this.metaLabel]["type"] && data[i][this.metaLabel]["type"]=='reference'){
+									target[i]=this.index[data[i][this.idAttribute]];
+									continue;
+								}
+
+								var mix={};
+							}
+							this._mixin(mix, data[i]);
+							target[i]=mix;
+						}else{
+							target[i]=data[i];
+						}
+					}	
+
+				}
+			}
+		},
+
+		isDirty: function(item){
+			// summary
+			//	returns true if the item is marked as dirty.
+
+			item = this._correctReference(item);
+			return item && item[this.metaLabel] && item[this.metaLabel]["isDirty"];
+		},
+
+		_createReference: function(item){
+			// summary
+			// 	Create a small reference object that can be used to replace
+			//	child objects during a trim
+
+			var obj={};
+			obj[this.metaLabel]={
+				type:'reference'
+			};
+
+			obj[this.idAttribute]=item[this.idAttribute];
+			return obj;
+		},
+
+		_trimItem: function(item){
+			//summary:
+			// 	copy an item recursively stoppying at other items that have id's
+			//	and replace them with a refrence object;
+			var copy;
+			if (dojo.isArray(item)){
+				copy = [];
+				for (var i=0; i<item.length;i++){
+					if (dojo.isArray(item[i])){
+						copy.push(this._trimItem(item[i]))
+					}else if (dojo.isObject(item[i])){
+						if (item[i]["getFullYear"]){
+							copy.push(dojo.date.stamp.toISOString(item[i]));
+						}else if (item[i][this.idAttribute]){
+							copy.push(this._createReference(item[i]));
+						}else{
+							copy.push(this._trimItem(item[i]));	
+						}
+					} else {
+						copy.push(item[i]);	
+					}
+				}
+				return copy;
+			} 
+
+			if (dojo.isObject(item)){
+				copy = {};
+
+				for (var attr in item){
+					if (!item[attr]){ copy[attr]=undefined;continue;}
+					if (dojo.isArray(item[attr])){
+						copy[attr] = this._trimItem(item[attr]);
+					}else if (dojo.isObject(item[attr])){
+						if (item[attr]["getFullYear"]){
+							copy[attr] =  dojo.date.stamp.toISOString(item[attr]);
+						}else if(item[attr][this.idAttribute]){
+							copy[attr]=this._createReference(item[attr]);
+						} else {
+							copy[attr]=this._trimItem(item[attr]);
+						}
+					} else {
+						copy[attr]=item[attr];
+					}
+				}
+				return copy;
+			}
+		},
+
+		//Notifcation Support
+
+		onSet: function(){
+		},
+
+		onNew: function(){
+
+		},
+
+		onDelete: function(){
+
+		},	
+	
+		onSave: function(items){
+			// summary:
+			//	notification of the save event..not part of the notification api, 
+			//	but probably should be.
+			//console.log("onSave() ", items);
+		},
+
+		onRevert: function(){
+			// summary:
+			//	notification of the revert event..not part of the notification api, 
+			//	but probably should be.
+
+		}
+	}
+);
+
+//setup an alias to byId, is there a better way to do this?
+dojox.data.jsonPathStore.byId=dojox.data.jsonPathStore.fetchItemByIdentity;
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/date/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/date/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/date/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/date/php.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/date/php.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/date/php.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/date/posix.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/date/posix.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/date/posix.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/Context.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/Context.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/Context.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxxxxxxxx)
+-------------------------------------------------------------------------------
+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.
+-------------------------------------------------------------------------------
+<!--{% commented markup %}-->
+
+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

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/_HtmlTemplated.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/_HtmlTemplated.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/_HtmlTemplated.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+				)
+			));
+		}
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/_Templated.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/_Templated.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/_Templated.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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();
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"]
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/data.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/data.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/data.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"]
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/dijit.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/dijit.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/dijit.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"]]
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/html.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/html.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/html.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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, '&lt;$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"]
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/objects.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/objects.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/contrib/objects.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"]
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Animation.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Animation.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Animation.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,45 @@
+<html>
+	<head>
+		<title>Testing dojox.dtl using animation to change attributes</title>
+		<script src="../../../dojo/dojo.js" djConfig="parseOnLoad: true, usePlainJson: true"></script>
+		<script>
+			dojo.require("dijit._Widget");
+			dojo.require("dojox.dtl._HtmlTemplated");
+
+			dojo.declare("demo.Animation", [dijit._Widget, dojox.dtl._HtmlTemplated],
+			{
+				buffer: 0, // Note: Sensitivity is 0 by default, but this is to emphasize we're not doing any buffering
+				templatePath: dojo.moduleUrl("dojox.dtl.demos.templates", "animation.html"),
+				constructor: function(props, node){
+					console.debug("constructor");
+					this.x = 0;
+					this.y = 0;
+				},
+				postCreate: function(){
+					var anim = new dojo._Animation({
+						curve: [0, 300],
+						rate: 10,
+						duration: 5000,
+						easing: dojo._defaultEasing
+					});
+					dojo.connect(anim, "onAnimate", this, "_reDraw");
+					anim.play();
+				},
+				_reDraw: function(obj){
+					this.x = obj;
+					this.y = Math.sqrt(obj) * 10;
+
+					dojo.style(this.blue, "left", this.x);
+					dojo.style(this.blue, "top", this.y + 10);
+
+					this.render();
+				}
+			});
+
+			dojo.require("dojo.parser");
+		</script>
+	</head>
+	<body>
+		<div dojoType="demo.Animation" />
+	</body>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Blog.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Blog.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Blog.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,96 @@
+<html>
+	<head>
+		<title>Testing dojox.dtl using a blog example</title>
+		<script src="../../../dojo/dojo.js" djConfig="usePlainJson: true, parseOnLoad: true"></script>
+		<script>
+			dojo.require("dijit._Widget");
+			dojo.require("dojox.dtl._HtmlTemplated");
+			dojo.require("dojo.parser");
+
+			dojo.declare("demo.Blog", [dijit._Widget, dojox.dtl._HtmlTemplated],
+			{
+				buffer: dojox.dtl.render.html.sensitivity.NODE,
+				templatePath: dojo.moduleUrl("dojox.dtl.demos.templates", "blog_list.html"),
+				base: {
+					url: dojo.moduleUrl("dojox.dtl.demos.templates", "blog_base.html"),
+					shared: true
+				},
+				constructor: function(props, node){
+					this.list = false;
+					this.blogs = {};
+					this.pages = {};
+				},
+				postCreate: function(){
+					if(!this.list){
+						dojo.xhrGet({
+							url: dojo.moduleUrl("dojox.dtl.demos.json.blog", "get_blog_list.json"),
+							handleAs: "json"
+						}).addCallback(this, "_loadList");
+					}
+				},
+				_showList: function(obj){
+					this.title = "Blog Posts";
+					this.setTemplate(this.templatePath);
+				},
+				_showDetail: function(obj){
+					var key = obj.target.className.substring(5);
+
+					if(this.blogs[key]){
+						this.title = "Blog Post";
+						this.blog = this.blogs[key];
+						this.blog.title = this.blog_list[key].title;
+						this.setTemplate(dojo.moduleUrl("dojox.dtl.demos.templates", "blog_detail.html"));
+					}else{
+						dojo.xhrGet({
+							url: dojo.moduleUrl("dojox.dtl.demos.json.blog", "get_blog_" + key + ".json"),
+							handleAs: "json",
+							load: function(data){
+								data.key = key;
+								return data;
+							}
+						}).addCallback(this, "_loadDetail");
+					}
+				},
+				_showPage: function(obj){
+					var key = obj.target.className.substring(5);
+
+					if(this.pages[key]){
+						this.title = this.pages[key].title;
+						this.body = this.pages[key].body;
+						this.setTemplate(dojo.moduleUrl("dojox.dtl.demos.templates", "blog_page.html"));
+					}else{
+						dojo.xhrGet({
+							url: dojo.moduleUrl("dojox.dtl.demos.json.blog", "get_page_" + key + ".json"),
+							handleAs: "json",
+							load: function(data){
+								data.key = key;
+								return data;
+							}
+						}).addCallback(this, "_loadPage");
+					}
+				},
+				_loadList: function(data){
+					this.title = "Blog Posts";
+					dojo.mixin(this, data);
+					this.render();
+				},
+				_loadDetail: function(data){
+					data.date = new Date(data.date);
+					this.blogs[data.key] = data;
+					this.title = "Blog Post";
+					this.blog = data;
+					this.blog.title = this.blog_list[data.key].title;
+					this.setTemplate(dojo.moduleUrl("dojox.dtl.demos.templates", "blog_detail.html"));
+				},
+				_loadPage: function(data){
+					this.pages[data.key] = data;
+					dojo.mixin(this, data);
+					this.setTemplate(dojo.moduleUrl("dojox.dtl.demos.templates", "blog_page.html"));
+				}
+			});
+		</script>
+	</head>
+	<body>
+		<div dojoType="demo.Blog" />
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Data.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Data.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Data.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,58 @@
+<html>
+	<head>
+			<title>Demo using the dojo.data bind_data tag</title>
+	    <script type="text/javascript" src="../../../dojo/dojo.js"
+				djConfig="isDebug: true, parseOnLoad: true"></script>
+	    <script type="text/javascript" src="../../../dijit/dijit.js"></script> 
+	    <script type="text/javascript">
+				dojo.require("dojox.dtl._Templated");
+				dojo.require("dojox.data.FlickrRestStore");
+				dojo.require("dojo.parser");
+
+				dojo.declare("demo.Gallery", [dijit._Widget, dojox.dtl._Templated], {
+					templatePath: dojo.moduleUrl("dojox.dtl.demos.templates", "gallery.html"),
+					store: new dojox.data.FlickrRestStore(),
+					selectThumbnail: function(e){
+						this.selected = e.target.className;
+						this.render();
+					},
+					keyUp: function(e){
+						if(e.keyCode == dojo.keys.ENTER){
+							var search = e.target.value;
+							var query = {
+								query: {
+									userid: "44153025@N00",
+									apikey: "8c6803164dbc395fb7131c9d54843627",
+									sort: [
+										   {
+											attribute: "interestingness",
+											descending: true
+											}
+									],
+									tags: search.split(/\s*,\s*/g),
+									tag_mode: "any"
+								},
+								start: 0,
+								count: 10,
+								onBegin: dojo.hitch(this, function(total){
+									console.debug(total);
+									this._maxPhotos = total;
+								}),
+								onComplete: dojo.hitch(this, function(items, request){
+									console.debug(items);
+									if(items && items.length) {
+										this.items = items;
+										this.render();
+									}
+								})
+							};
+							this.store.fetch(query);
+						}
+					}
+				});
+	    </script>
+			<body>
+				<div dojoType="demo.Gallery"></div>
+			</body>
+	</head>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Dijitless.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Dijitless.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Dijitless.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,50 @@
+<html>
+	<head>
+		<title>Demo using dojox.dtl._HtmlTemplated without Dijit</title>
+    <script type="text/javascript" src="../../../dojo/dojo.js"
+			djConfig="isDebug: true"></script>
+		<script type="text/javascript">
+			dojo.require("dojox.dtl.html");
+			dojo.require("dojox.dtl.render.html");
+			dojo.require("dojox.dtl.Context");
+
+			dojo.addOnLoad(function(){
+				var context = new dojox.dtl.Context({
+					items: ["apple", "banana", "orange"]
+				});
+
+				var template = new dojox.dtl.HtmlTemplate("<ul><!--{% for item in items %}--><li><!--{{ item }}--></li><!--{% endfor %}--></ul>");
+				// Render it plain
+				var node = template.render(context).getRootNode();
+				dojo.body().appendChild(node);
+
+				// Now show an example of how hard it is to manage stuff if the root node changes
+				var template2 = new dojox.dtl.HtmlTemplate("<!--{% ifequal items.length 3 %}--><ul><!--{% for item in items %}--><li><!--{{ item }}--></li><!--{% endfor %}--></ul>{% else %}<div>More than 3 items!</div>{% endifequal %}");
+				// Render it plain
+				var node2 = template2.render(context).getRootNode();
+				dojo.body().appendChild(node2);
+
+				// Now show how the HTML Render object makes this easier
+				var renderer = new dojox.dtl.render.html.Render(dojo.byId("attach"), new dojox.dtl.HtmlTemplate("<!--{% ifequal items.length 3 %}--><ul><!--{% for item in items reversed %}--><li><!--{{ item }}--></li><!--{% endfor %}--></ul>{% else %}<div>More than 3 items!</div>{% endifequal %}"));
+				renderer.render(context);
+
+				// Now re-render and break template2
+				setTimeout(function(){
+					context.items.push("guava");
+					template.render(context);
+					template2.render(context);
+					renderer.render(context);
+
+					// This is what has to be done to fix template2
+					setTimeout(function(){
+						var frag = template2.render(context).getRootNode();
+						node2.parentNode.replaceChild(frag, node2);
+					}, 3000);
+				}, 3000);
+			});
+		</script>
+	</head>
+	<body>
+		<div id="attach"></div>
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Events.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Events.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Events.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,46 @@
+<html>
+	<head>
+			<title>Demo using dojox.dtl._Templated</title>
+	    <script type="text/javascript" src="../../../dojo/dojo.js"
+				djConfig="isDebug: true, parseOnLoad: true"></script>
+	    <script type="text/javascript" src="../../../dijit/dijit.js"></script>
+			<style type="text/css">
+				@import "../../../dijit/themes/tundra/tundra.css";
+			</style>
+	    <script type="text/javascript">
+					dojo.require("dojox.dtl._HtmlTemplated");
+					dojo.require("dijit.form.Button");
+
+					dojo.declare("Fruit", [dijit._Widget, dojox.dtl._HtmlTemplated], {
+						widgetsInTemplate: true,
+						items: ["apple", "banana", "orange"],
+						keyUp: function(e){
+							if((e.type == "click" || e.keyCode == dojo.keys.ENTER) && this.input.value){
+								var i = dojo.indexOf(this.items, this.input.value);
+								if(i != -1){
+									this.items.splice(i, 1);
+								}else{
+									this.items.push(this.input.value);
+								}
+								this.input.value = "";
+								this.render();
+							}
+						},
+						postCreate: function(){
+						 	this.render();
+							dojo.connect(this.button, "onClick", this, "keyUp");
+						},
+						debug: function(e, verb, fruit){
+							console.debug("You " + verb + " a:", fruit);
+						},
+						// Note, the load tag here is superfluous, since _HtmlTemplate has a dojo.require for it.
+						templateString: '<!--{% load dojox.dtl.contrib.dijit %}--><div><input dojoAttachEvent="onkeyup: keyUp" dojoAttachPoint="input"> <button dojoType="dijit.form.Button" dojoAttachPoint="button">Add/Remove Item</button><ul><!--{% for item in items %}--><li onclick="debug \'ate\' item"><!--{{ item }}--></li><!--{% endfor %}--></ul></div>'
+					});
+
+	        dojo.require("dojo.parser");
+	    </script>
+			<body class="tundra">
+				<div dojoType="Fruit"></div>
+			</body>
+	</head>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_HtmlTemplated.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_HtmlTemplated.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_HtmlTemplated.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,40 @@
+<html>
+	<head>
+			<title>Demo using dojox.dtl._HtmlTemplated</title>
+	    <script type="text/javascript" src="../../../dojo/dojo.js"
+				djConfig="isDebug: true, parseOnLoad: true"></script>
+	    <script type="text/javascript" src="../../../dijit/dijit.js"></script>
+			<style type="text/css">
+				@import "../../../dijit/themes/tundra/tundra.css";
+			</style>
+	    <script type="text/javascript">
+					dojo.require("dojox.dtl._HtmlTemplated");
+					dojo.require("dijit.form.Button");
+
+					dojo.declare("Fruit", [dijit._Widget, dojox.dtl._HtmlTemplated], {
+						widgetsInTemplate: true,
+						items: ["apple", "banana", "orange"],
+						keyUp: function(e){
+							if((e.type == "click" || e.keyCode == dojo.keys.ENTER) && this.input.value){
+								console.debug(this.button);
+								var i = dojo.indexOf(this.items, this.input.value);
+								if(i != -1){
+									this.items.splice(i, 1);
+								}else{
+									this.items.push(this.input.value);
+								}
+								this.input.value = "";
+								this.render();
+							}
+						},
+						// Note, the load tag here is superfluous, since _HtmlTemplate has a dojo.require for it.
+						templateString: '<!--{% load dojox.dtl.contrib.dijit %}--><div><input dojoAttachEvent="onkeyup: keyUp" dojoAttachPoint="input"> <button dojoType="dijit.form.Button" dojoAttachPoint="button" dojoAttachEvent="onClick: keyUp">Add/Remove Item</button><ul><!--{% for item in items %}--><li><button dojoType="dijit.form.Button parsed" title="Fruit: {{ item }}"><!--{{ item }}--><script type="dojo/connect" event="onClick" args="e">console.debug("You clicked", this.containerNode.innerHTML);</' + 'script></button></li><!--{% endfor %}--></ul></div>'
+					});
+
+	        dojo.require("dojo.parser");
+	    </script>
+			<body class="tundra">
+				<div dojoType="Fruit" id="dtl"></div>
+			</body>
+	</head>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Inline.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Inline.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Inline.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,48 @@
+<html>
+	<head>
+		<title>Demo using dojox.dtl._HtmlTemplated inline in DOM</title>
+    <script type="text/javascript" src="../../../dojo/dojo.js"
+			djConfig="isDebug: true"></script>
+		<script type="text/javascript">
+			dojo.require("dojox.dtl.html");
+			dojo.require("dojox.dtl.Context");
+
+			dojo.addOnLoad(function(){
+				// Create a template from our first node (still in DOM)
+				var template = new dojox.dtl.HtmlTemplate("template");
+				var context = new dojox.dtl.Context({
+					items: ["apple", "banana", "orange"]
+				});
+				// Render it first without initial item list
+				template.render(context);
+
+				// Create a template with our second node (removed from DOM)
+				var node = dojo.byId("template2");
+				node.parentNode.removeChild(node);
+				var template2 = new dojox.dtl.HtmlTemplate(node);
+				// The render function returns a buffer, which has the getRootNode function
+				dojo.body().appendChild(template2.render(context).getRootNode());
+
+				// The re-render each with a new item
+				setTimeout(function(){
+					context.items.push("guava");
+					template.render(context);
+					template2.render(context);
+				}, 3000);
+			});
+		</script>
+	</head>
+	<body>
+		<ul id="template">
+			{% for item in items %}
+				<li>{{ item }}</li>
+			{% endfor %}
+		</ul>
+
+		<ul id="template2">
+			{% for item in items reversed %}
+				<li>{{ item }}</li>
+			{% endfor %}
+		</ul>
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_NodeList.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_NodeList.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_NodeList.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+<html>
+	<head>
+		<title>Demo using dojox.dtl._Templated</title>
+    <script type="text/javascript" src="../../../dojo/dojo.js"
+			djConfig="isDebug: true, parseOnLoad: true"></script>
+		<script type="text/javascript">
+			dojo.require("dojox.dtl.ext-dojo.NodeList");
+			dojo.require("dojox.dtl.Context");
+
+			dojo.addOnLoad(function(){
+				// First, look at the NodeList extension
+				dojo.query(".fruit").dtl(dojo.moduleUrl("dojox.dtl.demos.templates", "nodelist.html"), { items: ["apple", "banana", "pear"] });
+
+				dojo.query(".fruit2").dtl("<div><ul>{% for item in items %}<li>{{ item }}</li>{% endfor %}</ul></div", { items: ["apple", "banana", "pear"] });
+
+				// Now, create a real template object
+				var tpl = new dojox.dtl.Template(dojo.moduleUrl("dojox.dtl.demos.templates", "nodelist.html"));
+
+				// And test its update function with a dojo.query
+				tpl.update(dojo.query(".update"), dojo.moduleUrl("dojox.dtl.demos.json", "fruit.json"));
+
+				setTimeout(function(){
+					// And now test it with an ID reference
+					tpl.update("updateId", dojo.moduleUrl("dojox.dtl.demos.json", "morefruit.json"));
+					// And throw in a standard rendering just for fun
+					dojo.byId("updateId2").innerHTML = tpl.render(new dojox.dtl.Context({ items: ["pineapple", "orange", "tomato"] }));
+				}, 5000);
+			});
+		</script>
+	</head>
+	<body>
+		<div class="fruit"></div>
+		<div class="fruit2"></div>
+		<div class="update" id="updateId"></div>
+		<div class="update" id="updateId2"></div>
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Table.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Table.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Table.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4072 @@
+<html>
+	<head>
+			<title>Demo to show a massive nested for loop to render a table</title>
+	    <script type="text/javascript" src="../../../dojo/dojo.js"
+				djConfig="isDebug: true, parseOnLoad: true"></script>
+	    <script type="text/javascript" src="../../../dijit/dijit.js"></script>
+			<style type="text/css">
+				@import "../../../dijit/themes/tundra/tundra.css";
+
+				table {
+					border-collapse: collapse;
+				}
+				th {
+					background-color: #ccf;
+				}
+				th, td {
+					border: 1px solid #aaa;
+					padding: 2px 15px;
+				}
+				tr.even td {
+					background-color: #ffc;
+				}
+			</style>
+	    <script type="text/javascript">
+					dojo.require("dojox.dtl._HtmlTemplated");
+					dojo.require("dojox.dtl.tag.logic");
+					dojo.require("dojox.dtl.tag.loop");
+					dojo.require("dojox.dtl.filter.lists");
+
+					dojo.declare("demo.Table", [dijit._Widget, dojox.dtl._HtmlTemplated], {
+						pos: 0,
+						postCreate: function(){
+							this.ths = dojo.query("th", this.domNode).map(function(item){
+								return item.innerHTML;
+							});
+							this.trs = dojo.query("tbody tr", this.domNode).map(function(item){
+								return dojo.query("td", item).map(function(item){
+									return item.innerHTML;
+								});
+							});
+							console.time("render1");
+							this.render();
+							console.timeEnd("render1");
+						},
+						sortColumn: function(e){
+							this.pos = dojo.indexOf(this.ths, e.target.innerHTML);
+							console.time("render2");
+							this.render();
+							console.timeEnd("render2");
+						},
+						templateString: '<table><thead><tr><!--{% for th in ths %}--><th dojoAttachEvent="onclick: sortColumn"><!--{{ th }}--></th><!--{% endfor %}--></tr></thead><tbody><!--{% for tr in trs|dictsort:pos %}--><tr class="{% cycle \'odd\' \'even\' %}"><!--{% for td in tr %}--><td><!--{{ td }}--></td><!--{% endfor %}--></tr><!--{% endfor %}--></tbody></table>'
+					});
+
+	        dojo.require("dojo.parser");
+	    </script>
+			<body class="tundra">
+				<table dojoType="demo.Table" style="display: none;">
+					<thead>
+						<tr>
+							<th>Index</th>
+							<th>Numeric</th>
+							<th>Text</th>
+							<th>Currency</th>
+							<th>Date</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td>0</td>
+							<td>158.9</td>
+							<td>Bill</td>
+							<td>$22.44</td>
+
+							<td>2008-12-28</td>
+						</tr>
+						<tr>
+							<td>1</td>
+							<td>690.4</td>
+							<td>Joe</td>
+							<td>$3.03</td>
+
+							<td>2009-07-03</td>
+						</tr>
+						<tr>
+							<td>2</td>
+							<td>843</td>
+							<td>Bob</td>
+							<td>$11.14</td>
+
+							<td>2010-09-30</td>
+						</tr>
+						<tr>
+							<td>3</td>
+							<td>57.8</td>
+							<td>Matt</td>
+							<td>$70.64</td>
+
+							<td>2009-12-16</td>
+						</tr>
+						<tr>
+							<td>4</td>
+							<td>494.6</td>
+							<td>Mark</td>
+							<td>$9.13</td>
+
+							<td>2010-05-11</td>
+						</tr>
+						<tr>
+							<td>5</td>
+							<td>766.3</td>
+							<td>Tom</td>
+							<td>$55.34</td>
+
+							<td>2008-03-10</td>
+						</tr>
+						<tr>
+							<td>6</td>
+							<td>699.3</td>
+							<td>Jake</td>
+							<td>$26.24</td>
+
+							<td>2008-11-26</td>
+						</tr>
+						<tr>
+							<td>7</td>
+							<td>487.8</td>
+							<td>Greg</td>
+							<td>$72.94</td>
+
+							<td>2010-06-23</td>
+						</tr>
+						<tr>
+							<td>8</td>
+							<td>786.2</td>
+							<td>Adam</td>
+							<td>$34.64</td>
+
+							<td>2008-09-19</td>
+						</tr>
+						<tr>
+							<td>9</td>
+							<td>188.6</td>
+							<td>Steve</td>
+							<td>$6.33</td>
+
+							<td>2009-01-01</td>
+						</tr>
+						<tr>
+							<td>10</td>
+							<td>898.4</td>
+							<td>George</td>
+							<td>$22.24</td>
+
+							<td>2009-09-18</td>
+						</tr>
+						<tr>
+							<td>11</td>
+							<td>222.2</td>
+							<td>John</td>
+							<td>$91.24</td>
+
+							<td>2009-10-23</td>
+						</tr>
+						<tr>
+							<td>12</td>
+							<td>707.9</td>
+							<td>Phil</td>
+							<td>$75.54</td>
+
+							<td>2010-02-28</td>
+						</tr>
+						<tr>
+							<td>13</td>
+							<td>585.5</td>
+							<td>Jack</td>
+							<td>$81.34</td>
+
+							<td>2009-03-24</td>
+						</tr>
+						<tr>
+							<td>14</td>
+							<td>213.8</td>
+							<td>Paul</td>
+							<td>$30.74</td>
+
+							<td>2009-07-08</td>
+						</tr>
+						<tr>
+							<td>15</td>
+							<td>968.5</td>
+							<td>Rob</td>
+							<td>$7.33</td>
+
+							<td>2008-02-06</td>
+						</tr>
+						<tr>
+							<td>16</td>
+							<td>39.3</td>
+							<td>Walt</td>
+							<td>$77.34</td>
+
+							<td>2008-12-05</td>
+						</tr>
+						<tr>
+							<td>17</td>
+							<td>335.7</td>
+							<td>Nathan</td>
+							<td>$26.14</td>
+
+							<td>2008-01-27</td>
+						</tr>
+						<tr>
+							<td>18</td>
+							<td>127.6</td>
+							<td>Dan</td>
+							<td>$4.73</td>
+
+							<td>2009-03-03</td>
+						</tr>
+						<tr>
+							<td>19</td>
+							<td>365.3</td>
+							<td>Jeff</td>
+							<td>$23.54</td>
+
+							<td>2009-05-15</td>
+						</tr>
+						<tr>
+							<td>20</td>
+							<td>692.9</td>
+							<td>Bill</td>
+							<td>$13.34</td>
+
+							<td>2010-01-26</td>
+						</tr>
+						<tr>
+							<td>21</td>
+							<td>244.9</td>
+							<td>Joe</td>
+							<td>$35.64</td>
+
+							<td>2009-10-16</td>
+						</tr>
+						<tr>
+							<td>22</td>
+							<td>827</td>
+							<td>Bob</td>
+							<td>$6.33</td>
+
+							<td>2009-01-06</td>
+						</tr>
+						<tr>
+							<td>23</td>
+							<td>519.6</td>
+							<td>Matt</td>
+							<td>$64.94</td>
+
+							<td>2008-06-03</td>
+						</tr>
+						<tr>
+							<td>24</td>
+							<td>917.8</td>
+							<td>Mark</td>
+							<td>$86.34</td>
+
+							<td>2009-05-24</td>
+						</tr>
+						<tr>
+							<td>25</td>
+							<td>407.1</td>
+							<td>Tom</td>
+							<td>$83.14</td>
+
+							<td>2009-08-17</td>
+						</tr>
+						<tr>
+							<td>26</td>
+							<td>449.3</td>
+							<td>Jake</td>
+							<td>$87.04</td>
+
+							<td>2008-11-27</td>
+						</tr>
+						<tr>
+							<td>27</td>
+							<td>753.5</td>
+							<td>Greg</td>
+							<td>$20.64</td>
+
+							<td>2009-09-25</td>
+						</tr>
+						<tr>
+							<td>28</td>
+							<td>787</td>
+							<td>Adam</td>
+							<td>$33.44</td>
+
+							<td>2009-11-18</td>
+						</tr>
+						<tr>
+							<td>29</td>
+							<td>166.9</td>
+							<td>Steve</td>
+							<td>$69.94</td>
+
+							<td>2010-08-17</td>
+						</tr>
+						<tr>
+							<td>30</td>
+							<td>609.6</td>
+							<td>George</td>
+							<td>$39.24</td>
+
+							<td>2011-01-18</td>
+						</tr>
+						<tr>
+							<td>31</td>
+							<td>274</td>
+							<td>John</td>
+							<td>$63.64</td>
+
+							<td>2009-01-02</td>
+						</tr>
+						<tr>
+							<td>32</td>
+							<td>850.3</td>
+							<td>Phil</td>
+							<td>$46.34</td>
+
+							<td>2009-03-17</td>
+						</tr>
+						<tr>
+							<td>33</td>
+							<td>181.4</td>
+							<td>Jack</td>
+							<td>$98.34</td>
+
+							<td>2008-02-04</td>
+						</tr>
+						<tr>
+							<td>34</td>
+							<td>325.3</td>
+							<td>Paul</td>
+							<td>$90.14</td>
+
+							<td>2010-10-30</td>
+						</tr>
+						<tr>
+							<td>35</td>
+							<td>776.3</td>
+							<td>Rob</td>
+							<td>$30.84</td>
+
+							<td>2010-04-17</td>
+						</tr>
+						<tr>
+							<td>36</td>
+							<td>300.8</td>
+							<td>Walt</td>
+							<td>$75.74</td>
+
+							<td>2009-11-18</td>
+						</tr>
+						<tr>
+							<td>37</td>
+							<td>598</td>
+							<td>Nathan</td>
+							<td>$51.04</td>
+
+							<td>2010-07-15</td>
+						</tr>
+						<tr>
+							<td>38</td>
+							<td>155.6</td>
+							<td>Dan</td>
+							<td>$29.74</td>
+
+							<td>2008-06-04</td>
+						</tr>
+						<tr>
+							<td>39</td>
+							<td>759.8</td>
+							<td>Jeff</td>
+							<td>$46.44</td>
+
+							<td>2010-08-21</td>
+						</tr>
+						<tr>
+							<td>40</td>
+							<td>599.2</td>
+							<td>Bill</td>
+							<td>$7.43</td>
+
+							<td>2008-09-16</td>
+						</tr>
+						<tr>
+							<td>41</td>
+							<td>571.9</td>
+							<td>Joe</td>
+							<td>$34.84</td>
+
+							<td>2010-09-23</td>
+						</tr>
+						<tr>
+							<td>42</td>
+							<td>900.3</td>
+							<td>Bob</td>
+							<td>$19.84</td>
+
+							<td>2009-01-09</td>
+						</tr>
+						<tr>
+							<td>43</td>
+							<td>292.2</td>
+							<td>Matt</td>
+							<td>$37.94</td>
+
+							<td>2008-12-21</td>
+						</tr>
+						<tr>
+							<td>44</td>
+							<td>333</td>
+							<td>Mark</td>
+							<td>$70.54</td>
+
+							<td>2008-08-28</td>
+						</tr>
+						<tr>
+							<td>45</td>
+							<td>236.4</td>
+							<td>Tom</td>
+							<td>$48.14</td>
+
+							<td>2009-08-19</td>
+						</tr>
+						<tr>
+							<td>46</td>
+							<td>970.9</td>
+							<td>Jake</td>
+							<td>$78.24</td>
+
+							<td>2008-11-10</td>
+						</tr>
+						<tr>
+							<td>47</td>
+							<td>575.8</td>
+							<td>Greg</td>
+							<td>$37.94</td>
+
+							<td>2010-06-24</td>
+						</tr>
+						<tr>
+							<td>48</td>
+							<td>386.7</td>
+							<td>Adam</td>
+							<td>$53.54</td>
+
+							<td>2008-04-02</td>
+						</tr>
+						<tr>
+							<td>49</td>
+							<td>531.1</td>
+							<td>Steve</td>
+							<td>$29.54</td>
+
+							<td>2009-09-21</td>
+						</tr>
+						<tr>
+							<td>50</td>
+							<td>374.3</td>
+							<td>George</td>
+							<td>$89.44</td>
+
+							<td>2009-12-15</td>
+						</tr>
+						<tr>
+							<td>51</td>
+							<td>609.1</td>
+							<td>John</td>
+							<td>$46.64</td>
+
+							<td>2011-01-22</td>
+						</tr>
+						<tr>
+							<td>52</td>
+							<td>480.3</td>
+							<td>Phil</td>
+							<td>$36.64</td>
+
+							<td>2008-07-07</td>
+						</tr>
+						<tr>
+							<td>53</td>
+							<td>814.8</td>
+							<td>Jack</td>
+							<td>$65.84</td>
+
+							<td>2009-09-19</td>
+						</tr>
+						<tr>
+							<td>54</td>
+							<td>132.2</td>
+							<td>Paul</td>
+							<td>$99.14</td>
+
+							<td>2008-10-12</td>
+						</tr>
+						<tr>
+							<td>55</td>
+							<td>350.1</td>
+							<td>Rob</td>
+							<td>$22.84</td>
+
+							<td>2010-04-22</td>
+						</tr>
+						<tr>
+							<td>56</td>
+							<td>875.7</td>
+							<td>Walt</td>
+							<td>$19.84</td>
+
+							<td>2009-08-12</td>
+						</tr>
+						<tr>
+							<td>57</td>
+							<td>158.1</td>
+							<td>Nathan</td>
+							<td>$77.44</td>
+
+							<td>2010-10-25</td>
+						</tr>
+						<tr>
+							<td>58</td>
+							<td>950.9</td>
+							<td>Dan</td>
+							<td>$16.14</td>
+
+							<td>2009-05-05</td>
+						</tr>
+						<tr>
+							<td>59</td>
+							<td>41.1</td>
+							<td>Jeff</td>
+							<td>$69.24</td>
+
+							<td>2010-04-11</td>
+						</tr>
+						<tr>
+							<td>60</td>
+							<td>595.4</td>
+							<td>Bill</td>
+							<td>$6.63</td>
+
+							<td>2009-12-09</td>
+						</tr>
+						<tr>
+							<td>61</td>
+							<td>223.4</td>
+							<td>Joe</td>
+							<td>$67.54</td>
+
+							<td>2008-03-30</td>
+						</tr>
+						<tr>
+							<td>62</td>
+							<td>199.2</td>
+							<td>Bob</td>
+							<td>$15.64</td>
+
+							<td>2009-05-28</td>
+						</tr>
+						<tr>
+							<td>63</td>
+							<td>372.8</td>
+							<td>Matt</td>
+							<td>$97.04</td>
+
+							<td>2008-04-28</td>
+						</tr>
+						<tr>
+							<td>64</td>
+							<td>925.7</td>
+							<td>Mark</td>
+							<td>$10.24</td>
+
+							<td>2008-04-17</td>
+						</tr>
+						<tr>
+							<td>65</td>
+							<td>183.1</td>
+							<td>Tom</td>
+							<td>$45.34</td>
+
+							<td>2009-01-05</td>
+						</tr>
+						<tr>
+							<td>66</td>
+							<td>921.2</td>
+							<td>Jake</td>
+							<td>$32.84</td>
+
+							<td>2009-08-23</td>
+						</tr>
+						<tr>
+							<td>67</td>
+							<td>440.8</td>
+							<td>Greg</td>
+							<td>$48.64</td>
+
+							<td>2008-12-04</td>
+						</tr>
+						<tr>
+							<td>68</td>
+							<td>339.8</td>
+							<td>Adam</td>
+							<td>$43.74</td>
+
+							<td>2009-06-08</td>
+						</tr>
+						<tr>
+							<td>69</td>
+							<td>773.7</td>
+							<td>Steve</td>
+							<td>$47.84</td>
+
+							<td>2008-06-17</td>
+						</tr>
+						<tr>
+							<td>70</td>
+							<td>502.3</td>
+							<td>George</td>
+							<td>$7.33</td>
+
+							<td>2008-09-01</td>
+						</tr>
+						<tr>
+							<td>71</td>
+							<td>124.8</td>
+							<td>John</td>
+							<td>$29.74</td>
+
+							<td>2010-10-22</td>
+						</tr>
+						<tr>
+							<td>72</td>
+							<td>213</td>
+							<td>Phil</td>
+							<td>$49.64</td>
+
+							<td>2008-02-18</td>
+						</tr>
+						<tr>
+							<td>73</td>
+							<td>667.3</td>
+							<td>Jack</td>
+							<td>$86.94</td>
+
+							<td>2008-01-14</td>
+						</tr>
+						<tr>
+							<td>74</td>
+							<td>779.8</td>
+							<td>Paul</td>
+							<td>$79.44</td>
+
+							<td>2008-05-12</td>
+						</tr>
+						<tr>
+							<td>75</td>
+							<td>883.3</td>
+							<td>Rob</td>
+							<td>$97.74</td>
+
+							<td>2009-10-17</td>
+						</tr>
+						<tr>
+							<td>76</td>
+							<td>214.4</td>
+							<td>Walt</td>
+							<td>$89.94</td>
+
+							<td>2010-11-01</td>
+						</tr>
+						<tr>
+							<td>77</td>
+							<td>743.7</td>
+							<td>Nathan</td>
+							<td>$33.94</td>
+
+							<td>2009-03-16</td>
+						</tr>
+						<tr>
+							<td>78</td>
+							<td>47</td>
+							<td>Dan</td>
+							<td>$67.94</td>
+
+							<td>2010-08-04</td>
+						</tr>
+						<tr>
+							<td>79</td>
+							<td>511</td>
+							<td>Jeff</td>
+							<td>$45.34</td>
+
+							<td>2008-12-08</td>
+						</tr>
+						<tr>
+							<td>80</td>
+							<td>666.7</td>
+							<td>Bill</td>
+							<td>$95.54</td>
+
+							<td>2009-03-03</td>
+						</tr>
+						<tr>
+							<td>81</td>
+							<td>888.5</td>
+							<td>Joe</td>
+							<td>$8.03</td>
+
+							<td>2010-02-09</td>
+						</tr>
+						<tr>
+							<td>82</td>
+							<td>785.4</td>
+							<td>Bob</td>
+							<td>$29.34</td>
+
+							<td>2008-07-06</td>
+						</tr>
+						<tr>
+							<td>83</td>
+							<td>837.7</td>
+							<td>Matt</td>
+							<td>$96.04</td>
+
+							<td>2008-02-05</td>
+						</tr>
+						<tr>
+							<td>84</td>
+							<td>860.2</td>
+							<td>Mark</td>
+							<td>$74.04</td>
+
+							<td>2010-08-12</td>
+						</tr>
+						<tr>
+							<td>85</td>
+							<td>985</td>
+							<td>Tom</td>
+							<td>$62.34</td>
+
+							<td>2010-07-17</td>
+						</tr>
+						<tr>
+							<td>86</td>
+							<td>562.3</td>
+							<td>Jake</td>
+							<td>$83.74</td>
+
+							<td>2010-03-21</td>
+						</tr>
+						<tr>
+							<td>87</td>
+							<td>467.6</td>
+							<td>Greg</td>
+							<td>$58.14</td>
+
+							<td>2008-02-16</td>
+						</tr>
+						<tr>
+							<td>88</td>
+							<td>859</td>
+							<td>Adam</td>
+							<td>$62.84</td>
+
+							<td>2010-04-12</td>
+						</tr>
+						<tr>
+							<td>89</td>
+							<td>687.5</td>
+							<td>Steve</td>
+							<td>$13.94</td>
+
+							<td>2008-07-17</td>
+						</tr>
+						<tr>
+							<td>90</td>
+							<td>993.9</td>
+							<td>George</td>
+							<td>$80.54</td>
+
+							<td>2008-05-26</td>
+						</tr>
+						<tr>
+							<td>91</td>
+							<td>373.8</td>
+							<td>John</td>
+							<td>$69.44</td>
+
+							<td>2008-08-26</td>
+						</tr>
+						<tr>
+							<td>92</td>
+							<td>50.4</td>
+							<td>Phil</td>
+							<td>$47.94</td>
+
+							<td>2009-07-30</td>
+						</tr>
+						<tr>
+							<td>93</td>
+							<td>222.8</td>
+							<td>Jack</td>
+							<td>$31.74</td>
+
+							<td>2009-06-14</td>
+						</tr>
+						<tr>
+							<td>94</td>
+							<td>263.9</td>
+							<td>Paul</td>
+							<td>$17.74</td>
+
+							<td>2008-08-16</td>
+						</tr>
+						<tr>
+							<td>95</td>
+							<td>99.2</td>
+							<td>Rob</td>
+							<td>$16.24</td>
+
+							<td>2010-08-07</td>
+						</tr>
+						<tr>
+							<td>96</td>
+							<td>911.8</td>
+							<td>Walt</td>
+							<td>$72.44</td>
+
+							<td>2010-01-31</td>
+						</tr>
+						<tr>
+							<td>97</td>
+							<td>623</td>
+							<td>Nathan</td>
+							<td>$19.24</td>
+
+							<td>2008-10-03</td>
+						</tr>
+						<tr>
+							<td>98</td>
+							<td>673.4</td>
+							<td>Dan</td>
+							<td>$5.03</td>
+
+							<td>2010-09-29</td>
+						</tr>
+						<tr>
+							<td>99</td>
+							<td>402.8</td>
+							<td>Jeff</td>
+							<td>$73.84</td>
+
+							<td>2008-01-06</td>
+						</tr>
+						<tr>
+							<td>100</td>
+							<td>584.8</td>
+							<td>Bill</td>
+							<td>$73.24</td>
+
+							<td>2010-07-26</td>
+						</tr>
+						<tr>
+							<td>101</td>
+							<td>721.7</td>
+							<td>Joe</td>
+							<td>$10.64</td>
+
+							<td>2009-08-06</td>
+						</tr>
+						<tr>
+							<td>102</td>
+							<td>938.1</td>
+							<td>Bob</td>
+							<td>$15.64</td>
+
+							<td>2011-02-11</td>
+						</tr>
+						<tr>
+							<td>103</td>
+							<td>447.1</td>
+							<td>Matt</td>
+							<td>$37.94</td>
+
+							<td>2008-12-12</td>
+						</tr>
+						<tr>
+							<td>104</td>
+							<td>915.9</td>
+							<td>Mark</td>
+							<td>$64.34</td>
+
+							<td>2009-07-05</td>
+						</tr>
+						<tr>
+							<td>105</td>
+							<td>124.2</td>
+							<td>Tom</td>
+							<td>$74.24</td>
+
+							<td>2010-01-08</td>
+						</tr>
+						<tr>
+							<td>106</td>
+							<td>955.3</td>
+							<td>Jake</td>
+							<td>$65.34</td>
+
+							<td>2009-02-23</td>
+						</tr>
+						<tr>
+							<td>107</td>
+							<td>623.6</td>
+							<td>Greg</td>
+							<td>$27.64</td>
+
+							<td>2009-10-02</td>
+						</tr>
+						<tr>
+							<td>108</td>
+							<td>872.6</td>
+							<td>Adam</td>
+							<td>$95.04</td>
+
+							<td>2009-11-30</td>
+						</tr>
+						<tr>
+							<td>109</td>
+							<td>749.4</td>
+							<td>Steve</td>
+							<td>$35.34</td>
+
+							<td>2009-01-30</td>
+						</tr>
+						<tr>
+							<td>110</td>
+							<td>764.7</td>
+							<td>George</td>
+							<td>$93.74</td>
+
+							<td>2008-03-26</td>
+						</tr>
+						<tr>
+							<td>111</td>
+							<td>585.4</td>
+							<td>John</td>
+							<td>$65.94</td>
+
+							<td>2008-07-26</td>
+						</tr>
+						<tr>
+							<td>112</td>
+							<td>99.8</td>
+							<td>Phil</td>
+							<td>$59.74</td>
+
+							<td>2009-01-23</td>
+						</tr>
+						<tr>
+							<td>113</td>
+							<td>93.2</td>
+							<td>Jack</td>
+							<td>$4.43</td>
+
+							<td>2010-04-06</td>
+						</tr>
+						<tr>
+							<td>114</td>
+							<td>403.3</td>
+							<td>Paul</td>
+							<td>$96.04</td>
+
+							<td>2009-02-16</td>
+						</tr>
+						<tr>
+							<td>115</td>
+							<td>890.2</td>
+							<td>Rob</td>
+							<td>$8.43</td>
+
+							<td>2008-04-23</td>
+						</tr>
+						<tr>
+							<td>116</td>
+							<td>538.9</td>
+							<td>Walt</td>
+							<td>$3.93</td>
+
+							<td>2010-05-19</td>
+						</tr>
+						<tr>
+							<td>117</td>
+							<td>911.6</td>
+							<td>Nathan</td>
+							<td>$66.34</td>
+
+							<td>2008-02-02</td>
+						</tr>
+						<tr>
+							<td>118</td>
+							<td>475.9</td>
+							<td>Dan</td>
+							<td>$53.54</td>
+
+							<td>2011-02-05</td>
+						</tr>
+						<tr>
+							<td>119</td>
+							<td>90.7</td>
+							<td>Jeff</td>
+							<td>$28.54</td>
+
+							<td>2009-01-16</td>
+						</tr>
+						<tr>
+							<td>120</td>
+							<td>443.3</td>
+							<td>Bill</td>
+							<td>$5.03</td>
+
+							<td>2008-11-05</td>
+						</tr>
+						<tr>
+							<td>121</td>
+							<td>527.7</td>
+							<td>Joe</td>
+							<td>$63.54</td>
+
+							<td>2010-12-07</td>
+						</tr>
+						<tr>
+							<td>122</td>
+							<td>717.7</td>
+							<td>Bob</td>
+							<td>$73.54</td>
+
+							<td>2009-08-28</td>
+						</tr>
+						<tr>
+							<td>123</td>
+							<td>63.5</td>
+							<td>Matt</td>
+							<td>$82.84</td>
+
+							<td>2009-10-18</td>
+						</tr>
+						<tr>
+							<td>124</td>
+							<td>788</td>
+							<td>Mark</td>
+							<td>$23.14</td>
+
+							<td>2009-09-02</td>
+						</tr>
+						<tr>
+							<td>125</td>
+							<td>155</td>
+							<td>Tom</td>
+							<td>$12.14</td>
+
+							<td>2009-12-08</td>
+						</tr>
+						<tr>
+							<td>126</td>
+							<td>263.6</td>
+							<td>Jake</td>
+							<td>$66.04</td>
+
+							<td>2010-01-22</td>
+						</tr>
+						<tr>
+							<td>127</td>
+							<td>25.6</td>
+							<td>Greg</td>
+							<td>$57.24</td>
+
+							<td>2008-12-28</td>
+						</tr>
+						<tr>
+							<td>128</td>
+							<td>63.9</td>
+							<td>Adam</td>
+							<td>$4.73</td>
+
+							<td>2010-09-09</td>
+						</tr>
+						<tr>
+							<td>129</td>
+							<td>52</td>
+							<td>Steve</td>
+							<td>$13.84</td>
+
+							<td>2008-06-03</td>
+						</tr>
+						<tr>
+							<td>130</td>
+							<td>392.5</td>
+							<td>George</td>
+							<td>$58.14</td>
+
+							<td>2008-07-31</td>
+						</tr>
+						<tr>
+							<td>131</td>
+							<td>670.3</td>
+							<td>John</td>
+							<td>$10.94</td>
+
+							<td>2010-08-04</td>
+						</tr>
+						<tr>
+							<td>132</td>
+							<td>607</td>
+							<td>Phil</td>
+							<td>$82.74</td>
+
+							<td>2009-10-01</td>
+						</tr>
+						<tr>
+							<td>133</td>
+							<td>140.7</td>
+							<td>Jack</td>
+							<td>$89.04</td>
+
+							<td>2009-03-16</td>
+						</tr>
+						<tr>
+							<td>134</td>
+							<td>718.3</td>
+							<td>Paul</td>
+							<td>$67.84</td>
+
+							<td>2009-12-08</td>
+						</tr>
+						<tr>
+							<td>135</td>
+							<td>255.9</td>
+							<td>Rob</td>
+							<td>$83.34</td>
+
+							<td>2010-04-27</td>
+						</tr>
+						<tr>
+							<td>136</td>
+							<td>877.6</td>
+							<td>Walt</td>
+							<td>$9.73</td>
+
+							<td>2009-03-29</td>
+						</tr>
+						<tr>
+							<td>137</td>
+							<td>538.6</td>
+							<td>Nathan</td>
+							<td>$12.24</td>
+
+							<td>2011-01-20</td>
+						</tr>
+						<tr>
+							<td>138</td>
+							<td>862.5</td>
+							<td>Dan</td>
+							<td>$18.64</td>
+
+							<td>2008-01-13</td>
+						</tr>
+						<tr>
+							<td>139</td>
+							<td>721.9</td>
+							<td>Jeff</td>
+							<td>$23.84</td>
+
+							<td>2008-06-21</td>
+						</tr>
+						<tr>
+							<td>140</td>
+							<td>866.2</td>
+							<td>Bill</td>
+							<td>$63.04</td>
+
+							<td>2010-04-25</td>
+						</tr>
+						<tr>
+							<td>141</td>
+							<td>59.9</td>
+							<td>Joe</td>
+							<td>$30.14</td>
+
+							<td>2010-08-29</td>
+						</tr>
+						<tr>
+							<td>142</td>
+							<td>888.4</td>
+							<td>Bob</td>
+							<td>$90.84</td>
+
+							<td>2010-02-09</td>
+						</tr>
+						<tr>
+							<td>143</td>
+							<td>451.5</td>
+							<td>Matt</td>
+							<td>$4.83</td>
+
+							<td>2009-10-05</td>
+						</tr>
+						<tr>
+							<td>144</td>
+							<td>842.2</td>
+							<td>Mark</td>
+							<td>$76.74</td>
+
+							<td>2008-09-27</td>
+						</tr>
+						<tr>
+							<td>145</td>
+							<td>463.9</td>
+							<td>Tom</td>
+							<td>$2.23</td>
+
+							<td>2008-03-18</td>
+						</tr>
+						<tr>
+							<td>146</td>
+							<td>206.6</td>
+							<td>Jake</td>
+							<td>$90.04</td>
+
+							<td>2008-07-08</td>
+						</tr>
+						<tr>
+							<td>147</td>
+							<td>609.3</td>
+							<td>Greg</td>
+							<td>$43.84</td>
+
+							<td>2008-11-26</td>
+						</tr>
+						<tr>
+							<td>148</td>
+							<td>583.6</td>
+							<td>Adam</td>
+							<td>$30.14</td>
+
+							<td>2009-06-29</td>
+						</tr>
+						<tr>
+							<td>149</td>
+							<td>605.2</td>
+							<td>Steve</td>
+							<td>$2.33</td>
+
+							<td>2010-03-31</td>
+						</tr>
+						<tr>
+							<td>150</td>
+							<td>764.8</td>
+							<td>George</td>
+							<td>$88.94</td>
+
+							<td>2009-01-27</td>
+						</tr>
+						<tr>
+							<td>151</td>
+							<td>505.6</td>
+							<td>John</td>
+							<td>$94.94</td>
+
+							<td>2010-01-10</td>
+						</tr>
+						<tr>
+							<td>152</td>
+							<td>355.4</td>
+							<td>Phil</td>
+							<td>$83.74</td>
+
+							<td>2009-09-25</td>
+						</tr>
+						<tr>
+							<td>153</td>
+							<td>31.9</td>
+							<td>Jack</td>
+							<td>$28.84</td>
+
+							<td>2009-11-20</td>
+						</tr>
+						<tr>
+							<td>154</td>
+							<td>598.4</td>
+							<td>Paul</td>
+							<td>$13.14</td>
+
+							<td>2009-02-23</td>
+						</tr>
+						<tr>
+							<td>155</td>
+							<td>842.9</td>
+							<td>Rob</td>
+							<td>$59.44</td>
+
+							<td>2009-03-20</td>
+						</tr>
+						<tr>
+							<td>156</td>
+							<td>920.5</td>
+							<td>Walt</td>
+							<td>$80.14</td>
+
+							<td>2008-11-24</td>
+						</tr>
+						<tr>
+							<td>157</td>
+							<td>94.5</td>
+							<td>Nathan</td>
+							<td>$41.04</td>
+
+							<td>2010-04-16</td>
+						</tr>
+						<tr>
+							<td>158</td>
+							<td>390.6</td>
+							<td>Dan</td>
+							<td>$99.44</td>
+
+							<td>2008-01-28</td>
+						</tr>
+						<tr>
+							<td>159</td>
+							<td>872.6</td>
+							<td>Jeff</td>
+							<td>$59.94</td>
+
+							<td>2008-02-23</td>
+						</tr>
+						<tr>
+							<td>160</td>
+							<td>592.3</td>
+							<td>Bill</td>
+							<td>$36.44</td>
+
+							<td>2010-12-18</td>
+						</tr>
+						<tr>
+							<td>161</td>
+							<td>942.4</td>
+							<td>Joe</td>
+							<td>$86.94</td>
+
+							<td>2010-10-19</td>
+						</tr>
+						<tr>
+							<td>162</td>
+							<td>593</td>
+							<td>Bob</td>
+							<td>$22.44</td>
+
+							<td>2010-04-13</td>
+						</tr>
+						<tr>
+							<td>163</td>
+							<td>151.1</td>
+							<td>Matt</td>
+							<td>$25.64</td>
+
+							<td>2008-01-11</td>
+						</tr>
+						<tr>
+							<td>164</td>
+							<td>757.4</td>
+							<td>Mark</td>
+							<td>$85.54</td>
+
+							<td>2008-06-10</td>
+						</tr>
+						<tr>
+							<td>165</td>
+							<td>130</td>
+							<td>Tom</td>
+							<td>$69.84</td>
+
+							<td>2010-04-29</td>
+						</tr>
+						<tr>
+							<td>166</td>
+							<td>525</td>
+							<td>Jake</td>
+							<td>$61.84</td>
+
+							<td>2009-09-10</td>
+						</tr>
+						<tr>
+							<td>167</td>
+							<td>819.8</td>
+							<td>Greg</td>
+							<td>$71.34</td>
+
+							<td>2010-12-29</td>
+						</tr>
+						<tr>
+							<td>168</td>
+							<td>552.9</td>
+							<td>Adam</td>
+							<td>$10.34</td>
+
+							<td>2010-12-22</td>
+						</tr>
+						<tr>
+							<td>169</td>
+							<td>586.8</td>
+							<td>Steve</td>
+							<td>$97.54</td>
+
+							<td>2009-09-13</td>
+						</tr>
+						<tr>
+							<td>170</td>
+							<td>643.5</td>
+							<td>George</td>
+							<td>$56.84</td>
+
+							<td>2010-11-08</td>
+						</tr>
+						<tr>
+							<td>171</td>
+							<td>588.9</td>
+							<td>John</td>
+							<td>$51.04</td>
+
+							<td>2010-06-10</td>
+						</tr>
+						<tr>
+							<td>172</td>
+							<td>482.9</td>
+							<td>Phil</td>
+							<td>$10.34</td>
+
+							<td>2007-12-25</td>
+						</tr>
+						<tr>
+							<td>173</td>
+							<td>213.9</td>
+							<td>Jack</td>
+							<td>$25.44</td>
+
+							<td>2008-10-17</td>
+						</tr>
+						<tr>
+							<td>174</td>
+							<td>233.2</td>
+							<td>Paul</td>
+							<td>$1.13</td>
+
+							<td>2008-05-01</td>
+						</tr>
+						<tr>
+							<td>175</td>
+							<td>383</td>
+							<td>Rob</td>
+							<td>$14.24</td>
+
+							<td>2010-07-18</td>
+						</tr>
+						<tr>
+							<td>176</td>
+							<td>127.1</td>
+							<td>Walt</td>
+							<td>$66.74</td>
+
+							<td>2009-05-01</td>
+						</tr>
+						<tr>
+							<td>177</td>
+							<td>672.2</td>
+							<td>Nathan</td>
+							<td>$48.64</td>
+
+							<td>2008-06-03</td>
+						</tr>
+						<tr>
+							<td>178</td>
+							<td>627.4</td>
+							<td>Dan</td>
+							<td>$3.93</td>
+
+							<td>2008-09-30</td>
+						</tr>
+						<tr>
+							<td>179</td>
+							<td>576.3</td>
+							<td>Jeff</td>
+							<td>$62.64</td>
+
+							<td>2008-09-01</td>
+						</tr>
+						<tr>
+							<td>180</td>
+							<td>124.1</td>
+							<td>Bill</td>
+							<td>$26.94</td>
+
+							<td>2010-06-20</td>
+						</tr>
+						<tr>
+							<td>181</td>
+							<td>35.3</td>
+							<td>Joe</td>
+							<td>$85.84</td>
+
+							<td>2008-11-30</td>
+						</tr>
+						<tr>
+							<td>182</td>
+							<td>815.7</td>
+							<td>Bob</td>
+							<td>$34.14</td>
+
+							<td>2009-03-30</td>
+						</tr>
+						<tr>
+							<td>183</td>
+							<td>820.6</td>
+							<td>Matt</td>
+							<td>$55.54</td>
+
+							<td>2010-01-18</td>
+						</tr>
+						<tr>
+							<td>184</td>
+							<td>81.8</td>
+							<td>Mark</td>
+							<td>$78.84</td>
+
+							<td>2010-01-31</td>
+						</tr>
+						<tr>
+							<td>185</td>
+							<td>197.5</td>
+							<td>Tom</td>
+							<td>$17.14</td>
+
+							<td>2010-07-14</td>
+						</tr>
+						<tr>
+							<td>186</td>
+							<td>10.8</td>
+							<td>Jake</td>
+							<td>$29.84</td>
+
+							<td>2009-06-23</td>
+						</tr>
+						<tr>
+							<td>187</td>
+							<td>442</td>
+							<td>Greg</td>
+							<td>$97.04</td>
+
+							<td>2011-01-06</td>
+						</tr>
+						<tr>
+							<td>188</td>
+							<td>585.7</td>
+							<td>Adam</td>
+							<td>$59.74</td>
+
+							<td>2007-12-21</td>
+						</tr>
+						<tr>
+							<td>189</td>
+							<td>832.2</td>
+							<td>Steve</td>
+							<td>$17.44</td>
+
+							<td>2009-12-14</td>
+						</tr>
+						<tr>
+							<td>190</td>
+							<td>54.3</td>
+							<td>George</td>
+							<td>$29.84</td>
+
+							<td>2010-10-22</td>
+						</tr>
+						<tr>
+							<td>191</td>
+							<td>844</td>
+							<td>John</td>
+							<td>$33.34</td>
+
+							<td>2010-05-10</td>
+						</tr>
+						<tr>
+							<td>192</td>
+							<td>143.9</td>
+							<td>Phil</td>
+							<td>$14.94</td>
+
+							<td>2008-04-07</td>
+						</tr>
+						<tr>
+							<td>193</td>
+							<td>546.8</td>
+							<td>Jack</td>
+							<td>$96.94</td>
+
+							<td>2010-01-09</td>
+						</tr>
+						<tr>
+							<td>194</td>
+							<td>203.8</td>
+							<td>Paul</td>
+							<td>$5.13</td>
+
+							<td>2009-05-09</td>
+						</tr>
+						<tr>
+							<td>195</td>
+							<td>872.3</td>
+							<td>Rob</td>
+							<td>$24.84</td>
+
+							<td>2009-11-22</td>
+						</tr>
+						<tr>
+							<td>196</td>
+							<td>682.3</td>
+							<td>Walt</td>
+							<td>$25.94</td>
+
+							<td>2010-11-02</td>
+						</tr>
+						<tr>
+							<td>197</td>
+							<td>158.7</td>
+							<td>Nathan</td>
+							<td>$70.14</td>
+
+							<td>2010-09-28</td>
+						</tr>
+						<tr>
+							<td>198</td>
+							<td>121.2</td>
+							<td>Dan</td>
+							<td>$28.74</td>
+
+							<td>2009-06-19</td>
+						</tr>
+						<tr>
+							<td>199</td>
+							<td>122.6</td>
+							<td>Jeff</td>
+							<td>$11.94</td>
+
+							<td>2010-01-06</td>
+						</tr>
+						<tr>
+							<td>200</td>
+							<td>749.8</td>
+							<td>Bill</td>
+							<td>$17.34</td>
+
+							<td>2010-12-17</td>
+						</tr>
+						<tr>
+							<td>201</td>
+							<td>646.1</td>
+							<td>Joe</td>
+							<td>$1.73</td>
+
+							<td>2008-11-05</td>
+						</tr>
+						<tr>
+							<td>202</td>
+							<td>400.4</td>
+							<td>Bob</td>
+							<td>$16.14</td>
+
+							<td>2009-04-26</td>
+						</tr>
+						<tr>
+							<td>203</td>
+							<td>495.5</td>
+							<td>Matt</td>
+							<td>$70.84</td>
+
+							<td>2009-03-21</td>
+						</tr>
+						<tr>
+							<td>204</td>
+							<td>145.3</td>
+							<td>Mark</td>
+							<td>$91.24</td>
+
+							<td>2009-05-19</td>
+						</tr>
+						<tr>
+							<td>205</td>
+							<td>582.9</td>
+							<td>Tom</td>
+							<td>$78.44</td>
+
+							<td>2010-03-02</td>
+						</tr>
+						<tr>
+							<td>206</td>
+							<td>191.3</td>
+							<td>Jake</td>
+							<td>$46.64</td>
+
+							<td>2010-12-27</td>
+						</tr>
+						<tr>
+							<td>207</td>
+							<td>97.5</td>
+							<td>Greg</td>
+							<td>$62.54</td>
+
+							<td>2010-01-15</td>
+						</tr>
+						<tr>
+							<td>208</td>
+							<td>973.7</td>
+							<td>Adam</td>
+							<td>$74.64</td>
+
+							<td>2010-12-13</td>
+						</tr>
+						<tr>
+							<td>209</td>
+							<td>447.2</td>
+							<td>Steve</td>
+							<td>$86.84</td>
+
+							<td>2008-02-27</td>
+						</tr>
+						<tr>
+							<td>210</td>
+							<td>94.3</td>
+							<td>George</td>
+							<td>$61.84</td>
+
+							<td>2008-09-15</td>
+						</tr>
+						<tr>
+							<td>211</td>
+							<td>39</td>
+							<td>John</td>
+							<td>$26.44</td>
+
+							<td>2008-10-04</td>
+						</tr>
+						<tr>
+							<td>212</td>
+							<td>316.7</td>
+							<td>Phil</td>
+							<td>$66.54</td>
+
+							<td>2009-04-09</td>
+						</tr>
+						<tr>
+							<td>213</td>
+							<td>743</td>
+							<td>Jack</td>
+							<td>$16.04</td>
+
+							<td>2008-05-05</td>
+						</tr>
+						<tr>
+							<td>214</td>
+							<td>138.4</td>
+							<td>Paul</td>
+							<td>$30.54</td>
+
+							<td>2008-01-24</td>
+						</tr>
+						<tr>
+							<td>215</td>
+							<td>584.7</td>
+							<td>Rob</td>
+							<td>$88.84</td>
+
+							<td>2010-07-19</td>
+						</tr>
+						<tr>
+							<td>216</td>
+							<td>279.3</td>
+							<td>Walt</td>
+							<td>$7.93</td>
+
+							<td>2008-11-08</td>
+						</tr>
+						<tr>
+							<td>217</td>
+							<td>233</td>
+							<td>Nathan</td>
+							<td>$17.74</td>
+
+							<td>2010-11-01</td>
+						</tr>
+						<tr>
+							<td>218</td>
+							<td>887.8</td>
+							<td>Dan</td>
+							<td>$15.04</td>
+
+							<td>2010-01-11</td>
+						</tr>
+						<tr>
+							<td>219</td>
+							<td>829.3</td>
+							<td>Jeff</td>
+							<td>$59.84</td>
+
+							<td>2009-08-12</td>
+						</tr>
+						<tr>
+							<td>220</td>
+							<td>889.7</td>
+							<td>Bill</td>
+							<td>$69.24</td>
+
+							<td>2008-05-27</td>
+						</tr>
+						<tr>
+							<td>221</td>
+							<td>123.3</td>
+							<td>Joe</td>
+							<td>$73.14</td>
+
+							<td>2009-03-29</td>
+						</tr>
+						<tr>
+							<td>222</td>
+							<td>373.9</td>
+							<td>Bob</td>
+							<td>$4.73</td>
+
+							<td>2008-03-06</td>
+						</tr>
+						<tr>
+							<td>223</td>
+							<td>785.6</td>
+							<td>Matt</td>
+							<td>$79.04</td>
+
+							<td>2008-09-07</td>
+						</tr>
+						<tr>
+							<td>224</td>
+							<td>904.9</td>
+							<td>Mark</td>
+							<td>$92.94</td>
+
+							<td>2009-08-26</td>
+						</tr>
+						<tr>
+							<td>225</td>
+							<td>935.8</td>
+							<td>Tom</td>
+							<td>$51.34</td>
+
+							<td>2009-04-19</td>
+						</tr>
+						<tr>
+							<td>226</td>
+							<td>750.5</td>
+							<td>Jake</td>
+							<td>$79.34</td>
+
+							<td>2009-07-19</td>
+						</tr>
+						<tr>
+							<td>227</td>
+							<td>31.2</td>
+							<td>Greg</td>
+							<td>$2.53</td>
+
+							<td>2010-02-09</td>
+						</tr>
+						<tr>
+							<td>228</td>
+							<td>936.7</td>
+							<td>Adam</td>
+							<td>$91.34</td>
+
+							<td>2010-08-02</td>
+						</tr>
+						<tr>
+							<td>229</td>
+							<td>588</td>
+							<td>Steve</td>
+							<td>$74.24</td>
+
+							<td>2009-04-23</td>
+						</tr>
+						<tr>
+							<td>230</td>
+							<td>107.7</td>
+							<td>George</td>
+							<td>$63.24</td>
+
+							<td>2008-05-01</td>
+						</tr>
+						<tr>
+							<td>231</td>
+							<td>245.7</td>
+							<td>John</td>
+							<td>$75.54</td>
+
+							<td>2010-08-25</td>
+						</tr>
+						<tr>
+							<td>232</td>
+							<td>647.8</td>
+							<td>Phil</td>
+							<td>$12.94</td>
+
+							<td>2010-10-19</td>
+						</tr>
+						<tr>
+							<td>233</td>
+							<td>714.6</td>
+							<td>Jack</td>
+							<td>$91.54</td>
+
+							<td>2010-02-18</td>
+						</tr>
+						<tr>
+							<td>234</td>
+							<td>941.3</td>
+							<td>Paul</td>
+							<td>$82.04</td>
+
+							<td>2009-11-28</td>
+						</tr>
+						<tr>
+							<td>235</td>
+							<td>473.3</td>
+							<td>Rob</td>
+							<td>$75.54</td>
+
+							<td>2008-05-13</td>
+						</tr>
+						<tr>
+							<td>236</td>
+							<td>893.4</td>
+							<td>Walt</td>
+							<td>$50.64</td>
+
+							<td>2010-11-17</td>
+						</tr>
+						<tr>
+							<td>237</td>
+							<td>392.7</td>
+							<td>Nathan</td>
+							<td>$53.74</td>
+
+							<td>2010-12-16</td>
+						</tr>
+						<tr>
+							<td>238</td>
+							<td>68.8</td>
+							<td>Dan</td>
+							<td>$47.44</td>
+
+							<td>2010-09-06</td>
+						</tr>
+						<tr>
+							<td>239</td>
+							<td>895.2</td>
+							<td>Jeff</td>
+							<td>$6.13</td>
+
+							<td>2009-11-12</td>
+						</tr>
+						<tr>
+							<td>240</td>
+							<td>319.1</td>
+							<td>Bill</td>
+							<td>$16.94</td>
+
+							<td>2008-09-12</td>
+						</tr>
+						<tr>
+							<td>241</td>
+							<td>434.7</td>
+							<td>Joe</td>
+							<td>$41.54</td>
+
+							<td>2011-02-04</td>
+						</tr>
+						<tr>
+							<td>242</td>
+							<td>281.1</td>
+							<td>Bob</td>
+							<td>$6.33</td>
+
+							<td>2008-05-02</td>
+						</tr>
+						<tr>
+							<td>243</td>
+							<td>174.8</td>
+							<td>Matt</td>
+							<td>$77.74</td>
+
+							<td>2008-01-24</td>
+						</tr>
+						<tr>
+							<td>244</td>
+							<td>859</td>
+							<td>Mark</td>
+							<td>$71.84</td>
+
+							<td>2010-08-30</td>
+						</tr>
+						<tr>
+							<td>245</td>
+							<td>471.8</td>
+							<td>Tom</td>
+							<td>$19.14</td>
+
+							<td>2009-11-19</td>
+						</tr>
+						<tr>
+							<td>246</td>
+							<td>597.9</td>
+							<td>Jake</td>
+							<td>$8.53</td>
+
+							<td>2008-04-26</td>
+						</tr>
+						<tr>
+							<td>247</td>
+							<td>516.5</td>
+							<td>Greg</td>
+							<td>$47.84</td>
+
+							<td>2010-01-08</td>
+						</tr>
+						<tr>
+							<td>248</td>
+							<td>460.6</td>
+							<td>Adam</td>
+							<td>$54.64</td>
+
+							<td>2008-05-08</td>
+						</tr>
+						<tr>
+							<td>249</td>
+							<td>317.8</td>
+							<td>Steve</td>
+							<td>$44.14</td>
+
+							<td>2008-07-18</td>
+						</tr>
+						<tr>
+							<td>250</td>
+							<td>917.4</td>
+							<td>George</td>
+							<td>$76.04</td>
+
+							<td>2009-01-30</td>
+						</tr>
+						<tr>
+							<td>251</td>
+							<td>149.1</td>
+							<td>John</td>
+							<td>$19.54</td>
+
+							<td>2010-05-25</td>
+						</tr>
+						<tr>
+							<td>252</td>
+							<td>136.1</td>
+							<td>Phil</td>
+							<td>$47.64</td>
+
+							<td>2010-08-05</td>
+						</tr>
+						<tr>
+							<td>253</td>
+							<td>252.2</td>
+							<td>Jack</td>
+							<td>$65.14</td>
+
+							<td>2009-11-20</td>
+						</tr>
+						<tr>
+							<td>254</td>
+							<td>283</td>
+							<td>Paul</td>
+							<td>$51.04</td>
+
+							<td>2008-12-29</td>
+						</tr>
+						<tr>
+							<td>255</td>
+							<td>133.3</td>
+							<td>Rob</td>
+							<td>$98.24</td>
+
+							<td>2009-08-08</td>
+						</tr>
+						<tr>
+							<td>256</td>
+							<td>739</td>
+							<td>Walt</td>
+							<td>$57.94</td>
+
+							<td>2009-11-14</td>
+						</tr>
+						<tr>
+							<td>257</td>
+							<td>850.4</td>
+							<td>Nathan</td>
+							<td>$9.63</td>
+
+							<td>2008-03-19</td>
+						</tr>
+						<tr>
+							<td>258</td>
+							<td>498.6</td>
+							<td>Dan</td>
+							<td>$55.64</td>
+
+							<td>2009-12-11</td>
+						</tr>
+						<tr>
+							<td>259</td>
+							<td>620.3</td>
+							<td>Jeff</td>
+							<td>$87.44</td>
+
+							<td>2008-03-04</td>
+						</tr>
+						<tr>
+							<td>260</td>
+							<td>803.4</td>
+							<td>Bill</td>
+							<td>$79.14</td>
+
+							<td>2010-08-01</td>
+						</tr>
+						<tr>
+							<td>261</td>
+							<td>155.5</td>
+							<td>Joe</td>
+							<td>$94.04</td>
+
+							<td>2008-01-13</td>
+						</tr>
+						<tr>
+							<td>262</td>
+							<td>922.3</td>
+							<td>Bob</td>
+							<td>$7.63</td>
+
+							<td>2009-07-17</td>
+						</tr>
+						<tr>
+							<td>263</td>
+							<td>751.6</td>
+							<td>Matt</td>
+							<td>$32.94</td>
+
+							<td>2008-06-07</td>
+						</tr>
+						<tr>
+							<td>264</td>
+							<td>357.9</td>
+							<td>Mark</td>
+							<td>$61.14</td>
+
+							<td>2010-01-18</td>
+						</tr>
+						<tr>
+							<td>265</td>
+							<td>682.4</td>
+							<td>Tom</td>
+							<td>$74.54</td>
+
+							<td>2009-12-28</td>
+						</tr>
+						<tr>
+							<td>266</td>
+							<td>198.4</td>
+							<td>Jake</td>
+							<td>$48.44</td>
+
+							<td>2008-08-28</td>
+						</tr>
+						<tr>
+							<td>267</td>
+							<td>799.1</td>
+							<td>Greg</td>
+							<td>$33.44</td>
+
+							<td>2008-12-17</td>
+						</tr>
+						<tr>
+							<td>268</td>
+							<td>877.4</td>
+							<td>Adam</td>
+							<td>$83.34</td>
+
+							<td>2010-09-21</td>
+						</tr>
+						<tr>
+							<td>269</td>
+							<td>501.7</td>
+							<td>Steve</td>
+							<td>$45.34</td>
+
+							<td>2010-04-28</td>
+						</tr>
+						<tr>
+							<td>270</td>
+							<td>567.4</td>
+							<td>George</td>
+							<td>$25.64</td>
+
+							<td>2009-08-30</td>
+						</tr>
+						<tr>
+							<td>271</td>
+							<td>393.4</td>
+							<td>John</td>
+							<td>$41.14</td>
+
+							<td>2009-06-22</td>
+						</tr>
+						<tr>
+							<td>272</td>
+							<td>414.4</td>
+							<td>Phil</td>
+							<td>$33.44</td>
+
+							<td>2009-09-18</td>
+						</tr>
+						<tr>
+							<td>273</td>
+							<td>911.4</td>
+							<td>Jack</td>
+							<td>$8.53</td>
+
+							<td>2010-10-03</td>
+						</tr>
+						<tr>
+							<td>274</td>
+							<td>59.2</td>
+							<td>Paul</td>
+							<td>$44.34</td>
+
+							<td>2009-07-10</td>
+						</tr>
+						<tr>
+							<td>275</td>
+							<td>716.7</td>
+							<td>Rob</td>
+							<td>$12.64</td>
+
+							<td>2008-09-18</td>
+						</tr>
+						<tr>
+							<td>276</td>
+							<td>355.7</td>
+							<td>Walt</td>
+							<td>$32.44</td>
+
+							<td>2010-04-01</td>
+						</tr>
+						<tr>
+							<td>277</td>
+							<td>573.9</td>
+							<td>Nathan</td>
+							<td>$12.34</td>
+
+							<td>2008-02-20</td>
+						</tr>
+						<tr>
+							<td>278</td>
+							<td>887.7</td>
+							<td>Dan</td>
+							<td>$0.03</td>
+
+							<td>2010-10-10</td>
+						</tr>
+						<tr>
+							<td>279</td>
+							<td>757.8</td>
+							<td>Jeff</td>
+							<td>$50.24</td>
+
+							<td>2009-01-15</td>
+						</tr>
+						<tr>
+							<td>280</td>
+							<td>501.7</td>
+							<td>Bill</td>
+							<td>$6.93</td>
+
+							<td>2009-11-07</td>
+						</tr>
+						<tr>
+							<td>281</td>
+							<td>36.9</td>
+							<td>Joe</td>
+							<td>$46.34</td>
+
+							<td>2007-12-27</td>
+						</tr>
+						<tr>
+							<td>282</td>
+							<td>512.4</td>
+							<td>Bob</td>
+							<td>$87.74</td>
+
+							<td>2009-01-16</td>
+						</tr>
+						<tr>
+							<td>283</td>
+							<td>64.3</td>
+							<td>Matt</td>
+							<td>$78.84</td>
+
+							<td>2009-04-25</td>
+						</tr>
+						<tr>
+							<td>284</td>
+							<td>944.6</td>
+							<td>Mark</td>
+							<td>$84.74</td>
+
+							<td>2010-09-20</td>
+						</tr>
+						<tr>
+							<td>285</td>
+							<td>436.3</td>
+							<td>Tom</td>
+							<td>$56.44</td>
+
+							<td>2011-02-12</td>
+						</tr>
+						<tr>
+							<td>286</td>
+							<td>672.6</td>
+							<td>Jake</td>
+							<td>$92.04</td>
+
+							<td>2008-12-21</td>
+						</tr>
+						<tr>
+							<td>287</td>
+							<td>392.6</td>
+							<td>Greg</td>
+							<td>$49.44</td>
+
+							<td>2009-05-13</td>
+						</tr>
+						<tr>
+							<td>288</td>
+							<td>446.5</td>
+							<td>Adam</td>
+							<td>$38.14</td>
+
+							<td>2009-05-13</td>
+						</tr>
+						<tr>
+							<td>289</td>
+							<td>333</td>
+							<td>Steve</td>
+							<td>$13.94</td>
+
+							<td>2010-12-15</td>
+						</tr>
+						<tr>
+							<td>290</td>
+							<td>672.1</td>
+							<td>George</td>
+							<td>$64.14</td>
+
+							<td>2008-01-02</td>
+						</tr>
+						<tr>
+							<td>291</td>
+							<td>267.3</td>
+							<td>John</td>
+							<td>$67.84</td>
+
+							<td>2009-06-21</td>
+						</tr>
+						<tr>
+							<td>292</td>
+							<td>273.9</td>
+							<td>Phil</td>
+							<td>$19.04</td>
+
+							<td>2009-01-29</td>
+						</tr>
+						<tr>
+							<td>293</td>
+							<td>614.3</td>
+							<td>Jack</td>
+							<td>$25.44</td>
+
+							<td>2008-05-29</td>
+						</tr>
+						<tr>
+							<td>294</td>
+							<td>40</td>
+							<td>Paul</td>
+							<td>$19.94</td>
+
+							<td>2011-02-04</td>
+						</tr>
+						<tr>
+							<td>295</td>
+							<td>908.8</td>
+							<td>Rob</td>
+							<td>$63.54</td>
+
+							<td>2009-09-17</td>
+						</tr>
+						<tr>
+							<td>296</td>
+							<td>903.1</td>
+							<td>Walt</td>
+							<td>$30.84</td>
+
+							<td>2009-06-17</td>
+						</tr>
+						<tr>
+							<td>297</td>
+							<td>221.2</td>
+							<td>Nathan</td>
+							<td>$70.04</td>
+
+							<td>2011-01-09</td>
+						</tr>
+						<tr>
+							<td>298</td>
+							<td>662.1</td>
+							<td>Dan</td>
+							<td>$14.74</td>
+
+							<td>2009-01-23</td>
+						</tr>
+						<tr>
+							<td>299</td>
+							<td>103.2</td>
+							<td>Jeff</td>
+							<td>$47.94</td>
+
+							<td>2009-07-03</td>
+						</tr>
+						<tr>
+							<td>300</td>
+							<td>46.2</td>
+							<td>Bill</td>
+							<td>$15.24</td>
+
+							<td>2008-05-13</td>
+						</tr>
+						<tr>
+							<td>301</td>
+							<td>58.3</td>
+							<td>Joe</td>
+							<td>$41.94</td>
+
+							<td>2010-07-06</td>
+						</tr>
+						<tr>
+							<td>302</td>
+							<td>533</td>
+							<td>Bob</td>
+							<td>$69.34</td>
+
+							<td>2011-02-10</td>
+						</tr>
+						<tr>
+							<td>303</td>
+							<td>884.6</td>
+							<td>Matt</td>
+							<td>$30.74</td>
+
+							<td>2008-09-30</td>
+						</tr>
+						<tr>
+							<td>304</td>
+							<td>24.5</td>
+							<td>Mark</td>
+							<td>$34.74</td>
+
+							<td>2009-05-18</td>
+						</tr>
+						<tr>
+							<td>305</td>
+							<td>11.7</td>
+							<td>Tom</td>
+							<td>$25.64</td>
+
+							<td>2008-03-22</td>
+						</tr>
+						<tr>
+							<td>306</td>
+							<td>563</td>
+							<td>Jake</td>
+							<td>$15.94</td>
+
+							<td>2009-03-12</td>
+						</tr>
+						<tr>
+							<td>307</td>
+							<td>34.1</td>
+							<td>Greg</td>
+							<td>$38.04</td>
+
+							<td>2008-03-30</td>
+						</tr>
+						<tr>
+							<td>308</td>
+							<td>998.8</td>
+							<td>Adam</td>
+							<td>$4.23</td>
+
+							<td>2008-09-16</td>
+						</tr>
+						<tr>
+							<td>309</td>
+							<td>344.7</td>
+							<td>Steve</td>
+							<td>$14.54</td>
+
+							<td>2010-03-25</td>
+						</tr>
+						<tr>
+							<td>310</td>
+							<td>829.5</td>
+							<td>George</td>
+							<td>$19.14</td>
+
+							<td>2010-09-16</td>
+						</tr>
+						<tr>
+							<td>311</td>
+							<td>955</td>
+							<td>John</td>
+							<td>$24.94</td>
+
+							<td>2008-11-12</td>
+						</tr>
+						<tr>
+							<td>312</td>
+							<td>758</td>
+							<td>Phil</td>
+							<td>$78.34</td>
+
+							<td>2011-01-23</td>
+						</tr>
+						<tr>
+							<td>313</td>
+							<td>750.8</td>
+							<td>Jack</td>
+							<td>$66.74</td>
+
+							<td>2008-11-11</td>
+						</tr>
+						<tr>
+							<td>314</td>
+							<td>997.8</td>
+							<td>Paul</td>
+							<td>$69.14</td>
+
+							<td>2009-12-18</td>
+						</tr>
+						<tr>
+							<td>315</td>
+							<td>443.5</td>
+							<td>Rob</td>
+							<td>$70.34</td>
+
+							<td>2010-10-10</td>
+						</tr>
+						<tr>
+							<td>316</td>
+							<td>524</td>
+							<td>Walt</td>
+							<td>$26.64</td>
+
+							<td>2008-02-09</td>
+						</tr>
+						<tr>
+							<td>317</td>
+							<td>912</td>
+							<td>Nathan</td>
+							<td>$30.04</td>
+
+							<td>2009-04-24</td>
+						</tr>
+						<tr>
+							<td>318</td>
+							<td>1000</td>
+							<td>Dan</td>
+							<td>$29.94</td>
+
+							<td>2009-06-11</td>
+						</tr>
+						<tr>
+							<td>319</td>
+							<td>234.5</td>
+							<td>Jeff</td>
+							<td>$64.34</td>
+
+							<td>2009-11-26</td>
+						</tr>
+						<tr>
+							<td>320</td>
+							<td>948.4</td>
+							<td>Bill</td>
+							<td>$47.34</td>
+
+							<td>2010-07-05</td>
+						</tr>
+						<tr>
+							<td>321</td>
+							<td>813.7</td>
+							<td>Joe</td>
+							<td>$42.84</td>
+
+							<td>2008-02-18</td>
+						</tr>
+						<tr>
+							<td>322</td>
+							<td>97.7</td>
+							<td>Bob</td>
+							<td>$18.64</td>
+
+							<td>2010-08-11</td>
+						</tr>
+						<tr>
+							<td>323</td>
+							<td>74.3</td>
+							<td>Matt</td>
+							<td>$93.74</td>
+
+							<td>2009-07-22</td>
+						</tr>
+						<tr>
+							<td>324</td>
+							<td>357.7</td>
+							<td>Mark</td>
+							<td>$93.44</td>
+
+							<td>2008-07-29</td>
+						</tr>
+						<tr>
+							<td>325</td>
+							<td>988</td>
+							<td>Tom</td>
+							<td>$37.84</td>
+
+							<td>2010-10-21</td>
+						</tr>
+						<tr>
+							<td>326</td>
+							<td>873.8</td>
+							<td>Jake</td>
+							<td>$90.24</td>
+
+							<td>2008-06-24</td>
+						</tr>
+						<tr>
+							<td>327</td>
+							<td>918.3</td>
+							<td>Greg</td>
+							<td>$81.44</td>
+
+							<td>2009-06-06</td>
+						</tr>
+						<tr>
+							<td>328</td>
+							<td>342.7</td>
+							<td>Adam</td>
+							<td>$81.44</td>
+
+							<td>2010-05-18</td>
+						</tr>
+						<tr>
+							<td>329</td>
+							<td>809</td>
+							<td>Steve</td>
+							<td>$4.83</td>
+
+							<td>2009-03-31</td>
+						</tr>
+						<tr>
+							<td>330</td>
+							<td>420.4</td>
+							<td>George</td>
+							<td>$99.74</td>
+
+							<td>2010-09-30</td>
+						</tr>
+						<tr>
+							<td>331</td>
+							<td>223</td>
+							<td>John</td>
+							<td>$81.04</td>
+
+							<td>2008-12-06</td>
+						</tr>
+						<tr>
+							<td>332</td>
+							<td>275</td>
+							<td>Phil</td>
+							<td>$90.84</td>
+
+							<td>2009-07-09</td>
+						</tr>
+						<tr>
+							<td>333</td>
+							<td>109.5</td>
+							<td>Jack</td>
+							<td>$98.24</td>
+
+							<td>2009-04-27</td>
+						</tr>
+						<tr>
+							<td>334</td>
+							<td>610.9</td>
+							<td>Paul</td>
+							<td>$34.04</td>
+
+							<td>2009-02-10</td>
+						</tr>
+						<tr>
+							<td>335</td>
+							<td>803.7</td>
+							<td>Rob</td>
+							<td>$32.84</td>
+
+							<td>2010-04-23</td>
+						</tr>
+						<tr>
+							<td>336</td>
+							<td>699.6</td>
+							<td>Walt</td>
+							<td>$20.14</td>
+
+							<td>2009-12-30</td>
+						</tr>
+						<tr>
+							<td>337</td>
+							<td>861.4</td>
+							<td>Nathan</td>
+							<td>$12.04</td>
+
+							<td>2009-05-28</td>
+						</tr>
+						<tr>
+							<td>338</td>
+							<td>323.4</td>
+							<td>Dan</td>
+							<td>$46.24</td>
+
+							<td>2008-10-25</td>
+						</tr>
+						<tr>
+							<td>339</td>
+							<td>84.3</td>
+							<td>Jeff</td>
+							<td>$27.14</td>
+
+							<td>2008-12-19</td>
+						</tr>
+						<tr>
+							<td>340</td>
+							<td>488.6</td>
+							<td>Bill</td>
+							<td>$69.24</td>
+
+							<td>2008-12-15</td>
+						</tr>
+						<tr>
+							<td>341</td>
+							<td>365.7</td>
+							<td>Joe</td>
+							<td>$91.54</td>
+
+							<td>2008-05-10</td>
+						</tr>
+						<tr>
+							<td>342</td>
+							<td>670.8</td>
+							<td>Bob</td>
+							<td>$19.04</td>
+
+							<td>2008-01-24</td>
+						</tr>
+						<tr>
+							<td>343</td>
+							<td>161.5</td>
+							<td>Matt</td>
+							<td>$29.94</td>
+
+							<td>2008-01-03</td>
+						</tr>
+						<tr>
+							<td>344</td>
+							<td>588.8</td>
+							<td>Mark</td>
+							<td>$91.04</td>
+
+							<td>2009-01-30</td>
+						</tr>
+						<tr>
+							<td>345</td>
+							<td>950.3</td>
+							<td>Tom</td>
+							<td>$71.44</td>
+
+							<td>2010-02-13</td>
+						</tr>
+						<tr>
+							<td>346</td>
+							<td>689.5</td>
+							<td>Jake</td>
+							<td>$41.34</td>
+
+							<td>2010-10-04</td>
+						</tr>
+						<tr>
+							<td>347</td>
+							<td>330.4</td>
+							<td>Greg</td>
+							<td>$27.44</td>
+
+							<td>2007-12-20</td>
+						</tr>
+						<tr>
+							<td>348</td>
+							<td>785</td>
+							<td>Adam</td>
+							<td>$59.84</td>
+
+							<td>2009-06-07</td>
+						</tr>
+						<tr>
+							<td>349</td>
+							<td>53.2</td>
+							<td>Steve</td>
+							<td>$68.24</td>
+
+							<td>2010-04-17</td>
+						</tr>
+						<tr>
+							<td>350</td>
+							<td>369.6</td>
+							<td>George</td>
+							<td>$17.14</td>
+
+							<td>2009-04-25</td>
+						</tr>
+						<tr>
+							<td>351</td>
+							<td>682.4</td>
+							<td>John</td>
+							<td>$53.64</td>
+
+							<td>2009-01-17</td>
+						</tr>
+						<tr>
+							<td>352</td>
+							<td>805.3</td>
+							<td>Phil</td>
+							<td>$20.74</td>
+
+							<td>2009-08-24</td>
+						</tr>
+						<tr>
+							<td>353</td>
+							<td>836</td>
+							<td>Jack</td>
+							<td>$36.94</td>
+
+							<td>2010-08-05</td>
+						</tr>
+						<tr>
+							<td>354</td>
+							<td>848.6</td>
+							<td>Paul</td>
+							<td>$95.74</td>
+
+							<td>2010-04-23</td>
+						</tr>
+						<tr>
+							<td>355</td>
+							<td>201</td>
+							<td>Rob</td>
+							<td>$90.74</td>
+
+							<td>2009-05-26</td>
+						</tr>
+						<tr>
+							<td>356</td>
+							<td>880.9</td>
+							<td>Walt</td>
+							<td>$59.74</td>
+
+							<td>2010-09-16</td>
+						</tr>
+						<tr>
+							<td>357</td>
+							<td>762.2</td>
+							<td>Nathan</td>
+							<td>$92.74</td>
+
+							<td>2008-05-29</td>
+						</tr>
+						<tr>
+							<td>358</td>
+							<td>763.1</td>
+							<td>Dan</td>
+							<td>$71.24</td>
+
+							<td>2010-04-21</td>
+						</tr>
+						<tr>
+							<td>359</td>
+							<td>226.4</td>
+							<td>Jeff</td>
+							<td>$76.54</td>
+
+							<td>2009-04-18</td>
+						</tr>
+						<tr>
+							<td>360</td>
+							<td>960.8</td>
+							<td>Bill</td>
+							<td>$13.54</td>
+
+							<td>2009-11-02</td>
+						</tr>
+						<tr>
+							<td>361</td>
+							<td>386.9</td>
+							<td>Joe</td>
+							<td>$81.74</td>
+
+							<td>2008-05-14</td>
+						</tr>
+						<tr>
+							<td>362</td>
+							<td>727.6</td>
+							<td>Bob</td>
+							<td>$62.34</td>
+
+							<td>2009-01-08</td>
+						</tr>
+						<tr>
+							<td>363</td>
+							<td>257.8</td>
+							<td>Matt</td>
+							<td>$45.94</td>
+
+							<td>2010-03-11</td>
+						</tr>
+						<tr>
+							<td>364</td>
+							<td>87</td>
+							<td>Mark</td>
+							<td>$30.74</td>
+
+							<td>2010-01-20</td>
+						</tr>
+						<tr>
+							<td>365</td>
+							<td>826</td>
+							<td>Tom</td>
+							<td>$50.84</td>
+
+							<td>2009-10-05</td>
+						</tr>
+						<tr>
+							<td>366</td>
+							<td>278.6</td>
+							<td>Jake</td>
+							<td>$38.94</td>
+
+							<td>2008-06-25</td>
+						</tr>
+						<tr>
+							<td>367</td>
+							<td>144.2</td>
+							<td>Greg</td>
+							<td>$15.14</td>
+
+							<td>2008-04-02</td>
+						</tr>
+						<tr>
+							<td>368</td>
+							<td>284.2</td>
+							<td>Adam</td>
+							<td>$91.44</td>
+
+							<td>2010-07-05</td>
+						</tr>
+						<tr>
+							<td>369</td>
+							<td>22</td>
+							<td>Steve</td>
+							<td>$14.14</td>
+
+							<td>2009-10-07</td>
+						</tr>
+						<tr>
+							<td>370</td>
+							<td>441.8</td>
+							<td>George</td>
+							<td>$10.14</td>
+
+							<td>2010-03-12</td>
+						</tr>
+						<tr>
+							<td>371</td>
+							<td>32.2</td>
+							<td>John</td>
+							<td>$48.84</td>
+
+							<td>2009-08-13</td>
+						</tr>
+						<tr>
+							<td>372</td>
+							<td>158.8</td>
+							<td>Phil</td>
+							<td>$21.64</td>
+
+							<td>2008-06-02</td>
+						</tr>
+						<tr>
+							<td>373</td>
+							<td>492.4</td>
+							<td>Jack</td>
+							<td>$47.34</td>
+
+							<td>2009-11-14</td>
+						</tr>
+						<tr>
+							<td>374</td>
+							<td>194.4</td>
+							<td>Paul</td>
+							<td>$56.04</td>
+
+							<td>2010-11-05</td>
+						</tr>
+						<tr>
+							<td>375</td>
+							<td>853.5</td>
+							<td>Rob</td>
+							<td>$38.64</td>
+
+							<td>2009-04-14</td>
+						</tr>
+						<tr>
+							<td>376</td>
+							<td>420</td>
+							<td>Walt</td>
+							<td>$66.54</td>
+
+							<td>2010-07-09</td>
+						</tr>
+						<tr>
+							<td>377</td>
+							<td>583.4</td>
+							<td>Nathan</td>
+							<td>$80.94</td>
+
+							<td>2010-12-30</td>
+						</tr>
+						<tr>
+							<td>378</td>
+							<td>674</td>
+							<td>Dan</td>
+							<td>$9.33</td>
+
+							<td>2010-09-22</td>
+						</tr>
+						<tr>
+							<td>379</td>
+							<td>476.8</td>
+							<td>Jeff</td>
+							<td>$11.54</td>
+
+							<td>2008-01-01</td>
+						</tr>
+						<tr>
+							<td>380</td>
+							<td>44.9</td>
+							<td>Bill</td>
+							<td>$55.74</td>
+
+							<td>2008-04-27</td>
+						</tr>
+						<tr>
+							<td>381</td>
+							<td>748</td>
+							<td>Joe</td>
+							<td>$58.94</td>
+
+							<td>2009-11-13</td>
+						</tr>
+						<tr>
+							<td>382</td>
+							<td>268.4</td>
+							<td>Bob</td>
+							<td>$74.84</td>
+
+							<td>2010-07-21</td>
+						</tr>
+						<tr>
+							<td>383</td>
+							<td>411.3</td>
+							<td>Matt</td>
+							<td>$24.04</td>
+
+							<td>2008-11-18</td>
+						</tr>
+						<tr>
+							<td>384</td>
+							<td>12.8</td>
+							<td>Mark</td>
+							<td>$43.44</td>
+
+							<td>2010-08-29</td>
+						</tr>
+						<tr>
+							<td>385</td>
+							<td>921.3</td>
+							<td>Tom</td>
+							<td>$28.84</td>
+
+							<td>2008-09-18</td>
+						</tr>
+						<tr>
+							<td>386</td>
+							<td>337.8</td>
+							<td>Jake</td>
+							<td>$70.84</td>
+
+							<td>2010-10-27</td>
+						</tr>
+						<tr>
+							<td>387</td>
+							<td>143.3</td>
+							<td>Greg</td>
+							<td>$29.14</td>
+
+							<td>2010-03-20</td>
+						</tr>
+						<tr>
+							<td>388</td>
+							<td>99.8</td>
+							<td>Adam</td>
+							<td>$96.54</td>
+
+							<td>2010-07-06</td>
+						</tr>
+						<tr>
+							<td>389</td>
+							<td>970.4</td>
+							<td>Steve</td>
+							<td>$44.24</td>
+
+							<td>2010-11-16</td>
+						</tr>
+						<tr>
+							<td>390</td>
+							<td>981.5</td>
+							<td>George</td>
+							<td>$48.74</td>
+
+							<td>2009-06-21</td>
+						</tr>
+						<tr>
+							<td>391</td>
+							<td>93.8</td>
+							<td>John</td>
+							<td>$23.44</td>
+
+							<td>2008-03-02</td>
+						</tr>
+						<tr>
+							<td>392</td>
+							<td>694.2</td>
+							<td>Phil</td>
+							<td>$50.34</td>
+
+							<td>2010-07-16</td>
+						</tr>
+						<tr>
+							<td>393</td>
+							<td>510.3</td>
+							<td>Jack</td>
+							<td>$91.44</td>
+
+							<td>2008-02-17</td>
+						</tr>
+						<tr>
+							<td>394</td>
+							<td>799.7</td>
+							<td>Paul</td>
+							<td>$92.74</td>
+
+							<td>2009-07-04</td>
+						</tr>
+						<tr>
+							<td>395</td>
+							<td>649.5</td>
+							<td>Rob</td>
+							<td>$84.84</td>
+
+							<td>2010-06-02</td>
+						</tr>
+						<tr>
+							<td>396</td>
+							<td>885.6</td>
+							<td>Walt</td>
+							<td>$18.64</td>
+
+							<td>2009-06-28</td>
+						</tr>
+						<tr>
+							<td>397</td>
+							<td>786.6</td>
+							<td>Nathan</td>
+							<td>$32.94</td>
+
+							<td>2010-05-31</td>
+						</tr>
+						<tr>
+							<td>398</td>
+							<td>496.7</td>
+							<td>Dan</td>
+							<td>$42.94</td>
+
+							<td>2010-04-21</td>
+						</tr>
+						<tr>
+							<td>399</td>
+							<td>299.9</td>
+							<td>Jeff</td>
+							<td>$39.94</td>
+
+							<td>2008-07-13</td>
+						</tr>
+						<tr>
+							<td>400</td>
+							<td>218.1</td>
+							<td>Bill</td>
+							<td>$38.14</td>
+
+							<td>2010-01-27</td>
+						</tr>
+						<tr>
+							<td>401</td>
+							<td>693.2</td>
+							<td>Joe</td>
+							<td>$47.44</td>
+
+							<td>2010-10-26</td>
+						</tr>
+						<tr>
+							<td>402</td>
+							<td>757.2</td>
+							<td>Bob</td>
+							<td>$16.94</td>
+
+							<td>2009-03-29</td>
+						</tr>
+						<tr>
+							<td>403</td>
+							<td>568.9</td>
+							<td>Matt</td>
+							<td>$67.94</td>
+
+							<td>2008-12-20</td>
+						</tr>
+						<tr>
+							<td>404</td>
+							<td>620.5</td>
+							<td>Mark</td>
+							<td>$47.84</td>
+
+							<td>2008-09-26</td>
+						</tr>
+						<tr>
+							<td>405</td>
+							<td>106.4</td>
+							<td>Tom</td>
+							<td>$12.84</td>
+
+							<td>2008-04-04</td>
+						</tr>
+						<tr>
+							<td>406</td>
+							<td>880.1</td>
+							<td>Jake</td>
+							<td>$1.33</td>
+
+							<td>2008-11-05</td>
+						</tr>
+						<tr>
+							<td>407</td>
+							<td>361.5</td>
+							<td>Greg</td>
+							<td>$80.04</td>
+
+							<td>2009-11-20</td>
+						</tr>
+						<tr>
+							<td>408</td>
+							<td>133.8</td>
+							<td>Adam</td>
+							<td>$29.74</td>
+
+							<td>2008-01-29</td>
+						</tr>
+						<tr>
+							<td>409</td>
+							<td>871.1</td>
+							<td>Steve</td>
+							<td>$59.64</td>
+
+							<td>2009-05-05</td>
+						</tr>
+						<tr>
+							<td>410</td>
+							<td>50</td>
+							<td>George</td>
+							<td>$81.54</td>
+
+							<td>2010-07-20</td>
+						</tr>
+						<tr>
+							<td>411</td>
+							<td>715.4</td>
+							<td>John</td>
+							<td>$50.84</td>
+
+							<td>2008-11-18</td>
+						</tr>
+						<tr>
+							<td>412</td>
+							<td>615.3</td>
+							<td>Phil</td>
+							<td>$26.54</td>
+
+							<td>2009-06-01</td>
+						</tr>
+						<tr>
+							<td>413</td>
+							<td>18.1</td>
+							<td>Jack</td>
+							<td>$83.44</td>
+
+							<td>2008-05-25</td>
+						</tr>
+						<tr>
+							<td>414</td>
+							<td>335</td>
+							<td>Paul</td>
+							<td>$45.44</td>
+
+							<td>2009-11-30</td>
+						</tr>
+						<tr>
+							<td>415</td>
+							<td>578.7</td>
+							<td>Rob</td>
+							<td>$56.04</td>
+
+							<td>2010-04-27</td>
+						</tr>
+						<tr>
+							<td>416</td>
+							<td>670.5</td>
+							<td>Walt</td>
+							<td>$44.04</td>
+
+							<td>2010-05-12</td>
+						</tr>
+						<tr>
+							<td>417</td>
+							<td>948.2</td>
+							<td>Nathan</td>
+							<td>$80.24</td>
+
+							<td>2009-09-23</td>
+						</tr>
+						<tr>
+							<td>418</td>
+							<td>554.8</td>
+							<td>Dan</td>
+							<td>$93.64</td>
+
+							<td>2010-09-01</td>
+						</tr>
+						<tr>
+							<td>419</td>
+							<td>590.3</td>
+							<td>Jeff</td>
+							<td>$80.74</td>
+
+							<td>2009-05-22</td>
+						</tr>
+						<tr>
+							<td>420</td>
+							<td>24.8</td>
+							<td>Bill</td>
+							<td>$85.74</td>
+
+							<td>2008-10-19</td>
+						</tr>
+						<tr>
+							<td>421</td>
+							<td>839.9</td>
+							<td>Joe</td>
+							<td>$57.24</td>
+
+							<td>2010-05-29</td>
+						</tr>
+						<tr>
+							<td>422</td>
+							<td>129.3</td>
+							<td>Bob</td>
+							<td>$18.74</td>
+
+							<td>2008-01-29</td>
+						</tr>
+						<tr>
+							<td>423</td>
+							<td>587.2</td>
+							<td>Matt</td>
+							<td>$20.54</td>
+
+							<td>2010-09-20</td>
+						</tr>
+						<tr>
+							<td>424</td>
+							<td>723.7</td>
+							<td>Mark</td>
+							<td>$54.04</td>
+
+							<td>2008-12-27</td>
+						</tr>
+						<tr>
+							<td>425</td>
+							<td>338.5</td>
+							<td>Tom</td>
+							<td>$11.94</td>
+
+							<td>2010-10-07</td>
+						</tr>
+						<tr>
+							<td>426</td>
+							<td>81</td>
+							<td>Jake</td>
+							<td>$78.94</td>
+
+							<td>2008-12-28</td>
+						</tr>
+						<tr>
+							<td>427</td>
+							<td>836.9</td>
+							<td>Greg</td>
+							<td>$73.84</td>
+
+							<td>2008-05-13</td>
+						</tr>
+						<tr>
+							<td>428</td>
+							<td>392.7</td>
+							<td>Adam</td>
+							<td>$29.24</td>
+
+							<td>2008-02-29</td>
+						</tr>
+						<tr>
+							<td>429</td>
+							<td>245</td>
+							<td>Steve</td>
+							<td>$88.34</td>
+
+							<td>2010-09-19</td>
+						</tr>
+						<tr>
+							<td>430</td>
+							<td>693.7</td>
+							<td>George</td>
+							<td>$90.74</td>
+
+							<td>2010-04-06</td>
+						</tr>
+						<tr>
+							<td>431</td>
+							<td>956.8</td>
+							<td>John</td>
+							<td>$74.74</td>
+
+							<td>2008-11-27</td>
+						</tr>
+						<tr>
+							<td>432</td>
+							<td>727.5</td>
+							<td>Phil</td>
+							<td>$87.74</td>
+
+							<td>2009-07-02</td>
+						</tr>
+						<tr>
+							<td>433</td>
+							<td>763</td>
+							<td>Jack</td>
+							<td>$46.44</td>
+
+							<td>2010-02-24</td>
+						</tr>
+						<tr>
+							<td>434</td>
+							<td>632</td>
+							<td>Paul</td>
+							<td>$18.74</td>
+
+							<td>2008-09-10</td>
+						</tr>
+						<tr>
+							<td>435</td>
+							<td>955.1</td>
+							<td>Rob</td>
+							<td>$52.64</td>
+
+							<td>2009-01-26</td>
+						</tr>
+						<tr>
+							<td>436</td>
+							<td>838.7</td>
+							<td>Walt</td>
+							<td>$60.74</td>
+
+							<td>2008-05-27</td>
+						</tr>
+						<tr>
+							<td>437</td>
+							<td>162.7</td>
+							<td>Nathan</td>
+							<td>$44.44</td>
+
+							<td>2010-09-27</td>
+						</tr>
+						<tr>
+							<td>438</td>
+							<td>288.6</td>
+							<td>Dan</td>
+							<td>$83.64</td>
+
+							<td>2008-06-30</td>
+						</tr>
+						<tr>
+							<td>439</td>
+							<td>350.1</td>
+							<td>Jeff</td>
+							<td>$8.13</td>
+
+							<td>2008-02-15</td>
+						</tr>
+						<tr>
+							<td>440</td>
+							<td>218.4</td>
+							<td>Bill</td>
+							<td>$77.54</td>
+
+							<td>2010-12-31</td>
+						</tr>
+						<tr>
+							<td>441</td>
+							<td>943.2</td>
+							<td>Joe</td>
+							<td>$73.14</td>
+
+							<td>2010-03-14</td>
+						</tr>
+						<tr>
+							<td>442</td>
+							<td>240</td>
+							<td>Bob</td>
+							<td>$45.94</td>
+
+							<td>2009-10-22</td>
+						</tr>
+						<tr>
+							<td>443</td>
+							<td>724</td>
+							<td>Matt</td>
+							<td>$22.24</td>
+
+							<td>2008-02-09</td>
+						</tr>
+						<tr>
+							<td>444</td>
+							<td>413.3</td>
+							<td>Mark</td>
+							<td>$85.44</td>
+
+							<td>2008-09-13</td>
+						</tr>
+						<tr>
+							<td>445</td>
+							<td>642.8</td>
+							<td>Tom</td>
+							<td>$80.94</td>
+
+							<td>2010-05-14</td>
+						</tr>
+						<tr>
+							<td>446</td>
+							<td>991.3</td>
+							<td>Jake</td>
+							<td>$64.84</td>
+
+							<td>2009-02-13</td>
+						</tr>
+						<tr>
+							<td>447</td>
+							<td>129.2</td>
+							<td>Greg</td>
+							<td>$81.04</td>
+
+							<td>2010-07-11</td>
+						</tr>
+						<tr>
+							<td>448</td>
+							<td>4.6</td>
+							<td>Adam</td>
+							<td>$9.93</td>
+
+							<td>2010-01-02</td>
+						</tr>
+						<tr>
+							<td>449</td>
+							<td>172.2</td>
+							<td>Steve</td>
+							<td>$44.94</td>
+
+							<td>2010-04-06</td>
+						</tr>
+						<tr>
+							<td>450</td>
+							<td>222.3</td>
+							<td>George</td>
+							<td>$66.74</td>
+
+							<td>2009-07-19</td>
+						</tr>
+						<tr>
+							<td>451</td>
+							<td>179.7</td>
+							<td>John</td>
+							<td>$61.04</td>
+
+							<td>2008-09-11</td>
+						</tr>
+						<tr>
+							<td>452</td>
+							<td>884.3</td>
+							<td>Phil</td>
+							<td>$85.04</td>
+
+							<td>2010-02-24</td>
+						</tr>
+						<tr>
+							<td>453</td>
+							<td>465.3</td>
+							<td>Jack</td>
+							<td>$57.44</td>
+
+							<td>2010-11-08</td>
+						</tr>
+						<tr>
+							<td>454</td>
+							<td>510</td>
+							<td>Paul</td>
+							<td>$98.74</td>
+
+							<td>2010-05-22</td>
+						</tr>
+						<tr>
+							<td>455</td>
+							<td>741.8</td>
+							<td>Rob</td>
+							<td>$63.04</td>
+
+							<td>2009-10-13</td>
+						</tr>
+						<tr>
+							<td>456</td>
+							<td>499.2</td>
+							<td>Walt</td>
+							<td>$62.14</td>
+
+							<td>2008-08-31</td>
+						</tr>
+						<tr>
+							<td>457</td>
+							<td>863.3</td>
+							<td>Nathan</td>
+							<td>$75.04</td>
+
+							<td>2008-01-24</td>
+						</tr>
+						<tr>
+							<td>458</td>
+							<td>670.7</td>
+							<td>Dan</td>
+							<td>$75.54</td>
+
+							<td>2008-05-17</td>
+						</tr>
+						<tr>
+							<td>459</td>
+							<td>314.2</td>
+							<td>Jeff</td>
+							<td>$92.74</td>
+
+							<td>2009-10-19</td>
+						</tr>
+						<tr>
+							<td>460</td>
+							<td>38.7</td>
+							<td>Bill</td>
+							<td>$14.94</td>
+
+							<td>2008-09-28</td>
+						</tr>
+						<tr>
+							<td>461</td>
+							<td>537.8</td>
+							<td>Joe</td>
+							<td>$32.94</td>
+
+							<td>2010-09-05</td>
+						</tr>
+						<tr>
+							<td>462</td>
+							<td>768.2</td>
+							<td>Bob</td>
+							<td>$21.34</td>
+
+							<td>2010-03-15</td>
+						</tr>
+						<tr>
+							<td>463</td>
+							<td>457.5</td>
+							<td>Matt</td>
+							<td>$67.94</td>
+
+							<td>2008-11-07</td>
+						</tr>
+						<tr>
+							<td>464</td>
+							<td>368.5</td>
+							<td>Mark</td>
+							<td>$18.94</td>
+
+							<td>2008-10-23</td>
+						</tr>
+						<tr>
+							<td>465</td>
+							<td>133.3</td>
+							<td>Tom</td>
+							<td>$93.04</td>
+
+							<td>2010-10-22</td>
+						</tr>
+						<tr>
+							<td>466</td>
+							<td>706.9</td>
+							<td>Jake</td>
+							<td>$43.04</td>
+
+							<td>2009-08-10</td>
+						</tr>
+						<tr>
+							<td>467</td>
+							<td>927.9</td>
+							<td>Greg</td>
+							<td>$29.34</td>
+
+							<td>2008-10-25</td>
+						</tr>
+						<tr>
+							<td>468</td>
+							<td>959.1</td>
+							<td>Adam</td>
+							<td>$96.34</td>
+
+							<td>2008-01-16</td>
+						</tr>
+						<tr>
+							<td>469</td>
+							<td>88.8</td>
+							<td>Steve</td>
+							<td>$27.84</td>
+
+							<td>2010-12-24</td>
+						</tr>
+						<tr>
+							<td>470</td>
+							<td>667.2</td>
+							<td>George</td>
+							<td>$31.64</td>
+
+							<td>2008-04-13</td>
+						</tr>
+						<tr>
+							<td>471</td>
+							<td>912.6</td>
+							<td>John</td>
+							<td>$85.44</td>
+
+							<td>2009-04-29</td>
+						</tr>
+						<tr>
+							<td>472</td>
+							<td>768.1</td>
+							<td>Phil</td>
+							<td>$62.24</td>
+
+							<td>2010-01-01</td>
+						</tr>
+						<tr>
+							<td>473</td>
+							<td>473.8</td>
+							<td>Jack</td>
+							<td>$8.03</td>
+
+							<td>2008-12-25</td>
+						</tr>
+						<tr>
+							<td>474</td>
+							<td>753.4</td>
+							<td>Paul</td>
+							<td>$44.84</td>
+
+							<td>2009-07-31</td>
+						</tr>
+						<tr>
+							<td>475</td>
+							<td>20.3</td>
+							<td>Rob</td>
+							<td>$58.14</td>
+
+							<td>2009-05-11</td>
+						</tr>
+						<tr>
+							<td>476</td>
+							<td>917.3</td>
+							<td>Walt</td>
+							<td>$28.84</td>
+
+							<td>2010-09-20</td>
+						</tr>
+						<tr>
+							<td>477</td>
+							<td>435.6</td>
+							<td>Nathan</td>
+							<td>$21.64</td>
+
+							<td>2008-06-24</td>
+						</tr>
+						<tr>
+							<td>478</td>
+							<td>704.3</td>
+							<td>Dan</td>
+							<td>$17.54</td>
+
+							<td>2008-05-12</td>
+						</tr>
+						<tr>
+							<td>479</td>
+							<td>728.1</td>
+							<td>Jeff</td>
+							<td>$26.44</td>
+
+							<td>2009-03-29</td>
+						</tr>
+						<tr>
+							<td>480</td>
+							<td>678.9</td>
+							<td>Bill</td>
+							<td>$93.14</td>
+
+							<td>2010-03-30</td>
+						</tr>
+						<tr>
+							<td>481</td>
+							<td>779.1</td>
+							<td>Joe</td>
+							<td>$84.34</td>
+
+							<td>2009-10-12</td>
+						</tr>
+						<tr>
+							<td>482</td>
+							<td>208.3</td>
+							<td>Bob</td>
+							<td>$61.14</td>
+
+							<td>2008-07-31</td>
+						</tr>
+						<tr>
+							<td>483</td>
+							<td>850.8</td>
+							<td>Matt</td>
+							<td>$8.53</td>
+
+							<td>2008-10-31</td>
+						</tr>
+						<tr>
+							<td>484</td>
+							<td>171.8</td>
+							<td>Mark</td>
+							<td>$83.84</td>
+
+							<td>2010-04-03</td>
+						</tr>
+						<tr>
+							<td>485</td>
+							<td>681.4</td>
+							<td>Tom</td>
+							<td>$85.94</td>
+
+							<td>2008-12-04</td>
+						</tr>
+						<tr>
+							<td>486</td>
+							<td>121.1</td>
+							<td>Jake</td>
+							<td>$77.64</td>
+
+							<td>2009-11-02</td>
+						</tr>
+						<tr>
+							<td>487</td>
+							<td>990.2</td>
+							<td>Greg</td>
+							<td>$21.14</td>
+
+							<td>2010-07-10</td>
+						</tr>
+						<tr>
+							<td>488</td>
+							<td>152</td>
+							<td>Adam</td>
+							<td>$91.64</td>
+
+							<td>2011-01-28</td>
+						</tr>
+						<tr>
+							<td>489</td>
+							<td>277</td>
+							<td>Steve</td>
+							<td>$64.44</td>
+
+							<td>2008-09-28</td>
+						</tr>
+						<tr>
+							<td>490</td>
+							<td>679.5</td>
+							<td>George</td>
+							<td>$32.34</td>
+
+							<td>2008-07-10</td>
+						</tr>
+						<tr>
+							<td>491</td>
+							<td>398</td>
+							<td>John</td>
+							<td>$10.24</td>
+
+							<td>2008-01-10</td>
+						</tr>
+						<tr>
+							<td>492</td>
+							<td>970.4</td>
+							<td>Phil</td>
+							<td>$31.04</td>
+
+							<td>2009-12-18</td>
+						</tr>
+						<tr>
+							<td>493</td>
+							<td>164.7</td>
+							<td>Jack</td>
+							<td>$16.14</td>
+
+							<td>2010-03-26</td>
+						</tr>
+						<tr>
+							<td>494</td>
+							<td>438.5</td>
+							<td>Paul</td>
+							<td>$33.24</td>
+
+							<td>2009-09-20</td>
+						</tr>
+						<tr>
+							<td>495</td>
+							<td>160.2</td>
+							<td>Rob</td>
+							<td>$1.43</td>
+
+							<td>2009-04-10</td>
+						</tr>
+						<tr>
+							<td>496</td>
+							<td>463</td>
+							<td>Walt</td>
+							<td>$13.54</td>
+
+							<td>2008-07-24</td>
+						</tr>
+						<tr>
+							<td>497</td>
+							<td>53.9</td>
+							<td>Nathan</td>
+							<td>$12.54</td>
+
+							<td>2009-03-26</td>
+						</tr>
+						<tr>
+							<td>498</td>
+							<td>860.6</td>
+							<td>Dan</td>
+							<td>$27.74</td>
+
+							<td>2008-12-18</td>
+						</tr>
+						<tr>
+							<td>499</td>
+							<td>842.2</td>
+							<td>Jeff</td>
+							<td>$55.44</td>
+
+							<td>2011-01-02</td>
+						</tr>
+					</tbody>
+				</table>
+			</body>
+	</head>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Templated.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Templated.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Templated.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,36 @@
+<html>
+	<head>
+			<title>Demo using dojox.dtl._Templated</title>
+	    <script type="text/javascript" src="../../../dojo/dojo.js"
+				djConfig="isDebug: true, parseOnLoad: true"></script>
+	    <script type="text/javascript" src="../../../dijit/dijit.js"></script> 
+	    <script type="text/javascript">
+					dojo.require("dojox.dtl._Templated");
+
+					dojo.declare("Fruit", [dijit._Widget, dojox.dtl._Templated], {
+						oldRepl: "Fruit: ",
+						_dijitTemplateCompat: true,
+						items: ["apple", "banana", "orange"],
+						keyUp: function(e){
+							if(e.keyCode == dojo.keys.ENTER){
+								var i = dojo.indexOf(this.items, e.target.value);
+								if(i != -1){
+									this.items.splice(i, 1);
+								}else{
+									this.items.push(e.target.value);
+								}
+								e.target.value = "";
+								this.render();
+								dojo.query("input", this.domNode).forEach("item.focus();");
+							}
+						},
+						templateString: '<div><input dojoAttachEvent="onkeyup: keyUp"><ul>{% for item in items %}<li>${oldRepl} {{ item }}</li>{% endfor %}</ul></div>'
+					});
+
+	        dojo.require("dojo.parser");
+	    </script>
+			<body>
+				<div dojoType="Fruit"></div>
+			</body>
+	</head>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Tree.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Tree.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/demo_Tree.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,33 @@
+<html>
+	<head>
+			<title>Demo to show recursion in DTL</title>
+			<script type="text/javascript" src="../../../dojo/dojo.js"
+				djConfig="isDebug: true, parseOnLoad: true"></script>
+			<script type="text/javascript" src="../../../dijit/dijit.js"></script>
+			<script type="text/javascript">
+					dojo.require("dojox.dtl._HtmlTemplated");
+					dojo.require("dojo.data.ItemFileReadStore");
+					dojo.require("dojo.parser");
+
+					dojo.declare("demo.Tree", [dijit._Widget, dojox.dtl._HtmlTemplated], {
+						store: new dojo.data.ItemFileReadStore({ url: dojo.moduleUrl("dijit.tests._data", "countries.json") }),
+						countrychildren: dojo.moduleUrl("dojox.dtl.demos.templates", "countrychildren.html"),
+						postCreate: function(){
+							this.store.fetch({
+								query: {
+									type: "continent"
+								},
+								onComplete: dojo.hitch(this, function(items){
+									this.items = items;
+									this.render();
+								})
+							});
+						},
+						templateString: '{% load dojox.dtl.contrib.data %}{% bind_data items to store as countries %}<ul>{% for country in countries %}{% include countrychildren %}{% endfor %}</ul>'
+					});
+			</script>
+			<body>
+				<div dojoType="demo.Tree"></div>
+			</body>
+	</head>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_1.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_1.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_1.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_3.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_3.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_3.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_list.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_list.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_blog_list.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_page_about.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_page_about.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/blog/get_page_about.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+{"title":"About Jim","body":"<p>Jim is an avid golfer, enjoys long walks on the beach, and eating hot pockets</p><p>When he's not scalding his mouth, you'll find him throwing rocks at pigeons.</p>"}
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/fruit.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/fruit.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/fruit.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+{ items: ["apple", "banana", "pear"] }
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/morefruit.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/morefruit.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/json/morefruit.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+{ items: ["pineapple", "orange", "tomato"] }
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/animation.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/animation.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/animation.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+{% load dojox.dtl.contrib.dijit dojox.dtl.contrib.html %}
+<div>
+	<div tstyle="top: {{ y }}px; left: {{ x }}px;" style="width: 10px; height: 10px; background: red; position: absolute;">&nbsp;</div>
+	<div dojoAttachPoint="blue" style="top: 10px; left: 0; width: 10px; height: 10px; background: blue; position: absolute;">&nbsp;</div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_base.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_base.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_base.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,8 @@
+<div>
+	<h1><!--{{ title }}--></h1>
+	<ul style="float: left; width: 100px; height: 300px; margin-right: 20px; border: 1px solid #666;">
+		<li><a onclick="_showList" style="cursor: pointer;">Home</a></li>
+		<li><a onclick="_showPage" style="cursor: pointer;" class="page-about">About Jim</a></li>
+	</ul>
+	<!--{% block body %}--><!--{% endblock %}-->
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_detail.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_detail.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_detail.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,10 @@
+<!--{% extends base %}-->
+
+<!--{% block body %}-->
+<div>
+<h3><!--{{ blog.title }}--></h3>
+<div><small>posted on <!--{{ blog.date|date }}--> by <!--{{ blog.author }}--></small></div>
+<p><!--{{ blog.teaser }}--></p>
+<p><!--{{ blog.body }}--></p>
+</div>
+<!--{% endblock %}-->
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_list.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_list.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_list.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+<!--{% extends base %}-->
+<!--{% load dojox.dtl.contrib.dijit %}-->
+<!--{% block body %}-->
+<ul>
+<!--{% for key, blog in blog_list.items %}-->
+<li onclick="_showDetail" class="blog-{{ key }}" style="cursor: pointer;">{{ blog.title }}</li>
+<!--{% endfor %}-->
+</ul>
+<!--{% endblock %}-->
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_page.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_page.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/blog_page.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,7 @@
+<!--{% extends "shared:templates/blog_base.html" %}-->
+<!--{% load dojox.dtl.contrib.html %}-->
+<!--{% block body %}-->
+<div>
+	<!--{% html body %}-->
+</div>
+<!--{% endblock %}-->
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/countrychildren.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/countrychildren.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/countrychildren.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+<li>{{ country.type }}: {{ country.name }}{% if country.children %}<ul>{% for country in country.childrens %}{% include countrychildren %}{% endfor %}</ul>{% endif %}</li>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/gallery.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/gallery.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/gallery.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,16 @@
+{% load dojox.dtl.contrib.data %}
+{% bind_data items to store as flickr %}
+<div>
+	<input dojoAttachEvent="onkeypress: keyUp">
+	<table>
+		<tr>
+			{% for item in flickr %}<td><img src="{{ item.imageUrlThumb }}" dojoAttachEvent="onclick: selectThumbnail" class="{{ item.imageUrl }}" /></td>{% endfor %}
+			<td width="100%"></td>
+		</tr>
+		<tr>
+			<td colspan="{{ flickr|length|add:1 }}">
+				{% if selected %}<img src="{{ selected }}" />{% endif %}
+			</td>
+		</tr>
+	</table>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/nodelist.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/nodelist.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/demos/templates/nodelist.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+<div>
+	<ul>
+		{% for item in items %}<li>{{ item }}</li>{% endfor %}
+	</ul>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/ext-dojo/NodeList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/ext-dojo/NodeList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/ext-dojo/NodeList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/dates.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/dates.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/dates.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/htmlstrings.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/htmlstrings.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/htmlstrings.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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,
+	_escapegt: />/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, '&amp;').replace(dh._escapelt, '&lt;').replace(dh._escapegt, '&gt;').replace(dh._escapedblqt, '&quot;').replace(dh._escapeqt, '&#39;');
+	},
+	linebreaks: function(value){
+		// summary: Converts newlines into <p> and <br />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, "<br />")
+			output.push("<p>" + part + "</p>");
+		}
+
+		return output.join("\n\n");
+	},
+	linebreaksbr: function(value){
+		// summary: Converts newlines into <br />s
+		var dh = dojox.dtl.filter.htmlstrings;
+		return value.replace(dh._linebreaksrn, "\n").replace(dh._linebreaksbr, "<br />");
+	},
+	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("</?\s*" + tags + "\s*[^>]*>", "gi"), "");
+	},
+	striptags: function(value){
+		// summary: Strips all [X]HTML tags
+		return value.replace(dojox.dtl.filter.htmlstrings._striptags, "");
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/integers.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/integers.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/integers.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/lists.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/lists.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/lists.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 + "<li>" + value[0] + "\n" + indent + "<ul>\n" + recurse.join("\n") + "\n" + indent + "</ul>\n" + indent + "</li>";
+		}else{
+			return indent + "<li>" + value[0] + "</li>";
+		}
+	},
+	unordered_list: function(value){
+		// summary:
+		//		Recursively takes a self-nested list and returns an HTML unordered list --
+		//		WITHOUT opening and closing <ul> 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::
+		//
+		//		|	<li>States
+		//		|	<ul>
+		//		|		<li>Kansas
+		//		|		<ul>
+		//		|			<li>Lawrence</li>
+		//		|			<li>Topeka</li>
+		//		|		</ul>
+		//		|		</li>
+		//		|		<li>Illinois</li>
+		//		|	</ul>
+		//		|	</li>
+		return dojox.dtl.filter.lists._unordered_list(value, 1);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/logic.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/logic.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/logic.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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];
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/misc.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/misc.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/misc.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/strings.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/strings.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/filter/strings.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 ``&amp;`` entities
+		return value.replace(dojox.dtl.filter.strings._fix_ampersands, "&amp;");
+	},
+	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 += "</" + tag + ">";
+		}
+
+		return output;
+	},
+	upper: function(value){
+		return value.toUpperCase();
+	},
+	urlencode: function(value){
+		return dojox.dtl.filter.strings._urlquote(value);
+	},
+	_urlize: /^((?:[(>]|&lt;)*)(.*?)((?:[.,)>\n]|&gt;)*)$/,
+	_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 '<a href="http://' + middle + '" rel="nofollow">' + trimmed + '</a>';
+			}else if(startsHttp || startsHttps){
+				return '<a href="' + middle + '" rel="nofollow">' + trimmed + '</a>';
+			}else if(hasAt && !startsWww && !hasColon && dojox.dtl.filter.strings._urlize2.test(middle)){
+				return '<a href="mailto:' + middle + '">' + middle + '</a>';
+			}
+			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("");
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/html.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/html.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/html.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 = "<!--Test comment handling, and long comments, using comments whenever possible.-->";
+				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]+?)</" + pair[1] + ">", "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]*?</" + pair[2] + ">)", "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]) + "</" + close + ">";
+									for(k = 2; k < pair.length - 1; k++){
+										replacement += "</" + pair[k] + ">";
+									}
+									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));
+		}
+	});
+
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/render/html.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/render/html.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/render/html.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/date.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/date.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/date.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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());
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/loader.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/loader.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/loader.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/logic.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/logic.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/logic.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/loop.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/loop.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/loop.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/misc.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/misc.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/tag/misc.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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+</g, '><'));
+				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);
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl/utils/date.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl/utils/date.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl/utils/date.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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."]
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/dtl.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/dtl.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/dtl.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/ascii85.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/ascii85.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/ascii85.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/base64.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/base64.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/base64.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<x;){
+			var t=ba[i++]<<16|ba[i++]<<8|ba[i++];
+			s.push(tab.charAt((t>>>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<l;){
+			var t=tab.indexOf(s[i++])<<18;
+			if(i<=l){ t|=tab.indexOf(s[i++])<<12 };
+			if(i<=l){ t|=tab.indexOf(s[i++])<<6 };
+			if(i<=l){ t|=tab.indexOf(s[i++]) };
+			out.push((t>>>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[]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/bits.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/bits.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/bits.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/lzw.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/lzw.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/lzw.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/splay.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/splay.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/compression/splay.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/Blowfish.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/Blowfish.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/Blowfish.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<l;){
+			eb(res, box);
+			box.p[i++]=res.left, box.p[i++]=res.right;
+		}
+		for(i=0; i<4; i++){
+			for(j=0, l=box["s"+i].length; j<l;){
+				eb(res, box);
+				box["s"+i][j++]=res.left, box["s"+i][j++]=res.right;
+			}
+		}
+		return box;
+	}
+
+////////////////////////////////////////////////////////////////////////////
+//	PUBLIC FUNCTIONS
+////////////////////////////////////////////////////////////////////////////
+	this.getIV=function(/* dojox.encoding.crypto.outputTypes? */ outputType){
+		//	summary
+		//	returns the initialization vector in the output format specified by outputType
+		var out=outputType||dojox.encoding.crypto.outputTypes.Base64;
+		switch(out){
+			case dojox.encoding.crypto.outputTypes.Hex:{
+				return dojo.map(iv, function(item){
+					return item.toString(16);
+				}).join("");			//	string
+			}
+			case dojox.encoding.crypto.outputTypes.String:{
+				return iv.join("");		//	string
+			}
+			case dojox.encoding.crypto.outputTypes.Raw:{
+				return iv;				//	array
+			}
+			default:{
+				return dojox.encoding.base64.encode(iv); 	//	 string
+			}
+		}
+	};
+
+	this.setIV=function(/* string */data, /* dojox.encoding.crypto.outputTypes? */inputType){
+		//	summary
+		//	sets the initialization vector to data (as interpreted as inputType)
+		var ip=inputType||dojox.encoding.crypto.outputTypes.Base64;
+		var ba=null;
+		switch(ip){
+			case dojox.encoding.crypto.outputTypes.String:{
+				ba = dojo.map(data.split(""), function(item){
+					return item.charCodeAt(0);
+				});
+				break;
+			}
+			case dojox.encoding.crypto.outputTypes.Hex:{
+				ba=[];
+				for(var i=0, l=data.length-1; i<l; i+=2){
+					ba.push(parseInt(data.substr(i,2), 16));
+				}
+				break;
+			}
+			case dojox.encoding.crypto.outputTypes.Raw:{
+				ba=data;
+				break;
+			}
+			default:{
+				ba=dojox.encoding.base64.decode(data);
+				break;
+			}
+		}
+		//	make it a pair of words now
+		iv={};
+		iv.left=ba[0]*POW24|ba[1]*POW16|ba[2]*POW8|ba[3];
+		iv.right=ba[4]*POW24|ba[5]*POW16|ba[6]*POW8|ba[7];
+	};
+
+	this.encrypt = function(/* string */plaintext, /* string */key, /* object? */ao){
+		//	summary
+		//	encrypts plaintext using key; allows user to specify output type and cipher mode via keyword object "ao"
+		var out=dojox.encoding.crypto.outputTypes.Base64;
+		var mode=dojox.encoding.crypto.cipherModes.EBC;
+		if (ao){
+			if (ao.outputType) out=ao.outputType;
+			if (ao.cipherMode) mode=ao.cipherMode;
+		}
+
+		var bx = init(key), padding = 8-(plaintext.length&7);
+		for (var i=0; i<padding; i++){ plaintext+=String.fromCharCode(padding); }
+
+		var cipher=[], count=plaintext.length >> 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<count; i++){
+			o.left=plaintext.charCodeAt(pos)*POW24
+				|plaintext.charCodeAt(pos+1)*POW16
+				|plaintext.charCodeAt(pos+2)*POW8
+				|plaintext.charCodeAt(pos+3);
+			o.right=plaintext.charCodeAt(pos+4)*POW24
+				|plaintext.charCodeAt(pos+5)*POW16
+				|plaintext.charCodeAt(pos+6)*POW8
+				|plaintext.charCodeAt(pos+7);
+
+			if(isCBC){
+				o.left=(((o.left>>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<l; i+=2){
+					c.push(parseInt(ciphertext.substr(i,2), 16));
+				}
+				break;
+			}
+			case dojox.encoding.crypto.outputTypes.String:{
+				c = dojo.map(ciphertext.split(""), function(item){
+					return item.charCodeAt(0);
+				});
+				break;
+			}
+			case dojox.encoding.crypto.outputTypes.Raw:{
+				c=ciphertext;	//	should be a byte array
+				break;
+			}
+			default:{
+				c=dojox.encoding.base64.decode(ciphertext);
+				break;
+			}
+		}
+
+		var count=c.length >> 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<count; i++){
+			o.left=c[pos]*POW24|c[pos+1]*POW16|c[pos+2]*POW8|c[pos+3];
+			o.right=c[pos+4]*POW24|c[pos+5]*POW16|c[pos+6]*POW8|c[pos+7];
+
+			if(isCBC){
+				var left=o.left;
+				var right=o.right;
+			}
+
+			db(o, bx);	//	decrypt the block
+
+			if(isCBC){
+				o.left=(((o.left>>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);
+}();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/crypto/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/MD5.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/MD5.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/MD5.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<<c)|(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; i<x.length; i+=16){
+			var olda=a;
+			var oldb=b;
+			var oldc=c;
+			var oldd=d;
+
+			a=FF(a,b,c,d,x[i+ 0],7 ,-680876936);
+			d=FF(d,a,b,c,x[i+ 1],12,-389564586);
+			c=FF(c,d,a,b,x[i+ 2],17, 606105819);
+			b=FF(b,c,d,a,x[i+ 3],22,-1044525330);
+			a=FF(a,b,c,d,x[i+ 4],7 ,-176418897);
+			d=FF(d,a,b,c,x[i+ 5],12, 1200080426);
+			c=FF(c,d,a,b,x[i+ 6],17,-1473231341);
+			b=FF(b,c,d,a,x[i+ 7],22,-45705983);
+			a=FF(a,b,c,d,x[i+ 8],7 , 1770035416);
+			d=FF(d,a,b,c,x[i+ 9],12,-1958414417);
+			c=FF(c,d,a,b,x[i+10],17,-42063);
+			b=FF(b,c,d,a,x[i+11],22,-1990404162);
+			a=FF(a,b,c,d,x[i+12],7 , 1804603682);
+			d=FF(d,a,b,c,x[i+13],12,-40341101);
+			c=FF(c,d,a,b,x[i+14],17,-1502002290);
+			b=FF(b,c,d,a,x[i+15],22, 1236535329);
+
+			a=GG(a,b,c,d,x[i+ 1],5 ,-165796510);
+			d=GG(d,a,b,c,x[i+ 6],9 ,-1069501632);
+			c=GG(c,d,a,b,x[i+11],14, 643717713);
+			b=GG(b,c,d,a,x[i+ 0],20,-373897302);
+			a=GG(a,b,c,d,x[i+ 5],5 ,-701558691);
+			d=GG(d,a,b,c,x[i+10],9 , 38016083);
+			c=GG(c,d,a,b,x[i+15],14,-660478335);
+			b=GG(b,c,d,a,x[i+ 4],20,-405537848);
+			a=GG(a,b,c,d,x[i+ 9],5 , 568446438);
+			d=GG(d,a,b,c,x[i+14],9 ,-1019803690);
+			c=GG(c,d,a,b,x[i+ 3],14,-187363961);
+			b=GG(b,c,d,a,x[i+ 8],20, 1163531501);
+			a=GG(a,b,c,d,x[i+13],5 ,-1444681467);
+			d=GG(d,a,b,c,x[i+ 2],9 ,-51403784);
+			c=GG(c,d,a,b,x[i+ 7],14, 1735328473);
+			b=GG(b,c,d,a,x[i+12],20,-1926607734);
+
+			a=HH(a,b,c,d,x[i+ 5],4 ,-378558);
+			d=HH(d,a,b,c,x[i+ 8],11,-2022574463);
+			c=HH(c,d,a,b,x[i+11],16, 1839030562);
+			b=HH(b,c,d,a,x[i+14],23,-35309556);
+			a=HH(a,b,c,d,x[i+ 1],4 ,-1530992060);
+			d=HH(d,a,b,c,x[i+ 4],11, 1272893353);
+			c=HH(c,d,a,b,x[i+ 7],16,-155497632);
+			b=HH(b,c,d,a,x[i+10],23,-1094730640);
+			a=HH(a,b,c,d,x[i+13],4 , 681279174);
+			d=HH(d,a,b,c,x[i+ 0],11,-358537222);
+			c=HH(c,d,a,b,x[i+ 3],16,-722521979);
+			b=HH(b,c,d,a,x[i+ 6],23, 76029189);
+			a=HH(a,b,c,d,x[i+ 9],4 ,-640364487);
+			d=HH(d,a,b,c,x[i+12],11,-421815835);
+			c=HH(c,d,a,b,x[i+15],16, 530742520);
+			b=HH(b,c,d,a,x[i+ 2],23,-995338651);
+
+			a=II(a,b,c,d,x[i+ 0],6 ,-198630844);
+			d=II(d,a,b,c,x[i+ 7],10, 1126891415);
+			c=II(c,d,a,b,x[i+14],15,-1416354905);
+			b=II(b,c,d,a,x[i+ 5],21,-57434055);
+			a=II(a,b,c,d,x[i+12],6 , 1700485571);
+			d=II(d,a,b,c,x[i+ 3],10,-1894986606);
+			c=II(c,d,a,b,x[i+10],15,-1051523);
+			b=II(b,c,d,a,x[i+ 1],21,-2054922799);
+			a=II(a,b,c,d,x[i+ 8],6 , 1873313359);
+			d=II(d,a,b,c,x[i+15],10,-30611744);
+			c=II(c,d,a,b,x[i+ 6],15,-1560198380);
+			b=II(b,c,d,a,x[i+13],21, 1309151649);
+			a=II(a,b,c,d,x[i+ 4],6 ,-145523070);
+			d=II(d,a,b,c,x[i+11],10,-1120210379);
+			c=II(c,d,a,b,x[i+ 2],15, 718787259);
+			b=II(b,c,d,a,x[i+ 9],21,-343485551);
+
+			a=dxd.addWords(a, olda);
+			b=dxd.addWords(b, oldb);
+			c=dxd.addWords(c, oldc);
+			d=dxd.addWords(d, oldd);
+		}
+		return [a,b,c,d];
+	}
+
+	function hmac(data, key){
+		var wa=dxd.stringToWord(key);
+		if(wa.length>16){ 
+			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
+			}
+		}
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/digests/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<<chrsz)-1;
+	
+	d.stringToWord=function(/* string */s){
+		//	summary
+		//	convert a string to a word array
+		var wa=[];
+		for(var i=0, l=s.length*chrsz; i<l; i+=chrsz){
+			wa[i>>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<l; i+=chrsz){
+			s.push(String.fromCharCode((wa[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<l; i++){
+			s.push(h.charAt((wa[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<l; i+=3){
+			var t=(((wa[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
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/encoding/easy64.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/encoding/easy64.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/encoding/easy64.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/flash/DojoExternalInterface.as
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/flash/DojoExternalInterface.as	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/flash/DojoExternalInterface.as	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/flash/ExpressInstall.as
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/flash/ExpressInstall.as	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/flash/ExpressInstall.as	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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+"')");
+	}
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/flash/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/flash/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/flash/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,31 @@
+-------------------------------------------------------------------------------
+dojox.flash
+-------------------------------------------------------------------------------
+Version 0.4
+Release date: MM/DD/YYYY
+-------------------------------------------------------------------------------
+Project state: experimental (currently broken) 
+-------------------------------------------------------------------------------
+Project authors
+	Brad Neuberg (BradNeuberg@xxxxxxxxxxxxxxx)
+	Alex Russell (alex@xxxxxxxxxxxxxxx, 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

Added: branches/vhffs-design/vhffs-panel/js/dojox/flash/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/flash/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/flash/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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([
+			'<script language="VBScript" type="text/vbscript"\>',
+			'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',
+			'</script\>'].join("\r\n"));
+	}
+	
+	this._detectVersion();
+}
+
+dojox.flash.Info.prototype = {
+	// version: String
+	//		The full version string, such as "8r22".
+	version: -1,
+	
+	// versionMajor, versionMinor, versionRevision: String
+	//		The major, minor, and revisions of the plugin. For example, if the
+	//		plugin is 8r22, then the major version is 8, the minor version is 0,
+	//		and the revision is 22. 
+	versionMajor: -1,
+	versionMinor: -1,
+	versionRevision: -1,
+	
+	// capable: Boolean
+	//		Whether this platform has Flash already installed.
+	capable: false,
+	
+	// installing: Boolean
+	//	Set if we are in the middle of a Flash installation session.
+	installing: false,
+	
+	isVersionOrAbove: function(
+							/* int */ reqMajorVer, 
+							/* int */ reqMinorVer, 
+							/* int */ reqVer){ /* Boolean */
+		// summary: 
+		//	Asserts that this environment has the given major, minor, and revision
+		//	numbers for the Flash player.
+		// description:
+		//	Asserts that this environment has the given major, minor, and revision
+		//	numbers for the Flash player. 
+		//	
+		//	Example- To test for Flash Player 7r14:
+		//	
+		//	dojox.flash.info.isVersionOrAbove(7, 0, 14)
+		// returns:
+		//	Returns true if the player is equal
+		//	or above the given version, false otherwise.
+		
+		// make the revision a decimal (i.e. transform revision 14 into
+		// 0.14
+		reqVer = parseFloat("." + reqVer);
+		
+		if(this.versionMajor >= reqMajorVer && this.versionMinor >= reqMinorVer
+			 && this.versionRevision >= reqVer){
+			return true;
+		}else{
+			return false;
+		}
+	},
+	
+	_detectVersion: function(){
+		var versionStr;
+		
+		// loop backwards through the versions until we find the newest version	
+		for(var testVersion = 25; testVersion > 0; testVersion--){
+			if(dojo.isIE){
+				versionStr = VBGetSwfVer(testVersion);
+			}else{
+				versionStr = this._JSFlashInfo(testVersion);		
+			}
+				
+			if(versionStr == -1 ){
+				this.capable = false; 
+				return;
+			}else if(versionStr != 0){
+				var versionArray;
+				if(dojo.isIE){
+					var tempArray = versionStr.split(" ");
+					var tempString = tempArray[1];
+					versionArray = tempString.split(",");
+				}else{
+					versionArray = versionStr.split(".");
+				}
+					
+				this.versionMajor = versionArray[0];
+				this.versionMinor = versionArray[1];
+				this.versionRevision = versionArray[2];
+				
+				// 7.0r24 == 7.24
+				var versionString = this.versionMajor + "." + this.versionRevision;
+				this.version = parseFloat(versionString);
+				
+				this.capable = true;
+				
+				break;
+			}
+		}
+	},
+	 
+	// JavaScript helper required to detect Flash Player PlugIn version 
+	// information. Internet Explorer uses a corresponding Visual Basic
+	// version to interact with the Flash ActiveX control. 
+	_JSFlashInfo: function(testVersion){
+		// NS/Opera version >= 3 check for Flash plugin in plugin array
+		if(navigator.plugins != null && navigator.plugins.length > 0){
+			if(navigator.plugins["Shockwave Flash 2.0"] || 
+				 navigator.plugins["Shockwave Flash"]){
+				var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
+				var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
+				var descArray = flashDescription.split(" ");
+				var tempArrayMajor = descArray[2].split(".");
+				var versionMajor = tempArrayMajor[0];
+				var versionMinor = tempArrayMajor[1];
+				if(descArray[3] != ""){
+					var tempArrayMinor = descArray[3].split("r");
+				}else{
+					var tempArrayMinor = descArray[4].split("r");
+				}
+				var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
+				var version = versionMajor + "." + versionMinor + "." 
+											+ versionRevision;
+											
+				return version;
+			}
+		}
+		
+		return -1;
+	}
+};
+
+dojox.flash.Embed = function(visible){
+	// summary: A class that is used to write out the Flash object into the page.
+	// description:
+	//	Writes out the necessary tags to embed a Flash file into the page. Note that
+	//	these tags are written out as the page is loaded using document.write, so
+	//	you must call this class before the page has finished loading.
+	
+	this._visible = visible;
+}
+
+dojox.flash.Embed.prototype = {
+	// width: int
+	//	The width of this Flash applet. The default is the minimal width
+	//	necessary to show the Flash settings dialog. Current value is 
+	//  215 pixels.
+	width: 215,
+	
+	// height: int 
+	//	The height of this Flash applet. The default is the minimal height
+	//	necessary to show the Flash settings dialog. Current value is
+	// 138 pixels.
+	height: 138,
+	
+	// id: String
+	// 	The id of the Flash object. Current value is 'flashObject'.
+	id: "flashObject",
+	
+	// Controls whether this is a visible Flash applet or not.
+	_visible: true,
+
+	protocol: function(){
+		switch(window.location.protocol){
+			case "https:":
+				return "https";
+				break;
+			default:
+				return "http";
+				break;
+		}
+	},
+	
+	write: function(/* Boolean? */ doExpressInstall){
+		// summary: Writes the Flash into the page.
+		// description:
+		//	This must be called before the page
+		//	is finished loading. 
+		// doExpressInstall: Boolean
+		//	Whether to write out Express Install
+		//	information. Optional value; defaults to false.
+		
+		// determine our container div's styling
+		var containerStyle = "";
+		containerStyle += ("width: " + this.width + "px; ");
+		containerStyle += ("height: " + this.height + "px; ");
+		if(!this._visible){
+			containerStyle += "position: absolute; z-index: 10000; top: -1000px; left: -1000px; ";
+		}
+		
+		// figure out the SWF file to get and how to write out the correct HTML
+		// for this Flash version
+		var objectHTML;
+		var swfloc = dojox.flash.url;
+		var swflocObject = swfloc;
+		var swflocEmbed = swfloc;
+		var dojoUrl = dojo.baseUrl;
+		if(doExpressInstall){
+			// the location to redirect to after installing
+			var redirectURL = escape(window.location);
+			document.title = document.title.slice(0, 47) + " - Flash Player Installation";
+			var docTitle = escape(document.title);
+			swflocObject += "?MMredirectURL=" + redirectURL
+			                + "&MMplayerType=ActiveX"
+			                + "&MMdoctitle=" + docTitle
+							+ "&baseUrl=" + escape(dojoUrl);
+			swflocEmbed += "?MMredirectURL=" + redirectURL 
+							+ "&MMplayerType=PlugIn"
+							+ "&baseUrl=" + escape(dojoUrl);
+		}else{
+		  // IE/Flash has an evil bug that shows up some time: if we load the
+		  // Flash and it isn't in the cache, ExternalInterface works fine --
+		  // however, the second time when its loaded from the cache a timing
+		  // bug can keep ExternalInterface from working. The trick below 
+		  // simply invalidates the Flash object in the cache all the time to
+		  // keep it loading fresh. -- Brad Neuberg
+		  swflocObject += "?cachebust=" + new Date().getTime();
+		}
+
+		if(swflocEmbed.indexOf("?") == -1){
+			swflocEmbed +=  '?baseUrl='+escape(dojoUrl);
+		}else{
+		  swflocEmbed +=  '&baseUrl='+escape(dojoUrl);
+		}
+
+		objectHTML =
+			'<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '
+			  + 'codebase="'
+				+ this.protocol()
+				+ '://fpdownload.macromedia.com/pub/shockwave/cabs/flash/'
+				+ 'swflash.cab#version=8,0,0,0"\n '
+			  + 'width="' + this.width + '"\n '
+			  + 'height="' + this.height + '"\n '
+			  + 'id="' + this.id + '"\n '
+			  + 'name="' + this.id + '"\n '
+			  + 'align="middle">\n '
+			  + '<param name="allowScriptAccess" value="sameDomain"></param>\n '
+			  + '<param name="movie" value="' + swflocObject + '"></param>\n '
+			  + '<param name="quality" value="high"></param>\n '
+			  + '<param name="bgcolor" value="#ffffff"></param>\n '
+			  + '<embed src="' + swflocEmbed + '" '
+			  	  + 'quality="high" '
+				  + 'bgcolor="#ffffff" '
+				  + 'width="' + this.width + '" '
+				  + 'height="' + this.height + '" '
+				  + 'id="' + this.id + 'Embed' + '" '
+				  + 'name="' + this.id + '" '
+				  + 'swLiveConnect="true" '
+				  + 'align="middle" '
+				  + 'allowScriptAccess="sameDomain" '
+				  + 'type="application/x-shockwave-flash" '
+				  + 'pluginspage="'
+				  + this.protocol()
+				  +'://www.macromedia.com/go/getflashplayer" '
+				  + '></embed>\n'
+			+ '</object>\n';
+					
+		// using same mechanism on all browsers now to write out
+		// Flash object into page
+
+		// document.write no longer works correctly
+		// due to Eolas patent workaround in IE;
+		// nothing happens (i.e. object doesn't
+		// go into page if we use it)
+		dojo.connect(dojo, "loaded", dojo.hitch(this, function(){
+			var div = document.createElement("div");
+			div.setAttribute("id", this.id + "Container");
+			div.setAttribute("style", containerStyle);
+			div.innerHTML = objectHTML;
+	
+			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(){ /* Object */
+		// summary: Gets the Flash object DOM node.
+		if(dojo.isIE || dojo.isSafari){
+			return document.getElementById(this.id);
+		}else{
+			// different IDs on OBJECT and EMBED tags or
+			// else Firefox will return wrong one and
+			// communication won't work; 
+			// also, document.getElementById() returns a
+			// plugin but ExternalInterface calls don't
+			// work on it so we have to use
+			// document[id] instead
+			return document[this.id + "Embed"];
+		}
+	},
+	
+	setVisible: function(/* Boolean */ visible){
+	  //console.debug("setVisible, visible="+visible);
+		
+		// summary: Sets the visibility of this Flash object.		
+		var container = dojo.byId(this.id + "Container");
+		if(visible == true){
+		  container.style.position = "absolute"; // IE -- Brad Neuberg
+			container.style.visibility = "visible";
+		}else{
+			container.style.position = "absolute";
+			container.style.x = "-1000px";
+			container.style.y = "-1000px";
+			container.style.visibility = "hidden";
+		}
+	},
+	
+	center: function(){
+		// summary: Centers the flash applet on the page.
+		
+		var elementWidth = this.width;
+		var elementHeight = this.height;
+
+		var viewport = dijit.getViewport();
+
+		// compute the centered position    
+		var x = viewport.l + (viewport.w - elementWidth) / 2;
+		var y = viewport.t + (viewport.h - elementHeight) / 2; 
+		
+		// set the centered position
+		var container = dojo.byId(this.id + "Container");
+		container.style.top = y + "px";
+		container.style.left = x + "px";
+	}
+};
+
+
+dojox.flash.Communicator = function(){
+	// summary:
+	//	A class that is used to communicate between Flash and JavaScript.
+	// description:
+	//	This class helps mediate Flash and JavaScript communication. Internally
+	//	it uses Flash 8's ExternalInterface API, but adds functionality to fix 
+	//	various encoding bugs that ExternalInterface has.
+}
+
+dojox.flash.Communicator.prototype = {
+	// Registers the existence of a Flash method that we can call with
+	// JavaScript, using Flash 8's ExternalInterface. 
+	_addExternalInterfaceCallback: function(methodName){
+		var wrapperCall = dojo.hitch(this, function(){
+			// some browsers don't like us changing values in the 'arguments' array, so
+			// make a fresh copy of it
+			var methodArgs = new Array(arguments.length);
+			for(var i = 0; i < arguments.length; i++){
+				methodArgs[i] = this._encodeData(arguments[i]);
+			}
+			
+			var results = this._execFlash(methodName, methodArgs);
+			results = this._decodeData(results);
+			
+			return results;
+		});
+		
+		this[methodName] = wrapperCall;
+	},
+	
+	// Encodes our data to get around ExternalInterface bugs that are still
+	// present even in Flash 9.
+	_encodeData: function(data){
+		if(!data || typeof data != "string"){
+			return data;
+		}
+		
+		// double encode all entity values, or they will be mis-decoded
+		// by Flash when returned
+		var entityRE = /\&([^;]*)\;/g;
+		data = data.replace(entityRE, "&amp;$1;");
+
+		// entity encode XML-ish characters, or Flash's broken XML serializer
+		// breaks
+		data = data.replace(/</g, "&lt;");
+		data = data.replace(/>/g, "&gt;");
+
+		// transforming \ into \\ doesn't work; just use a custom encoding
+		data = data.replace("\\", "&custom_backslash;");
+
+		data = data.replace(/\0/g, "\\0"); // null character
+		data = data.replace(/\"/g, "&quot;");
+
+		return data;
+	},
+	
+	// Decodes our data to get around ExternalInterface bugs that are still
+	// present even in Flash 9.
+	_decodeData: function(data){
+		// wierdly enough, Flash sometimes returns the result as an
+		// 'object' that is actually an array, rather than as a String;
+		// detect this by looking for a length property; for IE
+		// we also make sure that we aren't dealing with a typeof string
+		// since string objects have length property there
+		if(data && data.length && typeof data != "string"){
+			data = data[0];
+		}
+		
+		if(!data || typeof data != "string"){
+			return data;
+		}
+	
+		// certain XMLish characters break Flash's wire serialization for
+		// ExternalInterface; these are encoded on the 
+		// DojoExternalInterface side 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 = data.replace(/\&custom_lt\;/g, "<");
+		data = data.replace(/\&custom_gt\;/g, ">");
+		data = data.replace(/\&custom_backslash\;/g, '\\');
+		
+		// needed for IE; \0 is the NULL character
+		data = data.replace(/\\0/g, "\0");
+		
+		return data;
+	},
+	
+	// Executes a Flash method; called from the JavaScript wrapper proxy we
+	// create on dojox.flash.comm.
+	_execFlash: function(methodName, methodArgs){
+		var plugin = dojox.flash.obj.get();
+		methodArgs = (methodArgs) ? methodArgs : [];
+		
+		// encode arguments that are strings
+		for(var i = 0; i < methodArgs; i++){
+			if(typeof methodArgs[i] == "string"){
+				methodArgs[i] = this._encodeData(methodArgs[i]);
+			}
+		}
+
+		// we use this gnarly hack below instead of 
+		// plugin[methodName] for two reasons:
+		// 1) plugin[methodName] has no call() method, which
+		// means we can't pass in multiple arguments dynamically
+		// to a Flash method -- we can only have one
+		// 2) On IE plugin[methodName] returns undefined -- 
+		// plugin[methodName] used to work on IE when we
+		// used document.write but doesn't now that
+		// we use dynamic DOM insertion of the Flash object
+		// -- Brad Neuberg
+		var flashExec = function(){ 
+			return eval(plugin.CallFunction(
+						 "<invoke name=\"" + methodName
+						+ "\" returntype=\"javascript\">" 
+						+ __flash__argumentsToXML(methodArgs, 0) 
+						+ "</invoke>")); 
+		};
+		var results = flashExec.call(methodArgs);
+		
+		if(typeof results == "string"){
+			results = this._decodeData(results);
+		}
+			
+		return results;
+	}
+}
+
+// FIXME: dojo.declare()-ify this
+
+// TODO: I did not test the Install code when I refactored Dojo Flash from 0.4 to 
+// 1.0, so am not sure if it works. If Flash is not present I now prefer 
+// that Gears is installed instead of Flash because GearsStorageProvider is
+// much easier to work with than Flash's hacky ExternalInteface. 
+// -- Brad Neuberg
+dojox.flash.Install = function(){
+	// summary: Helps install Flash plugin if needed.
+	// description:
+	//		Figures out the best way to automatically install the Flash plugin
+	//		for this browser and platform. Also determines if installation or
+	//		revving of the current plugin is needed on this platform.
+}
+
+dojox.flash.Install.prototype = {
+	needed: function(){ /* Boolean */
+		// summary:
+		//		Determines if installation or revving of the current plugin is
+		//		needed. 
+	
+		// do we even have flash?
+		if(dojox.flash.info.capable == false){
+			return true;
+		}
+
+		// Must have ExternalInterface which came in Flash 8
+		if(!dojox.flash.info.isVersionOrAbove(8, 0, 0)){
+			return true;
+		}
+
+		// otherwise we don't need installation
+		return false;
+	},
+
+	install: function(){
+		// summary: Performs installation or revving of the Flash plugin.
+	
+		// indicate that we are installing
+		dojox.flash.info.installing = true;
+		dojox.flash.installing();
+		
+		if(dojox.flash.info.capable == false){ // we have no Flash at all
+			// write out a simple Flash object to force the browser to prompt
+			// the user to install things
+			var installObj = new dojox.flash.Embed(false);
+			installObj.write(); // write out HTML for Flash
+		}else if(dojox.flash.info.isVersionOrAbove(6, 0, 65)){ // Express Install
+			var installObj = new dojox.flash.Embed(false);
+			installObj.write(true); // write out HTML for Flash 8 version+
+			installObj.setVisible(true);
+			installObj.center();
+		}else{ // older Flash install than version 6r65
+			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";
+		}
+	},
+	
+	// Called when the Express Install is either finished, failed, or was
+	// rejected by the user.
+	_onInstallStatus: function(msg){
+		if (msg == "Download.Complete"){
+			// Installation is 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"){
+			// The end user failed to download the installer due to a network failure
+			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.");
+		}	
+	}
+}
+
+// find out if Flash is installed
+dojox.flash.info = new dojox.flash.Info();
+
+// vim:ts=4:noet:tw=0:
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/flash.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/flash.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/flash.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/CheckedMultiSelect.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/CheckedMultiSelect.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/CheckedMultiSelect.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:"<div class=\"dijitReset ${baseClass}\"\n\t><input class=\"${baseClass}Box\" dojoType=\"dijit.form.CheckBox\" dojoAttachPoint=\"checkBox\" dojoAttachEvent=\"_onClick:_changeBox\" type=\"checkbox\" \n\t><div class=\"dijitInline ${baseClass}Label\" dojoAttachPoint=\"labelNode\" dojoAttachEvent=\"onmousedown:_onMouse,onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\">${option.innerHTML}</div\n></div>\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:"<div class=\"dijit dijitReset dijitInline\" dojoAttachEvent=\"onmousedown:_mouseDown,onclick:focus\"\n\t><select class=\"${baseClass}Select\" multiple=\"true\" dojoAttachPoint=\"containerNode,focusNode\" dojoAttachEvent=\"onchange: _onChange\"></select\n\t><div dojoAttachPoint=\"wrapperDiv\"></div\n></div>\n",
+
+	baseClass: "dojoxMultiSelect",
+
+	// children: dojox.form._CheckedMultiSelectItem[]
+	//		Array of all our children (for updating them)
+	children: [],
+	
+	/*=====
+	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,
+
+	_mouseDown: function(e){
+		// summary:
+		//		Cancels the mousedown event to prevent others from stealing
+		//		focus
+		dojo.stopEvent(e);
+	},
+
+	_updateChildren: function(){
+		// summary:
+		//		Called to update the checked states of my children to match me
+		dojo.forEach(this.children,function(child){
+			child._updateBox();
+		});
+	},
+	
+	_addChild: function(/*Element*/ option){
+		// summary:
+		//		Adds and returns a child for the given option.
+		var item = new dojox.form._CheckedMultiSelectItem({
+			option: option,
+			parent: this
+		});
+		this.wrapperDiv.appendChild(item.domNode);
+		return item;
+	},
+
+	_loadChildren: function(){
+		// summary:
+		//		Reloads the children to match our box.
+
+		// Destroy any existing children before loading them again
+		dojo.forEach(this.children, function(child){
+			child.destroyRecursive();
+		});
+		this.children = dojo.query("option", this.domNode).map(function(child){
+			return this._addChild(child);
+		}, this);
+		this.options = dojo.map(this.children, function(child){
+			var opt = child.option;
+			return { value:opt.value, label: opt.text };
+		});
+		// Update the statuses of the children
+		this._updateChildren();
+	},
+
+	addOption: function(/* dojox.form.__SelectOption or string, optional */ value, /* string? */ label){
+		// summary: Adds the given option to the select
+		
+		var o = new Option("","");
+		o.value = value.value || value;
+		o.innerHTML = value.label || label;
+		this.containerNode.appendChild(o);
+	},
+
+	removeOption: function(/*String*/ optionId){
+		dojo.query("option[value=" + optionId + "]", this.domNode).forEach(function(node){
+			node.parentNode.removeChild(node);
+		}, this);
+	},
+	
+	setOptionLabel: function(/*string*/ optionId, /*string*/ label){
+		dojo.query("option[value=" + optionId + "]", this.domNode).forEach(function(node){
+			node.innerHTML = label;
+		});
+	},
+
+	addSelected: function(select){
+		this.inherited(arguments);
+		
+		// Reload my children and the children of the guy pointing to me
+		if(select._loadChildren){
+			select._loadChildren();
+		}
+		this._loadChildren();
+	},
+	
+	setAttribute: function(attr, value){
+		// summary:
+		//		Disable (or enable) all the children as well
+		this.inherited(arguments);
+		switch(attr){
+			case "disabled":
+				dojo.forEach(this.children, function(node){
+					if(node && node.setAttribute){
+						node.setAttribute(attr, value);
+					}
+				});
+				break;
+			default:
+				break;
+		}
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+		this.inherited(arguments);
+
+		// Load children and make connections
+		this._loadChildren();
+		this.connect(this, "setValue", "_updateChildren");
+		this.connect(this, "invertSelection", "_updateChildren");
+		this.connect(this, "addOption", "_loadChildren");
+		this.connect(this, "removeOption", "_loadChildren");
+		this.connect(this, "setOptionLabel", "_loadChildren");
+		this._started = true;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/DropDownSelect.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/DropDownSelect.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/DropDownSelect.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,267 @@
+if(!dojo._hasResource["dojox.form.DropDownSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.form.DropDownSelect"] = true;
+dojo.provide("dojox.form.DropDownSelect");
+
+dojo.require("dijit.form.Button");
+dojo.require("dijit.Menu");
+
+dojo.require("dojo.data.ItemFileWriteStore");
+
+dojo.declare("dojox.form.DropDownSelect", dijit.form.DropDownButton, {
+	// summary:
+	//		This is a "Styleable" select box - it is basically a DropDownButton which
+	//		can take as its input a <select>.
+
+	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 = '<div class=" ' + this.baseClass + 'Label">' +
+					content +
+					'</div>';
+		//		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 || "&nbsp;");
+			}
+			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);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/PasswordValidator.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/PasswordValidator.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/PasswordValidator.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:"<div dojoAttachPoint=\"containerNode\">\n\t<input type=\"hidden\" name=\"${name}\" value=\"\" dojoAttachPoint=\"focusNode\" />\n</div>\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 <input> 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(); }
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 <select> drop down
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/nls/PasswordValidator.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/nls/PasswordValidator.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/nls/PasswordValidator.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"badPasswordMessage":"Invalid Password.","nomatchMessage":"Passwords do not match."})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,65 @@
+
+.dojoxMultiSelectSelect { display: none; }
+.dojoxMultiSelect {
+	border: solid black 1px;
+	margin: 1px 0;
+	overflow: scroll; 
+	overflow-y: scroll; 
+	overflow-x: hidden; 
+	height: 100px;
+}
+.dj_ie .dojoxMultiSelect,
+.dj_safari .dojoxMultiSelect {
+	
+	padding-right: 15px;
+}
+.dojoxMultiSelectItem {
+	white-space: nowrap;
+	padding:.1em .2em;
+	cursor:default;
+}
+.dojoxMultiSelectDisabled * {
+	color:gray !important;
+}
+.dojoxMultiSelectItemLabel {
+	margin-left: .2em;
+}
+.tundra .dojoxMultiSelect {
+	margin: 0em 0.1em;
+}
+.tundra .dojoxMultiSelect {
+	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 .dojoxMultiSelectFocused {
+	
+	border-color:#406b9b;
+}
+.soria .dojoxMultiSelect {
+	margin: 0em 0.1em;
+}
+.soria .dojoxMultiSelect {
+	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 .dojoxMultiSelectFocused {
+	
+	border-color:#406b9b;
+}
+.nihilo .dojoxMultiSelect {
+	margin: 0em 0.1em;
+}
+.nihilo .dojoxMultiSelect {
+	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 .dojoxMultiSelectFocused {
+	
+	border-color:#b3b3b3;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,99 @@
+/*
+**----------------------------------------------------------------------------
+**  CheckedMultiSelect
+**----------------------------------------------------------------------------
+*/
+.dojoxMultiSelectSelect { display: none; }
+
+.dojoxMultiSelect {
+	border: solid black 1px;
+	margin: 1px 0;
+	overflow: scroll; 
+	overflow-y: scroll; 
+	overflow-x: hidden; 
+	height: 100px;
+}
+
+.dj_ie .dojoxMultiSelect,
+.dj_safari .dojoxMultiSelect {
+	/* So that the scroll bar doesn't cover stuff up */
+	padding-right: 15px;
+}
+
+.dojoxMultiSelectItem {
+	white-space: nowrap;
+	padding:.1em .2em;
+	cursor:default;
+}
+
+.dojoxMultiSelectDisabled * {
+	color:gray !important;
+}
+
+.dojoxMultiSelectItemLabel {
+	margin-left: .2em;
+}
+
+/*
+**----------------------------------------------------------------------------
+**  Tundra theme (make look similar to text box)
+**----------------------------------------------------------------------------
+*/
+.tundra .dojoxMultiSelect {
+	margin: 0em 0.1em;
+}
+
+.tundra .dojoxMultiSelect {
+	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 .dojoxMultiSelectFocused {
+	/* input field when focused (ie: typing affects it) */
+	border-color:#406b9b;
+}
+
+/*
+**----------------------------------------------------------------------------
+**  Soria theme (make look similar to text box)
+**----------------------------------------------------------------------------
+*/
+.soria .dojoxMultiSelect {
+	margin: 0em 0.1em;
+}
+
+.soria .dojoxMultiSelect {
+	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 .dojoxMultiSelectFocused {
+	/* input field when focused (ie: typing affects it) */
+	border-color:#406b9b;
+}
+
+/*
+**----------------------------------------------------------------------------
+**  Nihilo theme (make look similar to text box)
+**----------------------------------------------------------------------------
+*/
+.nihilo .dojoxMultiSelect {
+	margin: 0em 0.1em;
+}
+
+.nihilo .dojoxMultiSelect {
+	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 .dojoxMultiSelectFocused {
+	/* input field when focused (ie: typing affects it) */
+	border-color:#b3b3b3;
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/resources/CheckedMultiSelect.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+<div class="dijit dijitReset dijitInline" dojoAttachEvent="onmousedown:_mouseDown,onclick:focus"
+	><select class="${baseClass}Select" multiple="true" dojoAttachPoint="containerNode,focusNode" dojoAttachEvent="onchange: _onChange"></select
+	><div dojoAttachPoint="wrapperDiv"></div
+></div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/resources/DropDownSelect.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/resources/DropDownSelect.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/resources/DropDownSelect.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/resources/DropDownSelect.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/resources/DropDownSelect.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/resources/DropDownSelect.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/resources/PasswordValidator.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/resources/PasswordValidator.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/resources/PasswordValidator.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+<div dojoAttachPoint="containerNode">
+	<input type="hidden" name="${name}" value="" dojoAttachPoint="focusNode" />
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/form/resources/_CheckedMultiSelectItem.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/form/resources/_CheckedMultiSelectItem.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/form/resources/_CheckedMultiSelectItem.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+<div class="dijitReset ${baseClass}"
+	><input class="${baseClass}Box" dojoType="dijit.form.CheckBox" dojoAttachPoint="checkBox" dojoAttachEvent="_onClick:_changeBox" type="checkbox" 
+	><div class="dijitInline ${baseClass}Label" dojoAttachPoint="labelNode" dojoAttachEvent="onmousedown:_onMouse,onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick">${option.innerHTML}</div
+></div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxx)
+	Shane O'Sullivan (shaneosullivan1@xxxxxxxxx)
+	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.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/Shadow.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/Shadow.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/Shadow.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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";
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/_arg.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/_arg.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/_arg.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/_core.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/_core.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/_core.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/easing.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/easing.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/easing.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/ext-dojo/NodeList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/ext-dojo/NodeList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/ext-dojo/NodeList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowB.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowB.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowBL.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowBL.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowBR.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowBR.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowL.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowL.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowR.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowR.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowT.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowT.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowTL.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowTL.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowTR.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/fx/resources/shadowTR.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/scroll.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/scroll.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/scroll.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx/style.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx/style.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx/style.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; }
+	// |	<div class="bar" id="test">
+	// |	Multi<br>line<br>text
+	// |	</div> 
+	// |
+	// |	// 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; 
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/fx.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/fx.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/fx.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"); 
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/Moveable.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/Moveable.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/Moveable.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/Mover.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/Mover.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/Mover.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxx)
+	Kun Xi (bookstack@xxxxxxxxx)
+	Chris Mitchell (ccmitchellusa@xxxxxxxxx) 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:
+<script type="text/javascript" src="../../../dojo/dojo.js" 
+	djConfig="parseOnLoad: true, gfxRenderer: 'canvas,svg,silverlight,vml'"></script>
+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.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/arc.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/arc.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/arc.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/attach.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/attach.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/attach.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/canvas.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/canvas.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/canvas.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/canvas_attach.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/canvas_attach.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/canvas_attach.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+};

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/decompose.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/decompose.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/decompose.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/beautify.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/beautify.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/beautify.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,48 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" >
+<head>
+<title>Beautify JSON</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true"></script>
+<script type="text/javascript">
+
+trimPath = function(o){
+	if(o instanceof Array){
+		for(var i = 0; i < o.length; ++i){
+			trimPath(o[i]);
+		}
+		return;
+	}
+	if(("shape" in o) && ("path" in o.shape)){
+		o.shape.path = dojo.trim(o.shape.path.replace(/\s\s+/g, " "));
+	}
+	if("children" in o){
+		trimPath(o.children);
+	}
+};
+
+beautify = function(){
+	var t = dojo.byId("io");
+	var v = dojo.fromJson(t.value);
+	if(dojo.byId("path").checked){
+		trimPath(v);
+	}
+	t.value = dojo.toJson(v, dojo.byId("pprint").checked);
+};
+
+</script>
+</head>
+<body>
+	<h1>Beautify JSON</h1>
+	<p>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.</p>
+	<p><textarea id="io" cols="80" rows="10" wrap="off"></textarea></p>
+	<p><button onclick="beautify()">Beautify!</button>
+	&nbsp;&nbsp;&nbsp;<input type="checkbox" id="path" checked="checked" />&nbsp;Process "path" elements
+	&nbsp;&nbsp;&nbsp;<input type="checkbox" id="pprint" checked="checked" />&nbsp;Pretty-print JSON</p>
+	<p><em>This program is a companion for inspector.html.</em></p>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/butterfly.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/butterfly.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/butterfly.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,88 @@
+<html>
+<head>
+<title>dojox.gfx: Butterfly</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/themes/tundra/tundra.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<!--
+The next line should include Microsoft's Silverligth.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="parseOnLoad: true"></script>
+<script type="text/javascript">
+
+dojo.require("dijit.form.Slider");
+dojo.require("dojo.parser"); // scan page for widgets
+
+dojo.require("dojox.gfx");
+
+var rotation = 0, scaling = 1;
+var surface, g, m = dojox.gfx.matrix;
+var initial_matrix = m.translate(140, 180);
+
+var updateMatrix = function(){
+	if(g){ g.setTransform([m.rotategAt(rotation, 350, 350), m.scaleAt(scaling, 350, 350), initial_matrix]); }
+};
+
+var rotatingEvent = function(value){
+	rotation = value;
+	dojo.byId("rotationValue").innerHTML = rotation;
+	updateMatrix();
+};
+
+var scalingEvent = function(value){
+	scaling = Math.exp(Math.LN10 * (value - 1));
+	dojo.byId("scaleValue").innerHTML = scaling.toFixed(3);
+	updateMatrix();
+};
+
+var makeShapes = function(){
+	surface = dojox.gfx.createSurface(dojo.byId("gfx_holder"), 700, 700);
+	surface.createRect({x: 0, y: 0, width: 700, height: 700}).setFill("#eee");
+	g = surface.createGroup().setTransform(initial_matrix);
+    g.createPath("M204.33 139.83 C196.33 133.33 206.68 132.82 206.58 132.58 C192.33 97.08 169.35 81.41 167.58 80.58 C162.12 78.02 159.48 78.26 160.45 76.97 C161.41 75.68 167.72 79.72 168.58 80.33 C193.83 98.33 207.58 132.33 207.58 132.33 C207.58 132.33 209.33 133.33 209.58 132.58 C219.58 103.08 239.58 87.58 246.33 81.33 C253.08 75.08 256.63 74.47 247.33 81.58 C218.58 103.58 210.34 132.23 210.83 132.33 C222.33 134.83 211.33 140.33 211.83 139.83 C214.85 136.81 214.83 145.83 214.83 145.83 C214.83 145.83 231.83 110.83 298.33 66.33 C302.43 63.59 445.83 -14.67 395.83 80.83 C393.24 85.79 375.83 105.83 375.83 105.83 C375.83 105.83 377.33 114.33 371.33 121.33 C370.3 122.53 367.83 134.33 361.83 140.83 C360.14 142.67 361.81 139.25 361.83 140.83 C362.33 170.83 337.76 170.17 339.33 170.33 C348.83 171.33 350.19 183.66 350.33 183.83 C355.83 190.33 353.83 191.83 355.83 194.83 C366.63 211.02 355.24 210.05 356.83 212.83 C360.83 219.83 355.99 222.72 357.33 224.83 C360.83 230.33 354.75 233.84 354.83 235.33 C355.33 243.83 349.67 240.73 349.83 244.33 C350.33 255.33 346.33 250.83 343.83 254.83 C336.33 266.83 333.46 262.38 332.83 263.83 C329.83 270.83 325.81 269.15 324.33 270.83 C320.83 274.83 317.33 274.83 315.83 276.33 C308.83 283.33 304.86 278.39 303.83 278.83 C287.83 285.83 280.33 280.17 277.83 280.33 C270.33 280.83 271.48 279.67 269.33 277.83 C237.83 250.83 219.33 211.83 215.83 206.83 C214.4 204.79 211.35 193.12 212.33 195.83 C214.33 201.33 213.33 250.33 207.83 250.33 C202.33 250.33 201.83 204.33 205.33 195.83 C206.43 193.16 204.4 203.72 201.79 206.83 C196.33 213.33 179.5 250.83 147.59 277.83 C145.42 279.67 146.58 280.83 138.98 280.33 C136.46 280.17 128.85 285.83 112.65 278.83 C111.61 278.39 107.58 283.33 100.49 276.33 C98.97 274.83 95.43 274.83 91.88 270.83 C90.39 269.15 86.31 270.83 83.27 263.83 C82.64 262.38 79.73 266.83 72.13 254.83 C69.6 250.83 65.54 255.33 66.05 244.33 C66.22 240.73 60.48 243.83 60.99 235.33 C61.08 233.84 54.91 230.33 58.45 224.83 C59.81 222.72 54.91 219.83 58.96 212.83 C60.57 210.05 49.04 211.02 59.97 194.83 C62 191.83 59.97 190.33 65.54 183.83 C65.69 183.66 67.06 171.33 76.69 170.33 C78.28 170.17 53.39 170.83 53.9 140.83 C53.92 139.25 55.61 142.67 53.9 140.83 C47.82 134.33 45.32 122.53 44.27 121.33 C38.19 114.33 39.71 105.83 39.71 105.83 C39.71 105.83 22.08 85.79 19.46 80.83 C-31.19 -14.67 114.07 63.59 118.22 66.33 C185.58 110.83 202 145.83 202 145.83 C202 145.83 202.36 143.28 203 141.83 C203.64 140.39 204.56 140.02 204.33 139.83 z").setFill("rgb(246,127,0)");
+    g.createPath("M203.62 139.62 C195.62 133.12 205.96 132.6 205.87 132.37 C191.62 96.87 168.64 81.2 166.87 80.37 C161.41 77.81 158.77 78.05 159.73 76.76 C160.69 75.47 167.01 79.51 167.87 80.12 C193.12 98.12 206.87 132.12 206.87 132.12 C206.87 132.12 208.62 133.12 208.87 132.37 C218.87 102.87 238.87 87.37 245.62 81.12 C252.37 74.87 255.92 74.26 246.62 81.37 C217.87 103.37 209.63 132.01 210.12 132.12 C221.62 134.62 210.62 140.12 211.12 139.62 C214.14 136.6 214.12 145.62 214.12 145.62 C214.12 145.62 231.12 110.62 297.62 66.12 C301.71 63.38 445.12 -14.88 395.12 80.62 C392.53 85.57 375.12 105.62 375.12 105.62 C375.12 105.62 376.62 114.12 370.62 121.12 C369.59 122.32 367.12 134.12 361.12 140.62 C359.43 142.46 361.09 139.04 361.12 140.62 C361.62 170.62 337.05 169.96 338.62 170.12 C348.12 171.12 349.47 183.45 349.62 183.62 C355.12 190.12 353.12 191.62 355.12 194.62 C365.91 210.81 354.53 209.84 356.12 212.62 C360.12 219.62 355.28 222.51 356.62 224.62 C360.12 230.12 354.03 233.62 354.12 235.12 C354.62 243.62 348.96 240.52 349.12 244.12 C349.62 255.12 345.62 250.62 343.12 254.62 C335.62 266.62 332.74 262.17 332.12 263.62 C329.12 270.62 325.09 268.94 323.62 270.62 C320.12 274.62 316.62 274.62 315.12 276.12 C308.12 283.12 304.15 278.17 303.12 278.62 C287.12 285.62 279.62 279.95 277.12 280.12 C269.62 280.62 270.77 279.46 268.62 277.62 C237.12 250.62 218.62 211.62 215.12 206.62 C213.69 204.57 210.63 192.91 211.62 195.62 C213.62 201.12 212.62 250.12 207.12 250.12 C201.62 250.12 201.12 204.12 204.62 195.62 C205.72 192.95 203.69 203.5 201.08 206.62 C195.62 213.12 178.79 250.62 146.88 277.62 C144.71 279.46 145.87 280.62 138.27 280.12 C135.75 279.95 128.14 285.62 111.94 278.62 C110.9 278.17 106.87 283.12 99.78 276.12 C98.26 274.62 94.72 274.62 91.17 270.62 C89.68 268.94 85.6 270.62 82.56 263.62 C81.93 262.17 79.01 266.62 71.42 254.62 C68.88 250.62 64.83 255.12 65.34 244.12 C65.51 240.52 59.77 243.62 60.27 235.12 C60.36 233.62 54.2 230.12 57.74 224.62 C59.1 222.51 54.2 219.62 58.25 212.62 C59.86 209.84 48.33 210.81 59.26 194.62 C61.29 191.62 59.26 190.12 64.83 183.62 C64.98 183.45 66.35 171.12 75.98 170.12 C77.57 169.96 52.68 170.62 53.18 140.62 C53.21 139.04 54.9 142.46 53.18 140.62 C47.11 134.12 44.6 122.32 43.56 121.12 C37.48 114.12 39 105.62 39 105.62 C39 105.62 21.37 85.57 18.74 80.62 C-31.9 -14.88 113.36 63.38 117.51 66.12 C184.87 110.62 201.29 145.62 201.29 145.62 C201.29 145.62 201.65 143.07 202.29 141.62 C202.93 140.18 203.85 139.81 203.62 139.62 zM242.12 153.12 C245.16 153.02 251.35 156.17 255.12 155.12 C280.55 148.06 328.44 154.56 331.62 155.62 C343.62 159.62 351.62 131.12 326.12 131.12 C294.59 131.12 301.12 129.12 280.12 126.12 C278.34 125.87 252.6 135.42 228.62 149.12 C225.12 151.12 227.12 153.62 242.12 153.12 zM223.12 148.12 C225.66 148.4 238.12 139.62 277.12 124.12 C279.49 123.18 279.62 118.12 300.62 108.62 C301.99 108 300.12 104.62 314.62 92.62 C321.79 86.69 297.12 87.62 291.62 88.62 C286.12 89.62 272.62 100.62 272.62 100.62 C272.62 100.62 287.8 88.55 282.62 90.12 C271.12 93.62 241.12 126.62 231.12 140.62 C221.12 154.62 247.62 116.62 254.12 110.62 C260.62 104.62 204.62 146.12 223.12 148.12 zM335.62 128.62 C350.14 131.53 348.62 110.12 341.12 109.12 C329.55 107.58 307.51 108.3 301.12 110.62 C284.62 116.62 280.29 122.65 281.62 123.12 C310.12 133.12 330.62 127.62 335.62 128.62 zM335.12 106.62 C341.04 107.36 351.12 109.62 351.62 101.62 C351.87 97.6 365.62 104.62 368.62 105.12 C371.1 105.53 358.12 100.33 353.62 97.12 C350.12 94.62 349.51 91.76 349.12 91.62 C317.12 80.12 303.62 107.12 303.62 107.12 C303.62 107.12 331.12 106.12 335.12 106.62 zM400.62 62.62 C395.62 54.62 386.66 57.08 383.62 53.62 C369.12 37.12 335.54 58.28 363.12 56.12 C395.12 53.62 401.21 63.57 400.62 62.62 zM376.62 66.62 C390.13 66.62 396.12 72.62 395.12 71.62 C388.12 64.62 382.12 66.12 380.62 64.12 C371.7 52.23 345.12 64.62 347.12 67.62 C349.12 70.62 373.12 66.62 376.62 66.62 zM330.12 76.12 C309.12 81.12 318.12 88.62 320.62 88.12 C340.05 84.24 334.5 75.08 330.12 76.12 zM340.62 52.12 C331.12 53.12 330.48 70.43 335.12 67.12 C342.12 62.12 350.12 51.12 340.62 52.12 zM315.62 75.62 C329.62 70.12 319.12 67.62 314.62 68.12 C310.12 68.62 306.79 75.45 308.12 78.12 C311.12 84.12 312.91 76.69 315.62 75.62 zM359.62 121.12 C364.12 118.62 358.62 112.62 354.62 115.12 C350.62 117.62 355.12 123.62 359.62 121.12 zM350.12 78.62 C361.89 90.39 366.62 84.12 369.12 83.12 C377.24 79.87 386.12 88.62 384.62 87.12 C377.34 79.84 372.62 81.12 371.62 79.62 C364.01 68.2 352.66 75.44 350.12 75.62 C343.12 76.12 334.43 81.03 337.62 80.12 C341.12 79.12 348.62 77.12 350.12 78.62 zM383.62 44.12 C390.62 39.12 381.4 37.85 379.62 38.12 C373.12 39.12 376.62 49.12 383.62 44.12 zM224.62 181.12 C230.12 187.62 291.62 285.12 282.12 252.62 C280.83 248.2 285.62 266.12 291.12 256.12 C292.66 253.32 301.27 253.03 274.62 208.62 C273.12 206.12 252.62 198.12 232.12 175.62 C229.02 172.21 220.05 175.72 224.62 181.12 zM280.12 215.62 C284.62 222.62 295.81 246.07 296.62 249.62 C299.12 260.62 306.12 248.12 307.62 248.62 C320.78 253.01 311.12 241.12 310.12 238.12 C300.95 210.62 279.62 213.12 279.62 213.12 C279.62 213.12 275.62 208.62 280.12 215.62 zM253.62 256.12 C266.26 274.09 271.12 267.12 273.62 265.12 C281.32 258.96 232.34 196.14 229.12 192.12 C225.12 187.12 225.12 215.62 253.62 256.12 zM300.12 219.12 C306.62 224.12 313.86 245.19 317.62 244.62 C327.62 243.12 321.62 234.62 324.12 236.12 C326.62 237.62 331.62 234.95 330.12 232.12 C317.62 208.62 298.12 216.12 298.12 216.12 C298.12 216.12 293.62 214.12 300.12 219.12 zM235.62 168.62 C216.12 168.62 282.12 222.62 301.12 212.12 C305.06 209.94 296.12 208.62 297.62 197.12 C297.9 195.02 284.12 191.12 284.12 178.12 C284.12 173.88 276.2 172.12 251.12 172.12 C246.62 172.12 256.03 168.62 235.62 168.62 zM307.62 213.62 C325.89 215.65 330.23 229.8 332.62 228.12 C361.12 208.12 309.89 199.96 300.62 201.12 C296.62 201.62 303.12 213.12 307.62 213.62 zM238.62 164.12 C242.12 166.62 254.12 176.62 292.62 168.12 C294.09 167.8 263.62 167.62 259.62 166.62 C255.62 165.62 236.25 162.43 238.62 164.12 zM305.12 198.62 C342.62 207.62 332.72 201.36 334.12 200.62 C342.62 196.12 333.33 195.23 334.62 193.62 C338.83 188.36 327.62 185.12 304.12 182.62 C298.56 182.03 287.54 179.27 287.12 180.12 C283.62 187.12 300.33 197.47 305.12 198.62 zM311.12 182.12 C343.62 187.62 323.23 177.43 323.62 177.12 C335.12 168.12 297.12 168.12 297.12 168.12 C297.12 168.12 280.79 172 281.12 172.62 C285.62 181.12 307.15 181.45 311.12 182.12 zM249.62 253.62 C249.62 253.62 220.62 207.12 226.62 188.12 C227.83 184.31 213.62 165.62 220.12 197.12 C220.22 197.61 218.89 190.43 216.62 187.12 C214.35 183.81 211.18 184.9 213.12 194.62 C218.01 219.05 249.62 253.62 249.62 253.62 zM289.12 83.62 C296.62 81.62 293.12 79.12 288.62 78.12 C284.12 77.12 281.62 85.62 289.12 83.62 zM187.4 149.12 C163.12 135.42 137.04 125.87 135.23 126.12 C113.96 129.12 120.58 131.12 88.64 131.12 C62.81 131.12 70.91 159.62 83.07 155.62 C86.29 154.56 134.8 148.06 160.56 155.12 C164.37 156.17 170.65 153.02 173.73 153.12 C188.92 153.62 190.95 151.12 187.4 149.12 zM161.57 110.62 C168.15 116.62 195 154.62 184.87 140.62 C174.74 126.62 144.35 93.62 132.7 90.12 C127.46 88.55 142.83 100.62 142.83 100.62 C142.83 100.62 129.16 89.62 123.58 88.62 C118.01 87.62 93.03 86.69 100.29 92.62 C114.97 104.62 113.08 108 114.47 108.62 C135.74 118.12 135.87 123.18 138.27 124.12 C177.78 139.62 190.4 148.4 192.97 148.12 C211.71 146.12 154.99 104.62 161.57 110.62 zM133.71 123.12 C135.07 122.65 130.68 116.62 113.96 110.62 C107.49 108.3 85.16 107.58 73.44 109.12 C65.85 110.12 64.31 131.53 79.01 128.62 C84.08 127.62 104.84 133.12 133.71 123.12 zM111.43 107.12 C111.43 107.12 97.75 80.12 65.34 91.62 C64.95 91.76 64.33 94.62 60.78 97.12 C56.23 100.33 43.08 105.53 45.59 105.12 C48.63 104.62 62.55 97.6 62.81 101.62 C63.31 109.62 73.53 107.36 79.52 106.62 C83.57 106.12 111.43 107.12 111.43 107.12 zM51.16 56.12 C79.09 58.28 45.08 37.12 30.39 53.62 C27.31 57.08 18.24 54.62 13.17 62.62 C12.57 63.57 18.74 53.62 51.16 56.12 zM67.37 67.62 C69.39 64.62 42.47 52.23 33.43 64.12 C31.91 66.12 25.83 64.62 18.74 71.62 C17.73 72.62 23.8 66.62 37.48 66.62 C41.03 66.62 65.34 70.62 67.37 67.62 zM84.59 76.12 C105.86 81.12 96.74 88.62 94.21 88.12 C74.53 84.24 80.15 75.08 84.59 76.12 zM79.52 67.12 C84.22 70.43 83.57 53.12 73.95 52.12 C64.33 51.12 72.43 62.12 79.52 67.12 zM106.87 78.12 C108.22 75.45 104.84 68.62 100.29 68.12 C95.73 67.62 85.09 70.12 99.27 75.62 C102.02 76.69 103.83 84.12 106.87 78.12 zM59.77 115.12 C55.72 112.62 50.14 118.62 54.7 121.12 C59.26 123.62 63.82 117.62 59.77 115.12 zM76.99 80.12 C80.22 81.03 71.42 76.12 64.33 75.62 C61.75 75.44 50.26 68.2 42.55 79.62 C41.53 81.12 36.75 79.84 29.38 87.12 C27.86 88.62 36.85 79.87 45.08 83.12 C47.61 84.12 52.41 90.39 64.33 78.62 C65.85 77.12 73.44 79.12 76.99 80.12 zM34.44 38.12 C32.64 37.85 23.3 39.12 30.39 44.12 C37.48 49.12 41.03 39.12 34.44 38.12 zM183.86 175.62 C163.09 198.12 142.32 206.12 140.8 208.62 C113.81 253.03 122.53 253.32 124.09 256.12 C129.66 266.12 134.52 248.2 133.21 252.62 C123.58 285.12 185.88 187.62 191.45 181.12 C196.08 175.72 187 172.21 183.86 175.62 zM135.74 213.12 C135.74 213.12 114.13 210.62 104.84 238.12 C103.83 241.12 94.05 253.01 107.38 248.62 C108.9 248.12 115.99 260.62 118.52 249.62 C119.34 246.07 130.68 222.62 135.23 215.62 C139.79 208.62 135.74 213.12 135.74 213.12 zM186.89 192.12 C183.64 196.14 134.02 258.96 141.82 265.12 C144.35 267.12 149.27 274.09 162.08 256.12 C190.95 215.62 190.95 187.12 186.89 192.12 zM117 216.12 C117 216.12 97.25 208.62 84.59 232.12 C83.06 234.95 88.13 237.62 90.66 236.12 C93.2 234.62 87.12 243.12 97.25 244.62 C101.06 245.19 108.39 224.12 114.97 219.12 C121.56 214.12 117 216.12 117 216.12 zM164.61 172.12 C139.2 172.12 131.18 173.88 131.18 178.12 C131.18 191.12 117.23 195.02 117.51 197.12 C119.03 208.62 109.97 209.94 113.96 212.12 C133.21 222.62 200.06 168.62 180.31 168.62 C159.64 168.62 169.17 172.12 164.61 172.12 zM114.47 201.12 C105.08 199.96 53.18 208.12 82.05 228.12 C84.47 229.8 88.87 215.65 107.38 213.62 C111.94 213.12 118.52 201.62 114.47 201.12 zM156 166.62 C151.95 167.62 121.09 167.8 122.57 168.12 C161.57 176.62 173.73 166.62 177.27 164.12 C179.67 162.43 160.05 165.62 156 166.62 zM128.14 180.12 C127.71 179.27 116.55 182.03 110.92 182.62 C87.12 185.12 75.76 188.36 80.03 193.62 C81.33 195.23 71.92 196.12 80.53 200.62 C81.95 201.36 71.92 207.62 109.91 198.62 C114.76 197.47 131.69 187.12 128.14 180.12 zM134.22 172.62 C134.56 172 118.01 168.12 118.01 168.12 C118.01 168.12 79.52 168.12 91.17 177.12 C91.57 177.43 70.91 187.62 103.83 182.12 C107.86 181.45 129.66 181.12 134.22 172.62 zM203.1 194.62 C205.07 184.9 201.85 183.81 199.56 187.12 C197.26 190.43 195.91 197.61 196.01 197.12 C202.6 165.62 188.21 184.31 189.43 188.12 C195.5 207.12 166.13 253.62 166.13 253.62 C166.13 253.62 198.15 219.05 203.1 194.62 zM126.62 78.12 C122.06 79.12 118.52 81.62 126.12 83.62 C133.71 85.62 131.18 77.12 126.62 78.12 z").setFill("black");
+    g.createPath("M363.73 85.73 C359.27 86.29 355.23 86.73 354.23 81.23 C353.23 75.73 355.73 73.73 363.23 75.73 C370.73 77.73 375.73 84.23 363.73 85.73 zM327.23 89.23 C327.23 89.23 308.51 93.65 325.73 80.73 C333.73 74.73 334.23 79.73 334.73 82.73 C335.48 87.2 327.23 89.23 327.23 89.23 zM384.23 48.73 C375.88 47.06 376.23 42.23 385.23 40.23 C386.7 39.91 389.23 49.73 384.23 48.73 zM389.23 48.73 C391.73 48.23 395.73 49.23 396.23 52.73 C396.73 56.23 392.73 58.23 390.23 56.23 C387.73 54.23 386.73 49.23 389.23 48.73 zM383.23 59.73 C385.73 58.73 393.23 60.23 392.73 63.23 C392.23 66.23 386.23 66.73 383.73 65.23 C381.23 63.73 380.73 60.73 383.23 59.73 zM384.23 77.23 C387.23 74.73 390.73 77.23 391.73 78.73 C392.73 80.23 387.73 82.23 386.23 82.73 C384.73 83.23 381.23 79.73 384.23 77.23 zM395.73 40.23 C395.73 40.23 399.73 40.23 398.73 41.73 C397.73 43.23 394.73 43.23 394.73 43.23 zM401.73 49.23 C401.73 49.23 405.73 49.23 404.73 50.73 C403.73 52.23 400.73 52.23 400.73 52.23 zM369.23 97.23 C369.23 97.23 374.23 99.23 373.23 100.73 C372.23 102.23 370.73 104.73 367.23 101.23 C363.73 97.73 369.23 97.23 369.23 97.23 zM355.73 116.73 C358.73 114.23 362.23 116.73 363.23 118.23 C364.23 119.73 359.23 121.73 357.73 122.23 C356.23 122.73 352.73 119.23 355.73 116.73 zM357.73 106.73 C360.73 104.23 363.23 107.73 364.23 109.23 C365.23 110.73 361.23 111.73 359.73 112.23 C358.23 112.73 354.73 109.23 357.73 106.73 zM340.73 73.23 C337.16 73.43 331.23 71.73 340.23 65.73 C348.55 60.19 348.23 61.73 348.73 64.73 C349.48 69.2 344.3 73.04 340.73 73.23 zM310.23 82.23 C310.23 82.23 306.73 79.23 313.73 73.23 C321.33 66.73 320.23 69.23 320.73 72.23 C321.48 76.7 310.23 82.23 310.23 82.23 zM341.23 55.73 C341.23 55.73 347.23 54.73 346.23 56.23 C345.23 57.73 342.73 63.23 339.23 59.73 C335.73 56.23 341.23 55.73 341.23 55.73 zM374.73 86.23 C376.11 86.23 377.23 87.36 377.23 88.73 C377.23 90.11 376.11 91.23 374.73 91.23 C373.36 91.23 372.23 90.11 372.23 88.73 C372.23 87.36 373.36 86.23 374.73 86.23 zM369.73 110.73 C371.11 110.73 372.23 111.86 372.23 113.23 C372.23 114.61 371.11 115.73 369.73 115.73 C368.36 115.73 367.23 114.61 367.23 113.23 C367.23 111.86 368.36 110.73 369.73 110.73 zM365.73 120.73 C367.11 120.73 368.23 121.86 368.23 123.23 C368.23 124.61 367.11 125.73 365.73 125.73 C364.36 125.73 363.23 124.61 363.23 123.23 C363.23 121.86 364.36 120.73 365.73 120.73 zM349.73 127.23 C351.11 127.23 352.23 128.36 352.23 129.73 C352.23 131.11 351.11 132.23 349.73 132.23 C348.36 132.23 347.23 131.11 347.23 129.73 C347.23 128.36 348.36 127.23 349.73 127.23 zM358.23 128.73 C359.61 128.73 362.23 130.86 362.23 132.23 C362.23 133.61 359.61 133.73 358.23 133.73 C356.86 133.73 355.73 132.61 355.73 131.23 C355.73 129.86 356.86 128.73 358.23 128.73 zM382.23 89.73 C383.61 89.73 384.73 90.86 384.73 92.23 C384.73 93.61 383.61 94.73 382.23 94.73 C380.86 94.73 379.73 93.61 379.73 92.23 C379.73 90.86 380.86 89.73 382.23 89.73 zM395.73 66.23 C397.11 66.23 398.23 67.36 398.23 68.73 C398.23 70.11 397.11 71.23 395.73 71.23 C394.36 71.23 393.23 70.11 393.23 68.73 C393.23 67.36 394.36 66.23 395.73 66.23 zM300.73 74.23 C303.05 75.16 314.23 67.73 310.73 66.73 C307.23 65.73 298.23 73.23 300.73 74.23 zM319.73 61.23 C322.23 61.73 329.73 58.73 326.23 57.73 C322.73 56.73 317.09 60.71 319.73 61.23 zM271.73 91.73 C277.23 88.73 292.73 81.23 285.23 82.23 C277.73 83.23 267.01 94.31 271.73 91.73 zM364.23 42.23 C366.73 42.73 374.23 39.73 370.73 38.73 C367.23 37.73 361.59 41.71 364.23 42.23 zM292.23 78.73 C294.73 79.23 299.73 76.73 296.23 75.73 C292.73 74.73 289.59 78.21 292.23 78.73 zM355.23 141.23 C356.61 141.23 357.73 142.86 357.73 144.23 C357.73 145.61 357.11 145.73 355.73 145.73 C354.36 145.73 353.23 144.61 353.23 143.23 C353.23 141.86 353.86 141.23 355.23 141.23 zM347.73 140.73 C349.11 140.73 351.23 141.36 351.23 142.73 C351.23 144.11 348.61 143.73 347.23 143.73 C345.86 143.73 344.73 142.61 344.73 141.23 C344.73 139.86 346.36 140.73 347.73 140.73 zM349.73 155.23 C351.11 155.23 353.73 157.36 353.73 158.73 C353.73 160.11 351.11 160.23 349.73 160.23 C348.36 160.23 347.23 159.11 347.23 157.73 C347.23 156.36 348.36 155.23 349.73 155.23 zM337.73 175.73 C341.73 174.73 341.73 176.73 342.73 180.23 C343.73 183.73 350.8 195.11 339.23 181.23 C336.73 178.23 333.73 176.73 337.73 175.73 zM349.73 187.73 C351.11 187.73 352.23 188.86 352.23 190.23 C352.23 191.61 351.11 192.73 349.73 192.73 C348.36 192.73 347.23 191.61 347.23 190.23 C347.23 188.86 348.36 187.73 349.73 187.73 zM352.23 196.73 C353.61 196.73 354.73 197.86 354.73 199.23 C354.73 200.61 353.61 201.73 352.23 201.73 C350.86 201.73 349.73 200.61 349.73 199.23 C349.73 197.86 350.86 196.73 352.23 196.73 zM352.4 205.73 C353.77 205.73 355.73 208.86 355.73 210.23 C355.73 211.61 354.61 212.73 353.23 212.73 C351.86 212.73 349.07 211.11 349.07 209.73 C349.07 208.36 351.02 205.73 352.4 205.73 zM353.73 221.73 C355.11 221.73 354.73 221.86 354.73 223.23 C354.73 224.61 354.61 223.73 353.23 223.73 C351.86 223.73 352.23 224.61 352.23 223.23 C352.23 221.86 352.36 221.73 353.73 221.73 zM340.23 188.73 C341.61 188.73 341.23 188.86 341.23 190.23 C341.23 191.61 341.11 190.73 339.73 190.73 C338.36 190.73 338.73 191.61 338.73 190.23 C338.73 188.86 338.86 188.73 340.23 188.73 zM343.23 201.23 C344.61 201.23 344.23 201.36 344.23 202.73 C344.23 204.11 344.44 207.73 343.07 207.73 C341.69 207.73 341.73 204.11 341.73 202.73 C341.73 201.36 341.86 201.23 343.23 201.23 zM346.73 215.23 C348.11 215.23 347.73 215.36 347.73 216.73 C347.73 218.11 347.61 217.23 346.23 217.23 C344.86 217.23 345.23 218.11 345.23 216.73 C345.23 215.36 345.36 215.23 346.73 215.23 zM340.57 228.73 C341.94 228.73 341.73 228.86 341.73 230.23 C341.73 231.61 341.44 230.73 340.07 230.73 C338.69 230.73 339.23 231.61 339.23 230.23 C339.23 228.86 339.19 228.73 340.57 228.73 zM349.4 232.07 C350.77 232.07 352.07 234.02 352.07 235.4 C352.07 236.77 349.11 239.23 347.73 239.23 C346.36 239.23 346.73 240.11 346.73 238.73 C346.73 237.36 348.02 232.07 349.4 232.07 zM343.73 246.4 C345.11 246.4 347.4 246.02 347.4 247.4 C347.4 248.77 344.11 251.23 342.73 251.23 C341.36 251.23 341.73 252.11 341.73 250.73 C341.73 249.36 342.36 246.4 343.73 246.4 zM335.23 239.23 C336.61 239.23 336.23 239.36 336.23 240.73 C336.23 242.11 336.11 241.23 334.73 241.23 C333.36 241.23 333.73 242.11 333.73 240.73 C333.73 239.36 333.86 239.23 335.23 239.23 zM332.73 258.4 C334.11 258.4 335.4 260.02 335.4 261.4 C335.4 262.77 333.11 262.23 331.73 262.23 C330.36 262.23 330.73 263.11 330.73 261.73 C330.73 260.36 331.36 258.4 332.73 258.4 zM324.4 263.73 C325.77 263.73 325.07 265.36 325.07 266.73 C325.07 268.11 320.11 271.23 318.73 271.23 C317.36 271.23 317.73 272.11 317.73 270.73 C317.73 269.36 323.02 263.73 324.4 263.73 zM325.23 247.73 C326.61 247.73 326.23 247.86 326.23 249.23 C326.23 250.61 326.11 249.73 324.73 249.73 C323.36 249.73 323.73 250.61 323.73 249.23 C323.73 247.86 323.86 247.73 325.23 247.73 zM313.23 256.23 C314.61 256.23 319.07 258.02 319.07 259.4 C319.07 260.77 313.44 263.07 312.07 263.07 C310.69 263.07 309.73 260.77 309.73 259.4 C309.73 258.02 311.86 256.23 313.23 256.23 zM300.23 260.73 C301.61 260.73 301.23 260.86 301.23 262.23 C301.23 263.61 301.11 262.73 299.73 262.73 C298.36 262.73 298.73 263.61 298.73 262.23 C298.73 260.86 298.86 260.73 300.23 260.73 zM308.23 272.73 C309.61 272.73 309.23 272.86 309.23 274.23 C309.23 275.61 309.11 274.73 307.73 274.73 C306.36 274.73 306.73 275.61 306.73 274.23 C306.73 272.86 306.86 272.73 308.23 272.73 zM305.23 273.73 C306.61 273.73 306.23 273.86 306.23 275.23 C306.23 276.61 306.11 275.73 304.73 275.73 C303.36 275.73 303.73 276.61 303.73 275.23 C303.73 273.86 303.86 273.73 305.23 273.73 zM293.73 274.07 C294.65 274.07 295.73 275.48 295.73 276.4 C295.73 277.32 295.65 276.73 294.73 276.73 C293.82 276.73 291.4 277.98 291.4 277.07 C291.4 276.15 292.82 274.07 293.73 274.07 zM296.73 276.73 C297.65 276.73 297.4 276.82 297.4 277.73 C297.4 278.65 297.32 278.07 296.4 278.07 C295.48 278.07 295.73 278.65 295.73 277.73 C295.73 276.82 295.82 276.73 296.73 276.73 zM291.4 263.73 C292.32 263.73 293.73 267.15 293.73 268.07 C293.73 268.98 290.65 268.73 289.73 268.73 C288.82 268.73 287.4 265.98 287.4 265.07 C287.4 264.15 290.48 263.73 291.4 263.73 zM280.07 274.73 C281.44 274.73 281.23 274.86 281.23 276.23 C281.23 277.61 280.94 276.73 279.57 276.73 C278.19 276.73 278.73 277.61 278.73 276.23 C278.73 274.86 278.69 274.73 280.07 274.73 zM277.07 267.73 C278.44 267.73 276.4 271.02 276.4 272.4 C276.4 273.77 271.94 274.23 270.57 274.23 C269.19 274.23 271.73 272.44 271.73 271.07 C271.73 269.69 275.69 267.73 277.07 267.73 zM52.23 84.9 C56.7 85.46 60.73 85.9 61.73 80.4 C62.73 74.9 60.23 72.9 52.73 74.9 C45.23 76.9 40.23 83.4 52.23 84.9 zM88.73 88.4 C88.73 88.4 107.45 92.81 90.23 79.9 C82.23 73.9 81.73 78.9 81.23 81.9 C80.49 86.37 88.73 88.4 88.73 88.4 zM31.73 47.9 C40.08 46.23 39.73 41.4 30.73 39.4 C29.27 39.07 26.73 48.9 31.73 47.9 zM26.73 47.9 C24.23 47.4 20.23 48.4 19.73 51.9 C19.23 55.4 23.23 57.4 25.73 55.4 C28.23 53.4 29.23 48.4 26.73 47.9 zM32.73 58.9 C30.23 57.9 22.73 59.4 23.23 62.4 C23.73 65.4 29.73 65.9 32.23 64.4 C34.73 62.9 35.23 59.9 32.73 58.9 zM31.73 76.4 C28.73 73.9 25.23 76.4 24.23 77.9 C23.23 79.4 28.23 81.4 29.73 81.9 C31.23 82.4 34.73 78.9 31.73 76.4 zM20.23 39.4 C20.23 39.4 16.23 39.4 17.23 40.9 C18.23 42.4 21.23 42.4 21.23 42.4 zM14.23 48.4 C14.23 48.4 10.23 48.4 11.23 49.9 C12.23 51.4 15.23 51.4 15.23 51.4 zM46.73 96.4 C46.73 96.4 41.73 98.4 42.73 99.9 C43.73 101.4 45.23 103.9 48.73 100.4 C52.23 96.9 46.73 96.4 46.73 96.4 zM60.23 115.9 C57.23 113.4 53.73 115.9 52.73 117.4 C51.73 118.9 56.73 120.9 58.23 121.4 C59.73 121.9 63.23 118.4 60.23 115.9 zM58.23 105.9 C55.23 103.4 52.73 106.9 51.73 108.4 C50.73 109.9 54.73 110.9 56.23 111.4 C57.73 111.9 61.23 108.4 58.23 105.9 zM75.23 72.4 C78.8 72.6 84.73 70.9 75.73 64.9 C67.41 59.35 67.73 60.9 67.23 63.9 C66.49 68.37 71.66 72.2 75.23 72.4 zM105.73 81.4 C105.73 81.4 109.23 78.4 102.23 72.4 C94.64 65.89 95.73 68.4 95.23 71.4 C94.49 75.87 105.73 81.4 105.73 81.4 zM74.73 54.9 C74.73 54.9 68.73 53.9 69.73 55.4 C70.73 56.9 73.23 62.4 76.73 58.9 C80.23 55.4 74.73 54.9 74.73 54.9 zM41.23 85.4 C39.86 85.4 38.73 86.53 38.73 87.9 C38.73 89.28 39.86 90.4 41.23 90.4 C42.61 90.4 43.73 89.28 43.73 87.9 C43.73 86.53 42.61 85.4 41.23 85.4 zM46.23 109.9 C44.86 109.9 43.73 111.03 43.73 112.4 C43.73 113.78 44.86 114.9 46.23 114.9 C47.61 114.9 48.73 113.78 48.73 112.4 C48.73 111.03 47.61 109.9 46.23 109.9 zM50.23 119.9 C48.86 119.9 47.73 121.03 47.73 122.4 C47.73 123.78 48.86 124.9 50.23 124.9 C51.61 124.9 52.73 123.78 52.73 122.4 C52.73 121.03 51.61 119.9 50.23 119.9 zM66.23 126.4 C64.86 126.4 63.73 127.53 63.73 128.9 C63.73 130.28 64.86 131.4 66.23 131.4 C67.61 131.4 68.73 130.28 68.73 128.9 C68.73 127.53 67.61 126.4 66.23 126.4 zM57.73 127.9 C56.36 127.9 53.73 130.03 53.73 131.4 C53.73 132.78 56.36 132.9 57.73 132.9 C59.11 132.9 60.23 131.78 60.23 130.4 C60.23 129.03 59.11 127.9 57.73 127.9 zM33.73 88.9 C32.36 88.9 31.23 90.03 31.23 91.4 C31.23 92.78 32.36 93.9 33.73 93.9 C35.11 93.9 36.23 92.78 36.23 91.4 C36.23 90.03 35.11 88.9 33.73 88.9 zM20.23 65.4 C18.86 65.4 17.73 66.53 17.73 67.9 C17.73 69.28 18.86 70.4 20.23 70.4 C21.61 70.4 22.73 69.28 22.73 67.9 C22.73 66.53 21.61 65.4 20.23 65.4 zM115.23 73.4 C112.91 74.33 101.73 66.9 105.23 65.9 C108.73 64.9 117.73 72.4 115.23 73.4 zM96.23 60.4 C93.73 60.9 86.23 57.9 89.73 56.9 C93.23 55.9 98.87 59.87 96.23 60.4 zM144.23 90.9 C138.73 87.9 123.23 80.4 130.73 81.4 C138.23 82.4 148.96 93.48 144.23 90.9 zM51.73 41.4 C49.23 41.9 41.73 38.9 45.23 37.9 C48.73 36.9 54.37 40.87 51.73 41.4 zM123.73 77.9 C121.23 78.4 116.23 75.9 119.73 74.9 C123.23 73.9 126.37 77.37 123.73 77.9 zM60.73 140.4 C59.36 140.4 58.23 142.03 58.23 143.4 C58.23 144.78 58.86 144.9 60.23 144.9 C61.61 144.9 62.73 143.78 62.73 142.4 C62.73 141.03 62.11 140.4 60.73 140.4 zM68.23 139.9 C66.86 139.9 64.73 140.53 64.73 141.9 C64.73 143.28 67.36 142.9 68.73 142.9 C70.11 142.9 71.23 141.78 71.23 140.4 C71.23 139.03 69.61 139.9 68.23 139.9 zM66.23 154.4 C64.86 154.4 62.23 156.53 62.23 157.9 C62.23 159.28 64.86 159.4 66.23 159.4 C67.61 159.4 68.73 158.28 68.73 156.9 C68.73 155.53 67.61 154.4 66.23 154.4 zM78.23 174.9 C74.23 173.9 74.23 175.9 73.23 179.4 C72.23 182.9 65.17 194.28 76.73 180.4 C79.23 177.4 82.23 175.9 78.23 174.9 zM66.23 186.9 C64.86 186.9 63.73 188.02 63.73 189.4 C63.73 190.77 64.86 191.9 66.23 191.9 C67.61 191.9 68.73 190.77 68.73 189.4 C68.73 188.02 67.61 186.9 66.23 186.9 zM63.73 195.9 C62.36 195.9 61.23 197.02 61.23 198.4 C61.23 199.77 62.36 200.9 63.73 200.9 C65.11 200.9 66.23 199.77 66.23 198.4 C66.23 197.02 65.11 195.9 63.73 195.9 zM63.57 204.9 C62.19 204.9 60.23 208.02 60.23 209.4 C60.23 210.77 61.36 211.9 62.73 211.9 C64.11 211.9 66.9 210.27 66.9 208.9 C66.9 207.52 64.94 204.9 63.57 204.9 zM62.23 220.9 C60.86 220.9 61.23 221.02 61.23 222.4 C61.23 223.77 61.36 222.9 62.73 222.9 C64.11 222.9 63.73 223.77 63.73 222.4 C63.73 221.02 63.61 220.9 62.23 220.9 zM75.73 187.9 C74.36 187.9 74.73 188.02 74.73 189.4 C74.73 190.77 74.86 189.9 76.23 189.9 C77.61 189.9 77.23 190.77 77.23 189.4 C77.23 188.02 77.11 187.9 75.73 187.9 zM72.73 200.4 C71.36 200.4 71.73 200.52 71.73 201.9 C71.73 203.27 71.53 206.9 72.9 206.9 C74.28 206.9 74.23 203.27 74.23 201.9 C74.23 200.52 74.11 200.4 72.73 200.4 zM69.23 214.4 C67.86 214.4 68.23 214.52 68.23 215.9 C68.23 217.27 68.36 216.4 69.73 216.4 C71.11 216.4 70.73 217.27 70.73 215.9 C70.73 214.52 70.61 214.4 69.23 214.4 zM75.4 227.9 C74.03 227.9 74.23 228.02 74.23 229.4 C74.23 230.77 74.53 229.9 75.9 229.9 C77.28 229.9 76.73 230.77 76.73 229.4 C76.73 228.02 76.78 227.9 75.4 227.9 zM66.57 231.23 C65.19 231.23 63.9 233.19 63.9 234.57 C63.9 235.94 66.86 238.4 68.23 238.4 C69.61 238.4 69.23 239.27 69.23 237.9 C69.23 236.52 67.94 231.23 66.57 231.23 zM72.23 245.57 C70.86 245.57 68.57 245.19 68.57 246.57 C68.57 247.94 71.86 250.4 73.23 250.4 C74.61 250.4 74.23 251.27 74.23 249.9 C74.23 248.52 73.61 245.57 72.23 245.57 zM80.73 238.4 C79.36 238.4 79.73 238.52 79.73 239.9 C79.73 241.27 79.86 240.4 81.23 240.4 C82.61 240.4 82.23 241.27 82.23 239.9 C82.23 238.52 82.11 238.4 80.73 238.4 zM83.23 257.57 C81.86 257.57 80.57 259.19 80.57 260.57 C80.57 261.94 82.86 261.4 84.23 261.4 C85.61 261.4 85.23 262.27 85.23 260.9 C85.23 259.52 84.61 257.57 83.23 257.57 zM91.57 262.9 C90.19 262.9 90.9 264.52 90.9 265.9 C90.9 267.27 95.86 270.4 97.23 270.4 C98.61 270.4 98.23 271.27 98.23 269.9 C98.23 268.52 92.94 262.9 91.57 262.9 zM90.73 246.9 C89.36 246.9 89.73 247.02 89.73 248.4 C89.73 249.77 89.86 248.9 91.23 248.9 C92.61 248.9 92.23 249.77 92.23 248.4 C92.23 247.02 92.11 246.9 90.73 246.9 zM102.73 255.4 C101.36 255.4 96.9 257.19 96.9 258.57 C96.9 259.94 102.53 262.23 103.9 262.23 C105.28 262.23 106.23 259.94 106.23 258.57 C106.23 257.19 104.11 255.4 102.73 255.4 zM115.73 259.9 C114.36 259.9 114.73 260.02 114.73 261.4 C114.73 262.77 114.86 261.9 116.23 261.9 C117.61 261.9 117.23 262.77 117.23 261.4 C117.23 260.02 117.11 259.9 115.73 259.9 zM107.73 271.9 C106.36 271.9 106.73 272.02 106.73 273.4 C106.73 274.77 106.86 273.9 108.23 273.9 C109.61 273.9 109.23 274.77 109.23 273.4 C109.23 272.02 109.11 271.9 107.73 271.9 zM110.73 272.9 C109.36 272.9 109.73 273.02 109.73 274.4 C109.73 275.77 109.86 274.9 111.23 274.9 C112.61 274.9 112.23 275.77 112.23 274.4 C112.23 273.02 112.11 272.9 110.73 272.9 zM122.23 273.23 C121.32 273.23 120.23 274.65 120.23 275.57 C120.23 276.48 120.32 275.9 121.23 275.9 C122.15 275.9 124.57 277.15 124.57 276.23 C124.57 275.32 123.15 273.23 122.23 273.23 zM119.23 275.9 C118.32 275.9 118.57 275.98 118.57 276.9 C118.57 277.82 118.65 277.23 119.57 277.23 C120.48 277.23 120.23 277.82 120.23 276.9 C120.23 275.98 120.15 275.9 119.23 275.9 zM124.57 262.9 C123.65 262.9 122.23 266.32 122.23 267.23 C122.23 268.15 125.32 267.9 126.23 267.9 C127.15 267.9 128.57 265.15 128.57 264.23 C128.57 263.32 125.48 262.9 124.57 262.9 zM135.9 273.9 C134.53 273.9 134.73 274.02 134.73 275.4 C134.73 276.77 135.03 275.9 136.4 275.9 C137.78 275.9 137.23 276.77 137.23 275.4 C137.23 274.02 137.28 273.9 135.9 273.9 zM138.9 266.9 C137.53 266.9 139.57 270.19 139.57 271.57 C139.57 272.94 144.03 273.4 145.4 273.4 C146.78 273.4 144.23 271.61 144.23 270.23 C144.23 268.86 140.28 266.9 138.9 266.9 zM211 134.8 C209.63 134.8 209.83 134.93 209.83 136.3 C209.83 137.68 210.13 136.8 211.5 136.8 C212.88 136.8 212.33 137.68 212.33 136.3 C212.33 134.93 212.38 134.8 211 134.8 zM205.5 134.8 C204.13 134.8 204.33 134.93 204.33 136.3 C204.33 137.68 204.63 136.8 206 136.8 C207.38 136.8 206.83 137.68 206.83 136.3 C206.83 134.93 206.88 134.8 205.5 134.8 zM211 143.8 C209.63 143.8 209.83 143.93 209.83 145.3 C209.83 146.68 210.13 145.8 211.5 145.8 C212.88 145.8 212.33 146.68 212.33 145.3 C212.33 143.93 212.38 143.8 211 143.8 zM204.9 143.7 C203.53 143.7 203.73 143.83 203.73 145.2 C203.73 146.58 204.03 145.7 205.4 145.7 C206.78 145.7 206.23 146.58 206.23 145.2 C206.23 143.83 206.28 143.7 204.9 143.7 zM213 154.3 C211.63 154.3 212 155.43 212 156.8 C212 158.18 212.42 161.3 213.8 161.3 C215.17 161.3 214.33 157.18 214.33 155.8 C214.33 154.43 214.38 154.3 213 154.3 zM204 154.3 C202.63 154.3 202.6 155.53 202.6 156.9 C202.6 158.28 201.63 161.5 203 161.5 C204.38 161.5 204.8 157.68 204.8 156.3 C204.8 154.93 205.38 154.3 204 154.3 z").setFill("rgb(255,246,227)");
+	//surface.createLine({x1: 0, y1: 350, x2: 700, y2: 350}).setStroke("green");
+	//surface.createLine({y1: 0, x1: 350, y2: 700, x2: 350}).setStroke("green");
+    dojo.connect(dijit.byId("rotatingSlider"), "onChange", rotatingEvent);
+    dojo.connect(dijit.byId("scalingSlider"), "onChange", scalingEvent);
+};
+
+dojo.addOnLoad(makeShapes);
+
+</script>
+<style type="text/css">
+	td.pad { padding: 0px 5px 0px 5px; }
+</style>
+</head>
+<body class="tundra">
+	<h1>dojox.gfx: Butterfly</h1>
+	<p>This example was directly converted from SVG file.</p>
+	<p>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.</p>
+	<table>
+		<tr><td align="center" class="pad">Rotation (<span id="rotationValue">0</span>)</td></tr>
+		<tr><td>
+			<div id="rotatingSlider" dojoType="dijit.form.HorizontalSlider" 
+					value="0" minimum="-180" maximum="180" discreteValues="72" showButtons="false" intermediateChanges="true"
+					style="width: 600px;">
+				<div dojoType="dijit.form.HorizontalRule" container="topDecoration" count="73" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count="9" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" labels="-180,-135,-90,-45,0,45,90,135,180" style="height:1.2em;font-size:75%;color:gray;"></div>
+			</div>
+		</td></tr>
+		<tr><td align="center" class="pad">Scaling (<span id="scaleValue">1.000</span>)</td></tr>
+		<tr><td>
+			<div id="scalingSlider" dojoType="dijit.form.HorizontalSlider"  intermediateChanges="true"
+					value="1" minimum="0" maximum="1"  showButtons="false" style="width: 600px;">
+				<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count="5" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" labels="10%,18%,32%,56%,100%" style="height:1.2em;font-size:75%;color:gray;"></div>
+			</div>
+		</td></tr>
+	</table>
+	<div id="gfx_holder" style="width: 700px; height: 700px;"></div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/career_test.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/career_test.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/career_test.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,467 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
+<head>
+<title>dojox.gfx: Career Aptitude Test</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<!--
+The next line should include Microsoft's Silverligth.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js"></script>
+
+<!--
+<script type="text/javascript" src="../Mover.js"></script>
+<script type="text/javascript" src="../Moveable.js"></script>
+<script type="text/javascript" src="../move.js"></script>
+<script type="text/javascript" src="../fx.js"></script>
+<script type="text/javascript" src="../shape.js"></script>
+-->
+
+<script type="text/javascript">
+
+dojo.require("dojox.gfx");
+dojo.require("dojox.gfx.move");
+dojo.require("dojox.gfx.fx");
+dojo.require("dojo.colors");
+dojo.require("dojo.fx");
+
+var g = dojox.gfx, m = g.matrix;
+
+var container, surface, surface_size,
+	vat, freezer, broiler, score, startTime, endTime;
+
+var totalItems = 10, goodItems = 0, badItems = 0;
+
+var radius = 30,		// pixels
+	slowRate = 10,		// speed in ms per pixel
+	fastRate = 2,		// speed in ms per pixel
+	freezeTime = 5000,	// ms
+	frostTime = 2000,	// ms
+	broilTime = 5000,	// ms
+	burnTime = 2000,	// ms
+	pulseTime = 200;	// ms
+	
+function getRand(from, to){
+	return Math.random() * (to - from) + from;
+}
+
+function inRect(rect, crd){
+	return	rect.x <= crd.x && crd.x < rect.x + rect.width &&
+			rect.y <= crd.y && crd.y < rect.y + rect.height;
+}
+
+function getCenter(circle){
+	var shape = circle.getShape(), matrix = circle.getTransform();
+	return m.multiplyPoint(matrix ? matrix : m.identity, shape.cx, shape.cy);
+}
+
+function getDuration(x1, y1, x2, y2, rate){
+	return Math.floor(Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) * rate);
+}
+
+function updateScore(){
+	var shape = score.getShape();
+	endTime = (new Date()).getTime();
+	shape.text = goodItems + " item" + (goodItems != 1 ? "s" : "") + 
+		" in " + ((endTime - startTime) / 1000) + "s"
+	score.setShape(shape);
+	
+	if(goodItems + badItems != totalItems){ return; }
+	
+	var rating = goodItems / (endTime - startTime) * 60000 * (40 - radius) / 10;
+	dojo.byId("result_pass").style.display = badItems || rating < 5 ? "none" : "";
+	dojo.byId("result_dollar").innerHTML = rating.toFixed(2);
+	dojo.byId("result_but").style.display = badItems ? "" : "none";
+	dojo.byId("result_waste").innerHTML = (badItems * 5).toFixed(2);
+	dojo.byId("result_and").style.display = badItems ? "none" : "";
+	dojo.byId("result_fail").style.display = badItems ? "" : "none";
+	if(!badItems){
+		var pos;
+		if(rating < 1){
+			pos = "Junior Speciment Flipper";
+		}else if(rating < 2){
+			pos = "Senior Speciment Flipper";
+		}else if(rating < 4){
+			pos = "Shift Supervisor";
+		}else if(rating < 6){
+			pos = "Joint Manager";
+		}else if(rating < 8){
+			pos = "Night Director";
+		}else if(rating < 10){
+			pos = "Morning Director";
+		}else if(rating < 12){
+			pos = "Vice President";
+		}else if(rating < 14){
+			pos = "Senior Vice President";
+		}else if(rating < 16){
+			pos = "Chief of Something";
+		}else{
+			pos = "Nominal President";
+		}
+		dojo.byId("result_pos").innerHTML = pos;
+	}
+	var anim1 = dojo.fx.wipeOut({
+			node: "gfx_holder",
+			duration: 500,
+			delay: 1000
+		}),
+		anim2 = dojo.fx.wipeIn({
+			node: "result",
+			duration: 500,
+			delay: 1000
+		});
+	anim1.play();
+	anim2.play();
+}
+
+function showStatus(circle, text){
+	var c = getCenter(circle),
+		status = surface.createText({});
+	status.moveToBack().setFill(new dojo.Color([0, 0, 0, 0.5]))
+		.setFont({family: "serif", variant: "small-caps", weight: "bold"})
+		.setShape({x: c.x, y: c.y, text: text, align: "middle"});
+	var anim = dojo.fx.combine([
+		g.fx.animateFill({
+			shape:		status,
+			duration:	3000,
+			color:		{end: "transparent"}
+		}),
+		g.fx.animateTransform({
+			shape:		status,
+			duration:	3000,
+			transform:	[
+				{name: "translate", start: [0, 0], end: [0, 300]},
+				{name: "original"}
+			]
+		})
+	]);
+	dojo.connect(anim, "onEnd", function(){ status.removeShape(); });
+	anim.play();
+}
+
+function moveToPile(shape, bad){
+	if(shape.moveable){
+		shape.moveable.destroy();
+		delete shape.moveable;
+	}
+	
+	var oldColor = shape.getFill(), c = getCenter(shape),
+		newX = 80 + (bad ? badItems++ : goodItems++) * 2.25 * 10,
+		newY = bad ? 445 : 415,
+		duration = getDuration(newX, newY, c.x, c.y, fastRate),
+		anim = dojo.fx.chain([
+			g.fx.animateFill({
+				shape: shape,
+				duration: 250,
+				color: {end: "transparent"}
+			}),
+			g.fx.animateTransform({
+				shape: shape,
+				duration: duration,
+				transform:	[
+					{name: "translate", start: [0, 0], end: [newX - c.x, newY - c.y]},
+					{name: "original"}
+				]
+			}),
+			g.fx.animateFill({
+				shape: shape,
+				duration: 250,
+				color: {end: oldColor}
+			}),
+			g.fx.animateTransform({
+				shape: shape,
+				duration: duration,
+				transform:	[
+					{name: "scaleAt", start: [1, newX, newY], end: [10 / radius, newX, newY]},
+					{name: "original"}
+				]
+			})
+		]);
+	dojo.connect(anim, "onEnd", updateScore);
+	anim.play();
+}
+
+function repeatMove(){
+	var rect = vat.getShape(), c = getCenter(this),
+		x = getRand(rect.x + radius, rect.x + rect.width - radius),
+		y = getRand(rect.y + radius, rect.y + rect.height - radius),
+		duration = getDuration(x, y, c.x, c.y, slowRate);
+	this.anim = g.fx.animateTransform({
+		duration:	duration,
+		shape: 		this,
+		transform:	[
+			{name: "translate", start: [0, 0], end: [x - c.x, y - c.y]},
+			{name: "original"}
+		]
+	});
+	dojo.connect(this.anim, "onEnd", this, repeatMove);
+	this.anim.play();
+}
+
+function repeatFrost(){
+	this.status = "frozen";
+	this.setStroke({color: "orange", width: 3});
+	showStatus(this, "Ready");
+	this.anim = g.fx.animateFill({
+		duration:	frostTime,
+		shape:		this,
+		color:		{end: "white"}
+	});
+	// calculate a shift
+	var dx = getRand(-radius, radius) / 2, dy = getRand(-radius, radius) / 2, sign = 1;
+	this.applyLeftTransform({dx: -dx / 2, dy: -dy / 2});
+	dojo.connect(this.anim, "onAnimate", this, function(){
+		this.applyLeftTransform({dx: sign * dx, dy: sign * dy});
+		sign = -sign;
+	});
+	dojo.connect(this.anim, "onEnd", this, function(){
+		showStatus(this, "Frozen");
+		moveToPile(this, true);
+	});
+	this.anim.play();
+}
+
+function repeatFreeze(){
+	this.status = "freezing";
+	this.setStroke({color: "black", width: 3});
+	this.anim = g.fx.animateFill({
+		duration:	freezeTime,
+		shape:		this,
+		color:		{end: "blue"}
+	});
+	// calculate a shift
+	var dx = getRand(-radius, radius) / 2, dy = getRand(-radius, radius) / 2, sign = 1;
+	this.applyLeftTransform({dx: -dx / 2, dy: -dy / 2});
+	dojo.connect(this.anim, "onAnimate", this, function(){
+		this.applyLeftTransform({dx: sign * dx, dy: sign * dy});
+		sign = -sign;
+	});
+	dojo.connect(this.anim, "onEnd", this, repeatFrost);
+	this.anim.play();
+}
+
+function repeatBurn(){
+	this.status = "burnt";
+	this.setStroke({color: "orange", width: 3});
+	showStatus(this, "Done");
+	var anim1 = g.fx.animateFill({
+		duration:	burnTime,
+		shape:		this,
+		color:		{end: "black"}
+	});
+	var anim2 = new dojo._Animation({
+		duration:	freezeTime,
+		curve:		[0, freezeTime]
+	});
+	var matrix = this.getTransform(), c = getCenter(this);
+	dojo.connect(anim2, "onAnimate", this, function(val){
+		var scale = (val % pulseTime) / pulseTime / 4 + 1;
+		this.setTransform([m.scaleAt(scale, c), matrix]);
+	});
+	this.anim = dojo.fx.combine([anim1, anim2]);
+	dojo.connect(this.anim, "onEnd", this, function(){
+		showStatus(this, "Burnt");
+		moveToPile(this, true);
+	});
+	this.anim.play();
+}
+
+function repeatBroil(){
+	this.status = "broiling";
+	this.setStroke({color: "black", width: 3});
+	var anim1 = g.fx.animateFill({
+		duration:	broilTime,
+		shape:		this,
+		color:		{end: "red"}
+	});
+	var anim2 = new dojo._Animation({
+		duration:	freezeTime,
+		curve:		[0, freezeTime]
+	});
+	var matrix = this.getTransform(), c = getCenter(this);
+	dojo.connect(anim2, "onAnimate", this, function(val){
+		var scale = (val % pulseTime) / pulseTime / 4 + 1;
+		this.setTransform([m.scaleAt(scale, c), matrix]);
+	});
+	this.anim = dojo.fx.combine([anim1, anim2]);
+	dojo.connect(this.anim, "onEnd", this, repeatBurn);
+	this.anim.play();
+}
+
+function drag(mover){
+	var shape = mover.shape;
+	shape.anim.stop();
+	shape.anim = null;
+}
+
+function drop(mover){
+	var c = getCenter(mover.shape);
+	do{	// break block
+		if(inRect(vat.getShape(), c)){
+			if(mover.shape.status == "fresh"){
+				repeatMove.call(mover.shape);
+				return;
+			}
+			break;
+		}
+		if(inRect(freezer.getShape(), c)){
+			if(mover.shape.status == "fresh"){
+				repeatFreeze.call(mover.shape);
+				return;
+			}
+			break;
+		}
+		if(inRect(broiler.getShape(), c)){
+			if(mover.shape.status == "frozen"){
+				repeatBroil.call(mover.shape);
+				return;
+			}
+			break;
+		}
+		if(mover.shape.status == "burnt"){
+			moveToPile(mover.shape, false);	// good
+			return;
+		}
+	}while(false);
+	moveToPile(mover.shape, true);	// bad
+}
+
+function makePatties(n){
+	var rect = vat.getShape();
+	for(var i = 0; i < n; ++i){
+		var cx = getRand(rect.x + radius, rect.x + rect.width - radius),
+			cy = getRand(rect.y + radius, rect.y + rect.height - radius),
+			patty = surface.createCircle({
+				cx: cx, cy: cy, r: radius
+			}).setFill("green").setStroke({
+				color: "black",
+				width: 3
+			});
+		patty.status = "fresh";
+		patty.moveable = new g.Moveable(patty);
+		repeatMove.call(patty);
+	}
+}
+
+function initGfx(){
+	container = dojo.byId("gfx_holder");
+	surface = g.createSurface(container, 500, 500);
+	surface_size = {width: 500, height: 500};
+	
+	vat = surface.createRect({x: 10, y: 210, width: 480, height: 180})
+		.setStroke({color: "black", width: 7, join: "round"});
+	surface.createText({x: 15, y: 230, text: "Ye Olde Vat v3.2"})
+		.setFill("black");
+			
+	freezer = surface.createRect({x: 10, y: 10, width: 230, height: 180})
+		.setStroke({color: "blue", width: 7, join: "round"});
+	surface.createText({x: 15, y: 30, text: "Deep Freeze 7000"})
+		.setFill("blue");
+			
+	broiler = surface.createRect({x: 260, y: 10, width: 230, height: 180})
+		.setStroke({color: "red", width: 7, join: "round"});
+	surface.createText({x: 265, y: 30, text: "Hellfire Broiler A4"})
+		.setFill("red");
+			
+	surface.createText({x: 15, y: 420, text: "Good:"})
+		.setFont({weight: "bold"}).setFill("green");
+	surface.createText({x: 15, y: 450, text: "Bad:"})
+		.setFont({weight: "bold"}).setFill("red");
+	surface.createText({x: 15, y: 480, text: "Total:"})
+		.setFont({weight: "bold"}).setFill("black");
+	score = surface.createText({x: 80, y: 485, text: "0"})
+		.setFont({weight: "bold", size: "24pt"}).setFill("black");
+	surface.createText({x: 120, y: 460, text: "DROP HERE!"})
+		.setFont({size: "50px"})
+		.setFill(new dojo.Color([0, 0, 0, 0.1])).moveToBack();
+
+	dojo.subscribe("/gfx/move/start", drag);
+	dojo.subscribe("/gfx/move/stop",  drop);
+	makePatties(totalItems);
+	
+	startTime = (new Date()).getTime();
+
+	// cancel text selection and text dragging
+	dojo.connect(container, "ondragstart",   dojo, "stopEvent");
+	dojo.connect(container, "onselectstart", dojo, "stopEvent");
+}
+
+//dojo.addOnLoad(initGfx);
+
+function startTest(level){
+	radius = level;
+	var anim = dojo.fx.wipeOut({
+		node: "explanation",
+		duration: 500
+	});
+	dojo.connect(anim, "onEnd", function(){
+		dojo.byId("gfx_holder").style.display = "";
+		initGfx();
+	});
+	anim.play();
+}
+
+</script>
+
+<style type="text/css">
+.movable { cursor: pointer; }
+</style>
+
+</head>
+<body>
+<h1>dojox.gfx: Career Aptitude Test</h1>
+<p>Warning: Canvas renderer doesn't implement event handling.</p>
+
+<div id="explanation">
+<p>Thank you for your interest in <em>"I can't believe it's manure" Eateries&trade;</em> 
+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.</p>
+<p>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:
+</p>
+<ol>
+	<li>Fish out a live speciment of <em>dung-42</em> from the container.</li>
+	<li>Freeze it until you see an orange glow to kill the elements and make it less green.</li>
+	<li>Broil it until you see the orange glow again, and drop it on the table below.</li>
+	<li>You have to process all items without wasting resources and in minimal time.</li>
+</ol>
+<p>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.</p>
+<p>Use your head and your mouse!</p>
+<p>Please select the desired position:</p>
+<table>
+	<tr>
+		<td>Workstation Supervisor&nbsp;</td>
+		<td><button onclick="startTest(30);">Apply</button></td>
+	</tr>
+	<tr>
+		<td>Shift Director&nbsp;</td>
+		<td><button onclick="startTest(20);">Apply</button></td>
+	</tr>
+	<tr>
+		<td>Vice President #49653&nbsp;</td>
+		<td><button onclick="startTest(10);">Apply</button></td>
+	</tr>
+</table>
+</div>
+
+<div id="gfx_holder" style="width: 500px; height: 500px; display: none;"></div>
+
+<div id="result" style="display: none;">
+<p id="result_pass"><strong>Impressive! Please contact us immediately.</strong></p>
+<p>You have made $<span id="result_dollar"></span> per minute for us.
+<span id="result_but">But you wasted $<span id="result_waste"></span> in materials.</span>
+<span id="result_and">It qualifies you to be a <em id="result_pos"></em>.</span>
+</p>
+<p id="result_fail">Should our hiring managers have an interest in your skills and
+capabilities, they will contact you directly. In addition, we will keep
+your resume on file for one year.</p>
+</div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/circles.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/circles.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/circles.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,90 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
+<head>
+<title>dojox.gfx: 100 draggable circles</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<!--
+The next line should include Microsoft's Silverligth.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js"></script>
+<script type="text/javascript">
+
+dojo.require("dojox.gfx");
+dojo.require("dojox.gfx.move");
+
+var container = null,
+	surface = null,
+	surface_size = null;
+
+function getRand(from, to){
+	return Math.random() * (to - from) + from;
+}
+
+var skew_stat_factor = 15;
+
+function getRandSkewed(from, to){
+	// let skew stats to smaller values
+	var seed = 0;
+	for(var i = 0; i < skew_stat_factor; ++i){
+		seed += Math.random();
+	}
+	seed = 2 * Math.abs(seed / skew_stat_factor - 0.5);
+	return seed * (to - from) + from;
+}
+
+function randColor(alpha){
+	var red   = Math.floor(getRand(0, 255)),
+		green = Math.floor(getRand(0, 255)),
+		blue  = Math.floor(getRand(0, 255)),
+		opacity = alpha ? getRand(0.1, 1) : 1;
+	return [red, green, blue, opacity];
+}
+
+var gShapes = {}
+var gShapeCounter = 0;
+
+function makeCircleGrid(itemCount){
+	var minR = 10, maxR = surface_size.width / 3;
+	for(var j = 0; j < itemCount; ++j){
+		var r = getRandSkewed(minR, maxR),
+			cx = getRand(r, surface_size.width  - r),
+			cy = getRand(r, surface_size.height - r),
+			shape = surface.createCircle({cx: cx, cy: cy, r: r})
+				.setFill(randColor(true))
+				.setStroke({color: randColor(true), width: getRand(0, 3)})
+				;
+		new dojox.gfx.Moveable(shape);
+	}
+}
+
+function initGfx(){
+	container = dojo.byId("gfx_holder");
+	surface = dojox.gfx.createSurface(container, 500, 500);
+	surface_size = {width: 500, height: 500};
+
+	makeCircleGrid(100);
+
+	// cancel text selection and text dragging
+	dojo.connect(container, "ondragstart",   dojo, "stopEvent");
+	dojo.connect(container, "onselectstart", dojo, "stopEvent");
+}
+
+dojo.addOnLoad(initGfx);
+
+</script>
+
+<style type="text/css">
+.movable { cursor: pointer; }
+</style>
+
+</head>
+<body>
+<h1>dojox.gfx: 100 draggable circles</h1>
+<p>Warning: Canvas renderer doesn't implement event handling.</p>
+<div id="gfx_holder" style="width: 500px; height: 500px;"></div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clock.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clock.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clock.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,253 @@
+<html>
+<head>
+<title>dojox.gfx: interactive analog clock</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<!--
+The next line should include Microsoft's Silverlight.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js"></script>
+<script type="text/javascript">
+
+dojo.require("dojox.gfx");
+dojo.require("dojo.date.locale");
+
+var current_time = new Date();
+
+var hour_hand   = null;
+var minute_hand = null;
+var second_hand = null;
+
+var hour_shadow   = null;
+var minute_shadow = null;
+var second_shadow = null;
+
+var center = {x: 385 / 2, y: 385 / 2};
+
+var hour_shadow_shift   = {dx: 2, dy: 2};
+var minute_shadow_shift = {dx: 3, dy: 3};
+var second_shadow_shift = {dx: 4, dy: 4};
+
+var selected_hand = null;
+var container = null;
+var container_position = null;
+var text_time = null;
+var diff_time = new Date();
+
+placeHand = function(shape, angle, shift){
+	var move = {dx: center.x + (shift ? shift.dx : 0), dy: center.y + (shift ? shift.dy : 0)};
+	return shape.setTransform([move, dojox.gfx.matrix.rotateg(angle)]);
+};
+
+placeHourHand = function(h, m, s){
+	var angle = 30 * (h % 12 + m / 60 + s / 3600);
+	placeHand(hour_hand, angle);
+	placeHand(hour_shadow, angle, hour_shadow_shift);
+};
+
+placeMinuteHand = function(m, s){
+	var angle = 6 * (m + s / 60);
+	placeHand(minute_hand, angle);
+	placeHand(minute_shadow, angle, minute_shadow_shift);
+};
+
+placeSecondHand = function(s){
+	var angle = 6 * s;
+	placeHand(second_hand, angle);
+	placeHand(second_shadow, angle, second_shadow_shift);
+};
+
+reflectTime = function(time, hold_second_hand, hold_minute_hand, hold_hour_hand){
+	if(!time) time = current_time;
+	var h = time.getHours();
+	var m = time.getMinutes();
+	var s = time.getSeconds();
+	if(!hold_hour_hand) placeHourHand(h, m, s);
+	if(!hold_minute_hand) placeMinuteHand(m, s);
+	if(!hold_second_hand) placeSecondHand(s);
+	text_time.innerHTML = dojo.date.locale.format(
+		time, {selector: "time", timePattern: "h:mm:ss a"});
+};
+
+resetTime = function(){
+	current_time = new Date();
+	reflectTime();
+};
+
+tick = function(){
+	current_time.setSeconds(current_time.getSeconds() + 1);
+	reflectTime();
+};
+
+advanceTime = function(){
+	if(!selected_hand) {
+		tick();
+	}
+};
+
+normalizeAngle = function(angle){
+	if(angle > Math.PI) {
+		angle -= 2 * Math.PI;
+	} else if(angle < -Math.PI) {
+		angle += 2 * Math.PI;
+	}
+	return angle;
+};
+
+calculateAngle = function(x, y, handAngle){
+	try {
+		return normalizeAngle(Math.atan2(y - center.y, x - center.x) - handAngle);
+	} catch(e) {
+		// supress
+	}
+	return 0;
+};
+
+getSecondAngle = function(time){
+	if(!time) time = current_time;
+	return (6 * time.getSeconds() - 90) / 180 * Math.PI;
+};
+
+getMinuteAngle = function(time){
+	if(!time) time = current_time;
+	return (6 * (time.getMinutes() + time.getSeconds() / 60) - 90) / 180 * Math.PI;
+};
+
+getHourAngle = function(time){
+	if(!time) time = current_time;
+	return (30 * (time.getHours() + (time.getMinutes() + time.getSeconds() / 60) / 60) - 90) / 180 * Math.PI;
+};
+
+onMouseDown = function(evt){
+	selected_hand = evt.target;
+	diff_time.setTime(current_time.getTime());
+	dojo.stopEvent(evt);
+};
+
+onMouseMove = function(evt){
+	if(!selected_hand) return;
+	if(evt.target == second_hand.getEventSource() || 
+			evt.target == minute_hand.getEventSource() || 
+			evt.target == hour_hand.getEventSource()){
+		dojo.stopEvent(evt);
+		return;
+	}
+	if(dojox.gfx.equalSources(selected_hand, second_hand.getEventSource())){
+		var angle = calculateAngle(
+			evt.clientX - container_position.x, 
+			evt.clientY - container_position.y, 
+			normalizeAngle(getSecondAngle())
+		);
+		var diff = Math.round(angle / Math.PI * 180 / 6); // in whole seconds
+		current_time.setSeconds(current_time.getSeconds() + Math.round(diff));
+		reflectTime();
+	}else if(dojox.gfx.equalSources(selected_hand, minute_hand.getEventSource())){
+		var angle = calculateAngle(
+			evt.clientX - container_position.x, 
+			evt.clientY - container_position.y, 
+			normalizeAngle(getMinuteAngle(diff_time))
+		);
+		var diff = Math.round(angle / Math.PI * 180 / 6 * 60); // in whole seconds
+		diff_time.setTime(diff_time.getTime() + 1000 * diff);
+		reflectTime(diff_time, true);
+		
+	}else if(dojox.gfx.equalSources(selected_hand, hour_hand.getEventSource())){
+		var angle = calculateAngle(
+			evt.clientX - container_position.x, 
+			evt.clientY - container_position.y, 
+			normalizeAngle(getHourAngle(diff_time))
+		);
+		var diff = Math.round(angle / Math.PI * 180 / 30 * 60 * 60); // in whole seconds
+		diff_time.setTime(diff_time.getTime() + 1000 * diff);
+		reflectTime(diff_time, true, true);
+	}else{
+		return;
+	}
+	dojo.stopEvent(evt);
+};
+
+onMouseUp = function(evt){
+	if(selected_hand && !dojox.gfx.equalSources(selected_hand, second_hand.getEventSource())){
+		current_time.setTime(diff_time.getTime());
+		reflectTime();
+	}
+	selected_hand = null;
+	dojo.stopEvent(evt);
+};
+
+makeShapes = function(){
+	// prerequisites
+	container = dojo.byId("gfx_holder");
+	container_position = dojo.coords(container, true);
+	text_time = dojo.byId("time");
+	var surface = dojox.gfx.createSurface(container, 385, 385);
+    surface.createImage({width: 385, height: 385, src: "images/clock_face.jpg"});
+    
+    // hand shapes
+    var hour_hand_points = [{x: -7, y: 15}, {x: 7, y: 15}, {x: 0, y: -60}, {x: -7, y: 15}];
+    var minute_hand_points = [{x: -5, y: 15}, {x: 5, y: 15}, {x: 0, y: -100}, {x: -5, y: 15}];
+    var second_hand_points = [{x: -2, y: 15}, {x: 2, y: 15}, {x: 2, y: -105}, {x: 6, y: -105}, {x: 0, y: -116}, {x: -6, y: -105}, {x: -2, y: -105}, {x: -2, y: 15}];
+    
+    // create shapes
+    hour_shadow = surface.createPolyline(hour_hand_points)
+		.setFill([0, 0, 0, 0.1])
+		;
+    hour_hand = surface.createPolyline(hour_hand_points)
+		.setStroke({color: "black", width: 2})
+		.setFill("#889")
+		;
+    minute_shadow = surface.createPolyline(minute_hand_points)
+		.setFill([0, 0, 0, 0.1])
+		;
+    minute_hand = surface.createPolyline(minute_hand_points)
+		.setStroke({color: "black", width: 2})
+		.setFill("#ccd")
+		;
+    second_shadow = surface.createPolyline(second_hand_points)
+		.setFill([0, 0, 0, 0.1])
+		;
+    second_hand = surface.createPolyline(second_hand_points)
+		.setStroke({color: "#800", width: 1})
+		.setFill("#d00")
+		;
+
+	// next 3 lines kill Silverlight because its nodes do not support CSS		
+	//dojox.gfx._addClass(hour_hand  .getEventSource(), "movable");
+	//dojox.gfx._addClass(minute_hand.getEventSource(), "movable");
+	//dojox.gfx._addClass(second_hand.getEventSource(), "movable");
+		
+	surface.createCircle({r: 1}).setFill("black").setTransform({dx: 192.5, dy: 192.5});
+	
+	// attach events
+	hour_hand  .connect("onmousedown", onMouseDown);
+	minute_hand.connect("onmousedown", onMouseDown);
+	second_hand.connect("onmousedown", onMouseDown);
+	dojo.connect(container, "onmousemove", onMouseMove);
+	dojo.connect(container, "onmouseup",   onMouseUp);
+	dojo.connect(dojo.byId("reset"), "onclick", resetTime);
+
+	// start the clock		
+	resetTime();
+	window.setInterval(advanceTime, 1000);
+};
+
+dojo.addOnLoad(makeShapes);
+
+</script>
+<style type="text/css">
+.movable { cursor: hand; }
+</style>
+</head>
+<body>
+<h1>dojox.gfx: interactive analog clock</h1>
+<p>Grab hands and set your own time.</p>
+<p>Warning: Canvas renderer doesn't implement event handling.</p>
+<div id="gfx_holder" style="width: 385px; height: 385px;"></div>
+<p>Current time: <span id="time"></span>.</p>
+<p><button id="reset">Reset</button></p>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clockWidget.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clockWidget.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clockWidget.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,332 @@
+<html>
+<head>
+<title>dojox.gfx: interactive analog clock</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/themes/dijit.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<!--
+The next line should include Microsoft's Silverlight.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="parseOnLoad:true"></script>
+<script type="text/javascript">
+	dojo.require("dijit._Widget");
+	dojo.require("dijit._Templated");
+	dojo.require("dojox.gfx");
+	dojo.require("dojo.date.locale");
+	dojo.declare("demo.Clock",dijit._Widget,{
+		
+		time:"",
+		
+		img:"images/clock_face_black.jpg",
+		
+		postCreate:function(){
+			this.inherited(arguments);
+			if(!this.time){ this.current_time = new Date(); }else{
+				this.current_time = this.time;
+			}
+			dojo.mixin(this,{
+				
+				diff_time: new Date(),
+				
+				hour_hand:null,
+				hour_shadow:null,
+				hour_shadow_shift:{dx: 2, dy: 2},
+
+				minute_hand:null,
+				minute_shadow:null,
+				minute_shadow_shift:{dx: 3, dy: 3},
+				
+				second_hand:null,
+				second_shadow:null,
+				second_shadow_shift:{dx: 4, dy: 4},
+				
+				container_position: null
+				
+			});
+
+			this._setSize();
+
+			this._init();
+		},
+		
+		_setSize:function(){
+
+			this.container_position = dojo.coords(this.domNode, true);
+			this.mb = dojo.marginBox(this.domNode);
+			this.center = {
+				x: (this.mb.w / 2),
+				y: (this.mb.h / 2)
+			};
+			
+		},
+		
+		_init:function(){
+			
+			this.surface = dojox.gfx.createSurface(this.domNode, this.mb.w, this.mb.h);
+			this.group = this.surface.createGroup();
+			this.group.createImage({
+				width: this.center.x * 2,
+				height:this.center.y * 2,
+				src: this.img
+			});
+			
+			// hand shapes
+			var _off = 15;
+			var mar = ((this.mb.w / 2) - _off) * -1;
+			var _c = mar * 0.7; // -105; 
+			var _a = mar * 0.5; //-60;
+			var _b = mar * 0.75; // -100;
+			var _d = mar * 0.8; // -116;
+			var _e = mar * 0.0523; // -7ish
+			var _f = mar * 0.042;
+			var _g = mar * 0.01234;
+			
+			var hour_hand_points = [{x: _e, y: _off }, {x: _e * -1, y: _off }, {x: 0, y: _a }, {x: _e, y: _off }];
+			var minute_hand_points = [{x: _f, y: _off }, {x: _f * -1, y: _off }, {x: 0, y: _b }, {x: _f, y: _off }];
+			var second_hand_points = [
+				{x: _g, y: _off }, {x: _g * -1, y: _off }, {x: _g * -1, y: _c },
+				{x: _e * -1, y: _c }, {x: 0, y: _d }, {x: _e, y: _c },
+				{x: _g, y: _c }, {x: _g, y: _off }
+			];
+			
+			// create shapes
+			this.hour_shadow = this.group.createPolyline(hour_hand_points)
+				.setFill([0, 0, 0, 0.1])
+				;
+			this.hour_hand = this.group.createPolyline(hour_hand_points)
+				.setStroke({color: "black", width: 2})
+				.setFill("#889")
+				;
+			this.minute_shadow = this.group.createPolyline(minute_hand_points)
+				.setFill([0, 0, 0, 0.1])
+				;
+			this.minute_hand = this.group.createPolyline(minute_hand_points)
+				.setStroke({color: "black", width: 2})
+				.setFill("#ccd")
+				;
+			this.second_shadow = this.group.createPolyline(second_hand_points)
+				.setFill([0, 0, 0, 0.1])
+				;
+			this.second_hand = this.group.createPolyline(second_hand_points)
+				.setStroke({color: "#800", width: 1})
+				.setFill("#d00")
+				;
+						
+			this.group.createCircle({r: 1}).setFill("black").setTransform({dx: this.center.x, dy: this.center.y });
+			
+			// start the clock		
+			this.resetTime();
+		
+			window.setInterval(dojo.hitch(this,"advanceTime"), 1000);
+		},
+		
+		placeHand: function(shape, angle, shift){
+			var move = {dx: this.center.x + (shift ? shift.dx : 0), dy: this.center.y + (shift ? shift.dy : 0)};
+			return shape.setTransform([move, dojox.gfx.matrix.rotateg(angle)]);
+		},
+		
+		placeHourHand: function(h, m, s){
+			var angle = 30 * (h % 12 + m / 60 + s / 3600);
+			this.placeHand(this.hour_hand, angle);
+			this.placeHand(this.hour_shadow, angle, this.hour_shadow_shift);
+		},
+		
+		placeMinuteHand: function(m, s){
+			var angle = 6 * (m + s / 60);
+			this.placeHand(this.minute_hand, angle);
+			this.placeHand(this.minute_shadow, angle, this.minute_shadow_shift);
+		},
+		
+		placeSecondHand:function(s){
+			var angle = 6 * s;
+			this.placeHand(this.second_hand, angle);
+			this.placeHand(this.second_shadow, angle, this.second_shadow_shift);
+		},
+		
+		reflectTime: function(time, hold_second_hand, hold_minute_hand, hold_hour_hand){
+			if(!time){ time = this.current_time; }
+			var h = time.getHours();
+			var m = time.getMinutes();
+			var s = time.getSeconds();
+
+			if(!hold_hour_hand) this.placeHourHand(h, m, s);
+			if(!hold_minute_hand) this.placeMinuteHand(m, s);
+			if(!hold_second_hand) this.placeSecondHand(s);
+
+			this.text_time = dojo.date.locale.format(
+				time, {selector: "time", timePattern: "h:mm:ss a"}
+			);
+		},
+		
+		resetTime: function(){
+			this.current_time = new Date();
+			this.reflectTime();
+		},
+		
+		tick: function(){
+			this.current_time.setSeconds(this.current_time.getSeconds()+1);
+			this.reflectTime();
+		},
+		
+		advanceTime: function(){
+			if(!this.selected_hand){
+				this.tick();
+			}
+		},
+
+		normalizeAngle: function(angle){
+			if(angle > Math.PI) {
+				angle -= 2 * Math.PI;
+			} else if(angle < -Math.PI) {
+				angle += 2 * Math.PI;
+			}
+			return angle;
+		},
+	
+		calculateAngle: function(x, y, handAngle){
+			try {
+				return this.normalizeAngle(Math.atan2(y - this.center.y, x - this.center.x) - handAngle);
+			}catch(e){ /* supress */ }
+			return 0;
+		},
+	
+		getSecondAngle: function(time){
+			if(!time) time = this.current_time;
+			return (6 * time.getSeconds() - 90) / 180 * Math.PI;
+		},
+	
+		getMinuteAngle: function(time){
+			if(!time) time = this.current_time;
+			return (6 * (time.getMinutes() + time.getSeconds() / 60) - 90) / 180 * Math.PI;
+		},
+	
+		getHourAngle: function(time){
+			if(!time) time = this.current_time;
+			return (30 * (time.getHours() + (time.getMinutes() + time.getSeconds() / 60) / 60) - 90) / 180 * Math.PI;
+		},
+		
+		resize: function(size){
+			this.surface.setDimensions(size.w, size.h);
+			this.group.setTransform(dojox.gfx.matrix.scale(size.w/this.mb.w, size.h/this.mb.h));
+			this._setSize();
+		}
+	
+	});
+	
+	dojo.declare("demo.InteractiveClock",demo.Clock,{
+	 
+		_init: function(){
+			this.inherited(arguments);
+			// attach events
+			this.diff_time = new Date();
+			this.hour_hand  .connect("onmousedown", this,"onMouseDown");
+			this.minute_hand.connect("onmousedown", this,"onMouseDown");
+			this.second_hand.connect("onmousedown", this,"onMouseDown");
+			this.connect(this.domNode, "onmousemove", "onMouseMove");
+			this.connect(this.domNode, "onmouseup", "onMouseUp");
+			
+		},
+	
+		onMouseDown: function(evt){
+			this.selected_hand = evt.target;
+			this.diff_time.setTime(this.current_time.getTime());
+			dojo.stopEvent(evt);
+		},
+	
+		onMouseMove: function(evt){
+			if(!this.selected_hand) return;
+			if(evt.target == this.second_hand.getEventSource() || 
+					evt.target == this.minute_hand.getEventSource() || 
+					evt.target == this.hour_hand.getEventSource()){
+					dojo.stopEvent(evt);
+				return;
+			}
+			if(dojox.gfx.equalSources(this.selected_hand, this.second_hand.getEventSource())){
+				var angle = this.calculateAngle(
+					evt.clientX - this.container_position.x, 
+					evt.clientY - this.container_position.y, 
+					this.normalizeAngle(this.getSecondAngle())
+				);
+				var diff = Math.round(angle / Math.PI * 180 / 6); // in whole seconds
+				this.current_time.setSeconds(this.current_time.getSeconds() + Math.round(diff));
+				this.reflectTime();
+			}else if(dojox.gfx.equalSources(this.selected_hand, this.minute_hand.getEventSource())){
+				var angle = this.calculateAngle(
+					evt.clientX - this.container_position.x, 
+					evt.clientY - this.container_position.y, 
+					this.normalizeAngle(this.getMinuteAngle(this.diff_time))
+				);
+				var diff = Math.round(angle / Math.PI * 180 / 6 * 60); // in whole seconds
+				this.diff_time.setTime(this.diff_time.getTime() + 1000 * diff);
+				this.reflectTime(this.diff_time, true);
+				
+			}else if(dojox.gfx.equalSources(this.selected_hand, this.hour_hand.getEventSource())){
+				var angle = this.calculateAngle(
+					evt.clientX - this.container_position.x, 
+					evt.clientY - this.container_position.y, 
+					this.normalizeAngle(this.getHourAngle(this.diff_time))
+				);
+				var diff = Math.round(angle / Math.PI * 180 / 30 * 60 * 60); // in whole seconds
+				this.diff_time.setTime(this.diff_time.getTime() + 1000 * diff);
+				this.reflectTime(this.diff_time, true, true);
+			}else{
+				return;
+			}
+			dojo.stopEvent(evt);
+		},
+		
+		onMouseUp:function(evt){
+			if(this.selected_hand && !dojox.gfx.equalSources(this.selected_hand, this.second_hand.getEventSource())){
+				this.current_time.setTime(this.diff_time.getTime());
+				this.reflectTime();
+			}
+			this.selected_hand = null;
+			dojo.stopEvent(evt);
+		}
+	});
+	dojo.require("dijit.form.Button");
+	dojo.addOnLoad(function(){
+		var n = dojo.doc.createElement('div');
+		dojo.body().appendChild(n);
+		dojo.style(n,{
+			height:"200px", width:"200px",
+			border:"5px solid #ededed"
+		});
+		new demo.Clock({},n);
+	});
+
+</script>
+<style type="text/css">
+.movable { cursor: hand; }
+</style>
+</head>
+<body>
+<h1>dojox.gfx: interactive analog clock</h1>
+<p>Grab hands and set your own time.</p>
+<p>Warning: Canvas renderer doesn't implement event handling.</p>
+
+<button dojoType="dijit.form.Button">
+	Resize
+	<script type="dojo/method" event="onClick">
+		dijit.byId("one").resize({ w:250, h:250 });
+	</script>
+</button>
+
+<hr noshade size="0" />
+
+<div class="dijitInline" dojoType="demo.Clock" id="gfx_holder" style="width: 300px; height: 300px;"></div>
+<div class="dijitInline" img="images/clock_face.jpg" dojoType="demo.InteractiveClock" style="width: 225px; height: 225px;"></div>
+<div class="dijitInline" id="one" dojoType="demo.Clock" style="width: 150px; height: 150px;"></div>
+<div class="dijitInline" dojoType="demo.Clock" style="width: 75px; height: 75px;"></div>
+
+<hr noshade size="0" />
+
+
+
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clock_black.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clock_black.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/clock_black.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,253 @@
+<html>
+<head>
+<title>dojox.gfx: interactive analog clock</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<!--
+The next line should include Microsoft's Silverlight.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js"></script>
+<script type="text/javascript">
+
+dojo.require("dojox.gfx");
+dojo.require("dojo.date.locale");
+
+var current_time = new Date();
+
+var hour_hand   = null;
+var minute_hand = null;
+var second_hand = null;
+
+var hour_shadow   = null;
+var minute_shadow = null;
+var second_shadow = null;
+
+var center = {x: 385 / 2, y: 385 / 2};
+
+var hour_shadow_shift   = {dx: 2, dy: 2};
+var minute_shadow_shift = {dx: 3, dy: 3};
+var second_shadow_shift = {dx: 4, dy: 4};
+
+var selected_hand = null;
+var container = null;
+var container_position = null;
+var text_time = null;
+var diff_time = new Date();
+
+placeHand = function(shape, angle, shift){
+	var move = {dx: center.x + (shift ? shift.dx : 0), dy: center.y + (shift ? shift.dy : 0)};
+	return shape.setTransform([move, dojox.gfx.matrix.rotateg(angle)]);
+};
+
+placeHourHand = function(h, m, s){
+	var angle = 30 * (h % 12 + m / 60 + s / 3600);
+	placeHand(hour_hand, angle);
+	placeHand(hour_shadow, angle, hour_shadow_shift);
+};
+
+placeMinuteHand = function(m, s){
+	var angle = 6 * (m + s / 60);
+	placeHand(minute_hand, angle);
+	placeHand(minute_shadow, angle, minute_shadow_shift);
+};
+
+placeSecondHand = function(s){
+	var angle = 6 * s;
+	placeHand(second_hand, angle);
+	placeHand(second_shadow, angle, second_shadow_shift);
+};
+
+reflectTime = function(time, hold_second_hand, hold_minute_hand, hold_hour_hand){
+	if(!time) time = current_time;
+	var h = time.getHours();
+	var m = time.getMinutes();
+	var s = time.getSeconds();
+	if(!hold_hour_hand) placeHourHand(h, m, s);
+	if(!hold_minute_hand) placeMinuteHand(m, s);
+	if(!hold_second_hand) placeSecondHand(s);
+	text_time.innerHTML = dojo.date.locale.format(
+		time, {selector: "time", timePattern: "h:mm:ss a"});
+};
+
+resetTime = function(){
+	current_time = new Date();
+	reflectTime();
+};
+
+tick = function(){
+	current_time.setSeconds(current_time.getSeconds() + 1);
+	reflectTime();
+};
+
+advanceTime = function(){
+	if(!selected_hand) {
+		tick();
+	}
+};
+
+normalizeAngle = function(angle){
+	if(angle > Math.PI) {
+		angle -= 2 * Math.PI;
+	} else if(angle < -Math.PI) {
+		angle += 2 * Math.PI;
+	}
+	return angle;
+};
+
+calculateAngle = function(x, y, handAngle){
+	try {
+		return normalizeAngle(Math.atan2(y - center.y, x - center.x) - handAngle);
+	} catch(e) {
+		// supress
+	}
+	return 0;
+};
+
+getSecondAngle = function(time){
+	if(!time) time = current_time;
+	return (6 * time.getSeconds() - 90) / 180 * Math.PI;
+};
+
+getMinuteAngle = function(time){
+	if(!time) time = current_time;
+	return (6 * (time.getMinutes() + time.getSeconds() / 60) - 90) / 180 * Math.PI;
+};
+
+getHourAngle = function(time){
+	if(!time) time = current_time;
+	return (30 * (time.getHours() + (time.getMinutes() + time.getSeconds() / 60) / 60) - 90) / 180 * Math.PI;
+};
+
+onMouseDown = function(evt){
+	selected_hand = evt.target;
+	diff_time.setTime(current_time.getTime());
+	dojo.stopEvent(evt);
+};
+
+onMouseMove = function(evt){
+	if(!selected_hand) return;
+	if(evt.target == second_hand.getEventSource() || 
+			evt.target == minute_hand.getEventSource() || 
+			evt.target == hour_hand.getEventSource()){
+		dojo.stopEvent(evt);
+		return;
+	}
+	if(dojox.gfx.equalSources(selected_hand, second_hand.getEventSource())){
+		var angle = calculateAngle(
+			evt.clientX - container_position.x, 
+			evt.clientY - container_position.y, 
+			normalizeAngle(getSecondAngle())
+		);
+		var diff = Math.round(angle / Math.PI * 180 / 6); // in whole seconds
+		current_time.setSeconds(current_time.getSeconds() + Math.round(diff));
+		reflectTime();
+	}else if(dojox.gfx.equalSources(selected_hand, minute_hand.getEventSource())){
+		var angle = calculateAngle(
+			evt.clientX - container_position.x, 
+			evt.clientY - container_position.y, 
+			normalizeAngle(getMinuteAngle(diff_time))
+		);
+		var diff = Math.round(angle / Math.PI * 180 / 6 * 60); // in whole seconds
+		diff_time.setTime(diff_time.getTime() + 1000 * diff);
+		reflectTime(diff_time, true);
+		
+	}else if(dojox.gfx.equalSources(selected_hand, hour_hand.getEventSource())){
+		var angle = calculateAngle(
+			evt.clientX - container_position.x, 
+			evt.clientY - container_position.y, 
+			normalizeAngle(getHourAngle(diff_time))
+		);
+		var diff = Math.round(angle / Math.PI * 180 / 30 * 60 * 60); // in whole seconds
+		diff_time.setTime(diff_time.getTime() + 1000 * diff);
+		reflectTime(diff_time, true, true);
+	}else{
+		return;
+	}
+	dojo.stopEvent(evt);
+};
+
+onMouseUp = function(evt){
+	if(selected_hand && !dojox.gfx.equalSources(selected_hand, second_hand.getEventSource())){
+		current_time.setTime(diff_time.getTime());
+		reflectTime();
+	}
+	selected_hand = null;
+	dojo.stopEvent(evt);
+};
+
+makeShapes = function(){
+	// prerequisites
+	container = dojo.byId("gfx_holder");
+	container_position = dojo.coords(container, true);
+	text_time = dojo.byId("time");
+	var surface = dojox.gfx.createSurface(container, 385, 385);
+    surface.createImage({width: 385, height: 385, src: "images/clock_face_black.jpg"});
+    
+    // hand shapes
+    var hour_hand_points = [{x: -7, y: 15}, {x: 7, y: 15}, {x: 0, y: -60}, {x: -7, y: 15}];
+    var minute_hand_points = [{x: -5, y: 15}, {x: 5, y: 15}, {x: 0, y: -100}, {x: -5, y: 15}];
+    var second_hand_points = [{x: -2, y: 15}, {x: 2, y: 15}, {x: 2, y: -105}, {x: 6, y: -105}, {x: 0, y: -116}, {x: -6, y: -105}, {x: -2, y: -105}, {x: -2, y: 15}];
+    
+    // create shapes
+    hour_shadow = surface.createPolyline(hour_hand_points)
+		.setFill([0, 0, 0, 0.1])
+		;
+    hour_hand = surface.createPolyline(hour_hand_points)
+		.setStroke({color: "black", width: 2})
+		.setFill("#889")
+		;
+    minute_shadow = surface.createPolyline(minute_hand_points)
+		.setFill([0, 0, 0, 0.1])
+		;
+    minute_hand = surface.createPolyline(minute_hand_points)
+		.setStroke({color: "black", width: 2})
+		.setFill("#ccd")
+		;
+    second_shadow = surface.createPolyline(second_hand_points)
+		.setFill([0, 0, 0, 0.1])
+		;
+    second_hand = surface.createPolyline(second_hand_points)
+		.setStroke({color: "#800", width: 1})
+		.setFill("#d00")
+		;
+
+	// next 3 lines kill Silverlight because its nodes do not support CSS		
+	//dojox.gfx._addClass(hour_hand  .getEventSource(), "movable");
+	//dojox.gfx._addClass(minute_hand.getEventSource(), "movable");
+	//dojox.gfx._addClass(second_hand.getEventSource(), "movable");
+		
+	surface.createCircle({r: 1}).setFill("black").setTransform({dx: 192.5, dy: 192.5});
+	
+	// attach events
+	hour_hand  .connect("onmousedown", onMouseDown);
+	minute_hand.connect("onmousedown", onMouseDown);
+	second_hand.connect("onmousedown", onMouseDown);
+	dojo.connect(container, "onmousemove", onMouseMove);
+	dojo.connect(container, "onmouseup",   onMouseUp);
+	dojo.connect(dojo.byId("reset"), "onclick", resetTime);
+
+	// start the clock		
+	resetTime();
+	window.setInterval(advanceTime, 1000);
+};
+
+dojo.addOnLoad(makeShapes);
+
+</script>
+<style type="text/css">
+.movable { cursor: hand; }
+</style>
+</head>
+<body>
+<h1>dojox.gfx: interactive analog clock</h1>
+<p>Grab hands and set your own time.</p>
+<p>Warning: Canvas renderer doesn't implement event handling.</p>
+<div id="gfx_holder" style="width: 385px; height: 385px;"></div>
+<p>Current time: <span id="time"></span>.</p>
+<p><button id="reset">Reset</button></p>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/creator.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/creator.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/creator.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,123 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
+<head>
+<title>Create DojoX GFX JSON</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+	td.cell { padding: 1em 1em 0em 0em; }
+</style>
+<!--
+The next line should include Microsoft's Silverligth.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js"></script>
+<script type="text/javascript">
+dojo.require("dojox.gfx");
+dojo.require("dojox.gfx.utils");
+
+surface = null;
+grid_size = 500;
+grid_step = 50;
+
+init = function(){
+	// initialize graphics
+	var container = dojo.byId("gfx");
+	surface = dojox.gfx.createSurface(container, 500, 500);
+	// create a picture
+
+	// make a grid
+	var grid = surface.createGroup();
+	for(var i = 0; i <= grid_size; i += grid_step){
+		grid.createLine({x1: 0, x2: grid_size, y1: i, y2: i}).setStroke("black");
+		grid.createLine({y1: 0, y2: grid_size, x1: i, x2: i}).setStroke("black");
+	}
+	
+	// make a checkerboard
+	var board = surface.createGroup(), gs2 = grid_step * 2;
+	for(var i = 0; i < grid_size; i += grid_step){
+		for(var j = 0; j < grid_size; j += grid_step){
+			if(i % gs2 == j % gs2) {
+				board.createRect({x: i, y: j, width: grid_step, height: grid_step}).setFill([255, 0, 0, 0.1]);
+			}
+		}
+	}
+	
+	// draw test_transform shapes
+	var g1 = surface.createGroup();
+	var r1 = g1.createShape({type: "rect", x: 200, y: 200})
+				.setFill("green")
+				.setStroke({})
+				;
+	var r2 = surface.createShape({type: "rect"}).setStroke({})
+				.setFill({type: "linear", to: {x: 50, y: 100},
+					colors: [{offset: 0, color: "green"}, {offset: 0.5, color: "red"}, {offset: 1, color: "blue"}] })
+				.setTransform({dx: 100, dy: 100})
+				;
+	var r3 = surface.createRect().setStroke({})
+				.setFill({ type: "linear" })
+				;
+	var r4 = g1.createShape({type: "rect"})
+				.setFill("blue")
+				.setTransform([dojox.gfx.matrix.rotategAt(-30, 350, 250), { dx: 300, dy: 200 }])
+				;
+	var p1 = g1.createShape({type: "path"})
+				.setStroke({})
+				.moveTo(300, 100)
+				.lineTo(400, 200)
+				.lineTo(400, 300)
+				.lineTo(300, 400)
+				.curveTo(400, 300, 400, 200, 300, 100)
+				.setTransform({})
+				;
+	var p2 = g1.createShape(p1.getShape())
+				.setStroke({color: "red", width: 2})
+				.setTransform({dx: 100})
+				;
+	var p3 = g1.createShape({type: "path"})
+				.setStroke({color: "blue", width: 2})
+				.moveTo(300, 100)
+				.setAbsoluteMode(false)
+				.lineTo ( 100,  100)
+				.lineTo (   0,  100)
+				.lineTo (-100,  100)
+				.curveTo( 100, -100, 100, -200, 0, -300)
+				//.setTransform(dojox.gfx.matrix.rotategAt(135, 250, 250))
+				.setTransform(dojox.gfx.matrix.rotategAt(180, 250, 250))
+				;
+	g1.moveToFront();
+	g1.setTransform(dojox.gfx.matrix.rotategAt(-15, 250, 250));
+	
+	// dump everything
+	dump();
+};
+
+dump = function(){
+	var objects = dojox.gfx.utils.serialize(surface);
+	// name top-level objects
+	for(var i = 0; i < objects.length; ++i){
+		objects[i].name = "shape" + i;
+	}
+	// format and show
+	dojo.byId("io").value = dojo.toJson(objects, dojo.byId("pprint").checked);
+};
+
+dojo.addOnLoad(init);
+</script>
+</head>
+<body>
+	<h1>Create DojoX GFX JSON</h1>
+	<p>This is a helper file, which serves as a template to generate static pictures.</p>
+	<table>
+		<tr>
+			<td align="left" valign="top" class="cell">
+				<div id="gfx" style="width: 500px; height: 500px; border: solid 1px black;">
+				</div>
+			</td>
+		</tr>
+	</table>
+	<p><textarea id="io" cols="80" rows="10" wrap="off"></textarea></p>
+	<p><button onclick="dump()">Dump!</button>
+	&nbsp;&nbsp;&nbsp;<input type="checkbox" id="pprint" checked="checked" />&nbsp;<label for="pprint">Pretty-print JSON</label></p>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Lars.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Lars.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Lars.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Lars.svg
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Lars.svg	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Lars.svg	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,531 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/";>
+	<g id="torso" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#000000000000">
+		<path id="leftArm" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+			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
+			"/>
+		<path id="leftArmThumb" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+			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"/>
+		<path id="rightArm" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+			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"/>
+		<g id="shirt" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+			<path id="tShirt" i:knockout="Off" fill="#4459A5" stroke="#000000" stroke-linecap="round" d="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"/>
+			<path id="shirtNeck" i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" d="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"/>
+			<g id="shirtLogo" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+				<g i:knockout="Off">
+					<path i:knockout="Off" d="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"/>
+				</g>
+				<g i:knockout="Off">
+					<path i:knockout="Off" d="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"/>
+				</g>
+				<path i:isolated="yes" i:knockout="Off" enable-background="new    " d="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"/>
+				<path i:isolated="yes" i:knockout="Off" enable-background="new    " d="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"/>
+				<path i:isolated="yes" i:knockout="Off" enable-background="new    " d="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"/>
+				<path i:isolated="yes" i:knockout="Off" enable-background="new    " d="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"/>
+			</g>
+		</g>
+	</g>
+	<g id="heads" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F004F00FFFF">
+		<g id="head1" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00">
+			<g id="leftEart" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00">
+				<path i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+				<path i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M211.711,203.09
+					c0.523,0.004,0.946-0.208,1.27-0.635"/>
+				<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M211.076,197.377
+					c3.062,3.013,5.489,5.624,4.443,10.155"/>
+			</g>
+			<path id="bgHairTop" i:knockout="Off" fill="#FFF471" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path id="bgHairLeft" i:knockout="Off" fill="#FFF471" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path id="bgHair" i:knockout="Off" fill="#FFF471" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path id="neck" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path id="headShape" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<g id="rightEar" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00">
+				<path i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+				<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M52.407,196.743
+					c-1.702,3.613-1.257,7.505-1.27,11.424"/>
+				<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M51.772,209.437
+					c-3.39-4.661,0.922-5.769,5.078-6.347"/>
+			</g>
+			<path id="fgHair" i:knockout="Off" fill="#FFF471" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+		</g>
+	</g>
+	<g id="eyes" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF">
+		<g id="eyes1" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#4F00FFFFFFFF" display="none">
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" stroke-linecap="round" d="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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+		</g>
+		<g id="eyes2" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#800080008000" display="none">
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="M98.668,186.108c0.668-8.915,15.545-13.749,22.667-15"
+				/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="M169.667,178.108
+				c5.307,3.436,16.928,5.632,19.668,12.333"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="M105.334,197.775c8.085-4.283,17.059-2.8,25-6.333"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+		</g>
+	</g>
+	<g id="beard" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00">
+		<path i:knockout="Off" fill="#AFA8A5" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M96.05,213.639
+			c-0.366,0.21-0.783,0.389-1.167,0.5"/>
+		<path i:knockout="Off" fill="#AFA8A5" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M102.55,211.972
+			c0.314-0.01,0.554-0.198,0.667-0.5"/>
+		<path i:knockout="Off" fill="#AFA8A5" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M105.717,208.805
+			c0.164-0.109,0.336-0.224,0.5-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M111.05,207.972
+			c-0.651-1.81,0.859-2.262,2.333-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M117.717,209.805
+			c1.738,0,3.653,0.369,5.333,0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M132.717,214.472
+			c0.104-0.21,0.162-0.435,0.167-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M139.551,216.972
+			c0.215-0.175,0.465-0.426,0.666-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M144.551,213.305
+			c0.277-0.056,0.556-0.111,0.833-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M147.884,216.639
+			c0.195,0.045,0.369-0.013,0.5-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M148.384,214.139
+			c0.112-0.168,0.222-0.332,0.333-0.5"/>
+		<path i:knockout="Off" display="none" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+			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"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M152.717,216.139
+			c0.611,0,1.223,0,1.834,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M160.384,217.472
+			c0.333,0,0.667,0,1,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M163.217,215.972
+			c0.321-0.042,0.658-0.175,0.834-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M164.217,218.805
+			c0.167,0,0.333,0,0.5,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M168.384,217.972
+			c0.056-0.056,0.111-0.111,0.167-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M169.884,225.805
+			c0.491-0.397,0.882-0.926,1.167-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M172.717,221.972
+			c0.056,0,0.111,0,0.167,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M171.717,229.805
+			c0.334,0.075,0.659,0.025,0.834-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M190.051,227.805
+			c0.163-0.242,0.398-0.423,0.666-0.5"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M197.384,221.472
+			c0.258-0.007,0.485-0.125,0.667-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M199.384,214.972
+			c-0.04-0.333,0.075-0.609,0.333-0.833"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M117.884,257.305
+			c0.056,0,0.111,0,0.167,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M142.717,252.472
+			c0.358,0.069,0.71,0.016,1-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M137.884,256.472
+			c0.277,0,0.556,0,0.833,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M160.884,252.972
+			c0.366-0.138,0.765-0.402,1-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M171.384,250.139
+			c0.235-0.263,0.475-0.561,0.667-0.834"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M89.384,243.972
+			c0.537,0.378,1.329,0.876,1.833,1.333"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M79.05,225.472
+			c0.087,0.272,0.143,0.55,0.167,0.833"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M73.884,222.639
+			c0,0.167,0,0.333,0,0.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M72.55,219.805c0.466-0.325,0.875-0.797,1.167-1.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M71.717,211.972c0.422-0.553,0.776-1.305,1-2"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M78.55,214.472c0-0.111,0-0.222,0-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M79.384,218.805c-0.001-0.137,0.055-0.248,0.167-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M80.217,221.139c0.111,0,0.222,0,0.333,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M75.55,226.472c0.103-0.5,0.156-0.977,0.167-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M78.55,230.139c0.111,0,0.222,0,0.333,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M83.384,227.639c0.118-0.059,0.215-0.107,0.333-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M81.55,237.139c0.056,0,0.111,0,0.167,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M86.217,233.805c0.056,0,0.111,0,0.167,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M87.884,230.472c0.595-0.181,1.219-0.527,1.833-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M88.717,222.139
+			c-0.929,2.359-1.615,4.865-2.667,7.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M89.05,216.139
+			c0.784-0.736,1.709-1.565,2.833-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M94.217,210.139
+			c1.599-0.089,3.199-0.167,4.833-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M94.884,224.639
+			c0.052-0.588-0.004-1.155-0.167-1.667"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M92.384,228.305
+			c0.585-0.062,1.244-0.132,1.667-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M88.717,240.139
+			c0.111,0,0.222,0,0.333,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M95.884,243.305
+			c0.526,0.1,1.017-0.015,1.333-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M98.55,248.305
+			c0.069-0.24,0.265-0.926,0.333-1.166"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M96.55,249.805
+			c0.125,0.014,0.18-0.042,0.167-0.166"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M104.55,250.139
+			c0.01-0.238,0.126-0.428,0.333-0.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M106.884,251.972
+			c0.195,0.045,0.37-0.013,0.5-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M122.217,254.639
+			c0.063-0.165,0.179-0.288,0.333-0.334"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M125.884,255.805
+			c1.13-0.745,2.783-0.962,3.667-2"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M129.717,249.305
+			c-0.045,0.154-0.168,0.271-0.333,0.334"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M136.551,252.305
+			c0.222,0,0.444,0,0.666,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M110.217,251.305
+			c0.056-0.056,0.111-0.11,0.167-0.166"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M140.717,251.805
+			c0.111,0,0.223,0,0.334,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M150.051,249.472
+			c0.111,0,0.222,0,0.333,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M152.217,253.472
+			c0.165-0.063,0.288-0.179,0.334-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M155.051,254.639
+			c0.222,0,0.444,0,0.666,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M157.717,256.472
+			c0.326-0.027,0.546-0.073,0.834-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M167.384,235.972
+			c0.118-0.54,0.353-1.064,0.667-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M170.717,242.805
+			c0-0.333,0-0.667,0-1"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M170.217,236.972
+			c0-0.333,0-0.667,0-1"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M179.051,235.805
+			c0.378-0.101,0.738-0.35,1-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M185.051,232.805
+			c0.379-0.319,0.656-0.702,0.833-1.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M188.051,231.139
+			c0.063-0.39,0.178-0.792,0.333-1.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M197.884,223.305
+			c-0.166,0.277-0.334,0.556-0.5,0.833"/>
+	</g>
+	<g id="mouths" i:isolated="yes" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F004F00" enable-background="new    ">
+		<g id="mouth1" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00" display="none">
+			<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFC0C0" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="M181.815,222.895c-3.101-2.75-4.764-8.777-9.282-10.403
+				"/>
+		</g>
+		<g id="mouth2" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00" display="none">
+			<path i:knockout="Off" display="inline" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" stroke-width="2" d="M87.785,228.193
+				c-5.907-3.235-0.344-9.531,3.971-11.424"/>
+			
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+				M184.679,227.228c-1.534,2.583-2.548,5.334-4.025,7.889"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+		</g>
+		<g id="mouth3" i:isolated="yes" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00" enable-background="new    ">
+			<path i:knockout="Off" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+			<path i:knockout="Off" fill="#F4BDBD" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		</g>
+	</g>
+	<g id="personalProps" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F004F00FFFF">
+		<g id="hat" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00" display="none">
+			<g display="inline">
+				<g i:knockout="Off">
+					<path i:knockout="Off" fill="#FF0000" d="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"/>
+					<path i:knockout="Off" d="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"/>
+				</g>
+				<g i:knockout="Off">
+					<path i:knockout="Off" fill="#FFFFFF" d="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"/>
+					<path i:knockout="Off" d="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"
+						/>
+				</g>
+				<g i:knockout="Off">
+					<path i:knockout="Off" d="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"/>
+				</g>
+				<g i:knockout="Off">
+					<path i:knockout="Off" d="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"/>
+				</g>
+			</g>
+		</g>
+		<g id="textSurface" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00">
+			<g id="spokenBubble" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF">
+				<path id="textContainer" i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path id="textArrowBelow" i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+			</g>
+			<g id="thoughtBubble" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF" display="none">
+				<path id="textContainer_1_" i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<g i:knockout="Off" display="inline">
+					<path i:knockout="Off" fill="#FFFFFF" d="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"/>
+					<g>
+						<path i:knockout="Off" fill="none" d="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"/>
+						<path i:knockout="Off" fill="#FFFFFF" d="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"/>
+					</g>
+				</g>
+				<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			</g>
+			<g id="yellBubble" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF" display="none">
+				<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M251.156,176.051
+					l40.228-15.992"/>
+				<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M280.932,149.385
+					l-40.667,36.42"/>
+				<path id="textContainer_2_" i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			</g>
+		</g>
+	</g>
+</svg>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/LarsDreaming.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/LarsDreaming.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/LarsDreaming.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/LarsDreaming.svg
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/LarsDreaming.svg	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/LarsDreaming.svg	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,536 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/";>
+	<g id="torso" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+		<path id="leftArm" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+			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
+			"/>
+		<path id="leftArmThumb" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+			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"/>
+		<path id="rightArm" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+			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"/>
+		<g id="shirt" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00">
+			<path id="tShirt" i:knockout="Off" fill="#4459A5" stroke="#000000" stroke-linecap="round" d="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"/>
+			<path id="shirtNeck" i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" d="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"/>
+			<g id="shirtLogo" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F004F00FFFF">
+				<g i:knockout="Off">
+					<path i:knockout="Off" d="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"/>
+				</g>
+				<g i:knockout="Off">
+					<path i:knockout="Off" d="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"/>
+				</g>
+				<path i:knockout="Off" d="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"/>
+				<path i:knockout="Off" d="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"/>
+				<path i:knockout="Off" d="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"/>
+				<path i:knockout="Off" d="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"/>
+			</g>
+		</g>
+	</g>
+	<g id="heads" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00">
+		<g id="head1" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF">
+			<g id="leftEart" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFFFFFF">
+				<path i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+				<path i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M211.711,203.09
+					c0.523,0.004,0.946-0.208,1.271-0.635"/>
+				<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M211.076,197.377
+					c3.062,3.013,5.489,5.624,4.442,10.155"/>
+			</g>
+			<path id="bgHairTop" i:knockout="Off" fill="#FFF471" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path id="bgHairLeft" i:knockout="Off" fill="#FFF471" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path id="bgHair" i:knockout="Off" fill="#FFF471" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path id="neck" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path id="headShape" i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<g id="rightEar" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#800080008000">
+				<path i:knockout="Off" fill="#FFE8B0" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+				<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M52.407,196.744
+					c-1.702,3.613-1.257,7.505-1.27,11.424"/>
+				<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M51.772,209.438
+					c-3.39-4.661,0.922-5.769,5.078-6.347"/>
+			</g>
+			<path id="fgHair" i:knockout="Off" fill="#FFF471" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+		</g>
+	</g>
+	<g id="eyes" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#000000000000">
+		<g id="eyes1" i:knockout="Off" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF" display="none">
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" stroke-linecap="round" d="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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+		</g>
+		<g id="eyes2" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F004F00">
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M98.668,186.108c0.668-8.915,15.545-13.749,22.667-15"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M169.667,178.108c5.307,3.436,16.928,5.632,19.668,12.333"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M105.334,197.775c8.085-4.283,17.059-2.8,25-6.333"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="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"/>
+		</g>
+	</g>
+	<g id="beard" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00">
+		<path i:knockout="Off" fill="#AFA8A5" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M96.05,213.64
+			c-0.366,0.21-0.783,0.389-1.167,0.5"/>
+		<path i:knockout="Off" fill="#AFA8A5" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M102.55,211.973
+			c0.314-0.01,0.554-0.198,0.667-0.5"/>
+		<path i:knockout="Off" fill="#AFA8A5" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M105.717,208.806
+			c0.164-0.109,0.336-0.224,0.5-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M111.05,207.973
+			c-0.651-1.81,0.859-2.262,2.333-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M117.717,209.806
+			c1.738,0,3.653,0.369,5.333,0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M132.717,214.473
+			c0.104-0.21,0.162-0.435,0.167-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M139.551,216.973
+			c0.215-0.175,0.465-0.426,0.666-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M144.551,213.306
+			c0.277-0.056,0.557-0.111,0.833-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M147.884,216.64
+			c0.195,0.045,0.369-0.013,0.5-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M148.384,214.14
+			c0.112-0.168,0.223-0.332,0.333-0.5"/>
+		<path i:knockout="Off" display="none" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+			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"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M152.717,216.14
+			c0.611,0,1.224,0,1.834,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M160.384,217.473
+			c0.333,0,0.667,0,1,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M163.217,215.973
+			c0.321-0.042,0.658-0.175,0.834-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M164.217,218.806
+			c0.167,0,0.333,0,0.5,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M168.384,217.973
+			c0.057-0.056,0.111-0.111,0.167-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M169.884,225.806
+			c0.491-0.397,0.882-0.926,1.167-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M172.717,221.973
+			c0.057,0,0.111,0,0.167,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M171.717,229.806
+			c0.334,0.075,0.659,0.025,0.834-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M190.051,227.806
+			c0.163-0.242,0.398-0.423,0.666-0.5"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M197.384,221.473
+			c0.258-0.007,0.485-0.125,0.667-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M199.384,214.973
+			c-0.04-0.333,0.075-0.609,0.333-0.833"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M117.884,257.306
+			c0.056,0,0.111,0,0.167,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M142.717,252.473
+			c0.358,0.068,0.71,0.016,1-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M137.884,256.473
+			c0.277,0,0.557,0,0.833,0"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M160.884,252.973
+			c0.366-0.139,0.766-0.402,1-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M171.384,250.14
+			c0.235-0.264,0.476-0.562,0.667-0.834"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M89.384,243.973
+			c0.537,0.378,1.329,0.876,1.833,1.333"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M79.05,225.473
+			c0.087,0.272,0.143,0.55,0.167,0.833"/>
+		<path i:knockout="Off" fill="none" stroke="#AAAAAA" stroke-linecap="round" stroke-linejoin="bevel" d="M73.884,222.64
+			c0,0.167,0,0.333,0,0.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M72.55,219.806c0.466-0.325,0.875-0.797,1.167-1.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M71.717,211.973c0.422-0.553,0.776-1.305,1-2"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M78.55,214.473c0-0.111,0-0.222,0-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M79.384,218.806c-0.001-0.137,0.055-0.248,0.167-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M80.217,221.14c0.111,0,0.222,0,0.333,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M75.55,226.473c0.103-0.5,0.156-0.977,0.167-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M78.55,230.14c0.111,0,0.222,0,0.333,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M83.384,227.64c0.118-0.059,0.215-0.107,0.333-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M81.55,237.14c0.056,0,0.111,0,0.167,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M86.217,233.806c0.056,0,0.111,0,0.167,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+			M87.884,230.473c0.595-0.181,1.219-0.527,1.833-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M88.717,222.14
+			c-0.929,2.359-1.615,4.865-2.667,7.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M89.05,216.14
+			c0.784-0.736,1.709-1.565,2.833-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M94.217,210.14
+			c1.599-0.089,3.199-0.167,4.833-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M94.884,224.64
+			c0.052-0.588-0.004-1.155-0.167-1.667"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M92.384,228.306
+			c0.585-0.062,1.244-0.132,1.667-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M88.717,240.14
+			c0.111,0,0.222,0,0.333,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M95.884,243.306
+			c0.526,0.1,1.017-0.016,1.333-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M98.55,248.306
+			c0.069-0.24,0.265-0.926,0.333-1.166"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M96.55,249.806
+			c0.125,0.014,0.18-0.042,0.167-0.166"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M104.55,250.14
+			c0.01-0.238,0.126-0.428,0.333-0.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M106.884,251.973
+			c0.195,0.045,0.37-0.014,0.5-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M122.217,254.64
+			c0.063-0.165,0.179-0.288,0.333-0.334"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M125.884,255.806
+			c1.13-0.745,2.783-0.962,3.667-2"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M129.717,249.306
+			c-0.045,0.153-0.168,0.271-0.333,0.334"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M136.551,252.306
+			c0.223,0,0.444,0,0.666,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M110.217,251.306
+			c0.056-0.057,0.111-0.11,0.167-0.166"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M140.717,251.806
+			c0.111,0,0.224,0,0.334,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M150.051,249.473
+			c0.111,0,0.223,0,0.333,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M152.217,253.473
+			c0.165-0.063,0.288-0.179,0.334-0.333"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M155.051,254.64
+			c0.223,0,0.444,0,0.666,0"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M157.717,256.473
+			c0.326-0.027,0.546-0.073,0.834-0.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="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"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M167.384,235.973
+			c0.118-0.54,0.354-1.064,0.667-1.5"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M170.717,242.806
+			c0-0.333,0-0.667,0-1"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M170.217,236.973
+			c0-0.333,0-0.667,0-1"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M179.051,235.806
+			c0.378-0.101,0.738-0.35,1-0.667"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M185.051,232.806
+			c0.379-0.319,0.656-0.702,0.833-1.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M188.051,231.14
+			c0.063-0.39,0.178-0.792,0.333-1.167"/>
+		<path i:knockout="Off" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="M197.884,223.306
+			c-0.166,0.277-0.334,0.556-0.5,0.833"/>
+	</g>
+	
+		<g id="mouths" i:isolated="yes" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F004F00FFFF" enable-background="new    ">
+		<g id="mouth1" i:knockout="Off" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00" display="none">
+			<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFC0C0" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="M181.815,222.896c-3.102-2.75-4.765-8.777-9.282-10.403
+				"/>
+		</g>
+		<g id="mouth2" i:knockout="Off" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF" display="none">
+			<path i:knockout="Off" display="inline" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="bevel" d="
+				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"/>
+			<path i:knockout="Off" display="inline" fill="none" stroke="#000000" stroke-width="2" d="M87.785,228.193
+				c-5.907-3.235-0.344-9.531,3.971-11.424"/>
+			
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="bevel" d="
+				M184.679,227.229c-1.534,2.583-2.548,5.334-4.024,7.889"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+		</g>
+		
+			<g id="mouth3" i:isolated="yes" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFFFFFF" enable-background="new    ">
+			
+				<path i:isolated="yes" i:knockout="Off" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" enable-background="new    " d="
+				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"/>
+			
+				<path i:isolated="yes" i:knockout="Off" fill="#F4BDBD" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" enable-background="new    " d="
+				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"/>
+		</g>
+	</g>
+	<g id="personalProps" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#800080008000">
+		<g id="hat" i:knockout="Off" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#000000000000" display="none">
+			<g i:knockout="Off" display="inline">
+				<g i:knockout="Off">
+					<path i:knockout="Off" fill="#FF0000" d="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"/>
+					<path i:knockout="Off" d="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"/>
+				</g>
+				<g i:knockout="Off">
+					<path i:knockout="Off" fill="#FFFFFF" d="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"/>
+					<path i:knockout="Off" d="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"
+						/>
+				</g>
+				<g i:knockout="Off">
+					<path i:knockout="Off" d="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"/>
+				</g>
+				<g i:knockout="Off">
+					<path i:knockout="Off" d="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"/>
+				</g>
+			</g>
+		</g>
+		<g id="textSurface" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+			
+				<g id="spokenBubble" i:knockout="Off" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#FFFF4F004F00" display="none">
+				<path id="textContainer" i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path id="textArrowBelow" i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			</g>
+			<g id="thoughtBubble" i:knockout="Off" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00">
+				<path id="textContainer_1_" i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<g i:knockout="Off">
+					<path i:knockout="Off" fill="#FFFFFF" d="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"/>
+					<g i:knockout="Off">
+						<path i:knockout="Off" fill="none" d="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"/>
+						<path i:knockout="Off" fill="#FFFFFF" d="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"/>
+					</g>
+				</g>
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+			</g>
+			
+				<g id="yellBubble" i:knockout="Off" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#4F004F00FFFF" display="none">
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+					M251.156,176.051l40.228-15.992"/>
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="bevel" d="
+					M280.932,149.385l-40.667,36.42"/>
+				<path id="textContainer_2_" i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+			</g>
+		</g>
+	</g>
+</svg>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Nils.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Nils.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Nils.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Nils.svg
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Nils.svg	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/Nils.svg	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/";>
+	<g id="nils_1_" i:isolated="yes" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F004F00" enable-background="new    ">
+		<g id="lowerBody" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00">
+			<g id="leftShoe" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF">
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="M133.453,425.375c0.901-2.979,2.793-5.781,4.667-8"/>
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="M56.787,426.708c-2.551-2.07-3.97-5.252-5.333-8"/>
+			</g>
+			<g id="rightShoe" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFFFFFF">
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="M62.787,424.708c-1.417-2.271-3.012-5.388-2.667-8.666"/>
+				<path i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="M141.453,428.042c2.076-1.991,4.274-3.745,6-6"/>
+			</g>
+			<path id="leftLeft" i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+			<path id="rightLeg" i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+			<g id="pants" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00">
+				<path id="pants_1_" i:knockout="Off" fill="#ADA274" stroke="#000000" d="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"/>
+			</g>
+		</g>
+		<g id="leftArm_1_" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFFFFFF">
+			<path id="leftArm" i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+			<path i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+			<path i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+			<path i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M208.453,188.375c-4.474,0.83-8.972-0.434-11-4"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M203.453,221.375c6.112-0.45,18.967,6.649,8,10"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M195.453,258.375c3.441-0.666,5.408-2.2,4-5"/>
+		</g>
+		<g id="rightArm" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00">
+			<path i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M6.453,248.042c2.111,0,6.324-0.997,6.667,1.666"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="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"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M31.787,255.042c3.675-0.503,7.077,4.971,3,6"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="M48.453,235.708c-5.387-0.935-3.676,10.551,3.667,8.667"/>
+			<path i:knockout="Off" fill="none" stroke="#000000" d="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"/>
+		</g>
+		<g id="shirt" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFFFFFF4F00">
+			<path id="mainShirt" i:knockout="Off" fill="#4867FF" stroke="#000000" stroke-width="2" d="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"/>
+			<path id="highlight" i:knockout="Off" fill="#4867FF" stroke="#000000" stroke-width="2" d="M99.453,179.375
+				c-5.364,2.937-10.603,8.065-17,8"/>
+			<g id="logo" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF">
+			</g>
+		</g>
+		<g id="heads" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F004F00">
+			<g id="head1" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFF4F00">
+				<path id="hair_1_" i:knockout="Off" fill="#605542" stroke="#000000" d="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"
+					/>
+				<path id="neck" i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+				<g id="leftEar_1_" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F00FFFFFFFF">
+					<path id="leftEar" i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+					<path i:knockout="Off" fill="none" stroke="#000000" d="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"/>
+					<path i:knockout="Off" fill="none" stroke="#000000" d="M238.453,90.375c1.863-0.367,3.589-1.433,5-3"/>
+				</g>
+				<path id="headShape" i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+				<g id="rightEar_1_" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#FFFF4F00FFFF">
+					<path id="rightEar" i:knockout="Off" fill="#FFF0A9" stroke="#000000" d="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"/>
+					<path i:knockout="Off" fill="none" stroke="#000000" d="M42.453,106.375c4.149-4.954,11.06-7.737,16-10"/>
+					<path i:knockout="Off" fill="none" stroke="#000000" d="M48.453,100.375c1.337,3.541,2.787,6.955,5,10"/>
+				</g>
+				<path id="adamsApple" i:knockout="Off" fill="none" stroke="#000000" d="M113.453,152.375c-0.526-2.327,1.546-3.837,5-4"/>
+			</g>
+		</g>
+		<g id="expressions" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#800080008000">
+			<g id="confused" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#000000000000">
+				<g id="mouth_1_" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+					<path id="mouth" i:knockout="Off" fill="none" stroke="#000000" d="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"/>
+					<path id="tooth_1_" i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+					<path id="tooth" i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+				</g>
+				<g id="eyes" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+					<path id="rightEye" i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+					<path id="pupilRight" i:knockout="Off" stroke="#000000" d="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"/>
+					<path id="leftEye" i:knockout="Off" fill="#FFFFFF" stroke="#000000" d="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"/>
+					<path id="pupilLeft" i:knockout="Off" stroke="#000000" d="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"/>
+				</g>
+			</g>
+			<g id="confused2" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#000000000000" display="none">
+				<path id="rightEye_1_" i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path id="pupilRight_1_" i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+				<path id="leftEye_1_" i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path id="pupilLeft_1_" i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+			</g>
+			<g id="talking" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#000000000000" display="none">
+				<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+			</g>
+			<g id="talking2" i:layer="yes" i:visible="no" i:dimmedPercent="50" i:rgbTrio="#000000000000" display="none">
+				<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="M84.87,73.503c2.341-8.752,12.467-12.772,19-18"/>
+				<path i:knockout="Off" display="inline" fill="none" stroke="#000000" d="M181.87,59.503c8.968-3.27,16.681,2.245,25,3"/>
+				<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"
+					/>
+				<path i:knockout="Off" display="inline" fill="#FFFFFF" stroke="#000000" d="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"
+					/>
+				<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+				<path i:knockout="Off" display="inline" stroke="#000000" d="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"/>
+			</g>
+		</g>
+	</g>
+</svg>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-bg.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-bg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-head.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-head.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-left-arm.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-left-arm.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-left-leg.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-left-leg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-lollipop.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-lollipop.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-nose-large.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-nose-large.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-nose-medium.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-nose-medium.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-right-arm.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-right-arm.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-right-leg.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-right-leg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-torso.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino-torso.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino.jpg
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/buratino.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"}}
+]

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/svg2gfx.xsl
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/svg2gfx.xsl	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/svg2gfx.xsl	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Super simple XSLT to convert Nils.svg and Lars.svg to our format -->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:fo="http://www.w3.org/1999/XSL/Format";>
+	<xsl:output method="text" version="1.0" encoding="UTF-8"/>
+	<xsl:template name="fill">
+		<xsl:param name="node"/>
+		<xsl:if test="count($node/@fill) &gt; 0">
+			<xsl:text>fill: "</xsl:text>
+			<xsl:value-of select="$node/@fill"/>
+			<xsl:text>",</xsl:text>
+		</xsl:if>
+	</xsl:template>
+	<xsl:template name="stroke">
+		<xsl:param name="node"/>
+		<xsl:text>stroke: {</xsl:text>
+		<xsl:if test="count($node/@stroke) &gt; 0">
+			<xsl:text>color: "</xsl:text>
+			<xsl:value-of select="$node/@stroke"/>
+			<xsl:text>",</xsl:text>
+		</xsl:if>
+		<xsl:if test="count($node/@stroke-width) &gt; 0">
+			<xsl:text>width: "</xsl:text>
+			<xsl:value-of select="$node/@stroke-width"/>
+			<xsl:text>",</xsl:text>
+		</xsl:if>
+		<xsl:if test="count($node/@stroke-linecap) &gt; 0">
+			<xsl:text>cap: "</xsl:text>
+			<xsl:value-of select="$node/@stroke-linecap"/>
+			<xsl:text>",</xsl:text>
+		</xsl:if>
+		<xsl:if test="count($node/@stroke-linejoin) &gt; 0">
+			<xsl:text>join: "</xsl:text>
+			<xsl:value-of select="$node/@stroke-linejoin"/>
+			<xsl:text>",</xsl:text>
+		</xsl:if>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+	<xsl:template match="g">
+		<xsl:text>{</xsl:text>
+		<xsl:if test="count(@id) &gt; 0">
+			<xsl:text>name: "</xsl:text>
+			<xsl:value-of select="@id"/>
+			<xsl:text>",</xsl:text>
+		</xsl:if>
+		<xsl:text>children: [</xsl:text>
+		<xsl:apply-templates select="g|path"/>
+		<xsl:text>]},</xsl:text>
+	</xsl:template>
+	<xsl:template match="path">
+		<xsl:text>{</xsl:text>
+		<xsl:if test="count(@id) &gt; 0">
+			<xsl:text>name: "</xsl:text>
+			<xsl:value-of select="@id"/>
+			<xsl:text>",</xsl:text>
+		</xsl:if>
+		<xsl:text>shape: {type: "path", path: "</xsl:text>
+		<xsl:value-of select="@d"/>
+		<xsl:text>"},</xsl:text>
+		<xsl:call-template name="fill">
+			<xsl:with-param name="node" select="."/>
+		</xsl:call-template>
+		<xsl:call-template name="stroke">
+			<xsl:with-param name="node" select="."/>
+		</xsl:call-template>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+	<xsl:template match="svg">
+		<xsl:text>[</xsl:text>
+		<xsl:apply-templates select="g|path"/>
+		<xsl:text>]</xsl:text>
+	</xsl:template>
+</xsl:stylesheet>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/transform.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/transform.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/data/transform.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"
+	}
+]

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/images/clock_face.jpg
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/images/clock_face.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/images/clock_face_black.jpg
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/images/clock_face_black.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/inspector.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/inspector.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/inspector.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,165 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" >
+<head>
+<title>Inspect DojoX GFX JSON</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+	td.cell { padding: 1em 1em 0em 0em; }
+	td.note { font-size: 80%; }
+</style>
+<!--
+The next line should include Microsoft's Silverligth.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js"></script>
+<script type="text/javascript">
+dojo.require("dojox.gfx");
+dojo.require("dojox.gfx.move");
+dojo.require("dojox.gfx.utils");
+
+surface = null;
+container_pos = null;
+mover = null;
+
+init = function(){
+	// initialize graphics
+	var container = dojo.byId("gfx");
+	surface = dojox.gfx.createSurface(container, 500, 500);
+	container_pos = dojo.coords(container, true);
+	// wire UI
+	dojo.connect(dojo.byId("load"), "onclick", onLoad);
+	dojo.connect(dojo.byId("add"),  "onclick", onAdd);
+	// handle moves
+	dojo.subscribe("/gfx/move/start", function(m){ mover = m; });
+	dojo.subscribe("/gfx/move/stop", function(){ mover = null; });
+	// handle shape operations
+	dojo.connect(document, "onkeydown", onKeyDown);
+	// cancel text selection and text dragging
+	dojo.connect(container, "ondragstart",   dojo, "stopEvent");
+	dojo.connect(container, "onselectstart", dojo, "stopEvent");
+};
+
+onLoad = function(){
+	var s = dojo.byId("source");
+	if(!s.value){
+		alert("Name of the file is required.");
+		return;
+	}
+	dojo.xhrGet({
+		url:			s.value,
+		preventCache:	true,
+		handleAs:		"json",
+		load:			loadObjects,
+		error:			function(r){ alert("Error: " + r); }
+	});
+};
+
+mainObject = null;
+names = [];
+
+loadObjects = function(r){
+	if(!r){
+		alert("Wrong JSON object. Did you type the file name correctly?");
+		return;
+	}
+	mainObject = r;
+	// clear old object names
+	names = [];
+	var s = dojo.byId("names"), ni = dojo.byId("names_info");
+	ni.innerHTML = "";
+	while(s.childNodes.length){ s.removeChild(s.lastChild); }
+	// find new names
+	findNames(s, dojo.byId("named").checked, "", mainObject);
+	ni.innerHTML = " (" + names.length + ")";
+};
+
+findNames = function(selector, named_only, prefix, o){
+	if(o instanceof Array){
+		for(var i = 0; i < o.length; ++i){
+			findNames(selector, named_only, prefix, o[i]);
+		}
+		return;
+	}
+	if(named_only && !("name" in o)) return;
+	var name = ("name" in o) ? o.name : "*",
+		full = prefix ? prefix + "/" + name : name,
+		opt  = document.createElement("option");
+	opt.value = names.length;
+	opt.innerHTML = full;
+	names.push(o);
+	selector.appendChild(opt);
+	if("children" in o){
+		findNames(selector, named_only, full, o.children);
+	}
+};
+
+onAdd = function(){
+	var s = dojo.byId("names");
+	for(var i = 0; i < s.options.length; ++i){
+		var opt = s.options[i];
+		if(!opt.selected) continue;
+		var object = names[Number(opt.value)];
+		var group = surface.createGroup();
+		dojox.gfx.utils.deserialize(group, object);
+		new dojox.gfx.Moveable(group); // make it moveable as whole
+	}
+};
+
+// event handling
+
+onKeyDown = function(e){
+	if(!mover) return;
+	switch(e.keyCode){
+		case "f".charCodeAt(0): case "F".charCodeAt(0):
+			mover.shape.moveToFront();
+			break;
+		case "b".charCodeAt(0): case "B".charCodeAt(0):
+			mover.shape.moveToBack();
+			break;
+		case "q".charCodeAt(0): case "Q".charCodeAt(0):
+			mover.shape.applyLeftTransform(dojox.gfx.matrix.rotategAt(-15, mover.lastX - container_pos.x, mover.lastY - container_pos.y));
+			break;
+		case "w".charCodeAt(0): case "W".charCodeAt(0):
+			mover.shape.applyLeftTransform(dojox.gfx.matrix.rotategAt(15, mover.lastX - container_pos.x, mover.lastY - container_pos.y));
+			break;
+		case "d".charCodeAt(0): case "D".charCodeAt(0):
+			mover.shape.parent.remove(mover.shape);
+			mover.shape.rawNode = null;
+			mover.destroy();
+			break;
+	}
+	dojo.stopEvent(e);
+};
+
+dojo.addOnLoad(init);
+</script>
+</head>
+<body>
+	<h1>Inspect DojoX GFX JSON</h1>
+	<p>Help: load a file, select an object, and add it, move it around, or apply operations to selected items:<br />
+	F &mdash; bring to front, B &mdash; bring to back, Q &mdash; rotate CCW, W &mdash; rotate CW, D &mdash; delete.<br />
+	(all operations work on currently dragged item).</p>
+	<p><strong>VML note:</strong> VML doesn't process PNG images with opacity correctly.</p>
+	<table><tr>
+		<td align="left" valign="top" class="cell"><div id="gfx" style="width: 500px; height: 500px; border: solid 1px black;"></div></td>
+		<td align="left" valign="top" class="cell"><table>
+			<tr><td>Source:</td></tr>
+			<tr><td><input type="text" id="source" value="data/Lars.json" size="30" />&nbsp;<button id="load">Load</button><br />
+			<input type="checkbox" id="named" checked="checked" />&nbsp;<label for="named">Load only named objects</label></td></tr>
+			<tr><td class="note"><em>Available sources:</em></td></tr>
+			<tr><td class="note"><em>data/Lars.json &mdash; vectors from SVG</em></td></tr>
+			<tr><td class="note"><em>data/Nils.json &mdash; vectors from SVG</em></td></tr>
+			<tr><td class="note"><em>data/LarsDreaming.json &mdash; vectors from SVG</em></td></tr>
+			<tr><td class="note"><em>data/buratino.json &mdash; images</em></td></tr>
+			<tr><td class="note"><em>data/transform.json &mdash; from dojox.gfx</em></td></tr>
+			<tr><td>&nbsp;</td></tr>
+			<tr><td>Objects<span id="names_info"></span>:</td></tr>
+			<tr><td><select id="names" multiple="multiple" size="10" style="width: 300px;"></select></td></tr>
+			<tr><td><button id="add">Add Selected</button></td></tr>
+			<tr><td class="note"><div  style="width: 300px;">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.</div></td></tr>
+		</table></td>
+	</tr></table>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/lion.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/lion.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/lion.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,235 @@
+<html>
+<head>
+<title>dojox.gfx: Lion</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/themes/tundra/tundra.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<!--
+The next line should include Microsoft's Silverligth.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="parseOnLoad: true"></script>
+<!--
+<script type="text/javascript" src="../_base.js"></script>
+<script type="text/javascript" src="../shape.js"></script>
+<script type="text/javascript" src="../path.js"></script>
+<script type="text/javascript" src="../arc.js"></script>
+-->
+<!--<script type="text/javascript" src="../vml.js"></script>-->
+<!--<script type="text/javascript" src="../svg.js"></script>-->
+<!--<script type="text/javascript" src="../canvas.js"></script>-->
+<!--<script type="text/javascript" src="../silverlight.js"></script>-->
+<script type="text/javascript">
+
+dojo.require("dijit.form.Slider");
+dojo.require("dojo.parser"); // scan page for widgets
+
+dojo.require("dojox.gfx");
+
+var rotation = 0, scaling = 1;
+var surface, g, m = dojox.gfx.matrix;
+var initial_matrix = m.normalize([m.rotateg(10), m.translate(300, 100)]);
+
+var updateMatrix = function(){
+	if(g){ g.setTransform([m.rotategAt(rotation, 350, 350), m.scaleAt(scaling, 350, 350), initial_matrix]); }
+};
+
+var rotatingEvent = function(value){
+	rotation = value;
+	dojo.byId("rotationValue").innerHTML = rotation;
+	updateMatrix();
+};
+
+var scalingEvent = function(value){
+	scaling = Math.exp(Math.LN10 * (value - 1));
+	dojo.byId("scaleValue").innerHTML = scaling.toFixed(3);
+	updateMatrix();
+};
+
+makeShapes = function(){
+	surface = dojox.gfx.createSurface(dojo.byId("gfx_holder"), 700, 700);
+	surface.createRect({x: 0, y: 0, width: 700, height: 700}).setFill("#eee");
+	g = surface.createGroup().setTransform(initial_matrix);
+	g.createPolyline([69,18,82,8,99,3,118,5,135,12,149,21,156,13,165,9,177,13,183,28,180,50,164,91,155,107,154,114,151,121,141,127,139,136,155,206,157,251,126,342,133,357,128,376,83,376,75,368,67,350,61,350,53,369,4,369,2,361,5,354,12,342,16,321,4,257,4,244,7,218,9,179,26,127,43,93,32,77,30,70,24,67,16,49,17,35,18,23,30,12,40,7,53,7,62,12]).setFill("#f2cc99");
+	g.createPolyline([142,79,136,74,138,82,133,78,133,84,127,78,128,85,124,80,125,87,119,82,119,90,125,99,125,96,128,100,128,94,131,98,132,93,135,97,136,93,138,97,139,94,141,98,143,94,144,85]).setFill("#e5b27f");
+	g.createPolyline([127,101,132,100,137,99,144,101,143,105,135,110]).setFill("#eb8080");
+	g.createPolyline([178,229,157,248,139,296,126,349,137,356,158,357,183,342,212,332,235,288,235,261,228,252,212,250,188,251]).setFill("#f2cc99");
+	var c = new dojo.Color("#9c826b");
+	g.createPolyline([56,229,48,241,48,250,57,281,63,325,71,338,81,315,76,321,79,311,83,301,75,308,80,298,73,303,76,296,71,298,74,292,69,293,74,284,78,278,71,278,74,274,68,273,70,268,66,267,68,261,60,266,62,259,65,253,57,258,59,251,55,254,55,248,60,237,54,240,58,234,54,236]).setFill(c);
+	g.createPolyline([74,363,79,368,81,368,85,362,89,363,92,370,96,373,101,372,108,361,110,371,113,373,116,371,120,358,122,363,123,371,126,371,129,367,132,357,135,361,130,376,127,377,94,378,84,376,76,371]).setFill(c);
+	g.createPolyline([212,250,219,251,228,258,236,270,235,287,225,304,205,332,177,343,171,352,158,357,166,352,168,346,168,339,165,333,155,327,155,323,161,320,165,316,169,316,167,312,171,313,168,308,173,309,170,306,177,306,175,308,177,311,174,311,176,316,171,315,174,319,168,320,168,323,175,327,179,332,183,326,184,332,189,323,190,328,194,320,194,325,199,316,201,320,204,313,206,316,208,310,211,305,219,298,226,288,229,279,228,266,224,259,217,253]).setFill(c);
+	g.createPolyline([151,205,151,238,149,252,141,268,128,282,121,301,130,300,126,313,118,324,116,337,120,346,133,352,133,340,137,333,145,329,156,327,153,319,153,291,157,271,170,259,178,277,193,250,174,216]).setFill(c);
+	g.createPolyline([78,127,90,142,95,155,108,164,125,167,139,175,150,206,152,191,141,140,121,148,100,136]).setFill(c);
+	g.createPolyline([21,58,35,63,38,68,32,69,42,74,40,79,47,80,54,83,45,94,34,81,32,73,24,66]).setFill(c);
+	g.createPolyline([71,34,67,34,66,27,59,24,54,17,48,17,39,22,30,26,28,31,31,39,38,46,29,45,36,54,41,61,41,70,50,69,54,71,55,58,67,52,76,43,76,39,68,44]).setFill(c);
+	g.createPolyline([139,74,141,83,143,89,144,104,148,104,155,106,154,86,157,77,155,72,150,77,144,77]).setFill(c);
+	g.createPolyline([105,44,102,53,108,58,111,62,112,55]).setFill(c);
+	g.createPolyline([141,48,141,54,144,58,139,62,137,66,136,59,137,52]).setFill(c);
+	g.createPolyline([98,135,104,130,105,134,108,132,108,135,112,134,113,137,116,136,116,139,119,139,124,141,128,140,133,138,140,133,139,140,126,146,104,144]).setFill(c);
+	g.createPolyline([97,116,103,119,103,116,111,118,116,117,122,114,127,107,135,111,142,107,141,114,145,118,149,121,145,125,140,124,127,121,113,125,100,124]).setFill(c);
+	g.createPolyline([147,33,152,35,157,34,153,31,160,31,156,28,161,28,159,24,163,25,163,21,165,22,170,23,167,17,172,21,174,18,175,23,176,22,177,28,177,33,174,37,176,39,174,44,171,49,168,53,164,57,159,68,156,70,154,60,150,51,146,43,144,35]).setFill(c);
+	g.createPolyline([85,72,89,74,93,75,100,76,105,75,102,79,94,79,88,76]).setFill(c);
+	g.createPolyline([86,214,79,221,76,232,82,225,78,239,82,234,78,245,81,243,79,255,84,250,84,267,87,254,90,271,90,257,95,271,93,256,95,249,92,252,93,243,89,253,89,241,86,250,87,236,83,245,87,231,82,231,90,219,84,221]).setFill(c);
+	c = new dojo.Color("#ffcc7f");
+	g.createPolyline([93,68,96,72,100,73,106,72,108,66,105,63,100,62]).setFill(c);
+	g.createPolyline([144,64,142,68,142,73,146,74,150,73,154,64,149,62]).setFill(c);
+	c = new dojo.Color("#9c826b");
+	g.createPolyline([57,91,42,111,52,105,41,117,53,112,46,120,53,116,50,124,57,119,55,127,61,122,60,130,67,126,66,134,71,129,72,136,77,130,76,137,80,133,82,138,86,135,96,135,94,129,86,124,83,117,77,123,79,117,73,120,75,112,68,116,71,111,65,114,69,107,63,110,68,102,61,107,66,98,61,103,63,97,57,99]).setFill(c);
+	g.createPolyline([83,79,76,79,67,82,75,83,65,88,76,87,65,92,76,91,68,96,77,95,70,99,80,98,72,104,80,102,76,108,85,103,92,101,87,98,93,96,86,94,91,93,85,91,93,89,99,89,105,93,107,85,102,82,92,80]).setFill(c);
+	g.createPolyline([109,77,111,83,109,89,113,94,117,90,117,81,114,78]).setFill(c);
+	g.createPolyline([122,128,127,126,134,127,136,129,134,130,130,128,124,129]).setFill(c);
+	g.createPolyline([78,27,82,32,80,33,82,36,78,37,82,40,78,42,81,46,76,47,78,49,74,50,82,52,87,50,83,48,91,46,86,45,91,42,88,40,92,37,86,34,90,31,86,29,89,26]).setFill(c);
+	g.createPolyline([82,17,92,20,79,21,90,25,81,25,94,28,93,26,101,30,101,26,107,33,108,28,111,40,113,34,115,45,117,39,119,54,121,46,124,58,126,47,129,59,130,49,134,58,133,44,137,48,133,37,137,40,133,32,126,20,135,26,132,19,138,23,135,17,142,18,132,11,116,6,94,6,78,11,92,12,80,14,90,16]).setFill(c);
+	g.createPolyline([142,234,132,227,124,223,115,220,110,225,118,224,127,229,135,236,122,234,115,237,113,242,121,238,139,243,121,245,111,254,95,254,102,244,104,235,110,229,100,231,104,224,113,216,122,215,132,217,141,224,145,230,149,240]).setFill(c);
+	g.createPolyline([115,252,125,248,137,249,143,258,134,255,125,254]).setFill(c);
+	g.createPolyline([114,212,130,213,140,219,147,225,144,214,137,209,128,207]).setFill(c);
+	g.createPolyline([102,263,108,258,117,257,131,258,116,260,109,265]).setFill(c);
+	g.createPolyline([51,241,35,224,40,238,23,224,31,242,19,239,28,247,17,246,25,250,37,254,39,263,44,271,47,294,48,317,51,328,60,351,60,323,53,262,47,246]).setFill(c);
+	g.createPolyline([2,364,9,367,14,366,18,355,20,364,26,366,31,357,35,364,39,364,42,357,47,363,53,360,59,357,54,369,7,373]).setFill(c);
+	g.createPolyline([7,349,19,345,25,339,18,341,23,333,28,326,23,326,27,320,23,316,25,311,20,298,15,277,12,264,9,249,10,223,3,248,5,261,15,307,17,326,11,343]).setFill(c);
+	g.createPolyline([11,226,15,231,25,236,18,227]).setFill(c);
+	g.createPolyline([13,214,19,217,32,227,23,214,16,208,15,190,24,148,31,121,24,137,14,170,8,189]).setFill(c);
+	g.createPolyline([202,254,195,258,199,260,193,263,197,263,190,268,196,268,191,273,188,282,200,272,194,272,201,266,197,265,204,262,200,258,204,256]).setFill(c);
+	c = new dojo.Color("#845433");
+	g.createPolyline([151,213,165,212,179,225,189,246,187,262,179,275,176,263,177,247,171,233,163,230,165,251,157,264,146,298,145,321,133,326,143,285,154,260,153,240]).setFill(c);
+	g.createPolyline([91,132,95,145,97,154,104,148,107,155,109,150,111,158,115,152,118,159,120,153,125,161,126,155,133,164,132,154,137,163,137,152,142,163,147,186,152,192,148,167,141,143,124,145,105,143]).setFill(c);
+	c = new dojo.Color("#9c826b");
+	g.createPolyline([31,57,23,52,26,51,20,44,23,42,21,36,22,29,25,23,24,32,30,43,26,41,30,50,26,48]).setFill(c);
+	g.createPolyline([147,21,149,28,155,21,161,16,167,14,175,15,173,11,161,9]).setFill(c);
+	g.createPolyline([181,39,175,51,169,57,171,65,165,68,165,75,160,76,162,91,171,71,180,51]).setFill(c);
+	g.createPolyline([132,346,139,348,141,346,142,341,147,342,143,355,133,350]).setFill(c);
+	g.createPolyline([146,355,151,352,155,348,157,343,160,349,151,356,147,357]).setFill(c);
+	g.createPolyline([99,266,100,281,94,305,86,322,78,332,72,346,73,331,91,291]).setFill(c);
+	g.createPolyline([20,347,32,342,45,340,54,345,45,350,42,353,38,350,31,353,29,356,23,350,19,353,15,349]).setFill(c);
+	g.createPolyline([78,344,86,344,92,349,88,358,84,352]).setFill(c);
+	g.createPolyline([93,347,104,344,117,345,124,354,121,357,116,351,112,351,108,355,102,351]).setFill(c);
+	c = new dojo.Color("black");
+	g.createPolyline([105,12,111,18,113,24,113,29,119,34,116,23,112,16]).setFill(c);
+	g.createPolyline([122,27,125,34,127,43,128,34,125,29]).setFill(c);
+	g.createPolyline([115,13,122,19,122,15,113,10]).setFill(c);
+	c = new dojo.Color("#ffe5b2");
+	g.createPolyline([116,172,107,182,98,193,98,183,90,199,89,189,84,207,88,206,87,215,95,206,93,219,91,230,98,216,97,226,104,214,112,209,104,208,113,202,126,200,139,207,132,198,142,203,134,192,142,195,134,187,140,185,130,181,136,177,126,177,125,171,116,180]).setFill(c);
+	g.createPolyline([74,220,67,230,67,221,59,235,63,233,60,248,70,232,65,249,71,243,67,256,73,250,69,262,73,259,71,267,76,262,72,271,78,270,76,275,82,274,78,290,86,279,86,289,92,274,88,275,87,264,82,270,82,258,77,257,78,247,73,246,77,233,72,236]).setFill(c);
+	g.createPolyline([133,230,147,242,148,250,145,254,138,247,129,246,142,245,138,241,128,237,137,238]).setFill(c);
+	g.createPolyline([133,261,125,261,116,263,111,267,125,265]).setFill(c);
+	g.createPolyline([121,271,109,273,103,279,99,305,92,316,85,327,83,335,89,340,97,341,94,336,101,336,96,331,103,330,97,327,108,325,99,322,109,321,100,318,110,317,105,314,110,312,107,310,113,308,105,306,114,303,105,301,115,298,107,295,115,294,108,293,117,291,109,289,117,286,109,286,118,283,112,281,118,279,114,278,119,276,115,274]).setFill(c);
+	g.createPolyline([79,364,74,359,74,353,76,347,80,351,83,356,82,360]).setFill(c);
+	g.createPolyline([91,363,93,356,97,353,103,355,105,360,103,366,99,371,94,368]).setFill(c);
+	g.createPolyline([110,355,114,353,118,357,117,363,113,369,111,362]).setFill(c);
+	g.createPolyline([126,354,123,358,124,367,126,369,129,361,129,357]).setFill(c);
+	g.createPolyline([30,154,24,166,20,182,23,194,29,208,37,218,41,210,41,223,46,214,46,227,52,216,52,227,61,216,59,225,68,213,73,219,70,207,77,212,69,200,77,202,70,194,78,197,68,187,76,182,64,182,58,175,58,185,53,177,50,186,46,171,44,182,39,167,36,172,36,162,30,166]).setFill(c);
+	g.createPolyline([44,130,41,137,45,136,43,150,48,142,48,157,53,150,52,164,60,156,61,169,64,165,66,175,70,167,74,176,77,168,80,183,85,172,90,182,93,174,98,181,99,173,104,175,105,169,114,168,102,163,95,157,94,166,90,154,87,162,82,149,75,159,72,148,68,155,67,143,62,148,62,138,58,145,56,133,52,142,52,128,49,134,47,125]).setFill(c);
+	g.createPolyline([13,216,19,219,36,231,22,223,16,222,22,227,12,224,13,220,16,220]).setFill(c);
+	g.createPolyline([10,231,14,236,25,239,27,237,19,234]).setFill(c);
+	g.createPolyline([9,245,14,242,25,245,13,245]).setFill(c);
+	g.createPolyline([33,255,26,253,18,254,25,256,18,258,27,260,18,263,27,265,19,267,29,270,21,272,29,276,21,278,30,281,22,283,31,287,24,288,32,292,23,293,34,298,26,299,37,303,32,305,39,309,33,309,39,314,34,314,40,318,34,317,40,321,34,321,41,326,33,326,40,330,33,332,39,333,33,337,42,337,54,341,49,337,52,335,47,330,50,330,45,325,49,325,45,321,48,321,45,316,46,306,45,286,43,274,36,261]).setFill(c);
+	g.createPolyline([7,358,9,351,14,351,17,359,11,364]).setFill(c);
+	g.createPolyline([44,354,49,351,52,355,49,361]).setFill(c);
+	g.createPolyline([32,357,37,353,40,358,36,361]).setFill(c);
+	g.createPolyline([139,334,145,330,154,330,158,334,154,341,152,348,145,350,149,340,147,336,141,339,139,345,136,342,136,339]).setFill(c);
+	g.createPolyline([208,259,215,259,212,255,220,259,224,263,225,274,224,283,220,292,208,300,206,308,203,304,199,315,197,309,195,318,193,313,190,322,190,316,185,325,182,318,180,325,172,321,178,320,176,313,186,312,180,307,188,307,184,303,191,302,186,299,195,294,187,290,197,288,192,286,201,283,194,280,203,277,198,275,207,271,200,269,209,265,204,265,212,262]).setFill(c);
+	g.createPolyline([106,126,106,131,109,132,111,134,115,132,115,135,119,133,118,137,123,137,128,137,133,134,136,130,136,127,132,124,118,128,112,128,106,126,106,126,106,126]).setFill(c);
+	g.createPolyline([107,114,101,110,98,102,105,97,111,98,119,102,121,108,118,112,113,115]).setFill(c);
+	g.createPolyline([148,106,145,110,146,116,150,118,152,111,151,107]).setFill(c);
+	g.createPolyline([80,55,70,52,75,58,63,57,72,61,57,61,67,66,57,67,62,69,54,71,61,73,54,77,63,78,53,85,60,84,56,90,69,84,63,82,75,76,70,75,77,72,72,71,78,69,72,66,81,67,78,64,82,63,80,60,86,62]).setFill(c);
+	g.createPolyline([87,56,91,52,96,50,102,56,98,56,92,60]).setFill(c);
+	g.createPolyline([85,68,89,73,98,76,106,74,96,73,91,70]).setFill(c);
+	g.createPolyline([115,57,114,64,111,64,115,75,122,81,122,74,126,79,126,74,131,78,130,72,133,77,131,68,126,61,119,57]).setFill(c);
+	g.createPolyline([145,48,143,53,147,59,151,59,150,55]).setFill(c);
+	g.createPolyline([26,22,34,15,43,10,52,10,59,16,47,15,32,22]).setFill(c);
+	g.createPolyline([160,19,152,26,149,34,154,33,152,30,157,30,155,26,158,27,157,23,161,23]).setFill(c);
+	c = new dojo.Color("black");
+	g.createPolyline([98,117,105,122,109,122,105,117,113,120,121,120,130,112,128,108,123,103,123,99,128,101,132,106,135,109,142,105,142,101,145,101,145,91,148,101,145,105,136,112,135,116,143,124,148,120,150,122,142,128,133,122,121,125,112,126,103,125,100,129,96,124]).setFill(c);
+	g.createPolyline([146,118,152,118,152,115,149,115]).setFill(c);
+	g.createPolyline([148,112,154,111,154,109,149,109]).setFill(c);
+	g.createPolyline([106,112,108,115,114,116,118,114]).setFill(c);
+	g.createPolyline([108,108,111,110,116,110,119,108]).setFill(c);
+	g.createPolyline([106,104,109,105,117,106,115,104]).setFill(c);
+	g.createPolyline([50,25,41,26,34,33,39,43,49,58,36,51,47,68,55,69,54,59,61,57,74,46,60,52,67,42,57,48,61,40,54,45,60,36,59,29,48,38,52,30,47,32]).setFill(c);
+	g.createPolyline([147,34,152,41,155,49,161,53,157,47,164,47,158,43,168,44,159,40,164,37,169,37,164,33,169,34,165,28,170,30,170,25,173,29,175,27,176,32,173,36,175,39,172,42,172,46,168,49,170,55,162,57,158,63,155,58,153,50,149,46]).setFill(c);
+	g.createPolyline([155,71,159,80,157,93,157,102,155,108,150,101,149,93,154,101,152,91,151,83,155,79]).setFill(c);
+	g.createPolyline([112,78,115,81,114,91,112,87,113,82]).setFill(c);
+	g.createPolyline([78,28,64,17,58,11,47,9,36,10,28,16,21,26,18,41,20,51,23,61,33,65,28,68,37,74,36,81,43,87,48,90,43,100,40,98,39,90,31,80,30,72,22,71,17,61,14,46,16,28,23,17,33,9,45,6,54,6,65,12]).setFill(c);
+	g.createPolyline([67,18,76,9,87,5,101,2,118,3,135,8,149,20,149,26,144,19,132,12,121,9,105,7,89,8,76,14,70,20]).setFill(c);
+	g.createPolyline([56,98,48,106,56,103,47,112,56,110,52,115,57,113,52,121,62,115,58,123,65,119,63,125,69,121,68,127,74,125,74,129,79,128,83,132,94,135,93,129,85,127,81,122,76,126,75,121,71,124,71,117,66,121,66,117,62,117,64,112,60,113,60,110,57,111,61,105,57,107,60,101,55,102]).setFill(c);
+	g.createPolyline([101,132,103,138,106,134,106,139,112,136,111,142,115,139,114,143,119,142,125,145,131,142,135,138,140,134,140,129,143,135,145,149,150,171,149,184,145,165,141,150,136,147,132,151,131,149,126,152,125,150,121,152,117,148,111,152,110,148,105,149,104,145,98,150,96,138,94,132,94,130,98,132]).setFill(c);
+	g.createPolyline([41,94,32,110,23,132,12,163,6,190,7,217,5,236,3,247,9,230,12,211,12,185,18,160,26,134,35,110,43,99]).setFill(c);
+	g.createPolyline([32,246,41,250,50,257,52,267,53,295,53,323,59,350,54,363,51,365,44,366,42,360,40,372,54,372,59,366,62,353,71,352,75,335,73,330,66,318,68,302,64,294,67,288,63,286,63,279,59,275,58,267,56,262,50,247,42,235,44,246,32,236,35,244]).setFill(c);
+	g.createPolyline([134,324,146,320,159,322,173,327,179,337,179,349,172,355,158,357,170,350,174,343,170,333,163,328,152,326,134,329]).setFill(c);
+	g.createPolyline([173,339,183,334,184,338,191,329,194,332,199,323,202,325,206,318,209,320,213,309,221,303,228,296,232,289,234,279,233,269,230,262,225,256,219,253,208,252,198,252,210,249,223,250,232,257,237,265,238,277,238,291,232,305,221,323,218,335,212,342,200,349,178,348]).setFill(c);
+	g.createPolyline([165,296,158,301,156,310,156,323,162,324,159,318,162,308,162,304]).setFill(c);
+	g.createPolyline([99,252,105,244,107,234,115,228,121,228,131,235,122,233,113,235,109,246,121,239,133,243,121,243,110,251]).setFill(c);
+	g.createPolyline([117,252,124,247,134,249,136,253,126,252]).setFill(c);
+	g.createPolyline([117,218,132,224,144,233,140,225,132,219,117,218,117,218,117,218]).setFill(c);
+	g.createPolyline([122,212,134,214,143,221,141,213,132,210]).setFill(c);
+	g.createPolyline([69,352,70,363,76,373,86,378,97,379,108,379,120,377,128,378,132,373,135,361,133,358,132,366,127,375,121,374,121,362,119,367,117,374,110,376,110,362,107,357,106,371,104,375,97,376,90,375,90,368,86,362,83,364,86,369,85,373,78,370,73,362,71,351]).setFill(c);
+	g.createPolyline([100,360,96,363,99,369,102,364]).setFill(c);
+	g.createPolyline([115,360,112,363,114,369,117,364]).setFill(c);
+	g.createPolyline([127,362,125,364,126,369,128,365]).setFill(c);
+	g.createPolyline([5,255,7,276,11,304,15,320,13,334,6,348,2,353,0,363,5,372,12,374,25,372,38,372,44,369,42,367,36,368,31,369,30,360,27,368,20,370,16,361,15,368,10,369,3,366,3,359,6,352,11,348,17,331,19,316,12,291,9,274]).setFill(c);
+	g.createPolyline([10,358,7,362,10,366,11,362]).setFill(c);
+	g.createPolyline([25,357,22,360,24,366,27,360]).setFill(c);
+	g.createPolyline([37,357,34,361,36,365,38,361]).setFill(c);
+	g.createPolyline([49,356,46,359,47,364,50,360]).setFill(c);
+	g.createPolyline([130,101,132,102,135,101,139,102,143,103,142,101,137,100,133,100]).setFill(c);
+	g.createPolyline([106,48,105,52,108,56,109,52]).setFill(c);
+	g.createPolyline([139,52,139,56,140,60,142,58,141,56]).setFill(c);
+	g.createPolyline([25,349,29,351,30,355,33,350,37,348,42,351,45,347,49,345,44,343,36,345]).setFill(c);
+	g.createPolyline([98,347,105,351,107,354,109,349,115,349,120,353,118,349,113,346,104,346]).setFill(c);
+	g.createPolyline([83,348,87,352,87,357,89,351,87,348]).setFill(c);
+	g.createPolyline([155,107,163,107,170,107,186,108,175,109,155,109]).setFill(c);
+	g.createPolyline([153,114,162,113,175,112,192,114,173,114,154,115]).setFill(c);
+	g.createPolyline([152,118,164,120,180,123,197,129,169,123,151,120]).setFill(c);
+	g.createPolyline([68,109,87,106,107,106,106,108,88,108]).setFill(c);
+	g.createPolyline([105,111,95,112,79,114,71,116,85,115,102,113]).setFill(c);
+	g.createPolyline([108,101,98,99,87,99,78,99,93,100,105,102]).setFill(c);
+	g.createPolyline([85,63,91,63,97,60,104,60,108,62,111,69,112,75,110,74,108,71,103,73,106,69,105,65,103,64,103,67,102,70,99,70,97,66,94,67,97,72,88,67,84,66]).setFill(c);
+	g.createPolyline([140,74,141,66,144,61,150,61,156,62,153,70,150,73,152,65,150,65,151,68,149,71,146,71,144,66,143,70,143,74]).setFill(c);
+	g.createPolyline([146,20,156,11,163,9,172,9,178,14,182,18,184,32,182,42,182,52,177,58,176,67,171,76,165,90,157,105,160,92,164,85,168,78,167,73,173,66,172,62,175,59,174,55,177,53,180,46,181,29,179,21,173,13,166,11,159,13,153,18,148,23]).setFill(c);
+	g.createPolyline([150,187,148,211,150,233,153,247,148,267,135,283,125,299,136,292,131,313,122,328,122,345,129,352,133,359,133,367,137,359,148,356,140,350,131,347,129,340,132,332,140,328,137,322,140,304,154,265,157,244,155,223,161,220,175,229,186,247,185,260,176,275,178,287,185,277,188,261,196,253,189,236,174,213]).setFill(c);
+	g.createPolyline([147,338,142,341,143,345,141,354,147,343]).setFill(c);
+	g.createPolyline([157,342,156,349,150,356,157,353,163,346,162,342]).setFill(c);
+	g.createPolyline([99,265,96,284,92,299,73,339,73,333,87,300]).setFill(c);
+	//surface.createLine({x1: 0, y1: 350, x2: 700, y2: 350}).setStroke("green");
+	//surface.createLine({y1: 0, x1: 350, y2: 700, x2: 350}).setStroke("green");
+    dojo.connect(dijit.byId("rotatingSlider"), "onChange", rotatingEvent);
+    dojo.connect(dijit.byId("scalingSlider"), "onChange", scalingEvent);
+};
+
+dojo.addOnLoad(makeShapes);
+
+</script>
+<style type="text/css">
+	td.pad { padding: 0px 5px 0px 5px; }
+</style>
+</head>
+<body class="tundra">
+	<h1>dojox.gfx: Lion</h1>
+	<p>This example was directly converted from SVG file.</p>
+	<table>
+		<tr><td align="center" class="pad">Rotation (<span id="rotationValue">0</span>)</td></tr>
+		<tr><td>
+			<div id="rotatingSlider" dojoType="dijit.form.HorizontalSlider" 
+					value="0" minimum="-180" maximum="180" discreteValues="72" showButtons="false" intermediateChanges="true"
+					style="width: 600px;">
+				<div dojoType="dijit.form.HorizontalRule" container="topDecoration" count="73" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count="9" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" labels="-180,-135,-90,-45,0,45,90,135,180" style="height:1.2em;font-size:75%;color:gray;"></div>
+			</div>
+		</td></tr>
+		<tr><td align="center" class="pad">Scaling (<span id="scaleValue">1.000</span>)</td></tr>
+		<tr><td>
+			<div id="scalingSlider" dojoType="dijit.form.HorizontalSlider" 
+				value="1" minimum="0" maximum="1"  showButtons="false"  intermediateChanges="true"
+				style="width: 600px;">
+				<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count="5" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" labels="10%,18%,32%,56%,100%" style="height:1.2em;font-size:75%;color:gray;"></div>
+			</div>
+		</td></tr>
+	</table>
+	<div id="gfx_holder" style="width: 700px; height: 700px;"></div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/roundedPane.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/roundedPane.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/roundedPane.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,191 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
+<html>
+    <head>
+
+		<title>rounded skeleton page | The Dojo Toolkit</title>
+			
+		<script type="text/javascript" src="../../../dojo/dojo.js"
+				djConfig="parseOnLoad:true, isDebug:true"></script>
+
+		<script type="text/javascript">
+		
+			dojo.require("dijit.layout.ContentPane");
+			dojo.require("dijit._Templated");
+			dojo.require("dojox.gfx");
+			dojo.require("dojo.dnd.TimedMoveable");
+			
+			dojo.declare("my.RoundedContentPane",[dijit.layout.ContentPane,dijit._Templated],{
+				// radius: Integer
+				//		radius of the corners
+				radius:15,
+				// moveable: Boolean
+				// 		if true, the node is movable by either the containerNode, or an optional node
+				//		found by the handle attribute
+				moveable:false,
+				// handle: String
+				// 		a CSS3 selector query to match the handle for this node, scoped to this.domNode
+				handle:".handle",
+				
+				// template:
+				templateString:
+					'<div><div style="position:relative;">' +
+						'<div dojoAttachPoint="surfaceNode"></div>' +
+						'<div dojoAttachPoint="containerNode"></div>' +
+					'</div></div>',
+				
+				startup:function(){
+					
+					this.inherited(arguments);
+					this._initSurface();
+					dojo.style(this.surfaceNode,{
+						position:"absolute",
+						top:0,
+						left:0
+					});
+					
+					if(this.moveable){
+						this._mover = new dojo.dnd.TimedMoveable(this.domNode,{
+							handle: dojo.query(this.handle,this.domNode)[0] ||this.containerNode,
+							timeout:69
+						});
+					}
+			
+				},
+				
+				_initSurface: function(){
+			
+					var s = dojo.marginBox(this.domNode);
+					var stroke = 2;
+					
+					this.surface = dojox.gfx.createSurface(this.surfaceNode, s.w + stroke * 2, s.h + stroke * 2);
+					this.roundedShape = this.surface.createRect({
+							r: this.radius,
+							width: s.w,
+							height: s.h
+						})
+						.setFill([0, 0, 0, 0.5]) // black, 50% transparency
+						.setStroke({ color:[255,255,255,1], width:stroke }) // solid white
+					;
+					this.resize(s);
+					
+				},
+				
+				resize:function(size){
+					
+					if(!this.surface){ this._initSurfce(); }
+			
+					this.surface.setDimensions(size.w,size.h);
+					this.roundedShape.setShape({
+						width: size.w,
+						height: size.h
+					});
+			
+					var _offset = Math.floor(this.radius / 2);		
+					dojo.style(this.containerNode,{
+						color: "#fff",
+						position: "absolute",
+						overflow: "auto",
+						top: _offset + "px",
+						left: _offset + "px",
+						height: (size.h - _offset * 2) + "px",
+						width: (size.w - _offset * 2) + "px"
+					});
+					
+				}
+				
+			});
+		</script>
+			
+		<style type="text/css">
+			body { background:#ededed; }
+		</style>
+	
+    </head>
+    <body>
+		
+		<h1>Some gfx + ContentPane's</h1>
+
+		<div dojoType="my.RoundedContentPane" radius="55" title="Pane 2" style="width:200px; height:400px; float:right">
+			<h3>YO!</h3>
+			<p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p><p>lorem</p>
+		</div>
+
+		<div style="width:400px; height:200px;" dojoType="my.RoundedContentPane">
+			LOREM, ipsum, dollllllllllor:
+			.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}<p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p><p>.roundedContent {
+				padding: 31px;
+				font-family: 'Tahoma';
+				font-size: 12px;
+				color:#fff; 
+			}</p>
+			
+		</div>
+	
+	
+		<div radius="45" style="width:400px; height:200px;" moveable="true" dojoType="my.RoundedContentPane" handle=".myHandle">
+			<h4 class="myHandle" style="cursor:move; margin-top:0; border:1px solid #666">Moveable Handle</h4>
+			LOREM, ipsum, dollllllllllor:			
+		</div>
+	
+	
+		<div dojoType="my.RoundedContentPane" title="Pane 1" moveable="true" style="width:100px; height:100px;">
+			lorem ipsum (small moveable)
+		</div>		
+	
+    </body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/tiger.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/tiger.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/tiger.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,566 @@
+<html>
+<head>
+<title>dojox.gfx: Tiger</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style type="text/css">
+	@import "../../../dojo/resources/dojo.css";
+	@import "../../../dijit/themes/tundra/tundra.css";
+	@import "../../../dijit/tests/css/dijitTests.css";
+</style>
+<!--
+The next line should include Microsoft's Silverligth.js, if you plan to use the silverlight backend
+<script type="text/javascript" src="Silverlight.js"></script>
+-->
+<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="parseOnLoad: true"></script>
+<script type="text/javascript">
+
+dojo.require("dijit.form.Slider");
+dojo.require("dojo.parser"); // scan page for widgets
+
+dojo.require("dojox.gfx");
+
+var rotation = 0, scaling = 1;
+var surface, g, m = dojox.gfx.matrix;
+var initial_matrix = m.translate(250, 250);
+
+var updateMatrix = function(){
+	if(g){ g.setTransform([m.rotategAt(rotation, 350, 350), m.scaleAt(scaling, 350, 350), initial_matrix]); }
+};
+
+var rotatingEvent = function(value){
+	rotation = value;
+	dojo.byId("rotationValue").innerHTML = rotation;
+	updateMatrix();
+};
+
+var scalingEvent = function(value){
+	scaling = Math.exp(Math.LN10 * (value - 1));
+	dojo.byId("scaleValue").innerHTML = scaling.toFixed(3);
+	updateMatrix();
+};
+
+makeShapes = function(){
+	surface = dojox.gfx.createSurface(dojo.byId("gfx_holder"), 700, 700);
+	surface.createRect({x: 0, y: 0, width: 700, height: 700}).setFill("#eee");
+	g = surface.createGroup().setTransform(initial_matrix);
+	var f, s = {color: "black", width: 1};
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-122.304 84.285C-122.304 84.285 -122.203 86.179 -123.027 86.16C-123.851 86.141 -140.305 38.066 -160.833 40.309C-160.833 40.309 -143.05 32.956 -122.304 84.285z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-118.774 81.262C-118.774 81.262 -119.323 83.078 -120.092 82.779C-120.86 82.481 -119.977 31.675 -140.043 26.801C-140.043 26.801 -120.82 25.937 -118.774 81.262z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-91.284 123.59C-91.284 123.59 -89.648 124.55 -90.118 125.227C-90.589 125.904 -139.763 113.102 -149.218 131.459C-149.218 131.459 -145.539 112.572 -91.284 123.59z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-94.093 133.801C-94.093 133.801 -92.237 134.197 -92.471 134.988C-92.704 135.779 -143.407 139.121 -146.597 159.522C-146.597 159.522 -149.055 140.437 -94.093 133.801z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-98.304 128.276C-98.304 128.276 -96.526 128.939 -96.872 129.687C-97.218 130.435 -147.866 126.346 -153.998 146.064C-153.998 146.064 -153.646 126.825 -98.304 128.276z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-109.009 110.072C-109.009 110.072 -107.701 111.446 -108.34 111.967C-108.979 112.488 -152.722 86.634 -166.869 101.676C-166.869 101.676 -158.128 84.533 -109.009 110.072z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-116.554 114.263C-116.554 114.263 -115.098 115.48 -115.674 116.071C-116.25 116.661 -162.638 95.922 -174.992 112.469C-174.992 112.469 -168.247 94.447 -116.554 114.263z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-119.154 118.335C-119.154 118.335 -117.546 119.343 -118.036 120.006C-118.526 120.669 -167.308 106.446 -177.291 124.522C-177.291 124.522 -173.066 105.749 -119.154 118.335z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-108.42 118.949C-108.42 118.949 -107.298 120.48 -107.999 120.915C-108.7 121.35 -148.769 90.102 -164.727 103.207C-164.727 103.207 -153.862 87.326 -108.42 118.949z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-128.2 90C-128.2 90 -127.6 91.8 -128.4 92C-129.2 92.2 -157.8 50.2 -177.001 57.8C-177.001 57.8 -161.8 46 -128.2 90z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-127.505 96.979C-127.505 96.979 -126.53 98.608 -127.269 98.975C-128.007 99.343 -164.992 64.499 -182.101 76.061C-182.101 76.061 -169.804 61.261 -127.505 96.979z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.172};
+	g.createPath("M-127.62 101.349C-127.62 101.349 -126.498 102.88 -127.199 103.315C-127.9 103.749 -167.969 72.502 -183.927 85.607C-183.927 85.607 -173.062 69.726 -127.62 101.349z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = "#000000";
+	g.createPath("M-129.83 103.065C-129.327 109.113 -128.339 115.682 -126.6 118.801C-126.6 118.801 -130.2 131.201 -121.4 144.401C-121.4 144.401 -121.8 151.601 -120.2 154.801C-120.2 154.801 -116.2 163.201 -111.4 164.001C-107.516 164.648 -98.793 167.717 -88.932 169.121C-88.932 169.121 -71.8 183.201 -75 196.001C-75 196.001 -75.4 212.401 -79 214.001C-79 214.001 -67.4 202.801 -77 219.601L-81.4 238.401C-81.4 238.401 -55.8 216.801 -71.4 235.201L-81.4 261.201C-81.4 261.201 -61.8 242.801 -69 251.201L-72.2 260.001C-72.2 260.001 -29 232.801 -59.8 262.401C-59.8 262.401 -51.8 258.801 -47.4 261.601C-47.4 261.601 -40.6 260.401 -41.4 262.001C-41.4 262.001 -62.2 272.401 -65.8 290.801C-65.8 290.801 -57.4 280.801 -60.6 291.601L-60.2 303.201C-60.2 303.201 -56.2 281.601 -56.6 319.201C-56.6 319.201 -37.4 301.201 -49 322.001L-49 338.801C-49 338.801 -33.8 322.401 -40.2 335.201C-40.2 335.201 -30.2 326.401 -34.2 341.601C-34.2 341.601 -35 352.001 -30.6 340.801C-30.6 340.801 -14.6 310.201 -20.6 336.401C-20.6 336.401 -21.4 355.601 -16.6 340.801C-16.6 340.801 -16.2 351.201 -7 358.401C-7 358.401 -8.2 307.601 4.6 343.601L8.6 360.001C8.6 360.001 11.4 350.801 11 345.601C11 345.601 25.8 329.201 19 353.601C19 353.601 34.2 330.801 31 344.001C31 344.001 23.4 360.001 25 364.801C25 364.801 41.8 330.001 43 328.401C43 328.401 41 370.802 51.8 334.801C51.8 334.801 57.4 346.801 54.6 351.201C54.6 351.201 62.6 343.201 61.8 340.001C61.8 340.001 66.4 331.801 69.2 345.401C69.2 345.401 71 354.801 72.6 351.601C72.6 351.601 76.6 375.602 77.8 352.801C77.8 352.801 79.4 339.201 72.2 327.601C72.2 327.601 73 324.401 70.2 320.401C70.2 320.401 83.8 342.001 76.6 313.201C76.6 313.201 87.801 321.201 89.001 321.201C89.001 321.201 75.4 298.001 84.2 302.801C84.2 302.801 79 292.401 97.001 304.401C97.001 304.401 81 288.401 98.601 298.001C98.601 298.001 106.601 304.401 99.001 294.401C99.001 294.401 84.6 278.401 106.601 296.401C106.601 296.401 118.201 312.801 119.001 315.601C119.001 315.601 109.001 286.401 104.601 283.601C104.601 283.601 113.001 247.201 154.201 262.801C154.201 262.801 161.001 280.001 165.401 261.601C165.401 261.601 178.201 255.201 189.401 282.801C189.401 282.801 193.401 269.201 192.601 266.401C192.601 266.401 199.401 267.601 198.601 266.401C198.601 266.401 211.801 270.801 213.001 270.001C213.001 270.001 219.801 276.801 220.201 273.201C220.201 273.201 229.401 276.001 227.401 272.401C227.401 272.401 236.201 288.001 236.601 291.601L239.001 277.601L241.001 280.401C241.001 280.401 242.601 272.801 241.801 271.601C241.001 270.401 261.801 278.401 266.601 299.201L268.601 307.601C268.601 307.601 274.601 292.801 273.001 288.801C273.001 288.801 278.201 289.601 278.601 294.001C278.601 294.001 282.601 270.801 277.801 264.801C277.801 264.801 282.201 264.001 283.401 267.601L283.401 260.401C283.401 260.401 290.601 261.201 290.601 258.801C290.601 258.801 295.001 254.801 297.001 259.601C297.001 259.601 284.601 224.401 303.001 243.601C303.001 243.601 310.201 254.401 306.601 235.601C303.001 216.801 299.001 215.201 303.801 214.801C303.801 214.801 304.601 211.201 302.601 209.601C300.601 208.001 303.801 209.601 303.801 209.601C303.801 209.601 308.601 213.601 303.401 191.601C303.401 191.601 309.801 193.201 297.801 164.001C297.801 164.001 300.601 161.601 296.601 153.201C296.601 153.201 304.601 157.601 307.401 156.001C307.401 156.001 307.001 154.401 303.801 150.401C303.801 150.401 282.201 95.6 302.601 117.601C302.601 117.601 314.451 131.151 308.051 108.351C308.051 108.351 298.94 84.341 299.717 80.045L-129.83 103.065z").setFill(f).setStroke(s);
+	f = "#cc7226"; s = "#000000";
+	g.createPath("M299.717 80.245C300.345 80.426 302.551 81.55 303.801 83.2C303.801 83.2 310.601 94 305.401 75.6C305.401 75.6 296.201 46.8 305.001 58C305.001 58 311.001 65.2 307.801 51.6C303.936 35.173 301.401 28.8 301.401 28.8C301.401 28.8 313.001 33.6 286.201 -6L295.001 -2.4C295.001 -2.4 275.401 -42 253.801 -47.2L245.801 -53.2C245.801 -53.2 284.201 -91.2 271.401 -128C271.401 -128 264.601 -133.2 255.001 -124C255.001 -124 248.601 -119.2 242.601 -120.8C242.601 -120.8 211.801 -119.6 209.801 -119.6C207.801 -119.6 173.001 -156.8 107.401 -139.2C107.401 -139.2 102.201 -137.2 97.801 -138.4C97.801 -138.4 79.4 -154.4 30.6 -131.6C30.6 -131.6 20.6 -129.6 19 -129.6C17.4 -129.6 14.6 -129.6 6.6 -123.2C-1.4 -116.8 -1.8 -116 -3.8 -114.4C-3.8 -114.4 -20.2 -103.2 -25 -102.4C-25 -102.4 -36.6 -96 -41 -86L-44.6 -84.8C-44.6 -84.8 -46.2 -77.6 -46.6 -76.4C-46.6 -76.4 -51.4 -72.8 -52.2 -67.2C-52.2 -67.2 -61 -61.2 -60.6 -56.8C-60.6 -56.8 -62.2 -51.6 -63 -46.8C-63 -46.8 -70.2 -42 -69.4 -39.2C-69.4 -39.2 -77 -25.2 -75.8 -18.4C-75.8 -18.4 -82.2 -18.8 -85 -16.4C-85 -16.4 -85.8 -11.6 -87.4 -11.2C-87.4 -11.2 -90.2 -10 -87.8 -6C-87.8 -6 -89.4 -3.2 -89.8 -1.6C-89.8 -1.6 -89 1.2 -93.4 6.8C-93.4 6.8 -99.8 25.6 -97.8 30.8C-97.8 30.8 -97.4 35.6 -100.2 37.2C-100.2 37.2 -103.8 36.8 -95.4 48.8C-95.4 48.8 -94.6 50 -97.8 52.4C-97.8 52.4 -115 56 -117.4 72.4C-117.4 72.4 -131 87.2 -131 92.4C-131 94.705 -130.729 97.852 -130.03 102.465C-130.03 102.465 -130.6 110.801 -103 111.601C-75.4 112.401 299.717 80.245 299.717 80.245z").setFill(f).setStroke(s);
+	f = "#cc7226"; s = null;
+	g.createPath("M-115.6 102.6C-140.6 63.2 -126.2 119.601 -126.2 119.601C-117.4 154.001 12.2 116.401 12.2 116.401C12.2 116.401 181.001 86 192.201 82C203.401 78 298.601 84.4 298.601 84.4L293.001 67.6C228.201 21.2 209.001 44.4 195.401 40.4C181.801 36.4 184.201 46 181.001 46.8C177.801 47.6 138.601 22.8 132.201 23.6C125.801 24.4 100.459 0.649 115.401 32.4C131.401 66.4 57 71.6 40.2 60.4C23.4 49.2 47.4 78.8 47.4 78.8C65.8 98.8 31.4 82 31.4 82C-3 69.2 -27 94.8 -30.2 95.6C-33.4 96.4 -38.2 99.6 -39 93.2C-39.8 86.8 -47.31 70.099 -79 96.4C-99 113.001 -112.8 91 -112.8 91L-115.6 102.6z").setFill(f).setStroke(s);
+	f = "#e87f3a";
+	g.createPath("M133.51 25.346C127.11 26.146 101.743 2.407 116.71 34.146C133.31 69.346 58.31 73.346 41.51 62.146C24.709 50.946 48.71 80.546 48.71 80.546C67.11 100.546 32.709 83.746 32.709 83.746C-1.691 70.946 -25.691 96.546 -28.891 97.346C-32.091 98.146 -36.891 101.346 -37.691 94.946C-38.491 88.546 -45.87 72.012 -77.691 98.146C-98.927 115.492 -112.418 94.037 -112.418 94.037L-115.618 104.146C-140.618 64.346 -125.546 122.655 -125.546 122.655C-116.745 157.056 13.509 118.146 13.509 118.146C13.509 118.146 182.31 87.746 193.51 83.746C204.71 79.746 299.038 86.073 299.038 86.073L293.51 68.764C228.71 22.364 210.31 46.146 196.71 42.146C183.11 38.146 185.51 47.746 182.31 48.546C179.11 49.346 139.91 24.546 133.51 25.346z").setFill(f).setStroke(s);
+	f = "#ea8c4d";
+	g.createPath("M134.819 27.091C128.419 27.891 103.685 3.862 118.019 35.891C134.219 72.092 59.619 75.092 42.819 63.892C26.019 52.692 50.019 82.292 50.019 82.292C68.419 102.292 34.019 85.492 34.019 85.492C-0.381 72.692 -24.382 98.292 -27.582 99.092C-30.782 99.892 -35.582 103.092 -36.382 96.692C-37.182 90.292 -44.43 73.925 -76.382 99.892C-98.855 117.983 -112.036 97.074 -112.036 97.074L-115.636 105.692C-139.436 66.692 -124.891 125.71 -124.891 125.71C-116.091 160.11 14.819 119.892 14.819 119.892C14.819 119.892 183.619 89.492 194.819 85.492C206.019 81.492 299.474 87.746 299.474 87.746L294.02 69.928C229.219 23.528 211.619 47.891 198.019 43.891C184.419 39.891 186.819 49.491 183.619 50.292C180.419 51.092 141.219 26.291 134.819 27.091z").setFill(f).setStroke(s);
+	f = "#ec9961";
+	g.createPath("M136.128 28.837C129.728 29.637 104.999 5.605 119.328 37.637C136.128 75.193 60.394 76.482 44.128 65.637C27.328 54.437 51.328 84.037 51.328 84.037C69.728 104.037 35.328 87.237 35.328 87.237C0.928 74.437 -23.072 100.037 -26.272 100.837C-29.472 101.637 -34.272 104.837 -35.072 98.437C-35.872 92.037 -42.989 75.839 -75.073 101.637C-98.782 120.474 -111.655 100.11 -111.655 100.11L-115.655 107.237C-137.455 70.437 -124.236 128.765 -124.236 128.765C-115.436 163.165 16.128 121.637 16.128 121.637C16.128 121.637 184.928 91.237 196.129 87.237C207.329 83.237 299.911 89.419 299.911 89.419L294.529 71.092C229.729 24.691 212.929 49.637 199.329 45.637C185.728 41.637 188.128 51.237 184.928 52.037C181.728 52.837 142.528 28.037 136.128 28.837z").setFill(f).setStroke(s);
+	f = "#eea575";
+	g.createPath("M137.438 30.583C131.037 31.383 106.814 7.129 120.637 39.383C137.438 78.583 62.237 78.583 45.437 67.383C28.637 56.183 52.637 85.783 52.637 85.783C71.037 105.783 36.637 88.983 36.637 88.983C2.237 76.183 -21.763 101.783 -24.963 102.583C-28.163 103.383 -32.963 106.583 -33.763 100.183C-34.563 93.783 -41.548 77.752 -73.763 103.383C-98.709 122.965 -111.273 103.146 -111.273 103.146L-115.673 108.783C-135.473 73.982 -123.582 131.819 -123.582 131.819C-114.782 166.22 17.437 123.383 17.437 123.383C17.437 123.383 186.238 92.983 197.438 88.983C208.638 84.983 300.347 91.092 300.347 91.092L295.038 72.255C230.238 25.855 214.238 51.383 200.638 47.383C187.038 43.383 189.438 52.983 186.238 53.783C183.038 54.583 143.838 29.783 137.438 30.583z").setFill(f).setStroke(s);
+	f = "#f1b288";
+	g.createPath("M138.747 32.328C132.347 33.128 106.383 9.677 121.947 41.128C141.147 79.928 63.546 80.328 46.746 69.128C29.946 57.928 53.946 87.528 53.946 87.528C72.346 107.528 37.946 90.728 37.946 90.728C3.546 77.928 -20.454 103.528 -23.654 104.328C-26.854 105.128 -31.654 108.328 -32.454 101.928C-33.254 95.528 -40.108 79.665 -72.454 105.128C-98.636 125.456 -110.891 106.183 -110.891 106.183L-115.691 110.328C-133.691 77.128 -122.927 134.874 -122.927 134.874C-114.127 169.274 18.746 125.128 18.746 125.128C18.746 125.128 187.547 94.728 198.747 90.728C209.947 86.728 300.783 92.764 300.783 92.764L295.547 73.419C230.747 27.019 215.547 53.128 201.947 49.128C188.347 45.128 190.747 54.728 187.547 55.528C184.347 56.328 145.147 31.528 138.747 32.328z").setFill(f).setStroke(s);
+	f = "#f3bf9c";
+	g.createPath("M140.056 34.073C133.655 34.873 107.313 11.613 123.255 42.873C143.656 82.874 64.855 82.074 48.055 70.874C31.255 59.674 55.255 89.274 55.255 89.274C73.655 109.274 39.255 92.474 39.255 92.474C4.855 79.674 -19.145 105.274 -22.345 106.074C-25.545 106.874 -30.345 110.074 -31.145 103.674C-31.945 97.274 -38.668 81.578 -71.145 106.874C-98.564 127.947 -110.509 109.219 -110.509 109.219L-115.709 111.874C-131.709 81.674 -122.273 137.929 -122.273 137.929C-113.473 172.329 20.055 126.874 20.055 126.874C20.055 126.874 188.856 96.474 200.056 92.474C211.256 88.474 301.22 94.437 301.22 94.437L296.056 74.583C231.256 28.183 216.856 54.874 203.256 50.874C189.656 46.873 192.056 56.474 188.856 57.274C185.656 58.074 146.456 33.273 140.056 34.073z").setFill(f).setStroke(s);
+	f = "#f5ccb0";
+	g.createPath("M141.365 35.819C134.965 36.619 107.523 13.944 124.565 44.619C146.565 84.219 66.164 83.819 49.364 72.619C32.564 61.419 56.564 91.019 56.564 91.019C74.964 111.019 40.564 94.219 40.564 94.219C6.164 81.419 -17.836 107.019 -21.036 107.819C-24.236 108.619 -29.036 111.819 -29.836 105.419C-30.636 99.019 -37.227 83.492 -69.836 108.619C-98.491 130.438 -110.127 112.256 -110.127 112.256L-115.727 113.419C-130.128 85.019 -121.618 140.983 -121.618 140.983C-112.818 175.384 21.364 128.619 21.364 128.619C21.364 128.619 190.165 98.219 201.365 94.219C212.565 90.219 301.656 96.11 301.656 96.11L296.565 75.746C231.765 29.346 218.165 56.619 204.565 52.619C190.965 48.619 193.365 58.219 190.165 59.019C186.965 59.819 147.765 35.019 141.365 35.819z").setFill(f).setStroke(s);
+	f = "#f8d8c4";
+	g.createPath("M142.674 37.565C136.274 38.365 108.832 15.689 125.874 46.365C147.874 85.965 67.474 85.565 50.674 74.365C33.874 63.165 57.874 92.765 57.874 92.765C76.274 112.765 41.874 95.965 41.874 95.965C7.473 83.165 -16.527 108.765 -19.727 109.565C-22.927 110.365 -27.727 113.565 -28.527 107.165C-29.327 100.765 -35.786 85.405 -68.527 110.365C-98.418 132.929 -109.745 115.293 -109.745 115.293L-115.745 114.965C-129.346 88.564 -120.963 144.038 -120.963 144.038C-112.163 178.438 22.673 130.365 22.673 130.365C22.673 130.365 191.474 99.965 202.674 95.965C213.874 91.965 302.093 97.783 302.093 97.783L297.075 76.91C232.274 30.51 219.474 58.365 205.874 54.365C192.274 50.365 194.674 59.965 191.474 60.765C188.274 61.565 149.074 36.765 142.674 37.565z").setFill(f).setStroke(s);
+	f = "#fae5d7";
+	g.createPath("M143.983 39.31C137.583 40.11 110.529 17.223 127.183 48.11C149.183 88.91 68.783 87.31 51.983 76.11C35.183 64.91 59.183 94.51 59.183 94.51C77.583 114.51 43.183 97.71 43.183 97.71C8.783 84.91 -15.217 110.51 -18.417 111.31C-21.618 112.11 -26.418 115.31 -27.218 108.91C-28.018 102.51 -34.346 87.318 -67.218 112.11C-98.345 135.42 -109.363 118.329 -109.363 118.329L-115.764 116.51C-128.764 92.51 -120.309 147.093 -120.309 147.093C-111.509 181.493 23.983 132.11 23.983 132.11C23.983 132.11 192.783 101.71 203.983 97.71C215.183 93.71 302.529 99.456 302.529 99.456L297.583 78.074C232.783 31.673 220.783 60.11 207.183 56.11C193.583 52.11 195.983 61.71 192.783 62.51C189.583 63.31 150.383 38.51 143.983 39.31z").setFill(f).setStroke(s);
+	f = "#fcf2eb";
+	g.createPath("M145.292 41.055C138.892 41.855 112.917 18.411 128.492 49.855C149.692 92.656 70.092 89.056 53.292 77.856C36.492 66.656 60.492 96.256 60.492 96.256C78.892 116.256 44.492 99.456 44.492 99.456C10.092 86.656 -13.908 112.256 -17.108 113.056C-20.308 113.856 -25.108 117.056 -25.908 110.656C-26.708 104.256 -32.905 89.232 -65.908 113.856C-98.273 137.911 -108.982 121.365 -108.982 121.365L-115.782 118.056C-128.582 94.856 -119.654 150.147 -119.654 150.147C-110.854 184.547 25.292 133.856 25.292 133.856C25.292 133.856 194.093 103.456 205.293 99.456C216.493 95.456 302.965 101.128 302.965 101.128L298.093 79.237C233.292 32.837 222.093 61.856 208.493 57.856C194.893 53.855 197.293 63.456 194.093 64.256C190.892 65.056 151.692 40.255 145.292 41.055z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M-115.8 119.601C-128.6 97.6 -119 153.201 -119 153.201C-110.2 187.601 26.6 135.601 26.6 135.601C26.6 135.601 195.401 105.2 206.601 101.2C217.801 97.2 303.401 102.8 303.401 102.8L298.601 80.4C233.801 34 223.401 63.6 209.801 59.6C196.201 55.6 198.601 65.2 195.401 66C192.201 66.8 153.001 42 146.601 42.8C140.201 43.6 114.981 19.793 129.801 51.6C152.028 99.307 69.041 89.227 54.6 79.6C37.8 68.4 61.8 98 61.8 98C80.2 118.001 45.8 101.2 45.8 101.2C11.4 88.4 -12.6 114.001 -15.8 114.801C-19 115.601 -23.8 118.801 -24.6 112.401C-25.4 106 -31.465 91.144 -64.6 115.601C-98.2 140.401 -108.6 124.401 -108.6 124.401L-115.8 119.601z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-74.2 149.601C-74.2 149.601 -81.4 161.201 -60.6 174.401C-60.6 174.401 -59.2 175.801 -77.2 171.601C-77.2 171.601 -83.4 169.601 -85 159.201C-85 159.201 -89.8 154.801 -94.6 149.201C-99.4 143.601 -74.2 149.601 -74.2 149.601z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M65.8 102C65.8 102 83.498 128.821 82.9 133.601C81.6 144.001 81.4 153.601 84.6 157.601C87.801 161.601 96.601 194.801 96.601 194.801C96.601 194.801 96.201 196.001 108.601 158.001C108.601 158.001 120.201 142.001 100.201 123.601C100.201 123.601 65 94.8 65.8 102z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-54.2 176.401C-54.2 176.401 -43 183.601 -57.4 214.801L-51 212.401C-51 212.401 -51.8 223.601 -55 226.001L-47.8 222.801C-47.8 222.801 -43 230.801 -47 235.601C-47 235.601 -30.2 243.601 -31 250.001C-31 250.001 -24.6 242.001 -28.6 235.601C-32.6 229.201 -39.8 233.201 -39 214.801L-47.8 218.001C-47.8 218.001 -42.2 209.201 -42.2 202.801L-50.2 205.201C-50.2 205.201 -34.731 178.623 -45.4 177.201C-51.4 176.401 -54.2 176.401 -54.2 176.401z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-21.8 193.201C-21.8 193.201 -19 188.801 -21.8 189.601C-24.6 190.401 -55.8 205.201 -61.8 214.801C-61.8 214.801 -27.4 190.401 -21.8 193.201z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-11.4 201.201C-11.4 201.201 -8.6 196.801 -11.4 197.601C-14.2 198.401 -45.4 213.201 -51.4 222.801C-51.4 222.801 -17 198.401 -11.4 201.201z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M1.8 186.001C1.8 186.001 4.6 181.601 1.8 182.401C-1 183.201 -32.2 198.001 -38.2 207.601C-38.2 207.601 -3.8 183.201 1.8 186.001z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-21.4 229.601C-21.4 229.601 -21.4 223.601 -24.2 224.401C-27 225.201 -63 242.801 -69 252.401C-69 252.401 -27 226.801 -21.4 229.601z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-20.2 218.801C-20.2 218.801 -19 214.001 -21.8 214.801C-23.8 214.801 -50.2 226.401 -56.2 236.001C-56.2 236.001 -26.6 214.401 -20.2 218.801z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-34.6 266.401L-44.6 274.001C-44.6 274.001 -34.2 266.401 -30.6 267.601C-30.6 267.601 -37.4 278.801 -38.2 284.001C-38.2 284.001 -27.8 271.201 -22.2 271.601C-22.2 271.601 -14.6 272.001 -14.6 282.801C-14.6 282.801 -9 272.401 -5.8 272.801C-5.8 272.801 -4.6 279.201 -5.8 286.001C-5.8 286.001 -1.8 278.401 2.2 280.001C2.2 280.001 8.6 278.001 7.8 289.601C7.8 289.601 7.8 300.001 7 302.801C7 302.801 12.6 276.401 15 276.001C15 276.001 23 274.801 27.8 283.601C27.8 283.601 23.8 276.001 28.6 278.001C28.6 278.001 39.4 279.601 42.6 286.401C42.6 286.401 35.8 274.401 41.4 277.601C41.4 277.601 48.2 277.601 49.4 284.001C49.4 284.001 57.8 305.201 59.8 306.801C59.8 306.801 52.2 285.201 53.8 285.201C53.8 285.201 51.8 273.201 57 288.001C57 288.001 53.8 274.001 59.4 274.801C65 275.601 69.4 285.601 77.8 283.201C77.8 283.201 87.401 288.801 89.401 219.601L-34.6 266.401z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-29.8 173.601C-29.8 173.601 -15 167.601 25 173.601C25 173.601 32.2 174.001 39 165.201C45.8 156.401 72.6 149.201 79 151.201L88.601 157.601L89.401 158.801C89.401 158.801 101.801 169.201 102.201 176.801C102.601 184.401 87.801 232.401 78.2 248.401C68.6 264.401 59 276.801 39.8 274.401C39.8 274.401 19 270.401 -6.6 274.401C-6.6 274.401 -35.8 272.801 -38.6 264.801C-41.4 256.801 -27.4 241.601 -27.4 241.601C-27.4 241.601 -23 233.201 -24.2 218.801C-25.4 204.401 -25 176.401 -29.8 173.601z").setFill(f).setStroke(s);
+	f = "#e5668c";
+	g.createPath("M-7.8 175.601C0.6 194.001 -29 259.201 -29 259.201C-31 260.801 -16.34 266.846 -6.2 264.401C4.746 261.763 45 266.001 45 266.001C68.6 250.401 81.4 206.001 81.4 206.001C81.4 206.001 91.801 182.001 74.2 178.801C56.6 175.601 -7.8 175.601 -7.8 175.601z").setFill(f).setStroke(s);
+	f = "#b23259";
+	g.createPath("M-9.831 206.497C-6.505 193.707 -4.921 181.906 -7.8 175.601C-7.8 175.601 54.6 182.001 65.8 161.201C70.041 153.326 84.801 184.001 84.4 193.601C84.4 193.601 21.4 208.001 6.6 196.801L-9.831 206.497z").setFill(f).setStroke(s);
+	f = "#a5264c";
+	g.createPath("M-5.4 222.801C-5.4 222.801 -3.4 230.001 -5.8 234.001C-5.8 234.001 -7.4 234.801 -8.6 235.201C-8.6 235.201 -7.4 238.801 -1.4 240.401C-1.4 240.401 0.6 244.801 3 245.201C5.4 245.601 10.2 251.201 14.2 250.001C18.2 248.801 29.4 244.801 29.4 244.801C29.4 244.801 35 241.601 43.8 245.201C43.8 245.201 46.175 244.399 46.6 240.401C47.1 235.701 50.2 232.001 52.2 230.001C54.2 228.001 63.8 215.201 62.6 214.801C61.4 214.401 -5.4 222.801 -5.4 222.801z").setFill(f).setStroke(s);
+	f = "#ff727f"; s = "#000000";
+	g.createPath("M-9.8 174.401C-9.8 174.401 -12.6 196.801 -9.4 205.201C-6.2 213.601 -7 215.601 -7.8 219.601C-8.6 223.601 -4.2 233.601 1.4 239.601L13.4 241.201C13.4 241.201 28.6 237.601 37.8 240.401C37.8 240.401 46.794 241.744 50.2 226.801C50.2 226.801 55 220.401 62.2 217.601C69.4 214.801 76.6 173.201 72.6 165.201C68.6 157.201 54.2 152.801 38.2 168.401C22.2 184.001 20.2 167.201 -9.8 174.401z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-8.2 249.201C-8.2 249.201 -9 247.201 -13.4 246.801C-13.4 246.801 -35.8 243.201 -44.2 230.801C-44.2 230.801 -51 225.201 -46.6 236.801C-46.6 236.801 -36.2 257.201 -29.4 260.001C-29.4 260.001 -13 264.001 -8.2 249.201z").setFill(f).setStroke(s);
+	f = "#cc3f4c"; s = null;
+	g.createPath("M71.742 185.229C72.401 177.323 74.354 168.709 72.6 165.201C66.154 152.307 49.181 157.695 38.2 168.401C22.2 184.001 20.2 167.201 -9.8 174.401C-9.8 174.401 -11.545 188.364 -10.705 198.376C-10.705 198.376 26.6 186.801 27.4 192.401C27.4 192.401 29 189.201 38.2 189.201C47.4 189.201 70.142 188.029 71.742 185.229z").setFill(f).setStroke(s);
+	s = {color: "#a51926", width: 2}; f = null;
+	g.createPath("M28.6 175.201C28.6 175.201 33.4 180.001 29.8 189.601C29.8 189.601 15.4 205.601 17.4 219.601").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-19.4 260.001C-19.4 260.001 -23.8 247.201 -15 254.001C-15 254.001 -10.2 256.001 -11.4 257.601C-12.6 259.201 -18.2 263.201 -19.4 260.001z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-14.36 261.201C-14.36 261.201 -17.88 250.961 -10.84 256.401C-10.84 256.401 -6.419 258.849 -7.96 259.281C-12.52 260.561 -7.96 263.121 -14.36 261.201z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-9.56 261.201C-9.56 261.201 -13.08 250.961 -6.04 256.401C-6.04 256.401 -1.665 258.711 -3.16 259.281C-6.52 260.561 -3.16 263.121 -9.56 261.201z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-2.96 261.401C-2.96 261.401 -6.48 251.161 0.56 256.601C0.56 256.601 4.943 258.933 3.441 259.481C0.48 260.561 3.441 263.321 -2.96 261.401z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M3.52 261.321C3.52 261.321 0 251.081 7.041 256.521C7.041 256.521 10.881 258.121 9.921 259.401C8.961 260.681 9.921 263.241 3.52 261.321z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M10.2 262.001C10.2 262.001 5.4 249.601 14.6 256.001C14.6 256.001 19.4 258.001 18.2 259.601C17 261.201 18.2 264.401 10.2 262.001z").setFill(f).setStroke(s);
+	s = {color: "#a5264c", width: 2}; f = null;
+	g.createPath("M-18.2 244.801C-18.2 244.801 -5 242.001 1 245.201C1 245.201 7 246.401 8.2 246.001C9.4 245.601 12.6 245.201 12.6 245.201").setFill(f).setStroke(s);
+	s = {color: "#a5264c", width: 2};
+	g.createPath("M15.8 253.601C15.8 253.601 27.8 240.001 39.8 244.401C46.816 246.974 45.8 243.601 46.6 240.801C47.4 238.001 47.6 233.801 52.6 230.801").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M33 237.601C33 237.601 29 226.801 26.2 239.601C23.4 252.401 20.2 256.001 18.6 258.801C18.6 258.801 18.6 264.001 27 263.601C27 263.601 37.8 263.201 38.2 260.401C38.6 257.601 37 246.001 33 237.601z").setFill(f).setStroke(s);
+	s = {color: "#a5264c", width: 2}; f = null;
+	g.createPath("M47 244.801C47 244.801 50.6 242.401 53 243.601").setFill(f).setStroke(s);
+	s = {color: "#a5264c", width: 2};
+	g.createPath("M53.5 228.401C53.5 228.401 56.4 223.501 61.2 222.701").setFill(f).setStroke(s);
+	f = "#b2b2b2"; s = null;
+	g.createPath("M-25.8 265.201C-25.8 265.201 -7.8 268.401 -3.4 266.801C-3.4 266.801 5.4 266.801 -3 268.801C-3 268.801 -15.8 268.801 -23.8 267.601C-23.8 267.601 -35.4 262.001 -25.8 265.201z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-11.8 172.001C-11.8 172.001 5.8 172.001 7.8 172.801C7.8 172.801 15 203.601 11.4 211.201C11.4 211.201 10.2 214.001 7.4 208.401C7.4 208.401 -11 175.601 -14.2 173.601C-17.4 171.601 -13 172.001 -11.8 172.001z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-88.9 169.301C-88.9 169.301 -80 171.001 -67.4 173.601C-67.4 173.601 -62.6 196.001 -59.4 200.801C-56.2 205.601 -59.8 205.601 -63.4 202.801C-67 200.001 -81.8 186.001 -83.8 181.601C-85.8 177.201 -88.9 169.301 -88.9 169.301z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-67.039 173.818C-67.039 173.818 -61.239 175.366 -60.23 177.581C-59.222 179.795 -61.432 183.092 -61.432 183.092C-61.432 183.092 -62.432 186.397 -63.634 184.235C-64.836 182.072 -67.708 174.412 -67.039 173.818z").setFill(f).setStroke(s);
+	f = "#000000"; s = null;
+	g.createPath("M-67 173.601C-67 173.601 -63.4 178.801 -59.8 178.801C-56.2 178.801 -55.818 178.388 -53 179.001C-48.4 180.001 -48.8 178.001 -42.2 179.201C-39.56 179.681 -37 178.801 -34.2 180.001C-31.4 181.201 -28.2 180.401 -27 178.401C-25.8 176.401 -21 172.201 -21 172.201C-21 172.201 -33.8 174.001 -36.6 174.801C-36.6 174.801 -59 176.001 -67 173.601z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-22.4 173.801C-22.4 173.801 -28.85 177.301 -29.25 179.701C-29.65 182.101 -24 185.801 -24 185.801C-24 185.801 -21.25 190.401 -20.65 188.001C-20.05 185.601 -21.6 174.201 -22.4 173.801z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-59.885 179.265C-59.885 179.265 -52.878 190.453 -52.661 179.242C-52.661 179.242 -52.104 177.984 -53.864 177.962C-59.939 177.886 -58.418 173.784 -59.885 179.265z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-52.707 179.514C-52.707 179.514 -44.786 190.701 -45.422 179.421C-45.422 179.421 -45.415 179.089 -47.168 178.936C-51.915 178.522 -51.57 174.004 -52.707 179.514z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-45.494 179.522C-45.494 179.522 -37.534 190.15 -38.203 180.484C-38.203 180.484 -38.084 179.251 -39.738 178.95C-43.63 178.244 -43.841 174.995 -45.494 179.522z").setFill(f).setStroke(s);
+	f = "#ffffcc"; s = {color: "#000000", width: 0.5};
+	g.createPath("M-38.618 179.602C-38.618 179.602 -30.718 191.163 -30.37 181.382C-30.37 181.382 -28.726 180.004 -30.472 179.782C-36.29 179.042 -35.492 174.588 -38.618 179.602z").setFill(f).setStroke(s);
+	f = "#e5e5b2"; s = null;
+	g.createPath("M-74.792 183.132L-82.45 181.601C-85.05 176.601 -87.15 170.451 -87.15 170.451C-87.15 170.451 -80.8 171.451 -68.3 174.251C-68.3 174.251 -67.424 177.569 -65.952 183.364L-74.792 183.132z").setFill(f).setStroke(s);
+	f = "#e5e5b2";
+	g.createPath("M-9.724 178.47C-11.39 175.964 -12.707 174.206 -13.357 173.8C-16.37 171.917 -12.227 172.294 -11.098 172.294C-11.098 172.294 5.473 172.294 7.356 173.047C7.356 173.047 7.88 175.289 8.564 178.68C8.564 178.68 -1.524 176.67 -9.724 178.47z").setFill(f).setStroke(s);
+	f = "#cc7226";
+	g.createPath("M43.88 40.321C71.601 44.281 97.121 8.641 98.881 -1.04C100.641 -10.72 90.521 -22.6 90.521 -22.6C91.841 -25.68 87.001 -39.76 81.721 -49C76.441 -58.24 60.54 -57.266 43 -58.24C27.16 -59.12 8.68 -35.8 7.36 -34.04C6.04 -32.28 12.2 6.001 13.52 11.721C14.84 17.441 12.2 43.841 12.2 43.841C46.44 34.741 16.16 36.361 43.88 40.321z").setFill(f).setStroke(s);
+	f = "#ea8e51";
+	g.createPath("M8.088 -33.392C6.792 -31.664 12.84 5.921 14.136 11.537C15.432 17.153 12.84 43.073 12.84 43.073C45.512 34.193 16.728 35.729 43.944 39.617C71.161 43.505 96.217 8.513 97.945 -0.992C99.673 -10.496 89.737 -22.16 89.737 -22.16C91.033 -25.184 86.281 -39.008 81.097 -48.08C75.913 -57.152 60.302 -56.195 43.08 -57.152C27.528 -58.016 9.384 -35.12 8.088 -33.392z").setFill(f).setStroke(s);
+	f = "#efaa7c";
+	g.createPath("M8.816 -32.744C7.544 -31.048 13.48 5.841 14.752 11.353C16.024 16.865 13.48 42.305 13.48 42.305C44.884 33.145 17.296 35.097 44.008 38.913C70.721 42.729 95.313 8.385 97.009 -0.944C98.705 -10.272 88.953 -21.72 88.953 -21.72C90.225 -24.688 85.561 -38.256 80.473 -47.16C75.385 -56.064 60.063 -55.125 43.16 -56.064C27.896 -56.912 10.088 -34.44 8.816 -32.744z").setFill(f).setStroke(s);
+	f = "#f4c6a8";
+	g.createPath("M9.544 -32.096C8.296 -30.432 14.12 5.761 15.368 11.169C16.616 16.577 14.12 41.537 14.12 41.537C43.556 32.497 17.864 34.465 44.072 38.209C70.281 41.953 94.409 8.257 96.073 -0.895C97.737 -10.048 88.169 -21.28 88.169 -21.28C89.417 -24.192 84.841 -37.504 79.849 -46.24C74.857 -54.976 59.824 -54.055 43.24 -54.976C28.264 -55.808 10.792 -33.76 9.544 -32.096z").setFill(f).setStroke(s);
+	f = "#f9e2d3";
+	g.createPath("M10.272 -31.448C9.048 -29.816 14.76 5.681 15.984 10.985C17.208 16.289 14.76 40.769 14.76 40.769C42.628 31.849 18.432 33.833 44.136 37.505C69.841 41.177 93.505 8.129 95.137 -0.848C96.769 -9.824 87.385 -20.84 87.385 -20.84C88.609 -23.696 84.121 -36.752 79.225 -45.32C74.329 -53.888 59.585 -52.985 43.32 -53.888C28.632 -54.704 11.496 -33.08 10.272 -31.448z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M44.2 36.8C69.4 40.4 92.601 8 94.201 -0.8C95.801 -9.6 86.601 -20.4 86.601 -20.4C87.801 -23.2 83.4 -36 78.6 -44.4C73.8 -52.8 59.346 -51.914 43.4 -52.8C29 -53.6 12.2 -32.4 11 -30.8C9.8 -29.2 15.4 5.6 16.6 10.8C17.8 16 15.4 40 15.4 40C40.9 31.4 19 33.2 44.2 36.8z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M90.601 2.8C90.601 2.8 62.8 10.4 51.2 8.8C51.2 8.8 35.4 2.2 26.6 24C26.6 24 23 31.2 21 33.2C19 35.2 90.601 2.8 90.601 2.8z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M94.401 0.6C94.401 0.6 65.4 12.8 55.4 12.4C55.4 12.4 39 7.8 30.6 22.4C30.6 22.4 22.2 31.6 19 33.2C19 33.2 18.6 34.8 25 30.8L35.4 36C35.4 36 50.2 45.6 59.8 29.6C59.8 29.6 63.8 18.4 63.8 16.4C63.8 14.4 85 8.8 86.601 8.4C88.201 8 94.801 3.8 94.401 0.6z").setFill(f).setStroke(s);
+	f = "#99cc32";
+	g.createPath("M47 36.514C40.128 36.514 31.755 32.649 31.755 26.4C31.755 20.152 40.128 13.887 47 13.887C53.874 13.887 59.446 18.952 59.446 25.2C59.446 31.449 53.874 36.514 47 36.514z").setFill(f).setStroke(s);
+	f = "#659900";
+	g.createPath("M43.377 19.83C38.531 20.552 33.442 22.055 33.514 21.839C35.054 17.22 41.415 13.887 47 13.887C51.296 13.887 55.084 15.865 57.32 18.875C57.32 18.875 52.004 18.545 43.377 19.83z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M55.4 19.6C55.4 19.6 51 16.4 51 18.6C51 18.6 54.6 23 55.4 19.6z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M45.4 27.726C42.901 27.726 40.875 25.7 40.875 23.2C40.875 20.701 42.901 18.675 45.4 18.675C47.9 18.675 49.926 20.701 49.926 23.2C49.926 25.7 47.9 27.726 45.4 27.726z").setFill(f).setStroke(s);
+	f = "#cc7226";
+	g.createPath("M-58.6 14.4C-58.6 14.4 -61.8 -6.8 -59.4 -11.2C-59.4 -11.2 -48.6 -21.2 -49 -24.8C-49 -24.8 -49.4 -42.8 -50.6 -43.6C-51.8 -44.4 -59.4 -50.4 -65.4 -44C-65.4 -44 -75.8 -26 -75 -19.6L-75 -17.6C-75 -17.6 -82.6 -18 -84.2 -16C-84.2 -16 -85.4 -10.8 -86.6 -10.4C-86.6 -10.4 -89.4 -8 -87.4 -5.2C-87.4 -5.2 -89.4 -2.8 -89 1.2L-81.4 5.2C-81.4 5.2 -79.4 19.6 -68.6 24.8C-63.764 27.129 -60.6 20.4 -58.6 14.4z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M-59.6 12.56C-59.6 12.56 -62.48 -6.52 -60.32 -10.48C-60.32 -10.48 -50.6 -19.48 -50.96 -22.72C-50.96 -22.72 -51.32 -38.92 -52.4 -39.64C-53.48 -40.36 -60.32 -45.76 -65.72 -40C-65.72 -40 -75.08 -23.8 -74.36 -18.04L-74.36 -16.24C-74.36 -16.24 -81.2 -16.6 -82.64 -14.8C-82.64 -14.8 -83.72 -10.12 -84.8 -9.76C-84.8 -9.76 -87.32 -7.6 -85.52 -5.08C-85.52 -5.08 -87.32 -2.92 -86.96 0.68L-80.12 4.28C-80.12 4.28 -78.32 17.24 -68.6 21.92C-64.248 24.015 -61.4 17.96 -59.6 12.56z").setFill(f).setStroke(s);
+	f = "#eb955c";
+	g.createPath("M-51.05 -42.61C-52.14 -43.47 -59.63 -49.24 -65.48 -43C-65.48 -43 -75.62 -25.45 -74.84 -19.21L-74.84 -17.26C-74.84 -17.26 -82.25 -17.65 -83.81 -15.7C-83.81 -15.7 -84.98 -10.63 -86.15 -10.24C-86.15 -10.24 -88.88 -7.9 -86.93 -5.17C-86.93 -5.17 -88.88 -2.83 -88.49 1.07L-81.08 4.97C-81.08 4.97 -79.13 19.01 -68.6 24.08C-63.886 26.35 -60.8 19.79 -58.85 13.94C-58.85 13.94 -61.97 -6.73 -59.63 -11.02C-59.63 -11.02 -49.1 -20.77 -49.49 -24.28C-49.49 -24.28 -49.88 -41.83 -51.05 -42.61z").setFill(f).setStroke(s);
+	f = "#f2b892";
+	g.createPath("M-51.5 -41.62C-52.48 -42.54 -59.86 -48.08 -65.56 -42C-65.56 -42 -75.44 -24.9 -74.68 -18.82L-74.68 -16.92C-74.68 -16.92 -81.9 -17.3 -83.42 -15.4C-83.42 -15.4 -84.56 -10.46 -85.7 -10.08C-85.7 -10.08 -88.36 -7.8 -86.46 -5.14C-86.46 -5.14 -88.36 -2.86 -87.98 0.94L-80.76 4.74C-80.76 4.74 -78.86 18.42 -68.6 23.36C-64.006 25.572 -61 19.18 -59.1 13.48C-59.1 13.48 -62.14 -6.66 -59.86 -10.84C-59.86 -10.84 -49.6 -20.34 -49.98 -23.76C-49.98 -23.76 -50.36 -40.86 -51.5 -41.62z").setFill(f).setStroke(s);
+	f = "#f8dcc8";
+	g.createPath("M-51.95 -40.63C-52.82 -41.61 -60.09 -46.92 -65.64 -41C-65.64 -41 -75.26 -24.35 -74.52 -18.43L-74.52 -16.58C-74.52 -16.58 -81.55 -16.95 -83.03 -15.1C-83.03 -15.1 -84.14 -10.29 -85.25 -9.92C-85.25 -9.92 -87.84 -7.7 -85.99 -5.11C-85.99 -5.11 -87.84 -2.89 -87.47 0.81L-80.44 4.51C-80.44 4.51 -78.59 17.83 -68.6 22.64C-64.127 24.794 -61.2 18.57 -59.35 13.02C-59.35 13.02 -62.31 -6.59 -60.09 -10.66C-60.09 -10.66 -50.1 -19.91 -50.47 -23.24C-50.47 -23.24 -50.84 -39.89 -51.95 -40.63z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M-59.6 12.46C-59.6 12.46 -62.48 -6.52 -60.32 -10.48C-60.32 -10.48 -50.6 -19.48 -50.96 -22.72C-50.96 -22.72 -51.32 -38.92 -52.4 -39.64C-53.16 -40.68 -60.32 -45.76 -65.72 -40C-65.72 -40 -75.08 -23.8 -74.36 -18.04L-74.36 -16.24C-74.36 -16.24 -81.2 -16.6 -82.64 -14.8C-82.64 -14.8 -83.72 -10.12 -84.8 -9.76C-84.8 -9.76 -87.32 -7.6 -85.52 -5.08C-85.52 -5.08 -87.32 -2.92 -86.96 0.68L-80.12 4.28C-80.12 4.28 -78.32 17.24 -68.6 21.92C-64.248 24.015 -61.4 17.86 -59.6 12.46z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-62.7 6.2C-62.7 6.2 -84.3 -4 -85.2 -4.8C-85.2 -4.8 -76.1 3.4 -75.3 3.4C-74.5 3.4 -62.7 6.2 -62.7 6.2z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-79.8 0C-79.8 0 -61.4 3.6 -61.4 8C-61.4 10.912 -61.643 24.331 -67 22.8C-75.4 20.4 -71.8 6 -79.8 0z").setFill(f).setStroke(s);
+	f = "#99cc32";
+	g.createPath("M-71.4 3.8C-71.4 3.8 -62.422 5.274 -61.4 8C-60.8 9.6 -60.137 17.908 -65.6 19C-70.152 19.911 -72.382 9.69 -71.4 3.8z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M14.595 46.349C14.098 44.607 15.409 44.738 17.2 44.2C19.2 43.6 31.4 39.8 32.2 37.2C33 34.6 46.2 39 46.2 39C48 39.8 52.4 42.4 52.4 42.4C57.2 43.6 63.8 44 63.8 44C66.2 45 69.6 47.8 69.6 47.8C84.2 58 96.601 50.8 96.601 50.8C116.601 44.2 110.601 27 110.601 27C107.601 18 110.801 14.6 110.801 14.6C111.001 10.8 118.201 17.2 118.201 17.2C120.801 21.4 121.601 26.4 121.601 26.4C129.601 37.6 126.201 19.8 126.201 19.8C126.401 18.8 123.601 15.2 123.601 14C123.601 12.8 121.801 9.4 121.801 9.4C118.801 6 121.201 -1 121.201 -1C123.001 -14.8 120.801 -13 120.801 -13C119.601 -14.8 110.401 -4.8 110.401 -4.8C108.201 -1.4 102.201 0.2 102.201 0.2C99.401 2 96.001 0.6 96.001 0.6C93.401 0.2 87.801 7.2 87.801 7.2C90.601 7 93.001 11.4 95.401 11.6C97.801 11.8 99.601 9.2 101.201 8.6C102.801 8 105.601 13.8 105.601 13.8C106.001 16.4 100.401 21.2 100.401 21.2C100.001 25.8 98.401 24.2 98.401 24.2C95.401 23.6 94.201 27.4 93.201 32C92.201 36.6 88.001 37 88.001 37C86.401 44.4 85.2 41.4 85.2 41.4C85 35.8 79 41.6 79 41.6C77.8 43.6 73.2 41.4 73.2 41.4C66.4 39.4 68.8 37.4 68.8 37.4C70.6 35.2 81.8 37.4 81.8 37.4C84 35.8 76 31.8 76 31.8C75.4 30 76.4 25.6 76.4 25.6C77.6 22.4 84.4 16.8 84.4 16.8C93.801 15.6 91.001 14 91.001 14C84.801 8.8 79 16.4 79 16.4C76.8 22.6 59.4 37.6 59.4 37.6C54.6 41 57.2 34.2 53.2 37.6C49.2 41 28.6 32 28.6 32C17.038 30.807 14.306 46.549 10.777 43.429C10.777 43.429 16.195 51.949 14.595 46.349z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M209.401 -120C209.401 -120 183.801 -112 181.001 -93.2C181.001 -93.2 178.601 -70.4 199.001 -52.8C199.001 -52.8 199.401 -46.4 201.401 -43.2C201.401 -43.2 199.801 -38.4 218.601 -46L245.801 -54.4C245.801 -54.4 252.201 -56.8 257.401 -65.6C262.601 -74.4 277.801 -93.2 274.201 -118.4C274.201 -118.4 275.401 -129.6 269.401 -130C269.401 -130 261.001 -131.6 253.801 -124C253.801 -124 247.001 -120.8 244.601 -121.2L209.401 -120z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M264.022 -120.99C264.022 -120.99 266.122 -129.92 261.282 -125.08C261.282 -125.08 254.242 -119.36 246.761 -119.36C246.761 -119.36 232.241 -117.16 227.841 -103.96C227.841 -103.96 223.881 -77.12 231.801 -71.4C231.801 -71.4 236.641 -63.92 243.681 -70.52C250.722 -77.12 266.222 -107.35 264.022 -120.99z").setFill(f).setStroke(s);
+	f = "#323232";
+	g.createPath("M263.648 -120.632C263.648 -120.632 265.738 -129.376 260.986 -124.624C260.986 -124.624 254.074 -119.008 246.729 -119.008C246.729 -119.008 232.473 -116.848 228.153 -103.888C228.153 -103.888 224.265 -77.536 232.041 -71.92C232.041 -71.92 236.793 -64.576 243.705 -71.056C250.618 -77.536 265.808 -107.24 263.648 -120.632z").setFill(f).setStroke(s);
+	f = "#666666";
+	g.createPath("M263.274 -120.274C263.274 -120.274 265.354 -128.832 260.69 -124.168C260.69 -124.168 253.906 -118.656 246.697 -118.656C246.697 -118.656 232.705 -116.536 228.465 -103.816C228.465 -103.816 224.649 -77.952 232.281 -72.44C232.281 -72.44 236.945 -65.232 243.729 -71.592C250.514 -77.952 265.394 -107.13 263.274 -120.274z").setFill(f).setStroke(s);
+	f = "#999999";
+	g.createPath("M262.9 -119.916C262.9 -119.916 264.97 -128.288 260.394 -123.712C260.394 -123.712 253.738 -118.304 246.665 -118.304C246.665 -118.304 232.937 -116.224 228.777 -103.744C228.777 -103.744 225.033 -78.368 232.521 -72.96C232.521 -72.96 237.097 -65.888 243.753 -72.128C250.41 -78.368 264.98 -107.02 262.9 -119.916z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M262.526 -119.558C262.526 -119.558 264.586 -127.744 260.098 -123.256C260.098 -123.256 253.569 -117.952 246.633 -117.952C246.633 -117.952 233.169 -115.912 229.089 -103.672C229.089 -103.672 225.417 -78.784 232.761 -73.48C232.761 -73.48 237.249 -66.544 243.777 -72.664C250.305 -78.784 264.566 -106.91 262.526 -119.558z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M262.151 -119.2C262.151 -119.2 264.201 -127.2 259.801 -122.8C259.801 -122.8 253.401 -117.6 246.601 -117.6C246.601 -117.6 233.401 -115.6 229.401 -103.6C229.401 -103.6 225.801 -79.2 233.001 -74C233.001 -74 237.401 -67.2 243.801 -73.2C250.201 -79.2 264.151 -106.8 262.151 -119.2z").setFill(f).setStroke(s);
+	f = "#992600";
+	g.createPath("M50.6 84C50.6 84 30.2 64.8 22.2 64C22.2 64 -12.2 60 -27 78C-27 78 -9.4 57.6 18.2 63.2C18.2 63.2 -3.4 58.8 -15.8 62C-15.8 62 -32.6 62 -42.2 76L-45 80.8C-45 80.8 -41 66 -22.6 60C-22.6 60 0.2 55.2 11 60C11 60 -10.6 53.2 -20.6 55.2C-20.6 55.2 -51 52.8 -63.8 79.2C-63.8 79.2 -59.8 64.8 -45 57.6C-45 57.6 -31.4 48.8 -11 51.6C-11 51.6 3.4 54.8 8.6 57.2C13.8 59.6 12.6 56.8 4.2 52C4.2 52 -1.4 42 -15.4 42.4C-15.4 42.4 -58.2 46 -68.6 58C-68.6 58 -55 46.8 -44.6 44C-44.6 44 -22.2 36 -13.8 36.8C-13.8 36.8 11 37.8 18.6 33.8C18.6 33.8 7.4 38.8 10.6 42C13.8 45.2 20.6 52.8 20.6 54C20.6 55.2 44.8 77.3 48.4 81.7L50.6 84z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M189 278C189 278 173.5 241.5 161 232C161 232 187 248 190.5 266C190.5 266 190.5 276 189 278z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M236 285.5C236 285.5 209.5 230.5 191 206.5C191 206.5 234.5 244 239.5 270.5L240 276L237 273.5C237 273.5 236.5 282.5 236 285.5z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M292.5 237C292.5 237 230 177.5 228.5 175C228.5 175 289 241 292 248.5C292 248.5 290 239.5 292.5 237z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M104 280.5C104 280.5 123.5 228.5 142.5 251C142.5 251 157.5 261 157 264C157 264 153 257.5 135 258C135 258 116 255 104 280.5z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M294.5 153C294.5 153 249.5 124.5 242 123C230.193 120.639 291.5 152 296.5 162.5C296.5 162.5 298.5 160 294.5 153z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M143.801 259.601C143.801 259.601 164.201 257.601 171.001 250.801L175.401 254.401L193.001 216.001L196.601 221.201C196.601 221.201 211.001 206.401 210.201 198.401C209.401 190.401 223.001 204.401 223.001 204.401C223.001 204.401 222.201 192.801 229.401 199.601C229.401 199.601 227.001 184.001 235.401 192.001C235.401 192.001 224.864 161.844 247.401 187.601C253.001 194.001 248.601 187.201 248.601 187.201C248.601 187.201 222.601 139.201 244.201 153.601C244.201 153.601 246.201 130.801 245.001 126.401C243.801 122.001 241.801 99.6 237.001 94.4C232.201 89.2 237.401 87.6 243.001 92.8C243.001 92.8 231.801 68.8 245.001 80.8C245.001 80.8 241.401 65.6 237.001 62.8C237.001 62.8 231.401 45.6 246.601 56.4C246.601 56.4 242.201 44 239.001 40.8C239.001 40.8 227.401 13.2 234.601 18L239.001 21.6C239.001 21.6 232.201 7.6 238.601 12C245.001 16.4 245.001 16 245.001 16C245.001 16 223.801 -17.2 244.201 0.4C244.201 0.4 236.042 -13.518 232.601 -20.4C232.601 -20.4 213.801 -40.8 228.201 -34.4L233.001 -32.8C233.001 -32.8 224.201 -42.8 216.201 -44.4C208.201 -46 218.601 -52.4 225.001 -50.4C231.401 -48.4 247.001 -40.8 247.001 -40.8C247.001 -40.8 259.801 -22 263.801 -21.6C263.801 -21.6 243.801 -29.2 249.801 -21.2C249.801 -21.2 264.201 -7.2 257.001 -7.6C257.001 -7.6 251.001 -0.4 255.801 8.4C255.801 8.4 237.342 -9.991 252.201 15.6L259.001 32C259.001 32 234.601 7.2 245.801 29.2C245.801 29.2 263.001 52.8 265.001 53.2C267.001 53.6 271.401 62.4 271.401 62.4L267.001 60.4L272.201 69.2C272.201 69.2 261.001 57.2 267.001 70.4L272.601 84.8C272.601 84.8 252.201 62.8 265.801 92.4C265.801 92.4 249.401 87.2 258.201 104.4C258.201 104.4 256.601 120.401 257.001 125.601C257.401 130.801 258.601 159.201 254.201 167.201C249.801 175.201 260.201 194.401 262.201 198.401C264.201 202.401 267.801 213.201 259.001 204.001C250.201 194.801 254.601 200.401 256.601 209.201C258.601 218.001 264.601 233.601 263.801 239.201C263.801 239.201 262.601 240.401 259.401 236.801C259.401 236.801 244.601 214.001 246.201 228.401C246.201 228.401 245.001 236.401 241.801 245.201C241.801 245.201 238.601 256.001 238.601 247.201C238.601 247.201 235.401 230.401 232.601 238.001C229.801 245.601 226.201 251.601 223.401 254.001C220.601 256.401 215.401 233.601 214.201 244.001C214.201 244.001 202.201 231.601 197.401 248.001L185.801 264.401C185.801 264.401 185.401 252.001 184.201 258.001C184.201 258.001 154.201 264.001 143.801 259.601z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M109.401 -97.2C109.401 -97.2 97.801 -105.2 93.801 -104.8C89.801 -104.4 121.401 -113.6 162.601 -86C162.601 -86 167.401 -83.2 171.001 -83.6C171.001 -83.6 174.201 -81.2 171.401 -77.6C171.401 -77.6 162.601 -68 173.801 -56.8C173.801 -56.8 192.201 -50 186.601 -58.8C186.601 -58.8 197.401 -54.8 199.801 -50.8C202.201 -46.8 201.001 -50.8 201.001 -50.8C201.001 -50.8 194.601 -58 188.601 -63.2C188.601 -63.2 183.401 -65.2 180.601 -73.6C177.801 -82 175.401 -92 179.801 -95.2C179.801 -95.2 175.801 -90.8 176.601 -94.8C177.401 -98.8 181.001 -102.4 182.601 -102.8C184.201 -103.2 200.601 -119 207.401 -119.4C207.401 -119.4 198.201 -118 195.201 -119C192.201 -120 165.601 -131.4 159.601 -132.6C159.601 -132.6 142.801 -139.2 154.801 -137.2C154.801 -137.2 190.601 -133.4 208.801 -120.2C208.801 -120.2 201.601 -128.6 183.201 -135.6C183.201 -135.6 161.001 -148.2 125.801 -143.2C125.801 -143.2 108.001 -140 100.201 -138.2C100.201 -138.2 97.601 -138.8 97.001 -139.2C96.401 -139.6 84.6 -148.6 57 -141.6C57 -141.6 40 -137 31.4 -132.2C31.4 -132.2 16.2 -131 12.6 -127.8C12.6 -127.8 -6 -113.2 -8 -112.4C-10 -111.6 -21.4 -104 -22.2 -103.6C-22.2 -103.6 2.4 -110.2 4.8 -112.6C7.2 -115 24.6 -117.6 27 -116.2C29.4 -114.8 37.8 -115.4 28.2 -114.8C28.2 -114.8 103.801 -100 104.601 -98C105.401 -96 109.401 -97.2 109.401 -97.2z").setFill(f).setStroke(s);
+	f = "#cc7226";
+	g.createPath("M180.801 -106.4C180.801 -106.4 170.601 -113.8 168.601 -113.8C166.601 -113.8 154.201 -124 150.001 -123.6C145.801 -123.2 133.601 -133.2 106.201 -125C106.201 -125 105.601 -127 109.201 -127.8C109.201 -127.8 115.601 -130 116.001 -130.6C116.001 -130.6 136.201 -134.8 143.401 -131.2C143.401 -131.2 152.601 -128.6 158.801 -122.4C158.801 -122.4 170.001 -119.2 173.201 -120.2C173.201 -120.2 182.001 -118 182.401 -116.2C182.401 -116.2 188.201 -113.2 186.401 -110.6C186.401 -110.6 186.801 -109 180.801 -106.4z").setFill(f).setStroke(s);
+	f = "#cc7226";
+	g.createPath("M168.33 -108.509C169.137 -107.877 170.156 -107.779 170.761 -106.97C170.995 -106.656 170.706 -106.33 170.391 -106.233C169.348 -105.916 168.292 -106.486 167.15 -105.898C166.748 -105.691 166.106 -105.873 165.553 -106.022C163.921 -106.463 162.092 -106.488 160.401 -105.8C158.416 -106.929 156.056 -106.345 153.975 -107.346C153.917 -107.373 153.695 -107.027 153.621 -107.054C150.575 -108.199 146.832 -107.916 144.401 -110.2C141.973 -110.612 139.616 -111.074 137.188 -111.754C135.37 -112.263 133.961 -113.252 132.341 -114.084C130.964 -114.792 129.507 -115.314 127.973 -115.686C126.11 -116.138 124.279 -116.026 122.386 -116.546C122.293 -116.571 122.101 -116.227 122.019 -116.254C121.695 -116.362 121.405 -116.945 121.234 -116.892C119.553 -116.37 118.065 -117.342 116.401 -117C115.223 -118.224 113.495 -117.979 111.949 -118.421C108.985 -119.269 105.831 -117.999 102.801 -119C106.914 -120.842 111.601 -119.61 115.663 -121.679C117.991 -122.865 120.653 -121.763 123.223 -122.523C123.71 -122.667 124.401 -122.869 124.801 -122.2C124.935 -122.335 125.117 -122.574 125.175 -122.546C127.625 -121.389 129.94 -120.115 132.422 -119.049C132.763 -118.903 133.295 -119.135 133.547 -118.933C135.067 -117.717 137.01 -117.82 138.401 -116.6C140.099 -117.102 141.892 -116.722 143.621 -117.346C143.698 -117.373 143.932 -117.032 143.965 -117.054C145.095 -117.802 146.25 -117.531 147.142 -117.227C147.48 -117.112 148.143 -116.865 148.448 -116.791C149.574 -116.515 150.43 -116.035 151.609 -115.852C151.723 -115.834 151.908 -116.174 151.98 -116.146C153.103 -115.708 154.145 -115.764 154.801 -114.6C154.936 -114.735 155.101 -114.973 155.183 -114.946C156.21 -114.608 156.859 -113.853 157.96 -113.612C158.445 -113.506 159.057 -112.88 159.633 -112.704C162.025 -111.973 163.868 -110.444 166.062 -109.549C166.821 -109.239 167.697 -109.005 168.33 -108.509z").setFill(f).setStroke(s);
+	f = "#cc7226";
+	g.createPath("M91.696 -122.739C89.178 -124.464 86.81 -125.57 84.368 -127.356C84.187 -127.489 83.827 -127.319 83.625 -127.441C82.618 -128.05 81.73 -128.631 80.748 -129.327C80.209 -129.709 79.388 -129.698 78.88 -129.956C76.336 -131.248 73.707 -131.806 71.2 -133C71.882 -133.638 73.004 -133.394 73.6 -134.2C73.795 -133.92 74.033 -133.636 74.386 -133.827C76.064 -134.731 77.914 -134.884 79.59 -134.794C81.294 -134.702 83.014 -134.397 84.789 -134.125C85.096 -134.078 85.295 -133.555 85.618 -133.458C87.846 -132.795 90.235 -133.32 92.354 -132.482C93.945 -131.853 95.515 -131.03 96.754 -129.755C97.006 -129.495 96.681 -129.194 96.401 -129C96.789 -129.109 97.062 -128.903 97.173 -128.59C97.257 -128.351 97.257 -128.049 97.173 -127.81C97.061 -127.498 96.782 -127.397 96.408 -127.346C95.001 -127.156 96.773 -128.536 96.073 -128.088C94.8 -127.274 95.546 -125.868 94.801 -124.6C94.521 -124.794 94.291 -125.012 94.401 -125.4C94.635 -124.878 94.033 -124.588 93.865 -124.272C93.48 -123.547 92.581 -122.132 91.696 -122.739z").setFill(f).setStroke(s);
+	f = "#cc7226";
+	g.createPath("M59.198 -115.391C56.044 -116.185 52.994 -116.07 49.978 -117.346C49.911 -117.374 49.688 -117.027 49.624 -117.054C48.258 -117.648 47.34 -118.614 46.264 -119.66C45.351 -120.548 43.693 -120.161 42.419 -120.648C42.095 -120.772 41.892 -121.284 41.591 -121.323C40.372 -121.48 39.445 -122.429 38.4 -123C40.736 -123.795 43.147 -123.764 45.609 -124.148C45.722 -124.166 45.867 -123.845 46 -123.845C46.136 -123.845 46.266 -124.066 46.4 -124.2C46.595 -123.92 46.897 -123.594 47.154 -123.848C47.702 -124.388 48.258 -124.198 48.798 -124.158C48.942 -124.148 49.067 -123.845 49.2 -123.845C49.336 -123.845 49.467 -124.156 49.6 -124.156C49.736 -124.155 49.867 -123.845 50 -123.845C50.136 -123.845 50.266 -124.066 50.4 -124.2C51.092 -123.418 51.977 -123.972 52.799 -123.793C53.837 -123.566 54.104 -122.418 55.178 -122.12C59.893 -120.816 64.03 -118.671 68.393 -116.584C68.7 -116.437 68.91 -116.189 68.8 -115.8C69.067 -115.8 69.38 -115.888 69.57 -115.756C70.628 -115.024 71.669 -114.476 72.366 -113.378C72.582 -113.039 72.253 -112.632 72.02 -112.684C67.591 -113.679 63.585 -114.287 59.198 -115.391z").setFill(f).setStroke(s);
+	f = "#cc7226";
+	g.createPath("M45.338 -71.179C43.746 -72.398 43.162 -74.429 42.034 -76.221C41.82 -76.561 42.094 -76.875 42.411 -76.964C42.971 -77.123 43.514 -76.645 43.923 -76.443C45.668 -75.581 47.203 -74.339 49.2 -74.2C51.19 -71.966 55.45 -71.581 55.457 -68.2C55.458 -67.341 54.03 -68.259 53.6 -67.4C51.149 -68.403 48.76 -68.3 46.38 -69.767C45.763 -70.148 46.093 -70.601 45.338 -71.179z").setFill(f).setStroke(s);
+	f = "#cc7226";
+	g.createPath("M17.8 -123.756C17.935 -123.755 24.966 -123.522 24.949 -123.408C24.904 -123.099 17.174 -122.05 16.81 -122.22C16.646 -122.296 9.134 -119.866 9 -120C9.268 -120.135 17.534 -123.756 17.8 -123.756z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M33.2 -114C33.2 -114 18.4 -112.2 14 -111C9.6 -109.8 -9 -102.2 -12 -100.2C-12 -100.2 -25.4 -94.8 -42.4 -74.8C-42.4 -74.8 -34.8 -78.2 -32.6 -81C-32.6 -81 -19 -93.6 -19.2 -91C-19.2 -91 -7 -99.6 -7.6 -97.4C-7.6 -97.4 16.8 -108.6 14.8 -105.4C14.8 -105.4 36.4 -110 35.4 -108C35.4 -108 54.2 -103.6 51.4 -103.4C51.4 -103.4 45.6 -102.2 52 -98.6C52 -98.6 48.6 -94.2 43.2 -98.2C37.8 -102.2 40.8 -100 35.8 -99C35.8 -99 33.2 -98.2 28.6 -102.2C28.6 -102.2 23 -106.8 14.2 -103.2C14.2 -103.2 -16.4 -90.6 -18.4 -90C-18.4 -90 -22 -87.2 -24.4 -83.6C-24.4 -83.6 -30.2 -79.2 -33.2 -77.8C-33.2 -77.8 -46 -66.2 -47.2 -64.8C-47.2 -64.8 -50.6 -59.6 -51.4 -59.2C-51.4 -59.2 -45 -63 -43 -65C-43 -65 -29 -75 -23.6 -75.8C-23.6 -75.8 -19.2 -78.8 -18.4 -80.2C-18.4 -80.2 -4 -89.4 0.2 -89.4C0.2 -89.4 9.4 -84.2 11.8 -91.2C11.8 -91.2 17.6 -93 23.2 -91.8C23.2 -91.8 26.4 -94.4 25.6 -96.6C25.6 -96.6 27.2 -98.4 28.2 -94.6C28.2 -94.6 31.6 -91 36.4 -93C36.4 -93 40.4 -93.2 38.4 -90.8C38.4 -90.8 34 -87 22.2 -86.8C22.2 -86.8 9.8 -86.2 -6.6 -78.6C-6.6 -78.6 -36.4 -68.2 -45.6 -57.8C-45.6 -57.8 -52 -49 -57.4 -47.8C-57.4 -47.8 -63.2 -47 -69.2 -39.6C-69.2 -39.6 -59.4 -45.4 -50.4 -45.4C-50.4 -45.4 -46.4 -47.8 -50.2 -44.2C-50.2 -44.2 -53.8 -36.6 -52.2 -31.2C-52.2 -31.2 -52.8 -26 -53.6 -24.4C-53.6 -24.4 -61.4 -11.6 -61.4 -9.2C-61.4 -6.8 -60.2 3 -59.8 3.6C-59.4 4.2 -60.8 2 -57 4.4C-53.2 6.8 -50.4 8.4 -49.6 11.2C-48.8 14 -51.6 5.8 -51.8 4C-52 2.2 -56.2 -5 -55.4 -7.4C-55.4 -7.4 -54.4 -6.4 -53.6 -5C-53.6 -5 -54.2 -5.6 -53.6 -9.2C-53.6 -9.2 -52.8 -14.4 -51.4 -17.6C-50 -20.8 -48 -24.6 -47.6 -25.4C-47.2 -26.2 -47.2 -32 -45.8 -29.4L-42.4 -26.8C-42.4 -26.8 -45.2 -29.4 -43 -31.6C-43 -31.6 -44 -37.2 -42.2 -39.8C-42.2 -39.8 -35.2 -48.2 -33.6 -49.2C-32 -50.2 -33.4 -49.8 -33.4 -49.8C-33.4 -49.8 -27.4 -54 -33.2 -52.4C-33.2 -52.4 -37.2 -50.8 -40.2 -50.8C-40.2 -50.8 -47.8 -48.8 -43.8 -53C-39.8 -57.2 -29.8 -62.6 -26 -62.4L-25.2 -60.8L-14 -63.2L-15.2 -62.4C-15.2 -62.4 -15.4 -62.6 -11.2 -63C-7 -63.4 -1.2 -62 0.2 -63.8C1.6 -65.6 5 -66.6 4.6 -65.2C4.2 -63.8 4 -61.8 4 -61.8C4 -61.8 9 -67.6 8.4 -65.4C7.8 -63.2 -0.4 -58 -1.8 -51.8L8.6 -60L12.2 -63C12.2 -63 15.8 -60.8 16 -62.4C16.2 -64 20.8 -69.8 22 -69.6C23.2 -69.4 25.2 -72.2 25 -69.6C24.8 -67 32.4 -61.6 32.4 -61.6C32.4 -61.6 35.6 -63.4 37 -62C38.4 -60.6 42.6 -81.8 42.6 -81.8L67.6 -92.4L111.201 -95.8L94.201 -102.6L33.2 -114z").setFill(f).setStroke(s);
+	s = {color: "#4c0000", width: 2}; f = null;
+	g.createPath("M51.4 85C51.4 85 36.4 68.2 28 65.6C28 65.6 14.6 58.8 -10 66.6").setFill(f).setStroke(s);
+	s = {color: "#4c0000", width: 2};
+	g.createPath("M24.8 64.2C24.8 64.2 -0.4 56.2 -15.8 60.4C-15.8 60.4 -34.2 62.4 -42.6 76.2").setFill(f).setStroke(s);
+	s = {color: "#4c0000", width: 2};
+	g.createPath("M21.2 63C21.2 63 4.2 55.8 -10.6 53.6C-10.6 53.6 -27.2 51 -43.8 58.2C-43.8 58.2 -56 64.2 -61.4 74.4").setFill(f).setStroke(s);
+	s = {color: "#4c0000", width: 2};
+	g.createPath("M22.2 63.4C22.2 63.4 6.8 52.4 5.8 51C5.8 51 -1.2 40 -14.2 39.6C-14.2 39.6 -35.6 40.4 -52.8 48.4").setFill(f).setStroke(s);
+	f = "#000000"; s = null;
+	g.createPath("M20.895 54.407C22.437 55.87 49.4 84.8 49.4 84.8C84.6 121.401 56.6 87.2 56.6 87.2C49 82.4 39.8 63.6 39.8 63.6C38.6 60.8 53.8 70.8 53.8 70.8C57.8 71.6 71.4 90.8 71.4 90.8C64.6 88.4 69.4 95.6 69.4 95.6C72.2 97.6 92.601 113.201 92.601 113.201C96.201 117.201 100.201 118.801 100.201 118.801C114.201 113.601 107.801 126.801 107.801 126.801C110.201 133.601 115.801 122.001 115.801 122.001C127.001 105.2 110.601 107.601 110.601 107.601C80.6 110.401 73.8 94.4 73.8 94.4C71.4 92 80.2 94.4 80.2 94.4C88.601 96.4 73 82 73 82C75.4 82 84.6 88.8 84.6 88.8C95.001 98 97.001 96 97.001 96C115.001 87.2 125.401 94.8 125.401 94.8C127.401 96.4 121.801 103.2 123.401 108.401C125.001 113.601 129.801 126.001 129.801 126.001C127.401 127.601 127.801 138.401 127.801 138.401C144.601 161.601 135.001 159.601 135.001 159.601C119.401 159.201 134.201 166.801 134.201 166.801C137.401 168.801 146.201 176.001 146.201 176.001C143.401 174.801 141.801 180.001 141.801 180.001C146.601 184.001 143.801 188.801 143.801 188.801C137.801 190.001 136.601 194.001 136.601 194.001C143.401 202.001 133.401 202.401 133.401 202.401C137.001 206.801 132.201 218.801 132.201 218.801C127.401 218.801 121.001 224.401 121.001 224.401C123.401 229.201 113.001 234.801 113.001 234.801C104.601 236.401 107.401 243.201 107.401 243.201C99.401 249.201 97.001 265.201 97.001 265.201C96.201 275.601 93.801 278.801 99.001 276.801C104.201 274.801 103.401 262.401 103.401 262.401C98.601 246.801 141.401 230.801 141.401 230.801C145.401 229.201 146.201 224.001 146.201 224.001C148.201 224.401 157.001 232.001 157.001 232.001C164.601 243.201 165.001 234.001 165.001 234.001C166.201 230.401 164.601 224.401 164.601 224.401C170.601 202.801 156.601 196.401 156.601 196.401C146.601 162.801 160.601 171.201 160.601 171.201C163.401 176.801 174.201 182.001 174.201 182.001L177.801 179.601C176.201 174.801 184.601 168.801 184.601 168.801C187.401 175.201 193.401 167.201 193.401 167.201C197.001 142.801 209.401 157.201 209.401 157.201C213.401 158.401 214.601 151.601 214.601 151.601C218.201 141.201 214.601 127.601 214.601 127.601C218.201 127.201 227.801 133.201 227.801 133.201C230.601 129.601 221.401 112.801 225.401 115.201C229.401 117.601 233.801 119.201 233.801 119.201C234.601 117.201 224.601 104.801 224.601 104.801C220.201 102 215.001 81.6 215.001 81.6C222.201 85.2 212.201 70 212.201 70C212.201 66.8 218.201 55.6 218.201 55.6C217.401 48.8 218.201 49.2 218.201 49.2C221.001 50.4 229.001 52 222.201 45.6C215.401 39.2 223.001 34.4 223.001 34.4C227.401 31.6 213.801 32 213.801 32C208.601 27.6 209.001 23.6 209.001 23.6C217.001 25.6 202.601 11.2 200.201 7.6C197.801 4 207.401 -1.2 207.401 -1.2C220.601 -4.8 209.001 -8 209.001 -8C189.401 -7.6 200.201 -18.4 200.201 -18.4C206.201 -18 204.601 -20.4 204.601 -20.4C199.401 -21.6 189.801 -28 189.801 -28C185.801 -31.6 189.401 -30.8 189.401 -30.8C206.201 -29.6 177.401 -40.8 177.401 -40.8C185.401 -40.8 167.401 -51.2 167.401 -51.2C165.401 -52.8 162.201 -60.4 162.201 -60.4C156.201 -65.6 151.401 -72.4 151.401 -72.4C151.001 -76.8 146.201 -81.6 146.201 -81.6C134.601 -95.2 129.001 -94.8 129.001 -94.8C114.201 -98.4 109.001 -97.6 109.001 -97.6L56.2 -93.2C29.8 -80.4 37.6 -59.4 37.6 -59.4C44 -51 53.2 -54.8 53.2 -54.8C57.8 -61 69.4 -58.8 69.4 -58.8C89.801 -55.6 87.201 -59.2 87.201 -59.2C84.801 -63.8 68.6 -70 68.4 -70.6C68.2 -71.2 59.4 -74.6 59.4 -74.6C56.4 -75.8 52 -85 52 -85C48.8 -88.4 64.6 -82.6 64.6 -82.6C63.4 -81.6 70.8 -77.6 70.8 -77.6C88.201 -78.6 98.801 -67.8 98.801 -67.8C109.601 -51.2 109.801 -59.4 109.801 -59.4C112.601 -68.8 100.801 -90 100.801 -90C101.201 -92 109.401 -85.4 109.401 -85.4C110.801 -87.4 111.601 -81.6 111.601 -81.6C111.801 -79.2 115.601 -71.2 115.601 -71.2C118.401 -58.2 122.001 -65.6 122.001 -65.6L126.601 -56.2C128.001 -53.6 122.001 -46 122.001 -46C121.801 -43.2 122.601 -43.4 117.001 -35.8C111.401 -28.2 114.801 -23.8 114.801 -23.8C113.401 -17.2 122.201 -17.6 122.201 -17.6C124.801 -15.4 128.201 -15.4 128.201 -15.4C130.001 -13.4 132.401 -14 132.401 -14C134.001 -17.8 140.201 -15.8 140.201 -15.8C141.601 -18.2 149.801 -18.6 149.801 -18.6C150.801 -21.2 151.201 -22.8 154.601 -23.4C158.001 -24 133.401 -67 133.401 -67C139.801 -67.8 131.601 -80.2 131.601 -80.2C129.401 -86.8 140.801 -72.2 143.001 -70.8C145.201 -69.4 146.201 -67.2 144.601 -67.4C143.001 -67.6 141.201 -65.4 142.601 -65.2C144.001 -65 157.001 -50 160.401 -39.8C163.801 -29.6 169.801 -25.6 176.001 -19.6C182.201 -13.6 181.401 10.6 181.401 10.6C181.001 19.4 187.001 30 187.001 30C189.001 33.8 184.801 52 184.801 52C182.801 54.2 184.201 55 184.201 55C185.201 56.2 192.001 69.4 192.001 69.4C190.201 69.2 193.801 72.8 193.801 72.8C199.001 78.8 192.601 75.8 192.601 75.8C186.601 74.2 193.601 84 193.601 84C194.801 85.8 185.801 81.2 185.801 81.2C176.601 80.6 188.201 87.8 188.201 87.8C196.801 95 185.401 90.6 185.401 90.6C180.801 88.8 184.001 95.6 184.001 95.6C187.201 97.2 204.401 104.2 204.401 104.2C204.801 108.001 201.801 113.001 201.801 113.001C202.201 117.001 200.001 120.401 200.001 120.401C198.801 128.601 198.201 129.401 198.201 129.401C194.001 129.601 186.601 143.401 186.601 143.401C184.801 146.001 174.601 158.001 174.601 158.001C172.601 165.001 154.601 157.801 154.601 157.801C148.001 161.201 150.001 157.801 150.001 157.801C149.601 155.601 154.401 149.601 154.401 149.601C161.401 147.001 158.801 136.201 158.801 136.201C162.801 134.801 151.601 132.001 151.801 130.801C152.001 129.601 157.801 128.201 157.801 128.201C165.801 126.201 161.401 123.801 161.401 123.801C160.801 119.801 163.801 114.201 163.801 114.201C175.401 113.401 163.801 97.2 163.801 97.2C153.001 89.6 152.001 83.8 152.001 83.8C164.601 75.6 156.401 63.2 156.601 59.6C156.801 56 158.001 34.4 158.001 34.4C156.001 28.2 153.001 14.6 153.001 14.6C155.201 9.4 162.601 -3.2 162.601 -3.2C165.401 -7.4 174.201 -12.2 172.001 -15.2C169.801 -18.2 162.001 -16.4 162.001 -16.4C154.201 -17.8 154.801 -12.6 154.801 -12.6C153.201 -11.6 152.401 -6.6 152.401 -6.6C151.68 1.333 142.801 7.6 142.801 7.6C131.601 13.8 140.801 17.8 140.801 17.8C146.801 24.4 137.001 24.6 137.001 24.6C126.001 22.8 134.201 33 134.201 33C145.001 45.8 142.001 48.6 142.001 48.6C131.801 49.6 144.401 58.8 144.401 58.8C144.401 58.8 143.601 56.8 143.801 58.6C144.001 60.4 147.001 64.6 147.801 66.6C148.601 68.6 144.601 68.8 144.601 68.8C145.201 78.4 129.801 74.2 129.801 74.2C129.801 74.2 129.801 74.2 128.201 74.4C126.601 74.6 115.401 73.8 109.601 71.6C103.801 69.4 97.001 69.4 97.001 69.4C97.001 69.4 93.001 71.2 85.4 71C77.8 70.8 69.8 73.6 69.8 73.6C65.4 73.2 74 68.8 74.2 69C74.4 69.2 80 63.6 72 64.2C50.203 65.835 39.4 55.6 39.4 55.6C37.4 54.2 34.8 51.4 34.8 51.4C24.8 49.4 36.2 63.8 36.2 63.8C37.4 65.2 36 66.2 36 66.2C35.2 64.6 27.4 59.2 27.4 59.2C24.589 58.227 23.226 56.893 20.895 54.407z").setFill(f).setStroke(s);
+	f = "#4c0000";
+	g.createPath("M-3 42.8C-3 42.8 8.6 48.4 11.2 51.2C13.8 54 27.8 65.4 27.8 65.4C27.8 65.4 22.4 63.4 19.8 61.6C17.2 59.8 6.4 51.6 6.4 51.6C6.4 51.6 2.6 45.6 -3 42.8z").setFill(f).setStroke(s);
+	f = "#99cc32";
+	g.createPath("M-61.009 11.603C-60.672 11.455 -61.196 8.743 -61.4 8.2C-62.422 5.474 -71.4 4 -71.4 4C-71.627 5.365 -71.682 6.961 -71.576 8.599C-71.576 8.599 -66.708 14.118 -61.009 11.603z").setFill(f).setStroke(s);
+	f = "#659900";
+	g.createPath("M-61.009 11.403C-61.458 11.561 -61.024 8.669 -61.2 8.2C-62.222 5.474 -71.4 3.9 -71.4 3.9C-71.627 5.265 -71.682 6.861 -71.576 8.499C-71.576 8.499 -67.308 13.618 -61.009 11.403z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-65.4 11.546C-66.025 11.546 -66.531 10.406 -66.531 9C-66.531 7.595 -66.025 6.455 -65.4 6.455C-64.775 6.455 -64.268 7.595 -64.268 9C-64.268 10.406 -64.775 11.546 -65.4 11.546z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-65.4 9z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-111 109.601C-111 109.601 -116.6 119.601 -91.8 113.601C-91.8 113.601 -77.8 112.401 -75.4 110.001C-74.2 110.801 -65.834 113.734 -63 114.401C-56.2 116.001 -47.8 106 -47.8 106C-47.8 106 -43.2 95.5 -40.4 95.5C-37.6 95.5 -40.8 97.1 -40.8 97.1C-40.8 97.1 -47.4 107.201 -47 108.801C-47 108.801 -52.2 128.801 -68.2 129.601C-68.2 129.601 -84.35 130.551 -83 136.401C-83 136.401 -74.2 134.001 -71.8 136.401C-71.8 136.401 -61 136.001 -69 142.401L-75.8 154.001C-75.8 154.001 -75.66 157.919 -85.8 154.401C-95.6 151.001 -105.9 138.101 -105.9 138.101C-105.9 138.101 -121.85 123.551 -111 109.601z").setFill(f).setStroke(s);
+	f = "#e59999";
+	g.createPath("M-112.2 113.601C-112.2 113.601 -114.2 123.201 -77.4 112.801C-77.4 112.801 -73 112.801 -70.6 113.601C-68.2 114.401 -56.2 117.201 -54.2 116.001C-54.2 116.001 -61.4 129.601 -73 128.001C-73 128.001 -86.2 129.601 -85.8 134.401C-85.8 134.401 -81.8 141.601 -77 144.001C-77 144.001 -74.2 146.401 -74.6 149.601C-75 152.801 -77.8 154.401 -79.8 155.201C-81.8 156.001 -85 152.801 -86.6 152.801C-88.2 152.801 -96.6 146.401 -101 141.601C-105.4 136.801 -113.8 124.801 -113.4 122.001C-113 119.201 -112.2 113.601 -112.2 113.601z").setFill(f).setStroke(s);
+	f = "#b26565";
+	g.createPath("M-109 131.051C-106.4 135.001 -103.2 139.201 -101 141.601C-96.6 146.401 -88.2 152.801 -86.6 152.801C-85 152.801 -81.8 156.001 -79.8 155.201C-77.8 154.401 -75 152.801 -74.6 149.601C-74.2 146.401 -77 144.001 -77 144.001C-80.066 142.468 -82.806 138.976 -84.385 136.653C-84.385 136.653 -84.2 139.201 -89.4 138.401C-94.6 137.601 -99.8 134.801 -101.4 131.601C-103 128.401 -105.4 126.001 -103.8 129.601C-102.2 133.201 -99.8 136.801 -98.2 137.201C-96.6 137.601 -97 138.801 -99.4 138.401C-101.8 138.001 -104.6 137.601 -109 132.401z").setFill(f).setStroke(s);
+	f = "#992600";
+	g.createPath("M-111.6 110.001C-111.6 110.001 -109.8 96.4 -108.6 92.4C-108.6 92.4 -109.4 85.6 -107 81.4C-104.6 77.2 -102.6 71 -99.6 65.6C-96.6 60.2 -96.4 56.2 -92.4 54.6C-88.4 53 -82.4 44.4 -79.6 43.4C-76.8 42.4 -77 43.2 -77 43.2C-77 43.2 -70.2 28.4 -56.6 32.4C-56.6 32.4 -72.8 29.6 -57 20.2C-57 20.2 -61.8 21.3 -58.5 14.3C-56.299 9.632 -56.8 16.4 -67.8 28.2C-67.8 28.2 -72.8 36.8 -78 39.8C-83.2 42.8 -95.2 49.8 -96.4 53.6C-97.6 57.4 -100.8 63.2 -102.8 64.8C-104.8 66.4 -107.6 70.6 -108 74C-108 74 -109.2 78 -110.6 79.2C-112 80.4 -112.2 83.6 -112.2 85.6C-112.2 87.6 -114.2 90.4 -114 92.8C-114 92.8 -113.2 111.801 -113.6 113.801L-111.6 110.001z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M-120.2 114.601C-120.2 114.601 -122.2 113.201 -126.6 119.201C-126.6 119.201 -119.3 152.201 -119.3 153.601C-119.3 153.601 -118.2 151.501 -119.5 144.301C-120.8 137.101 -121.7 124.401 -121.7 124.401L-120.2 114.601z").setFill(f).setStroke(s);
+	f = "#992600";
+	g.createPath("M-98.6 54C-98.6 54 -116.2 57.2 -115.8 86.4L-116.6 111.201C-116.6 111.201 -117.8 85.6 -119 84C-120.2 82.4 -116.2 71.2 -119.4 77.2C-119.4 77.2 -133.4 91.2 -125.4 112.401C-125.4 112.401 -123.9 115.701 -126.9 111.101C-126.9 111.101 -131.5 98.5 -130.4 92.1C-130.4 92.1 -130.2 89.9 -128.3 87.1C-128.3 87.1 -119.7 75.4 -117 73.1C-117 73.1 -115.2 58.7 -99.8 53.5C-99.8 53.5 -94.1 51.2 -98.6 54z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M40.8 -12.2C41.46 -12.554 41.451 -13.524 42.031 -13.697C43.18 -14.041 43.344 -15.108 43.862 -15.892C44.735 -17.211 44.928 -18.744 45.51 -20.235C45.782 -20.935 45.809 -21.89 45.496 -22.55C44.322 -25.031 43.62 -27.48 42.178 -29.906C41.91 -30.356 41.648 -31.15 41.447 -31.748C40.984 -33.132 39.727 -34.123 38.867 -35.443C38.579 -35.884 39.104 -36.809 38.388 -36.893C37.491 -36.998 36.042 -37.578 35.809 -36.552C35.221 -33.965 36.232 -31.442 37.2 -29C36.418 -28.308 36.752 -27.387 36.904 -26.62C37.614 -23.014 36.416 -19.662 35.655 -16.188C35.632 -16.084 35.974 -15.886 35.946 -15.824C34.724 -13.138 33.272 -10.693 31.453 -8.312C30.695 -7.32 29.823 -6.404 29.326 -5.341C28.958 -4.554 28.55 -3.588 28.8 -2.6C25.365 0.18 23.115 4.025 20.504 7.871C20.042 8.551 20.333 9.76 20.884 10.029C21.697 10.427 22.653 9.403 23.123 8.557C23.512 7.859 23.865 7.209 24.356 6.566C24.489 6.391 24.31 5.972 24.445 5.851C27.078 3.504 28.747 0.568 31.2 -1.8C33.15 -2.129 34.687 -3.127 36.435 -4.14C36.743 -4.319 37.267 -4.07 37.557 -4.265C39.31 -5.442 39.308 -7.478 39.414 -9.388C39.464 -10.272 39.66 -11.589 40.8 -12.2z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M31.959 -16.666C32.083 -16.743 31.928 -17.166 32.037 -17.382C32.199 -17.706 32.602 -17.894 32.764 -18.218C32.873 -18.434 32.71 -18.814 32.846 -18.956C35.179 -21.403 35.436 -24.427 34.4 -27.4C35.424 -28.02 35.485 -29.282 35.06 -30.129C34.207 -31.829 34.014 -33.755 33.039 -35.298C32.237 -36.567 30.659 -37.811 29.288 -36.508C28.867 -36.108 28.546 -35.321 28.824 -34.609C28.888 -34.446 29.173 -34.3 29.146 -34.218C29.039 -33.894 28.493 -33.67 28.487 -33.398C28.457 -31.902 27.503 -30.391 28.133 -29.062C28.905 -27.433 29.724 -25.576 30.4 -23.8C29.166 -21.684 30.199 -19.235 28.446 -17.358C28.31 -17.212 28.319 -16.826 28.441 -16.624C28.733 -16.138 29.139 -15.732 29.625 -15.44C29.827 -15.319 30.175 -15.317 30.375 -15.441C30.953 -15.803 31.351 -16.29 31.959 -16.666z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M94.771 -26.977C96.16 -25.185 96.45 -22.39 94.401 -21C94.951 -17.691 98.302 -19.67 100.401 -20.2C100.292 -20.588 100.519 -20.932 100.802 -20.937C101.859 -20.952 102.539 -21.984 103.601 -21.8C104.035 -23.357 105.673 -24.059 106.317 -25.439C108.043 -29.134 107.452 -33.407 104.868 -36.653C104.666 -36.907 104.883 -37.424 104.759 -37.786C104.003 -39.997 101.935 -40.312 100.001 -41C98.824 -44.875 98.163 -48.906 96.401 -52.6C94.787 -52.85 94.089 -54.589 92.752 -55.309C91.419 -56.028 90.851 -54.449 90.892 -53.403C90.899 -53.198 91.351 -52.974 91.181 -52.609C91.105 -52.445 90.845 -52.334 90.845 -52.2C90.846 -52.065 91.067 -51.934 91.201 -51.8C90.283 -50.98 88.86 -50.503 88.565 -49.358C87.611 -45.648 90.184 -42.523 91.852 -39.322C92.443 -38.187 91.707 -36.916 90.947 -35.708C90.509 -35.013 90.617 -33.886 90.893 -33.03C91.645 -30.699 93.236 -28.96 94.771 -26.977z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M57.611 -8.591C56.124 -6.74 52.712 -4.171 55.629 -2.243C55.823 -2.114 56.193 -2.11 56.366 -2.244C58.387 -3.809 60.39 -4.712 62.826 -5.294C62.95 -5.323 63.224 -4.856 63.593 -5.017C65.206 -5.72 67.216 -5.662 68.4 -7C72.167 -6.776 75.732 -7.892 79.123 -9.2C80.284 -9.648 81.554 -10.207 82.755 -10.709C84.131 -11.285 85.335 -12.213 86.447 -13.354C86.58 -13.49 86.934 -13.4 87.201 -13.4C87.161 -14.263 88.123 -14.39 88.37 -15.012C88.462 -15.244 88.312 -15.64 88.445 -15.742C90.583 -17.372 91.503 -19.39 90.334 -21.767C90.049 -22.345 89.8 -22.963 89.234 -23.439C88.149 -24.35 87.047 -23.496 86 -23.8C85.841 -23.172 85.112 -23.344 84.726 -23.146C83.867 -22.707 82.534 -23.292 81.675 -22.854C80.313 -22.159 79.072 -21.99 77.65 -21.613C77.338 -21.531 76.56 -21.627 76.4 -21C76.266 -21.134 76.118 -21.368 76.012 -21.346C74.104 -20.95 72.844 -20.736 71.543 -19.044C71.44 -18.911 70.998 -19.09 70.839 -18.955C69.882 -18.147 69.477 -16.913 68.376 -16.241C68.175 -16.118 67.823 -16.286 67.629 -16.157C66.983 -15.726 66.616 -15.085 65.974 -14.638C65.645 -14.409 65.245 -14.734 65.277 -14.99C65.522 -16.937 66.175 -18.724 65.6 -20.6C67.677 -23.12 70.194 -25.069 72 -27.8C72.015 -29.966 72.707 -32.112 72.594 -34.189C72.584 -34.382 72.296 -35.115 72.17 -35.462C71.858 -36.316 72.764 -37.382 71.92 -38.106C70.516 -39.309 69.224 -38.433 68.4 -37C66.562 -36.61 64.496 -35.917 62.918 -37.151C61.911 -37.938 61.333 -38.844 60.534 -39.9C59.549 -41.202 59.884 -42.638 59.954 -44.202C59.96 -44.33 59.645 -44.466 59.645 -44.6C59.646 -44.735 59.866 -44.866 60 -45C59.294 -45.626 59.019 -46.684 58 -47C58.305 -48.092 57.629 -48.976 56.758 -49.278C54.763 -49.969 53.086 -48.057 51.194 -47.984C50.68 -47.965 50.213 -49.003 49.564 -49.328C49.132 -49.544 48.428 -49.577 48.066 -49.311C47.378 -48.807 46.789 -48.693 46.031 -48.488C44.414 -48.052 43.136 -46.958 41.656 -46.103C40.171 -45.246 39.216 -43.809 38.136 -42.489C37.195 -41.337 37.059 -38.923 38.479 -38.423C40.322 -37.773 41.626 -40.476 43.592 -40.15C43.904 -40.099 44.11 -39.788 44 -39.4C44.389 -39.291 44.607 -39.52 44.8 -39.8C45.658 -38.781 46.822 -38.444 47.76 -37.571C48.73 -36.667 50.476 -37.085 51.491 -36.088C53.02 -34.586 52.461 -31.905 54.4 -30.6C53.814 -29.287 53.207 -28.01 52.872 -26.583C52.59 -25.377 53.584 -24.18 54.795 -24.271C56.053 -24.365 56.315 -25.124 56.8 -26.2C57.067 -25.933 57.536 -25.636 57.495 -25.42C57.038 -23.033 56.011 -21.04 55.553 -18.609C55.494 -18.292 55.189 -18.09 54.8 -18.2C54.332 -14.051 50.28 -11.657 47.735 -8.492C47.332 -7.99 47.328 -6.741 47.737 -6.338C49.14 -4.951 51.1 -6.497 52.8 -7C53.013 -8.206 53.872 -9.148 55.204 -9.092C55.46 -9.082 55.695 -9.624 56.019 -9.754C56.367 -9.892 56.869 -9.668 57.155 -9.866C58.884 -11.061 60.292 -12.167 62.03 -13.356C62.222 -13.487 62.566 -13.328 62.782 -13.436C63.107 -13.598 63.294 -13.985 63.617 -14.17C63.965 -14.37 64.207 -14.08 64.4 -13.8C63.754 -13.451 63.75 -12.494 63.168 -12.292C62.393 -12.024 61.832 -11.511 61.158 -11.064C60.866 -10.871 60.207 -11.119 60.103 -10.94C59.505 -9.912 58.321 -9.474 57.611 -8.591z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M2.2 -58C2.2 -58 -7.038 -60.872 -18.2 -35.2C-18.2 -35.2 -20.6 -30 -23 -28C-25.4 -26 -36.6 -22.4 -38.6 -18.4L-49 -2.4C-49 -2.4 -34.2 -18.4 -31 -20.8C-31 -20.8 -23 -29.2 -26.2 -22.4C-26.2 -22.4 -40.2 -11.6 -39 -2.4C-39 -2.4 -44.6 12 -45.4 14C-45.4 14 -29.4 -18 -27 -19.2C-24.6 -20.4 -23.4 -20.4 -24.6 -16.8C-25.8 -13.2 -26.2 3.2 -29 5.2C-29 5.2 -21 -15.2 -21.8 -18.4C-21.8 -18.4 -18.6 -22 -16.2 -16.8L-17.4 -0.8L-13 11.2C-13 11.2 -15.4 0 -13.8 -15.6C-13.8 -15.6 -15.8 -26 -11.8 -20.4C-7.8 -14.8 1.8 -8.8 1.8 -4C1.8 -4 -3.4 -21.6 -12.6 -26.4L-16.6 -20.4L-17.8 -22.4C-17.8 -22.4 -21.4 -23.2 -17 -30C-12.6 -36.8 -13 -37.6 -13 -37.6C-13 -37.6 -6.6 -30.4 -5 -30.4C-5 -30.4 8.2 -38 9.4 -13.6C9.4 -13.6 16.2 -28 7 -34.8C7 -34.8 -7.8 -36.8 -6.6 -42L0.6 -54.4C4.2 -59.6 2.6 -56.8 2.6 -56.8z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-17.8 -41.6C-17.8 -41.6 -30.6 -41.6 -33.8 -36.4L-41 -26.8C-41 -26.8 -23.8 -36.8 -19.8 -38C-15.8 -39.2 -17.8 -41.6 -17.8 -41.6z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-57.8 -35.2C-57.8 -35.2 -59.8 -34 -60.2 -31.2C-60.6 -28.4 -63 -28 -62.2 -25.2C-61.4 -22.4 -59.4 -20 -59.4 -24C-59.4 -28 -57.8 -30 -57 -31.2C-56.2 -32.4 -54.6 -36.8 -57.8 -35.2z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-66.6 26C-66.6 26 -75 22 -78.2 18.4C-81.4 14.8 -80.948 19.966 -85.8 19.6C-91.647 19.159 -90.6 3.2 -90.6 3.2L-94.6 10.8C-94.6 10.8 -95.8 25.2 -87.8 22.8C-83.893 21.628 -82.6 23.2 -84.2 24C-85.8 24.8 -78.6 25.2 -81.4 26.8C-84.2 28.4 -69.8 23.2 -72.2 33.6L-66.6 26z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-79.2 40.4C-79.2 40.4 -94.6 44.8 -98.2 35.2C-98.2 35.2 -103 37.6 -100.8 40.6C-98.6 43.6 -97.4 44 -97.4 44C-97.4 44 -92 45.2 -92.6 46C-93.2 46.8 -95.6 50.2 -95.6 50.2C-95.6 50.2 -85.4 44.2 -79.2 40.4z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M149.201 118.601C148.774 120.735 147.103 121.536 145.201 122.201C143.284 121.243 140.686 118.137 138.801 120.201C138.327 119.721 137.548 119.661 137.204 118.999C136.739 118.101 137.011 117.055 136.669 116.257C136.124 114.985 135.415 113.619 135.601 112.201C137.407 111.489 138.002 109.583 137.528 107.82C137.459 107.563 137.03 107.366 137.23 107.017C137.416 106.694 137.734 106.467 138.001 106.2C137.866 106.335 137.721 106.568 137.61 106.548C137 106.442 137.124 105.805 137.254 105.418C137.839 103.672 139.853 103.408 141.201 104.6C141.457 104.035 141.966 104.229 142.401 104.2C142.351 103.621 142.759 103.094 142.957 102.674C143.475 101.576 145.104 102.682 145.901 102.07C146.977 101.245 148.04 100.546 149.118 101.149C150.927 102.162 152.636 103.374 153.835 105.115C154.41 105.949 154.65 107.23 154.592 108.188C154.554 108.835 153.173 108.483 152.83 109.412C152.185 111.16 154.016 111.679 154.772 113.017C154.97 113.366 154.706 113.67 154.391 113.768C153.98 113.896 153.196 113.707 153.334 114.16C154.306 117.353 151.55 118.031 149.201 118.601z").setFill(f).setStroke(s);
+	f = "#ffffff";
+	g.createPath("M139.6 138.201C139.593 136.463 137.992 134.707 139.201 133.001C139.336 133.135 139.467 133.356 139.601 133.356C139.736 133.356 139.867 133.135 140.001 133.001C141.496 135.217 145.148 136.145 145.006 138.991C144.984 139.438 143.897 140.356 144.801 141.001C142.988 142.349 142.933 144.719 142.001 146.601C140.763 146.315 139.551 145.952 138.401 145.401C138.753 143.915 138.636 142.231 139.456 140.911C139.89 140.213 139.603 139.134 139.6 138.201z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-26.6 129.201C-26.6 129.201 -43.458 139.337 -29.4 124.001C-20.6 114.401 -10.6 108.801 -10.6 108.801C-10.6 108.801 -0.2 104.4 3.4 103.2C7 102 22.2 96.8 25.4 96.4C28.6 96 38.2 92 45 96C51.8 100 59.8 104.4 59.8 104.4C59.8 104.4 43.4 96 39.8 98.4C36.2 100.8 29 100.4 23 103.6C23 103.6 8.2 108.001 5 110.001C1.8 112.001 -8.6 123.601 -10.2 122.801C-11.8 122.001 -9.8 121.601 -8.6 118.801C-7.4 116.001 -9.4 114.401 -17.4 120.801C-25.4 127.201 -26.6 129.201 -26.6 129.201z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-19.195 123.234C-19.195 123.234 -17.785 110.194 -9.307 111.859C-9.307 111.859 -1.081 107.689 1.641 105.721C1.641 105.721 9.78 104.019 11.09 103.402C29.569 94.702 44.288 99.221 44.835 98.101C45.381 96.982 65.006 104.099 68.615 108.185C69.006 108.628 58.384 102.588 48.686 100.697C40.413 99.083 18.811 100.944 7.905 106.48C4.932 107.989 -4.013 113.773 -6.544 113.662C-9.075 113.55 -19.195 123.234 -19.195 123.234z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-23 148.801C-23 148.801 -38.2 146.401 -21.4 144.801C-21.4 144.801 -3.4 142.801 0.6 137.601C0.6 137.601 14.2 128.401 17 128.001C19.8 127.601 49.8 120.401 50.2 118.001C50.6 115.601 56.2 115.601 57.8 116.401C59.4 117.201 58.6 118.401 55.8 119.201C53 120.001 21.8 136.401 15.4 137.601C9 138.801 -2.6 146.401 -7.4 147.601C-12.2 148.801 -23 148.801 -23 148.801z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-3.48 141.403C-3.48 141.403 -12.062 140.574 -3.461 139.755C-3.461 139.755 5.355 136.331 7.403 133.668C7.403 133.668 14.367 128.957 15.8 128.753C17.234 128.548 31.194 124.861 31.399 123.633C31.604 122.404 65.67 109.823 70.09 113.013C73.001 115.114 63.1 113.437 53.466 117.847C52.111 118.467 18.258 133.054 14.981 133.668C11.704 134.283 5.765 138.174 3.307 138.788C0.85 139.403 -3.48 141.403 -3.48 141.403z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-11.4 143.601C-11.4 143.601 -6.2 143.201 -7.4 144.801C-8.6 146.401 -11 145.601 -11 145.601L-11.4 143.601z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-18.6 145.201C-18.6 145.201 -13.4 144.801 -14.6 146.401C-15.8 148.001 -18.2 147.201 -18.2 147.201L-18.6 145.201z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-29 146.801C-29 146.801 -23.8 146.401 -25 148.001C-26.2 149.601 -28.6 148.801 -28.6 148.801L-29 146.801z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-36.6 147.601C-36.6 147.601 -31.4 147.201 -32.6 148.801C-33.8 150.401 -36.2 149.601 -36.2 149.601L-36.6 147.601z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M1.8 108.001C1.8 108.001 6.2 108.001 5 109.601C3.8 111.201 0.6 110.801 0.6 110.801L1.8 108.001z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-8.2 113.601C-8.2 113.601 -1.694 111.46 -4.2 114.801C-5.4 116.401 -7.8 115.601 -7.8 115.601L-8.2 113.601z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-19.4 118.401C-19.4 118.401 -14.2 118.001 -15.4 119.601C-16.6 121.201 -19 120.401 -19 120.401L-19.4 118.401z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-27 124.401C-27 124.401 -21.8 124.001 -23 125.601C-24.2 127.201 -26.6 126.401 -26.6 126.401L-27 124.401z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-33.8 129.201C-33.8 129.201 -28.6 128.801 -29.8 130.401C-31 132.001 -33.4 131.201 -33.4 131.201L-33.8 129.201z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M5.282 135.598C5.282 135.598 12.203 135.066 10.606 137.195C9.009 139.325 5.814 138.26 5.814 138.26L5.282 135.598z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M15.682 130.798C15.682 130.798 22.603 130.266 21.006 132.395C19.409 134.525 16.214 133.46 16.214 133.46L15.682 130.798z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M26.482 126.398C26.482 126.398 33.403 125.866 31.806 127.995C30.209 130.125 27.014 129.06 27.014 129.06L26.482 126.398z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M36.882 121.598C36.882 121.598 43.803 121.066 42.206 123.195C40.609 125.325 37.414 124.26 37.414 124.26L36.882 121.598z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M9.282 103.598C9.282 103.598 16.203 103.066 14.606 105.195C13.009 107.325 9.014 107.06 9.014 107.06L9.282 103.598z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M19.282 100.398C19.282 100.398 26.203 99.866 24.606 101.995C23.009 104.125 18.614 103.86 18.614 103.86L19.282 100.398z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-3.4 140.401C-3.4 140.401 1.8 140.001 0.6 141.601C-0.6 143.201 -3 142.401 -3 142.401L-3.4 140.401z").setFill(f).setStroke(s);
+	f = "#992600";
+	g.createPath("M-76.6 41.2C-76.6 41.2 -81 50 -81.4 53.2C-81.4 53.2 -80.6 44.4 -79.4 42.4C-78.2 40.4 -76.6 41.2 -76.6 41.2z").setFill(f).setStroke(s);
+	f = "#992600";
+	g.createPath("M-95 55.2C-95 55.2 -98.2 69.6 -97.8 72.4C-97.8 72.4 -99 60.8 -98.6 59.6C-98.2 58.4 -95 55.2 -95 55.2z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-74.2 -19.4L-74.4 -16.2L-76.6 -16C-76.6 -16 -62.4 -3.4 -61.8 4.2C-61.8 4.2 -61 -4 -74.2 -19.4z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-70.216 -18.135C-70.647 -18.551 -70.428 -19.296 -70.836 -19.556C-71.645 -20.072 -69.538 -20.129 -69.766 -20.845C-70.149 -22.051 -69.962 -22.072 -70.084 -23.348C-70.141 -23.946 -69.553 -25.486 -69.168 -25.926C-67.722 -27.578 -69.046 -30.51 -67.406 -32.061C-67.102 -32.35 -66.726 -32.902 -66.441 -33.32C-65.782 -34.283 -64.598 -34.771 -63.648 -35.599C-63.33 -35.875 -63.531 -36.702 -62.962 -36.61C-62.248 -36.495 -61.007 -36.625 -61.052 -35.784C-61.165 -33.664 -62.494 -31.944 -63.774 -30.276C-63.323 -29.572 -63.781 -28.937 -64.065 -28.38C-65.4 -25.76 -65.211 -22.919 -65.385 -20.079C-65.39 -19.994 -65.697 -19.916 -65.689 -19.863C-65.336 -17.528 -64.752 -15.329 -63.873 -13.1C-63.507 -12.17 -63.036 -11.275 -62.886 -10.348C-62.775 -9.662 -62.672 -8.829 -63.08 -8.124C-61.045 -5.234 -62.354 -2.583 -61.185 0.948C-60.978 1.573 -59.286 3.487 -59.749 3.326C-62.262 2.455 -62.374 2.057 -62.551 1.304C-62.697 0.681 -63.027 -0.696 -63.264 -1.298C-63.328 -1.462 -63.499 -3.346 -63.577 -3.468C-65.09 -5.85 -63.732 -5.674 -65.102 -8.032C-66.53 -8.712 -67.496 -9.816 -68.619 -10.978C-68.817 -11.182 -67.674 -11.906 -67.855 -12.119C-68.947 -13.408 -70.1 -14.175 -69.764 -15.668C-69.609 -16.358 -69.472 -17.415 -70.216 -18.135z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-73.8 -16.4C-73.8 -16.4 -73.4 -9.6 -71 -8C-68.6 -6.4 -69.8 -7.2 -73 -8.4C-76.2 -9.6 -75 -10.4 -75 -10.4C-75 -10.4 -77.8 -10 -75.4 -8C-73 -6 -69.4 -3.6 -71 -3.6C-72.6 -3.6 -80.2 -7.6 -80.2 -10.4C-80.2 -13.2 -81.2 -17.3 -81.2 -17.3C-81.2 -17.3 -80.1 -18.1 -75.3 -18C-75.3 -18 -73.9 -17.3 -73.8 -16.4z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-74.6 2.2C-74.6 2.2 -83.12 -0.591 -101.6 2.8C-101.6 2.8 -92.569 0.722 -73.8 3C-63.5 4.25 -74.6 2.2 -74.6 2.2z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-72.502 2.129C-72.502 2.129 -80.748 -1.389 -99.453 0.392C-99.453 0.392 -90.275 -0.897 -71.774 2.995C-61.62 5.131 -72.502 2.129 -72.502 2.129z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-70.714 2.222C-70.714 2.222 -78.676 -1.899 -97.461 -1.514C-97.461 -1.514 -88.213 -2.118 -70.052 3.14C-60.086 6.025 -70.714 2.222 -70.714 2.222z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-69.444 2.445C-69.444 2.445 -76.268 -1.862 -93.142 -2.96C-93.142 -2.96 -84.803 -2.79 -68.922 3.319C-60.206 6.672 -69.444 2.445 -69.444 2.445z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M45.84 12.961C45.84 12.961 44.91 13.605 45.124 12.424C45.339 11.243 73.547 -1.927 77.161 -1.677C77.161 -1.677 46.913 11.529 45.84 12.961z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M42.446 13.6C42.446 13.6 41.57 14.315 41.691 13.121C41.812 11.927 68.899 -3.418 72.521 -3.452C72.521 -3.452 43.404 12.089 42.446 13.6z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M39.16 14.975C39.16 14.975 38.332 15.747 38.374 14.547C38.416 13.348 58.233 -2.149 68.045 -4.023C68.045 -4.023 50.015 4.104 39.16 14.975z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M36.284 16.838C36.284 16.838 35.539 17.532 35.577 16.453C35.615 15.373 53.449 1.426 62.28 -0.26C62.28 -0.26 46.054 7.054 36.284 16.838z").setFill(f).setStroke(s);
+	f = "#cccccc"; s = null;
+	g.createPath("M4.6 164.801C4.6 164.801 -10.6 162.401 6.2 160.801C6.2 160.801 24.2 158.801 28.2 153.601C28.2 153.601 41.8 144.401 44.6 144.001C47.4 143.601 63.8 140.001 64.2 137.601C64.6 135.201 70.6 132.801 72.2 133.601C73.8 134.401 73.8 143.601 71 144.401C68.2 145.201 49.4 152.401 43 153.601C36.6 154.801 25 162.401 20.2 163.601C15.4 164.801 4.6 164.801 4.6 164.801z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M77.6 127.401C77.6 127.401 74.6 129.001 73.4 131.601C73.4 131.601 67 142.201 52.8 145.401C52.8 145.401 29.8 154.401 22 156.401C22 156.401 8.6 161.401 1.2 160.601C1.2 160.601 -5.8 160.801 0.4 162.401C0.4 162.401 20.6 160.401 24 158.601C24 158.601 39.6 153.401 42.6 150.801C45.6 148.201 63.8 143.201 66 141.201C68.2 139.201 78 130.801 77.6 127.401z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M18.882 158.911C18.882 158.911 24.111 158.685 22.958 160.234C21.805 161.784 19.357 160.91 19.357 160.91L18.882 158.911z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M11.68 160.263C11.68 160.263 16.908 160.037 15.756 161.586C14.603 163.136 12.155 162.263 12.155 162.263L11.68 160.263z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M1.251 161.511C1.251 161.511 6.48 161.284 5.327 162.834C4.174 164.383 1.726 163.51 1.726 163.51L1.251 161.511z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-6.383 162.055C-6.383 162.055 -1.154 161.829 -2.307 163.378C-3.46 164.928 -5.908 164.054 -5.908 164.054L-6.383 162.055z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M35.415 151.513C35.415 151.513 42.375 151.212 40.84 153.274C39.306 155.336 36.047 154.174 36.047 154.174L35.415 151.513z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M45.73 147.088C45.73 147.088 51.689 143.787 51.155 148.849C50.885 151.405 46.362 149.749 46.362 149.749L45.73 147.088z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M54.862 144.274C54.862 144.274 62.021 140.573 60.287 146.035C59.509 148.485 55.493 146.935 55.493 146.935L54.862 144.274z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M64.376 139.449C64.376 139.449 68.735 134.548 69.801 141.21C70.207 143.748 65.008 142.11 65.008 142.11L64.376 139.449z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M26.834 155.997C26.834 155.997 32.062 155.77 30.91 157.32C29.757 158.869 27.308 157.996 27.308 157.996L26.834 155.997z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M62.434 34.603C62.434 34.603 61.708 35.268 61.707 34.197C61.707 33.127 79.191 19.863 88.034 18.479C88.034 18.479 71.935 25.208 62.434 34.603z").setFill(f).setStroke(s);
+	f = "#000000"; s = null;
+	g.createPath("M65.4 98.4C65.4 98.4 87.401 120.801 96.601 124.401C96.601 124.401 105.801 135.601 101.801 161.601C101.801 161.601 98.601 169.201 95.401 148.401C95.401 148.401 98.601 123.201 87.401 139.201C87.401 139.201 79 129.301 85.4 129.601C85.4 129.601 88.601 131.601 89.001 130.001C89.401 128.401 81.4 114.801 64.2 100.4C47 86 65.4 98.4 65.4 98.4z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M7 137.201C7 137.201 6.8 135.401 8.6 136.201C10.4 137.001 104.601 143.201 136.201 167.201C136.201 167.201 91.001 144.001 7 137.201z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M17.4 132.801C17.4 132.801 17.2 131.001 19 131.801C20.8 132.601 157.401 131.601 181.001 164.001C181.001 164.001 159.001 138.801 17.4 132.801z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M29 128.801C29 128.801 28.8 127.001 30.6 127.801C32.4 128.601 205.801 115.601 229.401 148.001C229.401 148.001 219.801 122.401 29 128.801z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M39 124.001C39 124.001 38.8 122.201 40.6 123.001C42.4 123.801 164.601 85.2 188.201 117.601C188.201 117.601 174.801 93 39 124.001z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-19 146.801C-19 146.801 -19.2 145.001 -17.4 145.801C-15.6 146.601 2.2 148.801 4.2 187.601C4.2 187.601 -3 145.601 -19 146.801z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-27.8 148.401C-27.8 148.401 -28 146.601 -26.2 147.401C-24.4 148.201 -10.2 143.601 -13 182.401C-13 182.401 -11.8 147.201 -27.8 148.401z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-35.8 148.801C-35.8 148.801 -36 147.001 -34.2 147.801C-32.4 148.601 -17 149.201 -29.4 171.601C-29.4 171.601 -19.8 147.601 -35.8 148.801z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M11.526 104.465C11.526 104.465 11.082 106.464 12.631 105.247C28.699 92.622 61.141 33.72 116.826 28.086C116.826 28.086 78.518 15.976 11.526 104.465z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M22.726 102.665C22.726 102.665 21.363 101.472 23.231 100.847C25.099 100.222 137.541 27.72 176.826 35.686C176.826 35.686 149.719 28.176 22.726 102.665z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M1.885 108.767C1.885 108.767 1.376 110.366 3.087 109.39C12.062 104.27 15.677 47.059 59.254 45.804C59.254 45.804 26.843 31.09 1.885 108.767z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-18.038 119.793C-18.038 119.793 -19.115 121.079 -17.162 120.825C-6.916 119.493 14.489 78.222 58.928 83.301C58.928 83.301 26.962 68.955 -18.038 119.793z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-6.8 113.667C-6.8 113.667 -7.611 115.136 -5.742 114.511C4.057 111.237 17.141 66.625 61.729 63.078C61.729 63.078 27.603 55.135 -6.8 113.667z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-25.078 124.912C-25.078 124.912 -25.951 125.954 -24.369 125.748C-16.07 124.669 1.268 91.24 37.264 95.354C37.264 95.354 11.371 83.734 -25.078 124.912z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-32.677 130.821C-32.677 130.821 -33.682 131.866 -32.091 131.748C-27.923 131.439 2.715 98.36 21.183 113.862C21.183 113.862 9.168 95.139 -32.677 130.821z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M36.855 98.898C36.855 98.898 35.654 97.543 37.586 97.158C39.518 96.774 160.221 39.061 198.184 51.927C198.184 51.927 172.243 41.053 36.855 98.898z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M3.4 163.201C3.4 163.201 3.2 161.401 5 162.201C6.8 163.001 22.2 163.601 9.8 186.001C9.8 186.001 19.4 162.001 3.4 163.201z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M13.8 161.601C13.8 161.601 13.6 159.801 15.4 160.601C17.2 161.401 35 163.601 37 202.401C37 202.401 29.8 160.401 13.8 161.601z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M20.6 160.001C20.6 160.001 20.4 158.201 22.2 159.001C24 159.801 48.6 163.201 72.2 195.601C72.2 195.601 36.6 158.801 20.6 160.001z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M28.225 157.972C28.225 157.972 27.788 156.214 29.678 156.768C31.568 157.322 52.002 155.423 90.099 189.599C90.099 189.599 43.924 154.656 28.225 157.972z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M38.625 153.572C38.625 153.572 38.188 151.814 40.078 152.368C41.968 152.922 76.802 157.423 128.499 192.399C128.499 192.399 54.324 150.256 38.625 153.572z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-1.8 142.001C-1.8 142.001 -2 140.201 -0.2 141.001C1.6 141.801 55 144.401 85.4 171.201C85.4 171.201 50.499 146.426 -1.8 142.001z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M-11.8 146.001C-11.8 146.001 -12 144.201 -10.2 145.001C-8.4 145.801 16.2 149.201 39.8 181.601C39.8 181.601 4.2 144.801 -11.8 146.001z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M49.503 148.962C49.503 148.962 48.938 147.241 50.864 147.655C52.79 148.068 87.86 150.004 141.981 181.098C141.981 181.098 64.317 146.704 49.503 148.962z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M57.903 146.562C57.903 146.562 57.338 144.841 59.264 145.255C61.19 145.668 96.26 147.604 150.381 178.698C150.381 178.698 73.317 143.904 57.903 146.562z").setFill(f).setStroke(s);
+	f = "#ffffff"; s = {color: "#000000", width: 0.1};
+	g.createPath("M67.503 141.562C67.503 141.562 66.938 139.841 68.864 140.255C70.79 140.668 113.86 145.004 203.582 179.298C203.582 179.298 82.917 138.904 67.503 141.562z").setFill(f).setStroke(s);
+	f = "#000000"; s = null;
+	g.createPath("M-43.8 148.401C-43.8 148.401 -38.6 148.001 -39.8 149.601C-41 151.201 -43.4 150.401 -43.4 150.401L-43.8 148.401z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-13 162.401C-13 162.401 -7.8 162.001 -9 163.601C-10.2 165.201 -12.6 164.401 -12.6 164.401L-13 162.401z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-21.8 162.001C-21.8 162.001 -16.6 161.601 -17.8 163.201C-19 164.801 -21.4 164.001 -21.4 164.001L-21.8 162.001z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-117.169 150.182C-117.169 150.182 -112.124 151.505 -113.782 152.624C-115.439 153.744 -117.446 152.202 -117.446 152.202L-117.169 150.182z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-115.169 140.582C-115.169 140.582 -110.124 141.905 -111.782 143.024C-113.439 144.144 -115.446 142.602 -115.446 142.602L-115.169 140.582z").setFill(f).setStroke(s);
+	f = "#000000";
+	g.createPath("M-122.369 136.182C-122.369 136.182 -117.324 137.505 -118.982 138.624C-120.639 139.744 -122.646 138.202 -122.646 138.202L-122.369 136.182z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-42.6 211.201C-42.6 211.201 -44.2 211.201 -48.2 213.201C-50.2 213.201 -61.4 216.801 -67 226.801C-67 226.801 -54.6 217.201 -42.6 211.201z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M45.116 303.847C45.257 304.105 45.312 304.525 45.604 304.542C46.262 304.582 47.495 304.883 47.37 304.247C46.522 299.941 45.648 295.004 41.515 293.197C40.876 292.918 39.434 293.331 39.36 294.215C39.233 295.739 39.116 297.088 39.425 298.554C39.725 299.975 41.883 299.985 42.8 298.601C43.736 300.273 44.168 302.116 45.116 303.847z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M34.038 308.581C34.786 309.994 34.659 311.853 36.074 312.416C36.814 312.71 38.664 311.735 38.246 310.661C37.444 308.6 37.056 306.361 35.667 304.55C35.467 304.288 35.707 303.755 35.547 303.427C34.953 302.207 33.808 301.472 32.4 301.801C31.285 304.004 32.433 306.133 33.955 307.842C34.091 307.994 33.925 308.37 34.038 308.581z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-5.564 303.391C-5.672 303.014 -5.71 302.551 -5.545 302.23C-5.014 301.197 -4.221 300.075 -4.558 299.053C-4.906 297.997 -6.022 298.179 -6.672 298.748C-7.807 299.742 -7.856 301.568 -8.547 302.927C-8.743 303.313 -8.692 303.886 -9.133 304.277C-9.607 304.698 -10.047 306.222 -9.951 306.793C-9.898 307.106 -10.081 317.014 -9.859 316.751C-9.24 316.018 -6.19 306.284 -6.121 305.392C-6.064 304.661 -5.332 304.196 -5.564 303.391z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-31.202 296.599C-28.568 294.1 -25.778 291.139 -26.22 287.427C-26.336 286.451 -28.111 286.978 -28.298 287.824C-29.1 291.449 -31.139 294.11 -33.707 296.502C-35.903 298.549 -37.765 304.893 -38 305.401C-34.303 300.145 -32.046 297.399 -31.202 296.599z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-44.776 290.635C-44.253 290.265 -44.555 289.774 -44.338 289.442C-43.385 287.984 -42.084 286.738 -42.066 285C-42.063 284.723 -42.441 284.414 -42.776 284.638C-43.053 284.822 -43.395 284.952 -43.503 285.082C-45.533 287.531 -46.933 290.202 -48.376 293.014C-48.559 293.371 -49.703 297.862 -49.39 297.973C-49.151 298.058 -47.431 293.877 -47.221 293.763C-45.958 293.077 -45.946 291.462 -44.776 290.635z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-28.043 310.179C-27.599 309.31 -26.023 308.108 -26.136 307.219C-26.254 306.291 -25.786 304.848 -26.698 305.536C-27.955 306.484 -31.404 307.833 -31.674 313.641C-31.7 314.212 -28.726 311.519 -28.043 310.179z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-13.6 293.001C-13.2 292.333 -12.492 292.806 -12.033 292.543C-11.385 292.171 -10.774 291.613 -10.482 290.964C-9.512 288.815 -7.743 286.995 -7.6 284.601C-9.091 283.196 -9.77 285.236 -10.4 286.201C-11.723 284.554 -12.722 286.428 -14.022 286.947C-14.092 286.975 -14.305 286.628 -14.38 286.655C-15.557 287.095 -16.237 288.176 -17.235 288.957C-17.406 289.091 -17.811 288.911 -17.958 289.047C-18.61 289.65 -19.583 289.975 -19.863 290.657C-20.973 293.364 -24.113 295.459 -26 303.001C-25.619 303.91 -21.488 296.359 -21.001 295.661C-20.165 294.465 -20.047 297.322 -18.771 296.656C-18.72 296.629 -18.534 296.867 -18.4 297.001C-18.206 296.721 -17.988 296.492 -17.6 296.601C-17.6 296.201 -17.734 295.645 -17.533 295.486C-16.296 294.509 -16.38 293.441 -15.6 292.201C-15.142 292.99 -14.081 292.271 -13.6 293.001z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M46.2 347.401C46.2 347.401 53.6 327.001 49.2 315.801C49.2 315.801 60.6 337.401 56 348.601C56 348.601 55.6 338.201 51.6 333.201C51.6 333.201 47.6 346.001 46.2 347.401z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M31.4 344.801C31.4 344.801 36.8 336.001 28.8 317.601C28.8 317.601 28 338.001 21.2 349.001C21.2 349.001 35.4 328.801 31.4 344.801z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M21.4 342.801C21.4 342.801 21.2 322.801 21.6 319.801C21.6 319.801 17.8 336.401 7.6 346.001C7.6 346.001 22 334.001 21.4 342.801z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M11.8 310.801C11.8 310.801 17.8 324.401 7.8 342.801C7.8 342.801 14.2 330.601 9.4 323.601C9.4 323.601 12 320.201 11.8 310.801z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-7.4 342.401C-7.4 342.401 -8.4 326.801 -6.6 324.601C-6.6 324.601 -6.4 318.201 -6.8 317.201C-6.8 317.201 -2.8 311.001 -2.6 318.401C-2.6 318.401 -1.2 326.201 1.6 330.801C1.6 330.801 5.2 336.201 5 342.601C5 342.601 -5 312.401 -7.4 342.401z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-11 314.801C-11 314.801 -17.6 325.601 -19.4 344.601C-19.4 344.601 -20.8 338.401 -17 324.001C-17 324.001 -12.8 308.601 -11 314.801z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-32.8 334.601C-32.8 334.601 -27.8 329.201 -26.4 324.201C-26.4 324.201 -22.8 308.401 -29.2 317.001C-29.2 317.001 -29 325.001 -37.2 332.401C-37.2 332.401 -32.4 330.001 -32.8 334.601z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-38.6 329.601C-38.6 329.601 -35.2 312.201 -34.4 311.401C-34.4 311.401 -32.6 308.001 -35.4 311.201C-35.4 311.201 -44.2 330.401 -48.2 337.001C-48.2 337.001 -40.2 327.801 -38.6 329.601z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-44.4 313.001C-44.4 313.001 -32.8 290.601 -54.6 316.401C-54.6 316.401 -43.6 306.601 -44.4 313.001z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M-59.8 298.401C-59.8 298.401 -55 279.601 -52.4 279.801C-52.4 279.801 -44.2 270.801 -50.8 281.401C-50.8 281.401 -56.8 291.001 -56.2 300.801C-56.2 300.801 -56.8 291.201 -59.8 298.401z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M270.5 287C270.5 287 258.5 277 256 273.5C256 273.5 269.5 292 269.5 299C269.5 299 272 291.5 270.5 287z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M276 265C276 265 255 250 251.5 242.5C251.5 242.5 278 272 278 276.5C278 276.5 278.5 267.5 276 265z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M293 111C293 111 281 103 279.5 105C279.5 105 290 111.5 292.5 120C292.5 120 291 111 293 111z").setFill(f).setStroke(s);
+	f = "#cccccc";
+	g.createPath("M301.5 191.5L284 179.5C284 179.5 303 196.5 303.5 200.5L301.5 191.5z").setFill(f).setStroke(s);
+	s = "#000000"; f = null;
+	g.createPath("M-89.25 169L-67.25 173.75").setFill(f).setStroke(s);
+	s = "#000000";
+	g.createPath("M-39 331C-39 331 -39.5 327.5 -48.5 338").setFill(f).setStroke(s);
+	s = "#000000";
+	g.createPath("M-33.5 336C-33.5 336 -31.5 329.5 -38 334").setFill(f).setStroke(s);
+	s = "#000000";
+	g.createPath("M20.5 344.5C20.5 344.5 22 333.5 10.5 346.5").setFill(f).setStroke(s);
+	//surface.createLine({x1: 0, y1: 350, x2: 700, y2: 350}).setStroke("green");
+	//surface.createLine({y1: 0, x1: 350, y2: 700, x2: 350}).setStroke("green");
+    dojo.connect(dijit.byId("rotatingSlider"), "onChange", rotatingEvent);
+    dojo.connect(dijit.byId("scalingSlider"), "onChange", scalingEvent);
+};
+
+dojo.addOnLoad(makeShapes);
+
+</script>
+<style type="text/css">
+	td.pad { padding: 0px 5px 0px 5px; }
+</style>
+</head>
+<body class="tundra">
+	<h1>dojox.gfx: Tiger</h1>
+	<p>This example was directly converted from SVG file.</p>
+	<table>
+		<tr><td align="center" class="pad">Rotation (<span id="rotationValue">0</span>)</td></tr>
+		<tr><td>
+			<div id="rotatingSlider" dojoType="dijit.form.HorizontalSlider" 
+					value="0" minimum="-180" maximum="180" discreteValues="72" showButtons="false" intermediateChanges="true"
+					style="width: 600px;">
+				<div dojoType="dijit.form.HorizontalRule" container="topDecoration" count="73" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count="9" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" labels="-180,-135,-90,-45,0,45,90,135,180" style="height:1.2em;font-size:75%;color:gray;"></div>
+			</div>
+		</td></tr>
+		<tr><td align="center" class="pad">Scaling (<span id="scaleValue">1.000</span>)</td></tr>
+		<tr><td>
+			<div id="scalingSlider" dojoType="dijit.form.HorizontalSlider" 
+				value="1" minimum="0" maximum="1"  showButtons="false"  intermediateChanges="true"
+				style="width: 600px;">
+				<div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count="5" style="height:5px;"></div>
+				<div dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" labels="10%,18%,32%,56%,100%" style="height:1.2em;font-size:75%;color:gray;"></div>
+			</div>
+		</td></tr>
+	</table>
+	<div id="gfx_holder" style="width: 700px; height: 700px;"></div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/tooltip.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/tooltip.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/demos/tooltip.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,238 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
+<head>
+	<title>A Sample ToolTip using dijit and dojox.gfx</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<style type="text/css">
+		@import "../../../dojo/resources/dojo.css";
+		@import "../../../dijit/tests/css/dijitTests.css";
+		@import "../../../dijit/themes/tundra/tundra.css";
+		.tooltipBody {
+			color:#fff;
+		}
+	</style>
+	<!--
+	The next line should include Microsoft's Silverligth.js, if you plan to use the silverlight backend
+	<script type="text/javascript" src="Silverlight.js"></script>
+	-->
+	<script type="text/javascript" djConfig="parseOnLoad:true, isDebug:true" src="../../../dojo/dojo.js"></script>
+	<script type="text/javascript">
+		dojo.require("dijit.form.Button");
+	
+		dojo.require("dojox.gfx");
+		dojo.require("dojox.gfx.move");
+		dojo.require("dijit._Widget"); dojo.require("dijit._Templated");
+		
+		dojo.declare("demo.Tooltip",[dijit._Widget,dijit._Templated],{
+			
+			// attachId: String|DomNode?
+			// 		the Id or domNode to attach this tooltip to
+			attachId:"",
+
+			// attachHover: Boolean
+			// 		disable hover behavior for the target
+			attachHover:true,
+
+			// attachParent: Boolean
+			//		automatically attach to our parentnode rather than byId or query
+			attachParent:false,
+
+			// attachQuery: String?
+			//		an optional selector query to attach this tooltip to
+			attachQuery:"",
+
+			// attachScope: String|DomNode?
+			//		and optional scope to run the query against, passed as the
+			//		second arg to dojo.query()
+			queryScope:"",
+
+			// hideDelay: Int
+			// 		time in my to delay automatically closing the node
+			hideDelay: 123, // ms
+
+			// persists: Boolean
+			//		if true, the node will stay visible until explicitly closed
+			//		via _hide() or click on closeIcon
+			persists:false,
+			
+			templateString:
+				'<div class="foo">'
+					+'<div style="position:relative;">'
+						+'<div dojoAttachPoint="surfaceNode"></div>'
+						+'<div class="tooltipBody" dojoAttachPoint="containerNode"></div>'
+					+'</div>'
+				+'</div>',
+			
+			postCreate:function(){
+				// call _Widget postCreate first
+				this.inherited(arguments);
+				// gfx version of "_Templated" idea:
+				this._initSurface();
+				
+				if(this.attachParent){
+					// over-ride and reuse attachId as domNode from now on
+					this.attachId = this.domNode.parentNode;
+				}
+				if(this.attachId){
+					// domNode again. setup connections
+					this.attachId = dojo.byId(this.attachId);
+					if(this.attachHover){
+						this.connect(this.attachId,"onmouseenter","_show");
+					}
+					if(!this.persists){
+						this.connect(this.attachId,"onmouseleave","_initHide");
+					}
+				}else if(this.attachQuery){
+					// setup connections via dojo.query for multi-tooltips
+					var nl = dojo.query(this.attachQuery,this.queryScope);
+					if(this.attachHover){ nl.connect("onmouseenter",this,"_show") }
+					if(!this.persists){ nl.connect("onmouseleave",this,"_initHide") }
+				}
+				// place the tooltip			
+				dojo.body().appendChild(this.domNode);
+				dojo.style(this.domNode,{
+					position:"absolute"
+				});
+				// could do this in css:
+				dojo.style(this.containerNode,{
+					position:"absolute",
+					top:"15px",
+					left:"12px",
+					height:"83px",
+					width:"190px"
+				});
+				// setup our animations
+				this._hideAnim = dojo.fadeOut({ node:this.domNode, duration:150 });
+				this._showAnim = dojo.fadeIn({ node:this.domNode, duration:75 });
+				this.connect(this._hideAnim,"onEnd","_postHide");
+				if(!this.persists){
+					this.connect(this.domNode,"onmouseleave","_initHide");
+				}
+				// hide quickly
+				this._postHide();
+			},
+			
+			_initHide: function(e){
+				// summary: start the timer for the hideDelay
+				if(!this.persists && this.hideDelay){
+					this._delay = setTimeout(dojo.hitch(this,"_hide",e||null),this.hideDelay);
+				}
+			},
+			
+			_clearDelay: function(){
+				// summary: clear our hide delay timeout
+				if(this._delay){ clearTimeout(this._delay); }
+			},
+			
+			_show: function(e){
+				// summary: show the widget
+				this._clearDelay();
+				var pos = dojo.coords(e.target || this.attachId,true)
+				// we need to more accurately position the domNode:
+				dojo.style(this.domNode,{
+					top: pos.y - (pos.h / 2) - 50,
+					left: pos.x + pos.w - 25,
+					display:"block"
+				});
+				dojo.fadeIn({ node: this.domNode, duration:75 }).play();
+			},
+			
+			_hide: function(e){
+				// summary: hide the tooltip
+				this._hideAnim.play();
+			},
+			
+			_postHide: function(){
+				// summary: after hide animation cleanup
+				dojo.style(this.domNode,"display","none");
+			},
+			
+			_initSurface:function(){
+				// made generally from an SVG file:
+				this.surface = dojox.gfx.createSurface(this.surfaceNode,220,120);
+				this.tooltip = this.surface.createGroup();
+				this.tooltip.createPath("M213,101.072c0,6.675-5.411,12.086-12.086,12.086H13.586 c-6.675,0-12.086-5.411-12.086-12.086V21.004c0-6.675,5.411-12.086,12.086-12.086h187.328c6.675,0,12.086,5.411,12.086,12.086 V101.072z")
+					.setFill("rgba(0,0,0,0.25)");
+				
+				this.tooltip.createPath("M211.5,97.418c0,6.627-5.373,12-12,12 h-186c-6.627,0-12-5.373-12-12v-79.5c0-6.627,5.373-12,12-12h186c6.627,0,12,5.373,12,12V97.418z")
+					.setStroke({ width:2, color:"#FFF" })
+					.setFill("rgba(0,0,0,0.5)")
+					.connect("onmouseover",dojo.hitch(this,"_clearDelay"));
+				
+				if(this.persists){
+					// make the close icon
+					this._toolButton = this.surface.createGroup();
+					this._toolButton.createEllipse({ cx:207.25, cy:12.32, rx: 7.866, ry: 7.099 })
+						.setFill("#ededed");
+					this._toolButton.createCircle({ cx:207.25, cy: 9.25, r:8.25 })
+						.setStroke({ width:2, color:"#FFF" })
+						.setFill("#000")
+					;
+					this._toolButton.connect("onclick",dojo.hitch(this,"_hide"));	
+					// the X	
+					this._toolButton.createLine({ x1:203.618, y1:5.04, x2: 210.89, y2:12.979 })
+						.setStroke({ width:2, color:"#d6d6d6" });
+					this._toolButton.createLine({ x1:203.539, y1:12.979, x2: 210.89, y2:5.04 })
+						.setStroke({ width:2, color:"#d6d6d6" });
+				}
+			}	
+		});
+	</script>
+	
+</head>
+<body class="tundra">
+
+	<h1>dojox.gfx: A Sample tooltip</h1>
+
+	<ul style="width:150px; border:2px solid #ededed; cursor:pointer">
+		
+	
+		<!-- you can put any content you want in there -->
+		<li id="warn2">
+			Tooltip + Button
+			<div attachId="warn2" id="warn2tt" dojoType="demo.Tooltip"><p style="margin-top:0">Canvas renderer doesn't implement event handling.
+				<button dojoType="dijit.form.Button">
+					Button
+					<script type="dojo/method" event="onClick">
+						alert(" woo hoo! ");
+						dijit.byId("warn2tt")._hide();
+					</script>
+				</button>
+			</p></div>
+		</li>
+
+		<!-- a simple tooltip -->
+		<li id="warn1">
+			Hover trigger / persists
+			<div persists="true" attachId="warn1" dojoType="demo.Tooltip">Canvas renderer doesn't implement event handling.</div>
+		</li>
+
+		<!-- these get the same tooltip from the attachQuery=".multitip" below -->
+		<li class="multitip">MultiTip trigger 1</li>
+		<li>I do nothing</li>
+		<li class="multitip">Trigger two</li>
+
+		<li><a href="#" onclick="dijit.byId('nohover')._show(arguments[0])">show this way
+			<label dojoType="demo.Tooltip" attachParent="true" attachHover="false" id="nohover">some text</label>
+			</a>	
+		</li>
+
+		<!-- attachParent makes the tooltip look for domNode.parentNode before moving to body() -->
+		<li>
+			Parent Attached Tooltip
+			<div attachParent="true" persists="true" dojoType="demo.Tooltip">
+				<form id="fooForm">
+					<p style="margin-top:0;">
+					Name:<br> <input type="text" name="username" style="border:1px solid #ededed" /><br>
+					Pass:<br> <input type="password" name="password" style="border:1px solid #ededed" />
+					</p>
+				</form>
+			</div>
+		</li>
+
+	</ul>
+
+	<!-- attach a single tooltip message to a number of nodes at once -->
+	<div attachQuery=".multitip" dojoType="demo.Tooltip">Canvas renderer doesn't implement event handling. (shared tooltip)</div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/fx.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/fx.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/fx.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/matrix.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/matrix.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/matrix.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/move.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/move.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/move.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/path.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/path.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/path.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/shape.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/shape.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/shape.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/silverlight.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/silverlight.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/silverlight.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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("<LinearGradientBrush/>");
+					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("<GradientStop/>");
+						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("<RadialGradientBrush/>"), 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("<GradientStop/>");
+						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("<SolidColorBrush/>");
+		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("<SolidColorBrush/>");
+			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("<MatrixTransform/>"),
+				mm = p.createFromXaml("<Matrix/>");
+			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("<MatrixTransform/>"),
+				mm = p.createFromXaml("<Matrix/>");
+			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 = "<Canvas xmlns='http://schemas.microsoft.com/client/2007' Name='" + dojox.gfx._base._getUniqueId() + "'/>";
+	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);
+	}
+
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/silverlight_attach.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/silverlight_attach.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/silverlight_attach.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	};
+})();

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/svg.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/svg.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/svg.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/svg_attach.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/svg_attach.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/svg_attach.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	};
+})();

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/utils.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/utils.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/utils.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/vml.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/vml.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/vml.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx/vml_attach.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx/vml_attach.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx/vml_attach.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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(" ");
+		}
+	};
+})();

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,36 @@
+-------------------------------------------------------------------------------
+dojox.gfx3d
+-------------------------------------------------------------------------------
+Version 0.100
+Release date: 10/31/2007
+-------------------------------------------------------------------------------
+Project state:
+beta
+-------------------------------------------------------------------------------
+Credits
+	Kun Xi (bookstack@xxxxxxxxx)
+	Eugene Lazutkin (eugene.lazutkin@xxxxxxxxx)
+-------------------------------------------------------------------------------
+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.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/gradient.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/gradient.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/gradient.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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};
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/lighting.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/lighting.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/lighting.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/matrix.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/matrix.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/matrix.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/object.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/object.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/object.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<this.cache.length; x++){
+			this.shape.createPolyline(this.cache[x])
+				.setStroke(this.strokeStyle)
+				.setFill(this.toStdFill(lighting, dojox.gfx3d.vector.normalize(this.cache[x])));
+		}
+		/*
+		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;
+		// using naive iteration to speed things up a bit by avoiding function call overhead
+		for(var x=0; x<this.cache.length; x++){
+			var i = this.cache[x];
+			zOrder += (i[0].z + i[1].z + i[2].z + i[3].z) / 4;
+		}
+		/*
+		dojo.forEach(this.cache, function(item){
+				zOrder += (item[0].z + item[1].z + item[2].z + item[3].z) / 4; });
+		*/
+		return (this.cache.length > 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<this.cache.length; x++){
+			zOrder += this.cache[x].z;
+		}
+		return (this.cache.length > 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<cache.length; x++){
+			this.shape.createPolyline(cache[x])
+				.setStroke(this.strokeStyle)
+				.setFill(this.toStdFill(lighting, dojox.gfx3d.vector.normalize(cache[x])));
+		}
+		/*
+		dojo.forEach(cache, function(item){
+			this.shape.createPolyline(item)
+				.setStroke(this.strokeStyle)
+				.setFill(this.toStdFill(lighting, dojox.gfx3d.vector.normalize(item)));
+		}, this);
+		*/
+	},
+
+	getZOrder: function(){
+		var top = this.cache[0][0];
+		var bottom = this.cache[1][2];
+		return (top.z + bottom.z) / 2;
+	}
+});
+
+
+dojo.declare("dojox.gfx3d.Cylinder", dojox.gfx3d.Object, {
+	constructor: function(){
+		this.object = dojo.clone(dojox.gfx3d.defaultCylinder);
+	},
+
+	render: function(camera){
+		// get the bottom surface first 
+		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.vector.substract(dojox.gfx3d.matrix.multiplyPoint(m, 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));
+		if(rx < ry){
+			var t = rx;
+			rx = ry;
+			ry = t;
+			theta -= Math.PI/2;
+		}
+
+		var top = dojox.gfx3d.matrix.multiplyPoint(m, 
+			dojox.gfx3d.vector.sum(this.object.center, {x: 0, y:0, z: this.object.height})); 
+
+		var gradient = this.fillStyle.type == "constant" ? this.fillStyle.color
+			: dojox.gfx3d.gradient(this.renderer.lighting, this.fillStyle, this.object.center, this.object.radius, Math.PI, 2 * Math.PI, m);
+		if(isNaN(rx) || isNaN(ry) || isNaN(theta)){
+			// in case the cap is invisible (parallel to the incident vector)
+			rx = this.object.radius, ry = 0, theta = 0;
+		}
+		this.cache = {center: center, top: top, rx: rx, ry: ry, theta: theta, gradient: gradient};
+	},
+
+	draw: function(){
+		var c = this.cache, v = dojox.gfx3d.vector, m = dojox.gfx.matrix,
+			centers = [c.center, c.top], normal = v.substract(c.top, c.center);
+		if(v.dotProduct(normal, this.renderer.lighting.incident) > 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<this.todos.length; x++){
+			this.todos[x].render(dojox.gfx3d.matrix.normalize([
+				m.cameraRotateXg(180),
+				m.cameraTranslate(0, this.dimension.height, 0),
+				this.camera,
+			]), this.deep);
+		}
+
+		this.objects = this.schedule(this.objects);
+		this.draw(this.todos, this.objects, this);
+		this.todos = [];
+		this.deep = false;
+	}
+
+});
+
+//FIXME: Viewport cannot masquerade as a Group
+dojox.gfx3d.Viewport.nodeType = dojox.gfx.Group.nodeType;
+
+dojox.gfx3d._creators = {
+	// summary: object creators
+	createEdges: function(edges, style){
+		// summary: creates an edge object 
+		// line: Object: a edge object (see dojox.gfx3d.defaultPath)
+		return this.create3DObject(dojox.gfx3d.Edges, edges, style);	// dojox.gfx3d.Edge
+	},
+	createTriangles: function(tris, style){
+		// summary: creates an edge object 
+		// line: Object: a edge object (see dojox.gfx3d.defaultPath)
+		return this.create3DObject(dojox.gfx3d.Triangles, tris, style);	// dojox.gfx3d.Edge
+	},
+	createQuads: function(quads, style){
+		// summary: creates an edge object 
+		// line: Object: a edge object (see dojox.gfx3d.defaultPath)
+		return this.create3DObject(dojox.gfx3d.Quads, quads, style);	// dojox.gfx3d.Edge
+	},
+	createPolygon: function(points){
+		// summary: creates an triangle object 
+		// points: Array of points || Object 
+		return this.create3DObject(dojox.gfx3d.Polygon, points);	// dojox.gfx3d.Polygon
+	},
+
+	createOrbit: function(orbit){
+		// summary: creates an triangle object 
+		// points: Array of points || Object 
+		return this.create3DObject(dojox.gfx3d.Orbit, orbit);	// dojox.gfx3d.Cube
+	},
+
+	createCube: function(cube){
+		// summary: creates an triangle object 
+		// points: Array of points || Object 
+		return this.create3DObject(dojox.gfx3d.Cube, cube);	// dojox.gfx3d.Cube
+	},
+
+	createCylinder: function(cylinder){
+		// summary: creates an triangle object 
+		// points: Array of points || Object 
+		return this.create3DObject(dojox.gfx3d.Cylinder, cylinder);	// dojox.gfx3d.Cube
+	},
+
+	createPath3d: function(path){
+		// summary: creates an edge object 
+		// line: Object: a edge object (see dojox.gfx3d.defaultPath)
+		return this.create3DObject(dojox.gfx3d.Path3d, path);	// dojox.gfx3d.Edge
+	},
+	createScene: function(){
+		// summary: creates an triangle object 
+		// line: Object: a triangle object (see dojox.gfx3d.defaultPath)
+		return this.create3DObject(dojox.gfx3d.Scene);	// dojox.gfx3d.Scene
+	},
+
+	create3DObject: function(objectType, rawObject, style){
+		// 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
+		var obj = new objectType();
+		this.adopt(obj);
+		if(rawObject){ obj.setObject(rawObject, style); }
+		return obj;	// dojox.gfx3d.Object
+	},
+	// todo : override the add/remove if necessary
+	adopt: function(obj){
+		// summary: adds a shape to the list
+		// shape: dojox.gfx.Shape: a shape
+		obj.renderer = this.renderer; // obj._setParent(this, null); more TODOs HERER?
+		obj.parent = this;
+		this.objects.push(obj);
+		this.addTodo(obj);
+		return this;
+	},
+	abandon: function(obj, silently){
+		// summary: removes a shape from the list
+		// silently: Boolean?: if true, do not redraw a picture yet
+		for(var i = 0; i < this.objects.length; ++i){
+			if(this.objects[i] == obj){
+				this.objects.splice(i, 1);
+			}
+		}
+		// if(this.rawNode == shape.rawNode.parentNode){
+		//	this.rawNode.removeChild(shape.rawNode);
+		// }
+		// obj._setParent(null, null);
+		obj.parent = null;
+		return this;	// self
+	},
+
+
+	setScheduler: function(scheduler){
+		this.schedule = scheduler;
+	},
+
+	setDrawer: function(drawer){
+		this.draw = drawer;
+	}
+};
+
+dojo.extend(dojox.gfx3d.Viewport, dojox.gfx3d._creators);
+dojo.extend(dojox.gfx3d.Scene, dojox.gfx3d._creators);
+delete dojox.gfx3d._creators;
+
+
+//FIXME: extending dojox.gfx.Surface and masquerading Viewport as Group is hacky!
+
+// Add createViewport to dojox.gfx.Surface
+dojo.extend(dojox.gfx.Surface, {
+	createViewport: function(){
+		//FIXME: createObject is non-public method!
+		var viewport = this.createObject(dojox.gfx3d.Viewport, null, true);
+		//FIXME: this may not work with dojox.gfx.Group !!
+		viewport.setDimensions(this.getDimensions());
+		return viewport;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/scheduler.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/scheduler.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/scheduler.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,126 @@
+if(!dojo._hasResource["dojox.gfx3d.scheduler"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.gfx3d.scheduler"] = true;
+dojo.provide("dojox.gfx3d.scheduler");
+dojo.provide("dojox.gfx3d.drawer");
+dojo.require("dojox.gfx3d.vector");
+
+dojo.mixin(dojox.gfx3d.scheduler, {
+	zOrder: function(buffer, order){
+		order = order ? order : dojox.gfx3d.scheduler.order;
+		buffer.sort(function(a, b){
+			return order(b) - order(a);
+		});
+		return buffer;
+	},
+
+	bsp: function(buffer, outline){
+		console.debug("BSP scheduler");
+		outline = outline ? outline : dojox.gfx3d.scheduler.outline;
+		var p = new dojox.gfx3d.scheduler.BinarySearchTree(buffer[0], outline);
+		dojo.forEach(buffer.slice(1), function(item){ p.add(item, outline); });
+		return p.iterate(outline);
+	},
+
+	// default implementation
+	order: function(it){
+		return it.getZOrder();
+	},
+
+	outline: function(it){
+		return it.getOutline();
+	}
+
+});
+
+dojo.declare("dojox.gfx3d.scheduler.BinarySearchTree", null, {
+	constructor: function(obj, outline){
+		// summary: build the binary search tree, using binary space partition algorithm.
+		// The idea is for any polygon, for example, (a, b, c), the space is divided by 
+		// the plane into two space: plus and minus. 
+		// 
+		// for any arbitary vertex p, if(p - a) dotProduct n = 0, p is inside the plane,
+		// > 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.
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/vector.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/vector.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d/vector.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/gfx3d.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/gfx3d.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/gfx3d.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/Grid.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/Grid.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/Grid.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	//	|
+	//	|	<div id="grid" model="model" structure="structure" 
+	//	|		dojoType="dojox.VirtualGrid"></div>
+	//	
+
+	//	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<v.length && v[i].name || this.inherited(arguments);
+	},
+
+	indexCellFields: function(){
+		var cells = this.layout.cells;
+		for(var i=0, c; cells && (c=cells[i]); i++){
+			if(dojo.isString(c.field)){
+				c.fieldIndex = this.model.fields.indexOf(c.field);
+			}
+		}
+	},
+
+	// utility
+	refresh: function(){
+		// summary:
+		//		Re-render the grid, getting new data from the model
+		this.edit.cancel();
+		this.model.measure();
+	},
+
+	// sorting
+	canSort: function(inSortInfo){
+		var f = this.getSortField(inSortInfo);
+		// 0 is not a valid sort field
+		return f && this.model.canSort(f);
+	},
+
+	getSortField: function(inSortInfo){
+		// summary:
+		//		Retrieves the model field on which to sort data.
+		// inSortInfo: Integer
+		//		1-based grid column index; positive if sort is ascending, otherwise negative
+		var c = this.getCell(this.getSortIndex(inSortInfo));
+		// we expect c.fieldIndex == -1 for non model fields
+		// that yields a getSortField value of 0, which can be detected as invalid
+		return (c.fieldIndex+1) * (this.sortInfo > 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 <th> 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;
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,39 @@
+-------------------------------------------------------------------------------
+dojox.grid
+-------------------------------------------------------------------------------
+Version 1.00
+Release date: 10/04/2007
+-------------------------------------------------------------------------------
+Project state:
+beta
+-------------------------------------------------------------------------------
+Credits
+	Scott J. Miles (sjmiles@xxxxxxxxxxxxxx)
+	Steve Orvell (sorvell@xxxxxxxxxxxxxx)
+-------------------------------------------------------------------------------
+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.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/VirtualGrid.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/VirtualGrid.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/VirtualGrid.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 }]
+	//	|		]}
+	//	|	];
+	//		
+	//	|	<div id="grid" 
+	//	|		rowCount="100" get="get" 
+	//	|		structure="structure" 
+	//	|		dojoType="dojox.VirtualGrid"></div>
+
+	templateString:"<div class=\"dojoxGrid\" hidefocus=\"hidefocus\" role=\"wairole:grid\">\n\t<div class=\"dojoxGrid-master-header\" dojoAttachPoint=\"viewsHeaderNode\"></div>\n\t<div class=\"dojoxGrid-master-view\" dojoAttachPoint=\"viewsNode\"></div>\n\t<span dojoAttachPoint=\"lastFocusNode\" tabindex=\"0\"></span>\n</div>\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<names.length;i++){
+				if(typeof obj[names[i]]=='undefined'){
+					var undefstring = names[0];
+					for(var j=1;j<=i;j++){
+						undefstring+="."+names[j];
+					}
+					throw new Error(undefstring+" is undefined");
+				}
+				obj = obj[names[i]];
+			}
+			var c = obj;
+		}else{
+			var c = eval(inClass);
+		}
+		var view = new c({ grid: this });
+		this.viewsNode.appendChild(view.domNode);
+		this.viewsHeaderNode.appendChild(view.headerNode);
+		this.views.addView(view);
+		return view;
+	},
+
+	buildViews: function(){
+		for(var i=0, vs; (vs=this.layout.structure[i]); i++){
+			this.createView(vs.type || dojox._scopeName + ".GridView").setStructure(vs);
+		}
+		this.scroller.setContentNodes(this.views.getContentNodes());
+	},
+	
+	setStructure: function(inStructure){
+		// summary:
+		//		Install a new structure and rebuild the grid.
+		// inStructure: Object
+		//		Structure object defines the grid layout and provides various
+		//		options for grid views and columns
+		//	description:
+		//		A grid structure is an array of view objects. A view object can
+		//		specify a view type (view class), width, noscroll (boolean flag
+		//		for view scrolling), and cells. Cells is an array of objects
+		//		corresponding to each grid column. The view cells object is an
+		//		array of subrows comprising a single row. Each subrow is an
+		//		array of column objects. A column object can have a name,
+		//		width, value (default), get function to provide data, styles,
+		//		and span attributes (rowSpan, colSpan).
+
+		this.views.destroyViews();
+		this.structure = inStructure;
+		if((this.structure)&&(dojo.isString(this.structure))){
+			this.structure=dojox.grid.getProp(this.structure);
+		}
+		if(!this.structure){
+			this.structure=window["layout"];
+		}
+		if(!this.structure){
+			return;
+		}
+		this.layout.setStructure(this.structure);
+		this._structureChanged();
+	},
+
+	_structureChanged: function() {
+		this.buildViews();
+		if(this.autoRender){
+			this.render();
+		}
+	},
+
+	hasLayout: function() {
+		return this.layout.cells.length;
+	},
+
+	// sizing
+	resize: function(sizeBox){
+	// summary:
+		//		Update the grid's rendering dimensions and resize it
+		// sizeBox: Object?
+		//		{w: int, h: int, l: int, t: int}
+		
+		// FIXME: If grid is not sized explicitly, sometimes bogus scrollbars 
+		// can appear in our container, which may require an extra call to 'resize'
+		// to sort out.
+		this._sizeBox = sizeBox;
+		this._resize();
+		this.sizeChange();
+	},
+	
+	_getPadBorder: function() {
+		this._padBorder = this._padBorder || dojo._getPadBorderExtents(this.domNode);
+		return this._padBorder;
+	},
+	
+	_resize: function(){
+		// if we have set up everything except the DOM, we cannot resize
+		if(!this.domNode.parentNode || this.domNode.parentNode.nodeType != 1 || !this.hasLayout()){
+			return;
+		}
+		// useful measurement
+		var padBorder = this._getPadBorder();
+		// grid height
+		if(this.autoHeight){
+			this.domNode.style.height = 'auto';
+			this.viewsNode.style.height = '';
+		}else if(this.flex > 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);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/dijitEditors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/dijitEditors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/dijitEditors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 "<div></div>";
+	},
+	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();
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/editors.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/editors.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/editors.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 '<input class="dojoxGrid-input" type="text" value="' + inDatum + '">';
+	},
+	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 = [ '<select class="dojoxGrid-select">' ];
+		for (var i=0, o, v; ((o=this.options[i]) !== undefined)&&((v=this.values[i]) !== undefined); i++){
+			h.push("<option", (inDatum==v ? ' selected' : ''), ' value="' + v + '"', ">", o, "</option>");
+		}
+		h.push('</select>');
+		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 '<input class="dojoxGrid-input" type="checkbox"' + (inDatum ? ' checked="checked"' : '') + ' style="width: auto" />';
+	},
+	doclick: function(e){
+		if(e.target.tagName == 'INPUT'){
+			this.applyStaticValue(e.rowIndex);
+		}
+	}
+});
+dojox.grid.editors.bool = dojox.grid.editors.Bool; // back-compat
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/fields.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/fields.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/fields.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<arguments.length; i++){
+			dojo.mixin(v, arguments[i]);
+		}
+		this.values[inIndex] = v;
+	},
+	set: function(/* inIndex, inField [, inField2, ... inFieldN] | inArray */){
+		if(arguments.length < 1){
+			return;
+		}
+		var a = arguments[0];
+		if(!dojo.isArray(a)){
+			this._set.apply(this, arguments);
+		}else{
+			if(a.length && a[0]["default"]){
+				this.setDefault(a.shift());
+			}
+			for(var i=0, l=a.length; i<l; i++){
+				this._set(i, a[i]);
+			}
+		}
+	},
+	insert: function(inIndex, inProps){
+		if (inIndex >= 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<this.values.length; i++){
+			var v = this.values[i];
+			if(v && v.key == inKey){return i;}
+		}
+		return -1;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/model.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/model.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_data/model.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,762 @@
+if(!dojo._hasResource['dojox.grid._data.model']){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource['dojox.grid._data.model'] = true;
+dojo.provide('dojox.grid._data.model');
+dojo.require('dojox.grid._data.fields');
+
+dojo.declare("dojox.grid.data.Model", null, {
+	// summary:
+	//	Base abstract grid data model.
+	//	Makes no assumptions about the structure of grid data.
+	constructor: function(inFields, inData){
+		this.observers = [];
+		this.fields = new dojox.grid.data.Fields();
+		if(inFields){
+			this.fields.set(inFields);
+		}
+		this.setData(inData);
+	},
+	count: 0,
+	updating: 0,
+	// observers 
+	observer: function(inObserver, inPrefix){
+		this.observers.push({o: inObserver, p: inPrefix||'model' });
+	},
+	notObserver: function(inObserver){
+		for(var i=0, m, o; (o=this.observers[i]); i++){
+			if(o.o==inObserver){
+				this.observers.splice(i, 1);
+				return;
+			}
+		}
+	},
+	notify: function(inMsg, inArgs){
+		if(!this.isUpdating()){
+			var a = inArgs || [];
+			for(var i=0, m, o; (o=this.observers[i]); i++){
+				m = o.p + inMsg; o = o.o;
+				(m in o)&&(o[m].apply(o, a));
+			}
+		}
+	},
+	// updates
+	clear: function(){
+		this.fields.clear();
+		this.clearData();
+	},
+	beginUpdate: function(){
+		this.updating++;
+	},
+	endUpdate: function(){
+		if(this.updating){
+			this.updating--;
+		}
+		/*if(this.updating){
+			if(!(--this.updating)){
+				this.change();
+			}
+		}
+		}*/
+	},
+	isUpdating: function(){
+		return Boolean(this.updating);
+	},
+	// data
+	clearData: function(){
+		this.setData(null);
+	},
+	// observer events
+	change: function(){
+		this.notify("Change", arguments);
+	},
+	insertion: function(/* index */){
+		this.notify("Insertion", arguments);
+		this.notify("Change", arguments);
+	},
+	removal: function(/* keys */){
+		this.notify("Removal", arguments);
+		this.notify("Change", arguments);
+	},
+	// insert
+	insert: function(inData /*, index */){
+		if(!this._insert.apply(this, arguments)){
+			return false;
+		}
+		this.insertion.apply(this, dojo._toArray(arguments, 1));
+		return true;
+	},
+	// remove
+	remove: function(inData /*, index */){
+		if(!this._remove.apply(this, arguments)){
+			return false;
+		}
+		this.removal.apply(this, arguments);
+		return true;
+	},
+	// sort
+	canSort: function(/* (+|-)column_index+1, ... */){
+		return this.sort != null;
+	},
+	generateComparator: function(inCompare, inField, inTrueForAscend, inSubCompare){
+		return function(a, b){
+			var ineq = inCompare(a[inField], b[inField]);
+			return ineq ? (inTrueForAscend ? ineq : -ineq) : inSubCompare && inSubCompare(a, b);
+		}
+	},
+	makeComparator: function(inIndices){
+		var idx, col, field, result = null;
+		for(var i=inIndices.length-1; 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<l; i++, r++){
+			this.setRow(inData[i], r);
+		}
+	},
+	// update
+	update: function(inOldData, inNewData, inRowIndex){
+		//delete this.cache[inRowIndex];	
+		//this.setRow(inNewData, inRowIndex);
+		return true;
+	},
+	// insert
+	_insert: function(inData, inRowIndex){
+		dojox.grid.arrayInsert(this.data, inRowIndex, inData);
+		this.count++;
+		return true;
+	},
+	// remove
+	_remove: function(inKeys){
+		for(var i=inKeys.length-1; 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);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid_rtl.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid_rtl.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid_rtl.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,8 @@
+.dijitRtl .dojoxGrid-header table {
+}
+.dj_ie .dijitRtl .dojoxGrid-header table {
+	float:none;
+}
+.dijitRtl .dojoxGrid-content {
+	float:left;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid_rtl.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid_rtl.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/Grid_rtl.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,10 @@
+.dijitRtl .dojoxGrid-header table {
+}
+
+.dj_ie .dijitRtl .dojoxGrid-header table {
+	float:none;
+}
+
+.dijitRtl .dojoxGrid-content {
+	float:left;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/builder.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/builder.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/builder.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: '<table class="dojoxGrid-row-table" border="0" cellspacing="0" cellpadding="0" role="wairole:presentation">',
+
+	// generate starting tags for a cell
+	generateCellMarkup: function(inCell, inMoreStyles, inMoreClasses, isHeader){
+		var result = [], html;
+		if (isHeader){
+			html = [ '<th tabIndex="-1" role="wairole:columnheader"' ];
+		}else{
+			html = [ '<td tabIndex="-1" role="wairole:gridcell"' ];
+		}
+		inCell.colSpan && html.push(' colspan="', inCell.colSpan, '"');
+		inCell.rowSpan && html.push(' rowspan="', inCell.rowSpan, '"');
+		html.push(' class="dojoxGrid-cell ');
+		inCell.classes && html.push(inCell.classes, ' ');
+		inMoreClasses && html.push(inMoreClasses, ' ');
+		// result[0] => td opener, style
+		result.push(html.join(''));
+		// SLOT: result[1] => td classes 
+		result.push('');
+		html = ['" idx="', inCell.index, '" style="'];
+		html.push(inCell.styles, inMoreStyles||'');
+		inCell.unitWidth && html.push('width:', inCell.unitWidth, ';');
+		// result[2] => markup
+		result.push(html.join(''));
+		// SLOT: result[3] => td style 
+		result.push('');
+		html = [ '"' ];
+		inCell.attrs && html.push(" ", inCell.attrs);
+		html.push('>');
+		// result[4] => td postfix
+		result.push(html.join(''));
+		// SLOT: result[5] => content
+		result.push('');
+		// result[6] => td closes
+		result.push('</td>');
+		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 ? '<tr>' : '<tr class="dojoxGrid-invisible">');
+			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('</tr>');
+		}
+		html.push('</table>');
+		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: '<table class="dojoxGrid-row-table" border="0" cellspacing="0" cellpadding="0" role="wairole:presentation"',
+
+	update: function(){
+		this.tableMap = new dojox.grid.tableMap(this.view.structure.rows);
+	},
+
+	generateHtml: function(inGetValue, inValue){
+		var html = [this._table], rows = this.view.structure.rows;
+		
+		// render header with appropriate width, if possible so that views with flex columns are correct height
+		if(this.view.viewWidth){
+			html.push([' style="width:', this.view.viewWidth, ';"'].join(''));
+		}
+		html.push('>');
+		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 ? '<tr>' : '<tr class="dojoxGrid-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('</tr>');
+		}
+		html.push('</table>');
+		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<rowSpan; y++){
+					for(var s=0; s<colSpan; s++){
+						this.map[j+y][x+s] = this.map[j][x];
+					}
+				}
+				x += colSpan;
+			}
+		}
+		//this.dumMap();
+	},
+
+	dumpMap: function(){
+		for(var j=0, row, h=''; (row=this.map[j]); j++,h=''){
+			for(var i=0, cell; (cell=row[i]); i++){
+				h += cell.r + ',' + cell.c + '   ';
+			}
+			console.log(h);
+		}
+	},
+
+	getMapCoords: function(inRow, inCol){
+		// summary: Find node's map coords by it's structure coords
+		for(var j=0, row; (row=this.map[j]); j++){
+			for(var i=0, cell; (cell=row[i]); i++){
+				if(cell.c==inCol && cell.r == inRow){
+					return { j: j, i: i };
+				}
+				//else{console.log(inRow, inCol, ' : ', i, j, " : ", cell.r, cell.c); };
+			}
+		}
+		return { j: -1, i: -1 };
+	},
+	
+	getNode: function(inTable, inRow, inCol){
+		// summary: Find a node in inNode's table with the given structure coords
+		var row = inTable && inTable.rows[inRow];
+		return row && row.cells[inCol];
+	},
+	
+	_findOverlappingNodes: function(inTable, inRow, inCol){
+		var nodes = [];
+		var m = this.getMapCoords(inRow, inCol);
+		//console.log("node j: %d, i: %d", m.j, m.i);
+		var row = this.map[m.j];
+		for(var j=0, row; (row=this.map[j]); j++){
+			if(j == m.j){ continue; }
+			with(row[m.i]){
+				//console.log("overlaps: r: %d, c: %d", r, c);
+				var n = this.getNode(inTable, r, c);
+				if(n){ nodes.push(n); }
+			}
+		}
+		//console.log(nodes);
+		return nodes;
+	},
+	
+	findOverlappingNodes: function(inNode){
+		return this._findOverlappingNodes(dojox.grid.findTable(inNode), dojox.grid.getTrIndex(inNode.parentNode), dojox.grid.getTdIndex(inNode));
+	}
+	
+});
+
+dojox.grid.rowIndexTag = "gridRowIndex";
+dojox.grid.gridViewTag = "gridView";
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/cell.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/cell.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/cell.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,66 @@
+if(!dojo._hasResource["dojox.grid._grid.cell"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.grid._grid.cell"] = true;
+dojo.provide("dojox.grid._grid.cell");
+
+dojo.declare("dojox.grid.cell", null, {
+	// summary:
+	//	Respresents a grid cell and contains information about column options and methods
+	//	for retrieving cell related information.
+	//	Each column in a grid layout has a cell object and most events and many methods
+	//	provide access to these objects.
+	styles: '',
+	constructor: function(inProps){
+		dojo.mixin(this, inProps);
+		if(this.editor){this.editor = new this.editor(this);}
+	},
+	// data source
+	format: function(inRowIndex){
+		// summary:
+		//	provides the html for a given grid cell.
+		// inRowIndex: int
+		// grid row index
+		// returns: html for a given grid cell
+		var f, i=this.grid.edit.info, d=this.get ? this.get(inRowIndex) : this.value;
+		if(this.editor && (this.editor.alwaysOn || (i.rowIndex==inRowIndex && i.cell==this))){
+			return this.editor.format(d, inRowIndex);
+		}else{
+			return (f = this.formatter) ? f.call(this, d, inRowIndex) : d;
+		}
+	},
+	// utility
+	getNode: function(inRowIndex){
+		// summary:
+		//	gets the dom node for a given grid cell.
+		// inRowIndex: int
+		// grid row index
+		// returns: dom node for a given grid cell
+		return this.view.getCellNode(inRowIndex, this.index);
+	},
+	isFlex: function(){
+		var uw = this.unitWidth;
+		return uw && (uw=='auto' || uw.slice(-1)=='%');
+	},
+	// edit support
+	applyEdit: function(inValue, inRowIndex){
+		this.grid.edit.applyCellEdit(inValue, this, inRowIndex);
+	},
+	cancelEdit: function(inRowIndex){
+		this.grid.doCancelEdit(inRowIndex);
+	},
+	_onEditBlur: function(inRowIndex){
+		if(this.grid.edit.isEditCell(inRowIndex, this.index)){
+			//console.log('editor onblur', e);
+			this.grid.edit.apply();
+		}
+	},
+	registerOnBlur: function(inNode, inRowIndex){
+		if(this.commitOnBlur){
+			dojo.connect(inNode, "onblur", function(e){
+				// hack: if editor still thinks this editor is current some ms after it blurs, assume we've focused away from grid
+				setTimeout(dojo.hitch(this, "_onEditBlur", inRowIndex), 250);
+			});
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/drag.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/drag.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/drag.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,113 @@
+if(!dojo._hasResource["dojox.grid._grid.drag"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.grid._grid.drag"] = true;
+dojo.provide("dojox.grid._grid.drag");
+
+// summary:
+//	utility functions for dragging as used in grid.
+// begin closure
+(function(){
+
+var dgdrag = dojox.grid.drag = {};
+
+dgdrag.dragging = false;
+dgdrag.hysteresis = 2;
+
+dgdrag.capture = function(inElement) {
+	//console.debug('dojox.grid.drag.capture');
+	if (inElement.setCapture)
+		inElement.setCapture();
+	else {
+		document.addEventListener("mousemove", inElement.onmousemove, true);
+		document.addEventListener("mouseup", inElement.onmouseup, true);
+		document.addEventListener("click", inElement.onclick, true);
+	}
+}
+
+dgdrag.release = function(inElement) {
+	//console.debug('dojox.grid.drag.release');
+	if(inElement.releaseCapture){
+		inElement.releaseCapture();
+	}else{
+		document.removeEventListener("click", inElement.onclick, true);
+		document.removeEventListener("mouseup", inElement.onmouseup, true);
+		document.removeEventListener("mousemove", inElement.onmousemove, true);
+	}
+}
+
+dgdrag.start = function(inElement, inOnDrag, inOnEnd, inEvent, inOnStart){
+	if(/*dgdrag.elt ||*/ !inElement || dgdrag.dragging){
+		console.debug('failed to start drag: bad input node or already dragging');
+		return;
+	}
+	dgdrag.dragging = true;
+	dgdrag.elt = inElement;
+	dgdrag.events = {
+		drag: inOnDrag || dojox.grid.nop, 
+		end: inOnEnd || dojox.grid.nop, 
+		start: inOnStart || dojox.grid.nop, 
+		oldmove: inElement.onmousemove, 
+		oldup: inElement.onmouseup, 
+		oldclick: inElement.onclick 
+	};
+	dgdrag.positionX = (inEvent && ('screenX' in inEvent) ? inEvent.screenX : false);
+	dgdrag.positionY = (inEvent && ('screenY' in inEvent) ? inEvent.screenY : false);
+	dgdrag.started = (dgdrag.position === false);
+	inElement.onmousemove = dgdrag.mousemove;
+	inElement.onmouseup = dgdrag.mouseup;
+	inElement.onclick = dgdrag.click;
+	dgdrag.capture(dgdrag.elt);
+}
+
+dgdrag.end = function(){
+	//console.debug("dojox.grid.drag.end");
+	dgdrag.release(dgdrag.elt);
+	dgdrag.elt.onmousemove = dgdrag.events.oldmove;
+	dgdrag.elt.onmouseup = dgdrag.events.oldup;
+	dgdrag.elt.onclick = dgdrag.events.oldclick;
+	dgdrag.elt = null;
+	try{
+		if(dgdrag.started){
+			dgdrag.events.end();
+		}
+	}finally{
+		dgdrag.dragging = false;
+	}
+}
+
+dgdrag.calcDelta = function(inEvent){
+	inEvent.deltaX = inEvent.screenX - dgdrag.positionX;
+	inEvent.deltaY = inEvent.screenY - dgdrag.positionY;
+}
+
+dgdrag.hasMoved = function(inEvent){
+	return Math.abs(inEvent.deltaX) + Math.abs(inEvent.deltaY) > 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
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/edit.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/edit.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/edit.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/focus.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/focus.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/focus.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_dx_gradient.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_dx_gradient.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_sort_down.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_sort_down.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_sort_up.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/grid_sort_up.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/tabEnabled_rotated.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/tabEnabled_rotated.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/tabHover_rotated.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/images/tabHover_rotated.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/layout.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/layout.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/layout.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+			}));
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/lib.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/lib.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/lib.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<l; i++){
+			dojo.connect(inNode, 'on' + evts[i], inObject, inMethod);
+		}
+	},
+
+	removeNode: function(inNode){
+		inNode = dojo.byId(inNode);
+		inNode && inNode.parentNode && inNode.parentNode.removeChild(inNode);
+		return inNode;
+	},
+	
+	getScrollbarWidth: function(){
+		if(this._scrollBarWidth){
+			return this._scrollBarWidth;
+		}
+		this._scrollBarWidth = 18;
+		try{
+			var e = document.createElement("div");
+			e.style.cssText = "top:0;left:0;width:100px;height:100px;overflow:scroll;position:absolute;visibility:hidden;";
+			document.body.appendChild(e);
+			this._scrollBarWidth = e.offsetWidth - e.clientWidth;
+			document.body.removeChild(e);
+			delete e;
+		}catch (ex){}
+		return this._scrollBarWidth;
+	},
+	
+	// needed? dojo has _getProp
+	getRef: function(name, create, context){
+		var obj=context||dojo.global, parts=name.split("."), prop=parts.pop();
+		for(var i=0, p; obj&&(p=parts[i]); i++){
+			obj = (p in obj ? obj[p] : (create ? obj[p]={} : undefined));
+		}
+		return { obj: obj, prop: prop }; 
+	},
+	
+	getProp: function(name, create, context){
+		with(dojox.grid.getRef(name, create, context)){
+			return (obj)&&(prop)&&(prop in obj ? obj[prop] : (create ? obj[prop]={} : undefined));
+		}
+	},
+	
+	indexInParent: function(inNode){
+		var i=0, n, p=inNode.parentNode;
+		while((n = p.childNodes[i++])){
+			if(n == inNode){
+				return i - 1;
+			}
+		}
+		return -1;
+	},
+	
+	cleanNode: function(inNode){
+		if(!inNode){
+			return;
+		}
+		var filter = function(inW){
+			return inW.domNode && dojo.isDescendant(inW.domNode, inNode, true);
+		}
+		var ws = dijit.registry.filter(filter);
+		for(var i=0, w; (w=ws[i]); i++){
+			w.destroy();
+		}
+		delete ws;
+	},
+	
+	getTagName: function(inNodeOrId){
+		var node = dojo.byId(inNodeOrId);
+		return (node && node.tagName ? node.tagName.toLowerCase() : '');
+	},
+	
+	nodeKids: function(inNode, inTag){
+		var result = [];
+		var i=0, n;
+		while((n = inNode.childNodes[i++])){
+			if(dojox.grid.getTagName(n) == inTag){
+				result.push(n);
+			}
+		}
+		return result;
+	},
+	
+	divkids: function(inNode){
+		return dojox.grid.nodeKids(inNode, 'div');
+	},
+	
+	focusSelectNode: function(inNode){
+		try{
+			dojox.grid.fire(inNode, "focus");
+			dojox.grid.fire(inNode, "select");
+		}catch(e){// IE sux bad
+		}
+	},
+	
+	whenIdle: function(/*inContext, inMethod, args ...*/){
+		setTimeout(dojo.hitch.apply(dojo, arguments), 0);
+	},
+	
+	arrayCompare: function(inA, inB){
+		for(var i=0,l=inA.length; i<l; i++){
+			if(inA[i] != inB[i]){return false;}
+		}
+		return (inA.length == inB.length);
+	},
+	
+	arrayInsert: function(inArray, inIndex, inValue){
+		if(inArray.length <= inIndex){
+			inArray[inIndex] = inValue;
+		}else{
+			inArray.splice(inIndex, 0, inValue);
+		}
+	},
+	
+	arrayRemove: function(inArray, inIndex){
+		inArray.splice(inIndex, 1);
+	},
+	
+	arraySwap: function(inArray, inI, inJ){
+		var cache = inArray[inI];
+		inArray[inI] = inArray[inJ];
+		inArray[inJ] = cache;
+	},
+	
+	initTextSizePoll: function(inInterval) {
+		var f = document.createElement("div");
+		with (f.style) {
+			top = "0px";
+			left = "0px";
+			position = "absolute";
+			visibility = "hidden";
+		}
+		f.innerHTML = "TheQuickBrownFoxJumpedOverTheLazyDog";
+		document.body.appendChild(f);
+		var fw = f.offsetWidth;
+		var job = function() {
+			if (f.offsetWidth != fw) {
+				fw = f.offsetWidth;
+				dojox.grid.textSizeChanged();
+			}
+		}
+		window.setInterval(job, inInterval||200);
+		dojox.grid.initTextSizePoll = dojox.grid.nop;
+	},
+	
+	textSizeChanged: function() {
+
+	}
+});
+
+dojox.grid.jobs = {
+
+	cancel: function(inHandle){
+		if(inHandle){
+			window.clearTimeout(inHandle);
+		}
+	},
+
+	jobs: [],
+
+	job: function(inName, inDelay, inJob){
+		dojox.grid.jobs.cancelJob(inName);
+		var job = function(){
+			delete dojox.grid.jobs.jobs[inName];
+			inJob();
+		}
+		dojox.grid.jobs.jobs[inName] = setTimeout(job, inDelay);
+	},
+
+	cancelJob: function(inName){
+		dojox.grid.jobs.cancel(dojox.grid.jobs.jobs[inName]);
+	}
+
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/nihiloGrid.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/nihiloGrid.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/nihiloGrid.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,211 @@
+.nihilo .dojoxGrid {
+	position: relative;
+	background-color: #e9e9e9;
+	font-size: 0.85em; 
+	-moz-outline-style: none;
+	outline: none;
+	overflow: hidden;
+	height: 0;
+}
+.nihilo .dojoxGrid table {
+	padding: 0;
+}
+.nihilo .dojoxGrid td {
+	-moz-outline: none;
+}
+.nihilo .dojoxGrid-master-header {
+	position: relative;
+}
+.nihilo .dojoxGrid-master-view  {
+	position: relative;
+}
+.nihilo .dojoxGrid-view {
+	position: absolute;
+	overflow: hidden;
+}
+.nihilo .dojoxGrid-header {
+	position: absolute;
+	overflow: hidden;
+}
+.nihilo .dojoxGrid-header {
+	background-color:  #e9e9e9;
+}
+.nihilo .dojoxGrid-header table {
+	text-align: center;
+}
+.nihilo .dojoxGrid-header .dojoxGrid-cell-content {
+	text-align: center;
+}
+.nihilo .dojoxGrid-header .dojoxGrid-cell { 
+	border: 1px solid transparent;
+	
+	border-color: white #ACA899 #919191 white;
+	background: url(../../../dijit/themes/nihilo/images/titleBar.png) #e9e9e9 repeat-x top;
+	padding-bottom: 2px;
+	color: #000 !important;
+}
+.nihilo .dojoxGrid-header .dojoxGrid-cell-over {
+	background: url(../../../dijit/themes/nihilo/images/titleBarActive.png) #e9e9e9 repeat-x top;
+}
+.nihilo .dojoxGrid-sort-down {
+	background: url(images/grid_sort_down.gif) right no-repeat;
+	padding-left: 0px;
+	margin-left: 0px;
+}
+.nihilo .dojoxGrid-sort-up {
+	background: url(images/grid_sort_up.gif) right no-repeat;
+	padding-left: 0px;
+	margin-left: 0px;
+}
+.nihilo .gridArrowButtonChar {
+	display:none !important;
+}
+.dijit_a11y .gridArrowButtonChar {
+	display:inline !important;
+}
+.nihilo .dojoxGrid-scrollbox {
+	position: relative;
+	overflow: scroll;
+	background-color: #fefefe;
+	width: 100%;
+}
+.nihilo .dojoxGrid-content {
+	position: relative;
+	overflow: hidden;
+	 -moz-outline-style: none;
+	outline: none;
+}
+.nihilo .dojoxGrid-rowbar { 
+	border: none;
+	
+	background: url(images/titleBar.png) #e9e9e9 repeat-y right;
+	border-right: 1px solid #cccccc;
+	padding: 0px;
+}
+.nihilo .dojoxGrid-rowbar-inner {
+	border: none;
+	border-bottom: 1px solid #cccccc;
+}
+.nihilo .dojoxGrid-rowbar-over {
+	background: url(images/titleBarActive.png) #e9e9e9 repeat-y right;
+}
+.nihilo .dojoxGrid-rowbar-selected {
+	background-color: #D9E8F9;
+	background-image: none;
+	background: url(../../../dijit/themes/nihilo/images/titleBar.png) #dddddd repeat-x top;
+	border-right: 1px solid #cccccc;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+.nihilo .dojoxGrid-row {
+	position: relative;
+	width: 9000em;
+}
+.nihilo .dojoxGrid-row {
+	border: none;
+	border-left: none;
+	border-right: none;
+	background-color: white;
+	border-top: none;
+}
+.nihilo .dojoxGrid-row-over {
+	border-top-color: #cccccc;
+	border-bottom-color: #cccccc;
+}
+.nihilo .dojoxGrid-row-over .dojoxGrid-cell {
+	background-color: #ffe284; 
+}
+.nihilo .dojoxGrid-row-odd {
+	background-color: #f2f5f9;
+	
+}
+.nihilo .dojoxGrid-row-selected {
+	background-color: #aec7e3;
+}
+.nihilo .dojoxGrid-row-table {
+	table-layout: fixed;
+	width: 0;
+	border-collapse: collapse;
+}
+.nihilo .dojoxGrid-invisible {
+	visibility: hidden;
+}		
+.nihilo .Xdojo-ie .dojoxGrid-invisible {
+	display: none;
+}		
+.nihilo .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;
+}
+.nihilo .dojoxGrid-cell {
+	border: 1px dotted #D5CDB5;
+	padding: 3px 3px 3px 3px;
+	text-align: left;
+	overflow: hidden;
+}
+.dj_ie6 .nihilo .dojoxGrid-cell {
+	border: 1px solid white;
+	border-right: 1px solid #D5CDB5;
+}
+.nihilo .dojoxGrid-cell-focus {
+	border: 1px dotted #a6a6a6;
+}
+.nihilo .dojoxGrid-cell-over {
+	border: 1px dotted #a6a6a6;
+}
+.nihilo .dojoxGrid-cell-focus.dojoxGrid-cell-over {
+	border: 1px dotted #595959;
+}
+.nihilo .dojoxGrid-cell-clip {
+	width: 100%;
+	overflow: hidden;
+	white-space:nowrap;
+	text-overflow: ellipsis;
+}
+.nihilo .dojoxGrid-row-editing td {
+	
+	background-color: #ffe284; 
+	
+}
+.nihilo .dojoxGrid-row-inserting td {
+	background-color: #F4FFF4;
+}
+.nihilo .dojoxGrid-row-inflight td {
+	background-color: #F2F7B7;
+}
+.nihilo .dojoxGrid-row-error td {
+	background-color: #F8B8B6;
+}
+.nihilo .dojoxGrid-input,
+.nihilo .dojoxGrid-select,
+.nihilo .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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/nihiloGrid.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/nihiloGrid.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/nihiloGrid.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,275 @@
+.nihilo .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;
+}
+
+.nihilo .dojoxGrid table {
+	padding: 0;
+}
+
+.nihilo .dojoxGrid td {
+	-moz-outline: none;
+}
+
+/* master header */
+
+.nihilo .dojoxGrid-master-header {
+	position: relative;
+}
+
+/* master view */
+
+.nihilo .dojoxGrid-master-view  {
+	position: relative;
+}
+
+/* views */
+
+.nihilo .dojoxGrid-view {
+	position: absolute;
+	overflow: hidden;
+}
+
+/* header */
+
+.nihilo .dojoxGrid-header {
+	position: absolute;
+	overflow: hidden;
+}
+
+.nihilo .dojoxGrid-header {
+	background-color:  #e9e9e9;
+}
+
+.nihilo .dojoxGrid-header table {
+	text-align: center;
+}
+
+.nihilo .dojoxGrid-header .dojoxGrid-cell-content {
+	text-align: center;
+}
+
+.nihilo .dojoxGrid-header .dojoxGrid-cell { 
+	border: 1px solid transparent;
+	/* border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; */
+	border-color: white #ACA899 #919191 white;
+	background: url(../../../dijit/themes/nihilo/images/titleBar.png) #e9e9e9 repeat-x top;
+	padding-bottom: 2px;
+	color: #000 !important;
+}
+
+.nihilo .dojoxGrid-header .dojoxGrid-cell-over {
+	background: url(../../../dijit/themes/nihilo/images/titleBarActive.png) #e9e9e9 repeat-x top;
+}
+
+.nihilo .dojoxGrid-sort-down {
+	background: url(images/grid_sort_down.gif) right no-repeat;
+	padding-left: 0px;
+	margin-left: 0px;
+}
+
+.nihilo .dojoxGrid-sort-up {
+	background: url(images/grid_sort_up.gif) right no-repeat;
+	padding-left: 0px;
+	margin-left: 0px;
+}
+
+.nihilo .gridArrowButtonChar {
+	display:none !important;
+}
+.dijit_a11y .gridArrowButtonChar {
+	display:inline !important;
+}
+
+/* content */
+
+.nihilo .dojoxGrid-scrollbox {
+	position: relative;
+	overflow: scroll;
+	background-color: #fefefe;
+	width: 100%;
+}
+
+.nihilo .dojoxGrid-content {
+	position: relative;
+	overflow: hidden;
+	 -moz-outline-style: none;
+	outline: none;
+}
+
+/* rowbar */
+
+.nihilo .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;
+}
+
+.nihilo .dojoxGrid-rowbar-inner {
+	border: none;
+	border-bottom: 1px solid #cccccc;
+}
+
+.nihilo .dojoxGrid-rowbar-over {
+	background: url(images/titleBarActive.png) #e9e9e9 repeat-y right;
+}
+
+.nihilo .dojoxGrid-rowbar-selected {
+	background-color: #D9E8F9;
+	background-image: none;
+	background: url(../../../dijit/themes/nihilo/images/titleBar.png) #dddddd repeat-x top;
+	border-right: 1px solid #cccccc;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+
+/* rows */
+
+.nihilo .dojoxGrid-row {
+	position: relative;
+	width: 9000em;
+}
+
+.nihilo .dojoxGrid-row {
+	border: none;
+	border-left: none;
+	border-right: none;
+	background-color: white;
+	border-top: none;
+}
+
+.nihilo .dojoxGrid-row-over {
+	border-top-color: #cccccc;
+	border-bottom-color: #cccccc;
+}
+
+.nihilo .dojoxGrid-row-over .dojoxGrid-cell {
+	background-color: #ffe284; 
+}
+
+.nihilo .dojoxGrid-row-odd {
+	background-color: #f2f5f9;
+	/*background-color: #F9F7E8;*/
+}
+
+.nihilo .dojoxGrid-row-selected {
+	background-color: #aec7e3;
+}
+
+.nihilo .dojoxGrid-row-table {
+	table-layout: fixed;
+	width: 0;
+	border-collapse: collapse;
+}
+
+.nihilo .dojoxGrid-invisible {
+	visibility: hidden;
+}		
+
+.nihilo .Xdojo-ie .dojoxGrid-invisible {
+	display: none;
+}		
+
+.nihilo .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 */
+
+.nihilo .dojoxGrid-cell {
+	border: 1px dotted #D5CDB5;
+	padding: 3px 3px 3px 3px;
+	text-align: left;
+	overflow: hidden;
+}
+
+.dj_ie6 .nihilo .dojoxGrid-cell {
+	border: 1px solid white;
+	border-right: 1px solid #D5CDB5;
+}
+
+.nihilo .dojoxGrid-cell-focus {
+	border: 1px dotted #a6a6a6;
+}
+
+.nihilo .dojoxGrid-cell-over {
+	border: 1px dotted #a6a6a6;
+}
+
+.nihilo .dojoxGrid-cell-focus.dojoxGrid-cell-over {
+	border: 1px dotted #595959;
+}
+
+.nihilo .dojoxGrid-cell-clip {
+	width: 100%;
+	overflow: hidden;
+	white-space:nowrap;
+	text-overflow: ellipsis;
+}
+
+/* editing */
+
+/* FIXME: these colors are off! */
+.nihilo .dojoxGrid-row-editing td {
+	/* background-color: #F4FFF4; */
+	background-color: #ffe284; 
+	/* padding: 0px 3px 0px 3px; */
+}
+
+.nihilo .dojoxGrid-row-inserting td {
+	background-color: #F4FFF4;
+}
+.nihilo .dojoxGrid-row-inflight td {
+	background-color: #F2F7B7;
+}
+.nihilo .dojoxGrid-row-error td {
+	background-color: #F8B8B6;
+}
+
+.nihilo .dojoxGrid-input,
+.nihilo .dojoxGrid-select,
+.nihilo .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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/publicEvents.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/publicEvents.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/publicEvents.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,451 @@
+if(!dojo._hasResource["dojox.grid._grid.publicEvents"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.grid._grid.publicEvents"] = true;
+dojo.provide("dojox.grid._grid.publicEvents");
+
+dojox.grid.publicEvents = {
+	// summary:
+	//		VirtualGrid mixin that provides default implementations for grid events.
+	// description: 
+	//		Default ynthetic events dispatched for VirtualGrid. dojo.connect to events to
+	//		retain default implementation or override them for custom handling.
+	
+	// cellOverClass: String
+	// 		css class to apply to grid cells over which the cursor is placed.
+	cellOverClass: "dojoxGrid-cell-over",
+	
+	onKeyEvent: function(e){
+		// summary: top level handler for Key Events
+		this.dispatchKeyEvent(e);
+	},
+
+	onContentEvent: function(e){
+		// summary: Top level handler for Content events
+		this.dispatchContentEvent(e);
+	},
+
+	onHeaderEvent: function(e){
+		// summary: Top level handler for header events
+		this.dispatchHeaderEvent(e);
+	},
+
+	onStyleRow: function(inRow){
+		// summary:
+		//		Perform row styling on a given row. Called whenever row styling is updated.
+		//
+		// inRow: Object
+		// 		Object containing row state information: selected, true if the row is selcted; over:
+		// 		true of the mouse is over the row; odd: true if the row is odd. Use customClasses and
+		// 		customStyles to control row css classes and styles; both properties are strings.
+		//
+		// example: onStyleRow({ selected: true, over:true, odd:false })
+		with(inRow){
+			customClasses += (odd?" dojoxGrid-row-odd":"") + (selected?" dojoxGrid-row-selected":"") + (over?" dojoxGrid-row-over":"");
+		}
+		this.focus.styleRow(inRow);
+		this.edit.styleRow(inRow);
+	},
+	
+	onKeyDown: function(e){
+		// summary:
+		// 		Grid key event handler. By default enter begins editing and applies edits, escape cancels and edit,
+		// 		tab, shift-tab, and arrow keys move grid cell focus.
+		if(e.altKey || e.ctrlKey || e.metaKey){
+			return;
+		}
+		var dk = dojo.keys;
+		switch(e.keyCode){
+			case dk.ESCAPE:
+				this.edit.cancel();
+				break;
+			case dk.ENTER:
+				if(!e.shiftKey){
+					var isEditing = this.edit.isEditing();
+					this.edit.apply();
+					if(!isEditing){
+						this.edit.setEditCell(this.focus.cell, this.focus.rowIndex);
+					}
+				}
+				break;
+			case dk.TAB:
+				this.focus[e.shiftKey ? 'previousKey' : 'nextKey'](e);
+				break;
+			case dk.LEFT_ARROW:
+			case dk.RIGHT_ARROW:
+				if(!this.edit.isEditing()){
+					dojo.stopEvent(e);
+					var offset = (e.keyCode == dk.LEFT_ARROW) ? 1 : -1;
+					if(dojo._isBodyLtr()){ offset *= -1; }
+					this.focus.move(0, offset);
+				}
+				break;
+			case dk.UP_ARROW:
+				if(!this.edit.isEditing() && this.focus.rowIndex != 0){
+					dojo.stopEvent(e);
+					this.focus.move(-1, 0);
+				}
+				break;
+			case dk.DOWN_ARROW:
+				if(!this.edit.isEditing() && this.focus.rowIndex+1 != this.model.count){
+					dojo.stopEvent(e);
+					this.focus.move(1, 0);
+				}
+				break;
+			case dk.PAGE_UP:
+				if(!this.edit.isEditing() && this.focus.rowIndex != 0){
+					dojo.stopEvent(e);
+					if(this.focus.rowIndex != this.scroller.firstVisibleRow+1){
+						this.focus.move(this.scroller.firstVisibleRow-this.focus.rowIndex, 0);
+					}else{
+						this.setScrollTop(this.scroller.findScrollTop(this.focus.rowIndex-1));
+						this.focus.move(this.scroller.firstVisibleRow-this.scroller.lastVisibleRow+1, 0);
+					}
+				}
+				break;
+			case dk.PAGE_DOWN:
+				if(!this.edit.isEditing() && this.focus.rowIndex+1 != this.model.count){
+					dojo.stopEvent(e);
+					if(this.focus.rowIndex != this.scroller.lastVisibleRow-1){
+						this.focus.move(this.scroller.lastVisibleRow-this.focus.rowIndex-1, 0);
+					}else{
+						this.setScrollTop(this.scroller.findScrollTop(this.focus.rowIndex+1));
+						this.focus.move(this.scroller.lastVisibleRow-this.scroller.firstVisibleRow-1, 0);
+					}
+				}
+				break;
+		}
+	},
+	
+	onMouseOver: function(e){
+		// summary:
+		//		Event fired when mouse is over the grid.
+		// e: Event
+		//		Decorated event object contains reference to grid, cell, and rowIndex
+		e.rowIndex == -1 ? this.onHeaderCellMouseOver(e) : this.onCellMouseOver(e);
+	},
+	
+	onMouseOut: function(e){
+		// summary:
+		//		Event fired when mouse moves out of the grid.
+		// e: Event
+		//		Decorated event object that contains reference to grid, cell, and rowIndex
+		e.rowIndex == -1 ? this.onHeaderCellMouseOut(e) : this.onCellMouseOut(e);
+	},
+	
+	onMouseDown: function(e){
+		// summary:
+		//		Event fired when mouse is down inside grid.
+		// e: Event
+		//		Decorated event object that contains reference to grid, cell, and rowIndex
+		e.rowIndex == -1 ? this.onHeaderCellMouseDown(e) : this.onCellMouseDown(e);
+	},
+	
+	onMouseOverRow: function(e){
+		// summary:
+		//		Event fired when mouse is over any row (data or header).
+		// e: Event
+		//		Decorated event object contains reference to grid, cell, and rowIndex
+		if(!this.rows.isOver(e.rowIndex)){
+			this.rows.setOverRow(e.rowIndex);
+			e.rowIndex == -1 ? this.onHeaderMouseOver(e) : this.onRowMouseOver(e);
+		}
+	},
+	onMouseOutRow: function(e){
+		// summary:
+		//		Event fired when mouse moves out of any row (data or header).
+		// e: Event
+		//		Decorated event object contains reference to grid, cell, and rowIndex
+		if(this.rows.isOver(-1)){
+			this.onHeaderMouseOut(e);
+		}else if(!this.rows.isOver(-2)){
+			this.rows.setOverRow(-2);
+			this.onRowMouseOut(e);
+		}
+	},
+	
+	onMouseDownRow: function(e){
+		// summary:
+		//		Event fired when mouse is down inside grid row
+		// e: Event
+		//		Decorated event object that contains reference to grid, cell, and rowIndex
+		if(e.rowIndex != -1)
+			this.onRowMouseDown(e);
+	},
+
+	// cell events
+	onCellMouseOver: function(e){
+		// summary:
+		//		Event fired when mouse is over a cell.
+		// e: Event
+		//		Decorated event object contains reference to grid, cell, and rowIndex
+		dojo.addClass(e.cellNode, this.cellOverClass);
+	},
+	
+	onCellMouseOut: function(e){
+		// summary:
+		//		Event fired when mouse moves out of a cell.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+		dojo.removeClass(e.cellNode, this.cellOverClass);
+	},
+	
+	onCellMouseDown: function(e){
+		// summary:
+		//		Event fired when mouse is down in a header cell.
+		// e: Event
+		// 		Decorated event object which contains reference to grid, cell, and rowIndex
+	},
+
+	onCellClick: function(e){
+		// summary:
+		//		Event fired when a cell is clicked.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+		this._click[0] = this._click[1];
+		this._click[1] = e;
+		if(!this.edit.isEditCell(e.rowIndex, e.cellIndex)){
+			this.focus.setFocusCell(e.cell, e.rowIndex);
+		}
+		this.onRowClick(e);
+	},
+
+	onCellDblClick: function(e){
+		// summary:
+		//		Event fired when a cell is double-clicked.
+		// e: Event
+		//		Decorated event object contains reference to grid, cell, and rowIndex
+		if(dojo.isIE){
+			this.edit.setEditCell(this._click[1].cell, this._click[1].rowIndex);
+		}else if(this._click[0].rowIndex != this._click[1].rowIndex){
+			this.edit.setEditCell(this._click[0].cell, this._click[0].rowIndex);
+		}else{
+			this.edit.setEditCell(e.cell, e.rowIndex);
+		}
+		this.onRowDblClick(e);
+	},
+
+	onCellContextMenu: function(e){
+		// summary:
+		//		Event fired when a cell context menu is accessed via mouse right click.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+		this.onRowContextMenu(e);
+	},
+
+	onCellFocus: function(inCell, inRowIndex){
+		// summary:
+		//		Event fired when a cell receives focus.
+		// inCell: Object
+		//		Cell object containing properties of the grid column.
+		// inRowIndex: Integer
+		//		Index of the grid row
+		this.edit.cellFocus(inCell, inRowIndex);
+	},
+
+	// row events
+	onRowClick: function(e){
+		// summary:
+		//		Event fired when a row is clicked.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+		this.edit.rowClick(e);
+		this.selection.clickSelectEvent(e);
+	},
+
+	onRowDblClick: function(e){
+		// summary:
+		//		Event fired when a row is double clicked.
+		// e: Event
+		//		decorated event object which contains reference to grid, cell, and rowIndex
+	},
+
+	onRowMouseOver: function(e){
+		// summary:
+		//		Event fired when mouse moves over a data row.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+	},
+
+	onRowMouseOut: function(e){
+		// summary:
+		//		Event fired when mouse moves out of a data row.
+		// e: Event
+		// 		Decorated event object contains reference to grid, cell, and rowIndex
+	},
+	
+	onRowMouseDown: function(e){
+		// summary:
+		//		Event fired when mouse is down in a row.
+		// e: Event
+		// 		Decorated event object which contains reference to grid, cell, and rowIndex
+	},
+
+	onRowContextMenu: function(e){
+		// summary:
+		//		Event fired when a row context menu is accessed via mouse right click.
+		// e: Event
+		// 		Decorated event object which contains reference to grid, cell, and rowIndex
+		dojo.stopEvent(e);
+	},
+
+	// header events
+	onHeaderMouseOver: function(e){
+		// summary:
+		//		Event fired when mouse moves over the grid header.
+		// e: Event
+		// 		Decorated event object contains reference to grid, cell, and rowIndex
+	},
+
+	onHeaderMouseOut: function(e){
+		// summary:
+		//		Event fired when mouse moves out of the grid header.
+		// e: Event
+		// 		Decorated event object which contains reference to grid, cell, and rowIndex
+	},
+
+	onHeaderCellMouseOver: function(e){
+		// summary:
+		//		Event fired when mouse moves over a header cell.
+		// e: Event
+		// 		Decorated event object which contains reference to grid, cell, and rowIndex
+		dojo.addClass(e.cellNode, this.cellOverClass);
+	},
+
+	onHeaderCellMouseOut: function(e){
+		// summary:
+		//		Event fired when mouse moves out of a header cell.
+		// e: Event
+		// 		Decorated event object which contains reference to grid, cell, and rowIndex
+		dojo.removeClass(e.cellNode, this.cellOverClass);
+	},
+	
+	onHeaderCellMouseDown: function(e) {
+		// summary:
+		//		Event fired when mouse is down in a header cell.
+		// e: Event
+		// 		Decorated event object which contains reference to grid, cell, and rowIndex
+	},
+
+	onHeaderClick: function(e){
+		// summary:
+		//		Event fired when the grid header is clicked.
+		// e: Event
+		// Decorated event object which contains reference to grid, cell, and rowIndex
+	},
+
+	onHeaderCellClick: function(e){
+		// summary:
+		//		Event fired when a header cell is clicked.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+		this.setSortIndex(e.cell.index);
+		this.onHeaderClick(e);
+	},
+
+	onHeaderDblClick: function(e){
+		// summary:
+		//		Event fired when the grid header is double clicked.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+	},
+
+	onHeaderCellDblClick: function(e){
+		// summary:
+		//		Event fired when a header cell is double clicked.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+		this.onHeaderDblClick(e);
+	},
+
+	onHeaderCellContextMenu: function(e){
+		// summary:
+		//		Event fired when a header cell context menu is accessed via mouse right click.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+		this.onHeaderContextMenu(e);
+	},
+
+	onHeaderContextMenu: function(e){
+		// summary:
+		//		Event fired when the grid header context menu is accessed via mouse right click.
+		// e: Event
+		//		Decorated event object which contains reference to grid, cell, and rowIndex
+		dojo.stopEvent(e);
+	},
+
+	// editing
+	onStartEdit: function(inCell, inRowIndex){
+		// summary:
+		//		Event fired when editing is started for a given grid cell
+		// inCell: Object
+		//		Cell object containing properties of the grid column.
+		// inRowIndex: Integer
+		//		Index of the grid row
+	},
+
+	onApplyCellEdit: function(inValue, inRowIndex, inFieldIndex){
+		// summary:
+		//		Event fired when editing is applied for a given grid cell
+		// inValue: String
+		//		Value from cell editor
+		// inRowIndex: Integer
+		//		Index of the grid row
+		// inFieldIndex: Integer
+		//		Index in the grid's data model
+	},
+
+	onCancelEdit: function(inRowIndex){
+		// summary:
+		//		Event fired when editing is cancelled for a given grid cell
+		// inRowIndex: Integer
+		//		Index of the grid row
+	},
+
+	onApplyEdit: function(inRowIndex){
+		// summary:
+		//		Event fired when editing is applied for a given grid row
+		// inRowIndex: Integer
+		//		Index of the grid row
+	},
+
+	onCanSelect: function(inRowIndex){
+		// summary:
+		//		Event to determine if a grid row may be selected
+		// inRowIndex: Integer
+		//		Index of the grid row
+		// returns: Boolean
+		//		true if the row can be selected
+		return true;
+	},
+
+	onCanDeselect: function(inRowIndex){
+		// summary:
+		//		Event to determine if a grid row may be deselected
+		// inRowIndex: Integer
+		//		Index of the grid row
+		// returns: Boolean
+		//		true if the row can be deselected
+		return true;
+	},
+
+	onSelected: function(inRowIndex){
+		// summary:
+		//		Event fired when a grid row is selected
+		// inRowIndex: Integer
+		//		Index of the grid row
+		this.updateRowStyles(inRowIndex);
+	},
+
+	onDeselected: function(inRowIndex){
+		// summary:
+		//		Event fired when a grid row is deselected
+		// inRowIndex: Integer
+		//		Index of the grid row
+		this.updateRowStyles(inRowIndex);
+	},
+
+	onSelectionChanged: function(){
+	}
+
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/rowbar.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/rowbar.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/rowbar.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,53 @@
+if(!dojo._hasResource["dojox.grid._grid.rowbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.grid._grid.rowbar"] = true;
+dojo.provide("dojox.grid._grid.rowbar");
+dojo.require("dojox.grid._grid.view");
+
+dojo.declare('dojox.GridRowView', dojox.GridView, {
+	// summary:
+	//	Custom grid view. If used in a grid structure, provides a small selectable region for grid rows.
+	defaultWidth: "3em",
+	noscroll: true,
+	padBorderWidth: 2,
+	buildRendering: function(){
+		this.inherited('buildRendering', arguments);
+		this.scrollboxNode.style.overflow = "hidden";
+		this.headerNode.style.visibility = "hidden";
+	},	
+	getWidth: function(){
+		return this.viewWidth || this.defaultWidth;
+	},
+	buildRowContent: function(inRowIndex, inRowNode){
+		var w = this.contentNode.offsetWidth - this.padBorderWidth 
+		inRowNode.innerHTML = '<table style="width:' + w + 'px;" role="wairole:presentation"><tr><td class="dojoxGrid-rowbar-inner"></td></tr></table>';
+	},
+	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);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/rows.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/rows.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/rows.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/scroller.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/scroller.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/scroller.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<this.pageCount; i++, h += ph){
+			ph = this.getPageHeight(i);
+			if(h + ph >= 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<this.pageCount)&&((b<0)||(y<b)); p++){
+			y += this.needPage(p, y);
+		}
+		this.firstVisibleRow = this.getFirstVisibleRow(this.page, this.pageTop, inTop);
+		this.lastVisibleRow = this.getLastVisibleRow(p - 1, y, b);
+		// indicates some page size has been updated
+		if(h != this.height){
+			this.repositionPages(p-1);
+		}
+		this.endPacify();
+	},
+	getScrollBottom: function(inTop){
+		return (this.windowHeight >= 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<this.stack.length; i++){
+			last = Math.max(this.stack[i], last);
+		}
+		//
+		var n = inNodes[inPageIndex];
+		var y = (n ? this.getPageNodePosition(n) + this.getPageHeight(inPageIndex) : 0);
+		//console.log('detected height change, repositioning from #%d (%d) @ %d ', inPageIndex + 1, last, y, this.pageHeights[0]);
+		//
+		for(var p=inPageIndex+1; p<=last; p++){
+			n = inNodes[p];
+			if(n){
+				//console.log('#%d @ %d', inPageIndex, y, this.getPageNodePosition(n));
+				if(this.getPageNodePosition(n) == y){
+					return;
+				}
+				//console.log('placing page %d at %d', p, y);
+				this.positionPage(p, y);
+			}
+			y += this.getPageHeight(p);
+		}
+	},
+	invalidatePageNode: function(inPageIndex, inNodes){
+		var p = inNodes[inPageIndex];
+		if(p){
+			delete inNodes[inPageIndex];
+			this.removePage(inPageIndex, p);
+			dojox.grid.cleanNode(p);
+			p.innerHTML = '';
+		}
+		return p;
+	},
+	preparePageNode: function(inPageIndex, inReusePageIndex, inNodes){
+		var p = (inReusePageIndex === null ? this.createPageNode() : this.invalidatePageNode(inReusePageIndex, inNodes));
+		p.pageIndex = inPageIndex;
+		p.id = (this._pageIdPrefix || "") + 'page-' + inPageIndex;
+		inNodes[inPageIndex] = p;
+	},
+	// implementation for page manager
+	pageExists: function(inPageIndex){
+		return Boolean(this.getDefaultPageNode(inPageIndex));
+	},
+	measurePage: function(inPageIndex){
+		return this.getDefaultPageNode(inPageIndex).offsetHeight;
+	},
+	positionPage: function(inPageIndex, inPos){
+		this.positionPageNode(this.getDefaultPageNode(inPageIndex), inPos);
+	},
+	repositionPages: function(inPageIndex){
+		this.repositionPageNodes(inPageIndex, this.getDefaultNodes());
+	},
+	preparePage: function(inPageIndex, inReuseNode){
+		this.preparePageNode(inPageIndex, (inReuseNode ? this.popPage() : null), this.getDefaultNodes());
+	},
+	installPage: function(inPageIndex){
+		this.contentNode.appendChild(this.getDefaultPageNode(inPageIndex));
+	},
+	destroyPage: function(inPageIndex){
+		var p = this.invalidatePageNode(inPageIndex, this.getDefaultNodes());
+		dojox.grid.removeNode(p);
+	},
+	// rendering implementation
+	renderPage: function(inPageIndex){
+		var node = this.pageNodes[inPageIndex];
+		for(var i=0, j=inPageIndex*this.rowsPerPage; (i<this.rowsPerPage)&&(j<this.rowCount); i++, j++){
+			this.renderRow(j, node);
+		}
+	},
+	removePage: function(inPageIndex){
+		for(var i=0, j=inPageIndex*this.rowsPerPage; i<this.rowsPerPage; i++, j++){
+			this.removeRow(j);
+		}
+	},
+	// scroll control
+	getPageRow: function(inPage){
+		return inPage * this.rowsPerPage;
+	},
+	getLastPageRow: function(inPage){
+		return Math.min(this.rowCount, this.getPageRow(inPage + 1)) - 1;
+	},
+	getFirstVisibleRowNodes: function(inPage, inPageTop, inScrollTop, inNodes){
+		var row = this.getPageRow(inPage);
+		var rows = dojox.grid.divkids(inNodes[inPage]);
+		for(var i=0,l=rows.length; i<l && inPageTop<inScrollTop; i++, row++){
+			inPageTop += rows[i].offsetHeight;
+		}
+		return (row ? row - 1 : row);
+	},
+	getFirstVisibleRow: function(inPage, inPageTop, inScrollTop){
+		if(!this.pageExists(inPage)){
+			return 0;
+		}
+		return this.getFirstVisibleRowNodes(inPage, inPageTop, inScrollTop, this.getDefaultNodes());
+	},
+	getLastVisibleRowNodes: function(inPage, inBottom, inScrollBottom, inNodes){
+		var row = this.getLastPageRow(inPage);
+		var rows = dojox.grid.divkids(inNodes[inPage]);
+		for(var i=rows.length-1; 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<l; i++){
+			h = rows[i].offsetHeight;
+			t += h;
+			if(t >= 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<rowPage; i++){
+			t += this.getPageHeight(i);
+		}
+		this.pageTop = t;
+		this.needPage(rowPage, this.pageTop);
+		var rows = dojox.grid.divkids(inNodes[rowPage]);
+		var r = inRow - this.rowsPerPage * rowPage;
+		for(var i=0,l=rows.length; i<l && i<r; i++){
+			t += rows[i].offsetHeight;
+		}
+		return t;
+	},
+	findTopRow: function(inScrollTop){
+		return this.findTopRowForNodes(inScrollTop, this.getDefaultNodes());
+	},
+	findScrollTop: function(inRow){
+		return this.findScrollTopForNodes(inRow, this.getDefaultNodes());
+	},
+	dummy: 0
+});
+
+dojo.declare('dojox.grid.scroller.columns', dojox.grid.scroller, {
+	// summary:
+	//	Virtual scroller class that scrolls list of columns. Owned by grid and used internally
+	//	for virtual scrolling.
+	constructor: function(inContentNodes){
+		this.setContentNodes(inContentNodes);
+	},
+	// nodes
+	setContentNodes: function(inNodes){
+		this.contentNodes = inNodes;
+		this.colCount = (this.contentNodes ? this.contentNodes.length : 0);
+		this.pageNodes = [];
+		for(var i=0; i<this.colCount; i++){
+			this.pageNodes[i] = [];
+		}
+	},
+	getDefaultNodes: function(){
+		return this.pageNodes[0] || [];
+	},
+	scroll: function(inTop) {
+		if(this.colCount){
+			dojox.grid.scroller.prototype.scroll.call(this, inTop);
+		}
+	},
+	// resize
+	resize: function(){
+		if(this.scrollboxNode){
+			this.windowHeight = this.scrollboxNode.clientHeight;
+		}
+		for(var i=0; i<this.colCount; i++){
+			dojox.grid.setStyleHeightPx(this.contentNodes[i], this.height);
+		}
+	},
+	// implementation for page manager
+	positionPage: function(inPageIndex, inPos){
+		for(var i=0; i<this.colCount; i++){
+			this.positionPageNode(this.pageNodes[i][inPageIndex], inPos);
+		}
+	},
+	preparePage: function(inPageIndex, inReuseNode){
+		var p = (inReuseNode ? this.popPage() : null);
+		for(var i=0; i<this.colCount; i++){
+			this.preparePageNode(inPageIndex, p, this.pageNodes[i]);
+		}
+	},
+	installPage: function(inPageIndex){
+		for(var i=0; i<this.colCount; i++){
+			this.contentNodes[i].appendChild(this.pageNodes[i][inPageIndex]);
+		}
+	},
+	destroyPage: function(inPageIndex){
+		for(var i=0; i<this.colCount; i++){
+			dojox.grid.removeNode(this.invalidatePageNode(inPageIndex, this.pageNodes[i]));
+		}
+	},
+	// rendering implementation
+	renderPage: function(inPageIndex){
+		var nodes = [];
+		for(var i=0; i<this.colCount; i++){
+			nodes[i] = this.pageNodes[i][inPageIndex];
+		}
+		//this.renderRows(inPageIndex*this.rowsPerPage, this.rowsPerPage, nodes);
+		for(var i=0, j=inPageIndex*this.rowsPerPage; (i<this.rowsPerPage)&&(j<this.rowCount); i++, j++){
+			this.renderRow(j, nodes);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/selection.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/selection.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/selection.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,215 @@
+if(!dojo._hasResource['dojox.grid._grid.selection']){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource['dojox.grid._grid.selection'] = true;
+dojo.provide('dojox.grid._grid.selection');
+
+dojo.declare("dojox.grid.selection",
+	null,
+	{
+	// summary:
+	//		Manages row selection for grid. Owned by grid and used internally 
+	//		for selection. Override to implement custom selection.
+
+	constructor: function(inGrid){
+		this.grid = inGrid;
+		this.selected = [];
+	},
+	
+	multiSelect: true,
+	selected: null,
+	updating: 0,
+	selectedIndex: -1,
+
+	onCanSelect: function(inIndex){
+		return this.grid.onCanSelect(inIndex);
+	},
+
+	onCanDeselect: function(inIndex){
+		return this.grid.onCanDeselect(inIndex);
+	},
+
+	onSelected: function(inIndex){
+		return this.grid.onSelected(inIndex);
+	},
+
+	onDeselected: function(inIndex){
+		return this.grid.onDeselected(inIndex);
+	},
+
+	//onSetSelected: function(inIndex, inSelect) { };
+	onChanging: function(){
+	},
+
+	onChanged: function(){
+		return this.grid.onSelectionChanged();
+	},
+
+	isSelected: function(inIndex){
+		return this.selected[inIndex];
+	},
+
+	getFirstSelected: function(){
+		for(var i=0, l=this.selected.length; i<l; i++){
+			if(this.selected[i]){
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	getNextSelected: function(inPrev){
+		for(var i=inPrev+1, l=this.selected.length; i<l; i++){
+			if(this.selected[i]){
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	getSelected: function(){
+		var result = [];
+		for(var i=0, l=this.selected.length; i<l; i++){
+			if(this.selected[i]){
+				result.push(i);
+			}
+		}
+		return result;
+	},
+
+	getSelectedCount: function(){
+		var c = 0;
+		for(var i=0; i<this.selected.length; i++){
+			if(this.selected[i]){
+				c++;
+			}
+		}
+		return c;
+	},
+
+	beginUpdate: function(){
+		if(this.updating == 0){
+			this.onChanging();
+		}
+		this.updating++;
+	},
+
+	endUpdate: function(){
+		this.updating--;
+		if(this.updating == 0){
+			this.onChanged();
+		}
+	},
+
+	select: function(inIndex){
+		this.unselectAll(inIndex);
+		this.addToSelection(inIndex);
+	},
+
+	addToSelection: function(inIndex){
+		inIndex = Number(inIndex);
+		if(this.selected[inIndex]){
+			this.selectedIndex = inIndex;
+		}else{
+			if(this.onCanSelect(inIndex) !== false){
+				this.selectedIndex = inIndex;
+				this.beginUpdate();
+				this.selected[inIndex] = true;
+				this.grid.onSelected(inIndex);
+				//this.onSelected(inIndex);
+				//this.onSetSelected(inIndex, true);
+				this.endUpdate();
+			}
+		}
+	},
+
+	deselect: function(inIndex){
+		inIndex = Number(inIndex);
+		if(this.selectedIndex == inIndex){
+			this.selectedIndex = -1;
+		}
+		if(this.selected[inIndex]){
+			if(this.onCanDeselect(inIndex) === false){
+				return;
+			}
+			this.beginUpdate();
+			delete this.selected[inIndex];
+			this.grid.onDeselected(inIndex);
+			//this.onDeselected(inIndex);
+			//this.onSetSelected(inIndex, false);
+			this.endUpdate();
+		}
+	},
+
+	setSelected: function(inIndex, inSelect){
+		this[(inSelect ? 'addToSelection' : 'deselect')](inIndex);
+	},
+
+	toggleSelect: function(inIndex){
+		this.setSelected(inIndex, !this.selected[inIndex])
+	},
+
+	insert: function(inIndex){
+		this.selected.splice(inIndex, 0, false);
+		if(this.selectedIndex >= 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();
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/soriaGrid.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/soriaGrid.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/soriaGrid.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/soriaGrid.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/soriaGrid.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/soriaGrid.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/tundraGrid.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/tundraGrid.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/tundraGrid.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/tundraGrid.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/tundraGrid.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/tundraGrid.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/view.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/view.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/view.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:"<div class=\"dojoxGrid-view\">\n\t<div class=\"dojoxGrid-header\" dojoAttachPoint=\"headerNode\">\n\t\t<div dojoAttachPoint=\"headerNodeContainer\" style=\"width:9000em\">\n\t\t\t<div dojoAttachPoint=\"headerContentNode\"></div>\n\t\t</div>\n\t</div>\n\t<input type=\"checkbox\" class=\"dojoxGrid-hidden-focus\" dojoAttachPoint=\"hiddenFocusNode\" />\n\t<input type=\"checkbox\" class=\"dojoxGrid-hidden-focus\" />\n\t<div class=\"dojoxGrid-scrollbox\" dojoAttachPoint=\"scrollboxNode\">\n\t\t<div class=\"dojoxGrid-content\" dojoAttachPoint=\"contentNode\" hidefocus=\"hidefocus\"></div>\n\t</div>\n</div>\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 [ '<div class="', inCell.grid.sortInfo > 0 ? 'dojoxGrid-sort-down' : 'dojoxGrid-sort-up', '"><div class="gridArrowButtonChar">', inCell.grid.sortInfo > 0 ? '&#9660;' : '&#9650;', '</div>', n, '</div>' ].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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/views.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/views.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/_grid/views.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<c); i++){
+			// get width
+			vw = this.getViewWidth(i);
+			// process boxes
+			v.setSize(vw, 0);
+			setPosition(v, l);
+			vw = v.domNode.offsetWidth;
+			// update position
+			l += vw;
+		}
+		// next view (is the client, i++ == c) 
+		i++;
+		// start from the right edge
+		var r = w;
+		// for views right of the client (iterated from the right)
+		for(var j=len-1; (v=this.views[j])&&(i<=j); j--){
+			// get width
+			vw = this.getViewWidth(j);
+			// set size
+			v.setSize(vw, 0);
+			// measure in pixels
+			vw = v.domNode.offsetWidth;
+			// update position
+			r -= vw;
+			// set position
+			setPosition(v, r);
+		}
+		if(c<len){
+			v = this.views[c];
+			// position the client box between left and right boxes	
+			vw = Math.max(1, r-l);
+			// set size
+			v.setSize(vw + 'px', 0);
+			setPosition(v, l);
+		}
+		return l;
+	},
+
+	// rendering
+	renderRow: function(inRowIndex, inNodes){
+		var rowNodes = [];
+		for(var i=0, v, n, rowNode; (v=this.views[i])&&(n=inNodes[i]); i++){
+			rowNode = v.renderRow(inRowIndex);
+			n.appendChild(rowNode);
+			rowNodes.push(rowNode);
+		}
+		this.normalizeRowNodeHeights(rowNodes);
+	},
+	
+	rowRemoved: function(inRowIndex){
+		this.onEach("rowRemoved", [ inRowIndex ]);
+	},
+	
+	// updating
+	updateRow: function(inRowIndex, inHeight){
+		for(var i=0, v; v=this.views[i]; i++){
+			v.updateRow(inRowIndex, inHeight);
+		}
+		this.renormalizeRow(inRowIndex);
+	},
+	
+	updateRowStyles: function(inRowIndex){
+		this.onEach("updateRowStyles", [ inRowIndex ]);
+	},
+	
+	// scrolling
+	setScrollTop: function(inTop){
+		var top = inTop;
+		for(var i=0, v; v=this.views[i]; i++){
+			top = v.setScrollTop(inTop);
+		}
+		return top;
+		//this.onEach("setScrollTop", [ inTop ]);
+	},
+	
+	getFirstScrollingView: function(){
+		// summary: Returns the first grid view with a scroll bar 
+		for(var i=0, v; (v=this.views[i]); i++){
+			if(v.hasScrollbar()){
+				return v;
+			}
+		}
+	}
+	
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/GridView.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/GridView.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/GridView.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+<div class="dojoxGrid-view">
+	<div class="dojoxGrid-header" dojoAttachPoint="headerNode">
+		<div dojoAttachPoint="headerNodeContainer" style="width:9000em">
+			<div dojoAttachPoint="headerContentNode"></div>
+		</div>
+	</div>
+	<input type="checkbox" class="dojoxGrid-hidden-focus" dojoAttachPoint="hiddenFocusNode" />
+	<input type="checkbox" class="dojoxGrid-hidden-focus" />
+	<div class="dojoxGrid-scrollbox" dojoAttachPoint="scrollboxNode">
+		<div class="dojoxGrid-content" dojoAttachPoint="contentNode" hidefocus="hidefocus"></div>
+	</div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/VirtualGrid.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/VirtualGrid.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/grid/resources/VirtualGrid.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+<div class="dojoxGrid" hidefocus="hidefocus" role="wairole:grid">
+	<div class="dojoxGrid-master-header" dojoAttachPoint="viewsHeaderNode"></div>
+	<div class="dojoxGrid-master-view" dojoAttachPoint="viewsNode"></div>
+	<span dojoAttachPoint="lastFocusNode" tabindex="0"></span>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/help/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/help/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/help/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,35 @@
+-------------------------------------------------------------------------------
+dojox.help
+-------------------------------------------------------------------------------
+Version 0.0
+Release date: 3/13/2008
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits
+	Neil Roberts (pottedmeat@xxxxxxxxxxxxxxx)
+	Wolfram Kriesing (wolfram@xxxxxxxxxxx)
+-------------------------------------------------------------------------------
+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
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/help/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/help/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/help/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+			}
+		}
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/help/console.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/help/console.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/help/console.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/help/demos/demo_Console.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/help/demos/demo_Console.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/help/demos/demo_Console.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,33 @@
+<html>
+	<head>
+		<title>Simple demo of dojox.help.console</title>
+		<script src="../../../dojo/dojo.js" type="text/javascript" djConfig="isDebug: true"></script>
+		<script type="text/javascript">
+			dojo.addOnLoad(function(){
+				dojo.query("code").onclick(function(e){
+					var cmd = e.target.innerHTML;
+					if(cmd.slice(-1) == ";"){
+						dojo.eval(cmd);
+					}else{
+						console.log(dojo.getObject(cmd));
+					}
+				});
+			});
+		</script>
+	</head>
+	<body>
+		<p>You'll want to open up Firebug for this</p>
+		<p>Click each of the items below to run the command:
+			<ul>
+				<li><code>dojo.require("dojox.help.console");</code></li>
+				<li><code>dojox.help.locate("xhr", dojo);</code> searches variable names in the dojo namespaces for "xhr".</li>
+				<li><code>dojo.query.help();</code> displays help for dojo.byId</li>
+				<li><code>dojo.connect</code> loads and displays the function signature for dojo.connect</li>
+				<li><code>dojo.isBrowser</code> shows an example of a "conflict". It's using the Boolean object rather than the boolean generic.</li>
+				<li><code>dojox.help.noConflict();</code> fixes this conflict (click on <code>dojo.isBrowser</code> again).</li>
+				<li><code>dojox.help.refresh();</code> parses the page again</code></li>
+				<li><code>dojo.isBrowser</code> and the conflict is back again!</li>
+			</ul>
+		</p>
+	</body>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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, '&amp;').replace(/</gm, '&lt;').replace(/>/gm, '&gt;');
+	}
+	
+	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('<span class="'+ keywordM +'">' + esc(match[0]) + '</span>');
+				}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 + '<span class="' + newMode.className + '">');
+					newMode.buffer = '';
+				}else{
+					this.result.push('<span class="' + newMode.className + '">');
+					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) + '</span>' + lexeme);
+				}else{
+					this.result.push(this.processKeywords(mode.buffer + lexeme) + '</span>');
+				}
+				while(endLevel > 1){
+					this.result.push('</span>');
+					--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 = '<pre><code class="' + className + '">' + text + '</code></pre>';
+			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);
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_all.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_all.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_all.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_dynamic.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_dynamic.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_dynamic.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_static.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_static.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_static.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_www.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_www.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/_www.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/cpp.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/cpp.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/cpp.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: ['comment', 'string', 'number', 'preprocessor'],
+			keywords: {
+				'false': 1, 'int': 1, 'float': 1, 'while': 1, 'private': 1,
+				'char': 1, 'catch': 1, 'export': 1, 'virtual': 1, 
+				'operator': 2, 'sizeof': 2, 'dynamic_cast': 2, 'typedef': 2,
+				'const_cast': 2, 'const': 1, 'struct': 1, 'for': 1,
+				'static_cast': 2, 'union': 1, 'namespace': 1, 'unsigned': 1,
+				'long': 1, 'throw': 1, 'volatile': 2, 'static': 1, 
+				'protected': 1, 'bool': 1, 'template': 1, 'mutable': 1, 
+				'if': 1, 'public': 1, 'friend': 2, 'do': 1, 'return': 1,
+				'goto': 1, 'auto': 1, 'void': 2, 'enum': 1, 'else': 1, 
+				'break': 1, 'new': 1, 'extern': 1, 'using': 1, 'true': 1,
+				'class': 1, 'asm': 1, 'case': 1, 'typeid': 1, 'short': 1,
+				'reinterpret_cast': 2, 'default': 1, 'double': 1, 
+				'register': 1, 'explicit': 1, 'signed': 1, 'typename': 1,
+				'try': 1, 'this': 1, 'switch': 1, 'continue': 1, 'wchar_t': 1,
+				'inline': 1, 'delete': 1
+			}
+		},
+		modes: [
+			dhc.C_LINE_COMMENT_MODE,
+			dhc.C_BLOCK_COMMENT_MODE,
+			dhc.C_NUMBER_MODE,
+			dhc.QUOTE_STRING_MODE,
+			dhc.BACKSLASH_ESCAPE,
+			{
+				className: 'string',
+				begin: '\'', 
+				end: '[^\\\\]\'',
+				illegal: '[^\\\\][^\']'
+			},
+			{
+				className: 'preprocessor',
+				begin: '#', end: '$'
+			}
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/css.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/css.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/css.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,96 @@
+if(!dojo._hasResource["dojox.highlight.languages.css"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.highlight.languages.css"] = true;
+dojo.provide("dojox.highlight.languages.css"); 
+
+dojo.require("dojox.highlight._base");
+dojo.require("dojox.highlight.languages.html");
+
+(function(){
+	var dh = dojox.highlight, dhc = dh.constants, dhl = dh.languages;
+	dhl.css = {
+		defaultMode: {
+			contains: ['id', 'class', 'attr_selector', 'rules', 'comment'],
+			keywords: dhl.html.HTML_TAGS,
+			lexems: [dhc.IDENT_RE],
+			illegal: '='
+		},
+		case_insensitive: true,
+		modes: [
+			{
+				className: 'id',
+				begin: '\\#[A-Za-z0-9_-]+', end: '^'
+			},
+			{
+				className: 'class',
+				begin: '\\.[A-Za-z0-9_-]+', end: '^',
+				relevance: 0
+			},
+			{
+				className: 'attr_selector',
+				begin: '\\[', end: '\\]',
+				illegal: '$'
+			},
+			{
+				className: 'rules',
+				begin: '{', end: '}',
+				lexems: ['[A-Za-z-]+'],
+				keywords: {
+					'play-during': 1, 'counter-reset': 1, 
+					'counter-increment': 1, 'min-height': 1, 'quotes': 1,
+					'border-top': 1, 'pitch': 1, 'font': 1, 'pause': 1,
+					'list-style-image': 1, 'border-width': 1, 'cue': 1,
+					'outline-width': 1, 'border-left': 1, 'elevation': 1,
+					'richness': 1, 'speech-rate': 1, 'border-bottom': 1,
+					'border-spacing': 1, 'background': 1, 'list-style-type': 1,
+					'text-align': 1, 'page-break-inside': 1, 'orphans': 1,
+					'page-break-before': 1, 'text-transform': 1, 
+					'line-height': 1, 'padding-left': 1, 'font-size': 1,
+					'right': 1, 'word-spacing': 1, 'padding-top': 1,
+					'outline-style': 1, 'bottom': 1, 'content': 1,
+					'border-right-style': 1, 'padding-right': 1,
+					'border-left-style': 1, 'voice-family': 1,
+					'background-color': 1, 'border-bottom-color': 1,
+					'outline-color': 1, 'unicode-bidi': 1, 'max-width': 1,
+					'font-family': 1, 'caption-side': 1, 
+					'border-right-width': 1, 'pause-before': 1,
+					'border-top-style': 1, 'color': 1, 'border-collapse': 1,
+					'border-bottom-width': 1, 'float': 1, 'height': 1,
+					'max-height': 1, 'margin-right': 1, 'border-top-width': 1,
+					'speak': 1, 'speak-header': 1, 'top': 1, 'cue-before': 1,
+					'min-width': 1, 'width': 1, 'font-variant': 1,
+					'border-top-color': 1, 'background-position': 1,
+					'empty-cells': 1, 'direction': 1, 'border-right': 1,
+					'visibility': 1, 'padding': 1, 'border-style': 1,
+					'background-attachment': 1, 'overflow': 1,
+					'border-bottom-style': 1, 'cursor': 1, 'margin': 1,
+					'display': 1, 'border-left-width': 1, 'letter-spacing': 1,
+					'vertical-align': 1, 'clip': 1, 'border-color': 1,
+					'list-style': 1, 'padding-bottom': 1, 'pause-after': 1,
+					'speak-numeral': 1, 'margin-left': 1, 'widows': 1,
+					'border': 1, 'font-style': 1, 'border-left-color': 1,
+					'pitch-range': 1, 'background-repeat': 1, 
+					'table-layout': 1, 'margin-bottom': 1, 
+					'speak-punctuation': 1, 'font-weight': 1,
+					'border-right-color': 1, 'page-break-after': 1, 
+					'position': 1, 'white-space': 1, 'text-indent': 1,
+					'background-image': 1, 'volume': 1, 'stress': 1, 
+					'outline': 1, 'clear': 1, 'z-index': 1, 
+					'text-decoration': 1, 'margin-top': 1, 'azimuth': 1,
+					'cue-after': 1, 'left': 1, 'list-style-position': 1
+				},
+				contains: ['comment', 'value']
+			},
+			dhc.C_BLOCK_COMMENT_MODE,
+			{
+				className: 'value',
+				begin: ':', 
+				end: ';', 
+				endsWithParent: true, 
+				excludeBegin: true, 
+				excludeEnd: true
+			}
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/delphi.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/delphi.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/delphi.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,122 @@
+if(!dojo._hasResource["dojox.highlight.languages.delphi"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.highlight.languages.delphi"] = true;
+dojo.provide("dojox.highlight.languages.delphi"); 
+
+dojo.require("dojox.highlight._base");
+
+(function(){ 
+	var DELPHI_KEYWORDS = {
+		'and': 1, 'safecall': 1, 'cdecl': 1, 'then': 1, 'string': 1, 
+		'exports': 1, 'library': 1, 'not': 1, 'pascal': 1, 'set': 1, 
+		'virtual': 1, 'file': 1, 'in': 1, 'array': 1, 'label': 1, 'packed': 1,
+		'end.': 1, 'index': 1, 'while': 1, 'const': 1, 'raise': 1, 'for': 1,
+		'to': 1, 'implementation': 1, 'with': 1, 'except': 1, 'overload': 1,
+		'destructor': 1, 'downto': 1, 'finally': 1, 'program': 1, 'exit': 1,
+		'unit': 1, 'inherited': 1, 'override': 1, 'if': 1, 'type': 1, 
+		'until': 1, 'function': 1, 'do': 1, 'begin': 1, 'repeat': 1, 'goto': 1,
+		'nil': 1, 'far': 1, 'initialization': 1, 'object': 1, 'else': 1, 
+		'var': 1, 'uses': 1, 'external': 1, 'resourcestring': 1, 
+		'interface': 1, 'end': 1, 'finalization': 1, 'class': 1, 'asm': 1,
+		'mod': 1, 'case': 1, 'on': 1, 'shr': 1, 'shl': 1, 'of': 1, 
+		'register': 1, 'xorwrite': 1, 'threadvar': 1, 'try': 1, 'record': 1,
+		'near': 1, 'stored': 1, 'constructor': 1, 'stdcall': 1, 'inline': 1,
+		'div': 1, 'out': 1, 'or': 1, 'procedure': 1
+	};
+	var DELPHI_CLASS_KEYWORDS = {
+		'safecall': 1, 'stdcall': 1, 'pascal': 1, 'stored': 1, 'const': 1,
+		'implementation': 1, 'finalization': 1, 'except': 1, 'to': 1,
+		'finally': 1, 'program': 1, 'inherited': 1, 'override': 1, 'then': 1,
+		'exports': 1, 'string': 1, 'read': 1, 'not': 1, 'mod': 1, 'shr': 1,
+		'try': 1, 'div': 1, 'shl': 1, 'set': 1, 'library': 1, 'message': 1,
+		'packed': 1, 'index': 1, 'for': 1, 'near': 1, 'overload': 1, 
+		'label': 1, 'downto': 1, 'exit': 1, 'public': 1, 'goto': 1,
+		'interface': 1, 'asm': 1, 'on': 1, 'of': 1, 'constructor': 1, 'or': 1,
+		'private': 1, 'array': 1, 'unit': 1, 'raise': 1, 'destructor': 1,
+		'var': 1, 'type': 1, 'until': 1, 'function': 1, 'else': 1, 
+		'external': 1, 'with': 1, 'case': 1, 'default': 1, 'record': 1,
+		'while': 1, 'protected': 1, 'property': 1, 'procedure': 1, 
+		'published': 1, 'and': 1, 'cdecl': 1, 'do': 1, 'threadvar': 1, 
+		'file': 1, 'in': 1, 'if': 1, 'end': 1, 'virtual': 1, 'write': 1, 
+		'far': 1, 'out': 1, 'begin': 1, 'repeat': 1, 'nil': 1,
+		'initialization': 1, 'object': 1, 'uses': 1, 'resourcestring': 1,
+		'class': 1, 'register': 1, 'xorwrite': 1, 'inline': 1
+	};
+
+	var dh = dojox.highlight, dhc = dh.constants;
+	dh.languages.delphi = {
+		defaultMode: {
+			lexems: [dhc.IDENT_RE],
+			illegal: '("|\\$[G-Zg-z]|\\/\\*|</)',
+			contains: ['comment', 'string', 'number', 'function', 'class'],
+			keywords: DELPHI_KEYWORDS
+		},
+		case_insensitive: true,
+		modes: [
+			{
+				className: 'comment',
+				begin: '{', end: '}'
+			},
+			{
+				className: 'comment',
+				begin: '\\(\\*', end: '\\*\\)',
+				relevance: 10
+			},
+			dhc.C_LINE_COMMENT_MODE,
+			{
+				className: 'number',
+				begin: dhc.NUMBER_RE, end: '^',
+				relevance: 0
+			},
+			{
+				className: 'string',
+				begin: '\'', end: '\'',
+				contains: ['quote'],
+				relevance: 0
+			},
+			{
+				className: 'string',
+				begin: '(#\\d+)+', end: '^'
+			},
+			{
+				className: 'quote',
+				begin: '\'\'', end: '^'
+			},
+			{
+				className: 'function',
+				begin: 'function', end: '[:;]',
+				lexems: [dhc.IDENT_RE],
+				keywords: {'function': 1},
+				contains: ['title', 'params', 'comment'],
+				relevance: 0
+			},
+			{
+				className: 'function',
+				begin: '(procedure|constructor|destructor)', end: ';',
+				lexems: [dhc.IDENT_RE],
+				keywords: {'constructor': 1, 'destructor': 1, 'procedure': 1},
+				contains: ['title', 'params', 'comment'],
+				relevance: 10
+			},
+			{
+				className: 'title',
+				begin: dhc.IDENT_RE, end: '^'
+			},
+			{
+				className: 'params',
+				begin: '\\(', end: '\\)',
+				lexems: [dhc.IDENT_RE],
+				keywords: DELPHI_KEYWORDS,
+				contains: ['string']
+			},
+			{
+				className: 'class',
+				begin: '=\\s*class', end: 'end;',
+				lexems: [dhc.IDENT_RE],
+				keywords: DELPHI_CLASS_KEYWORDS,
+				contains: ['string', 'comment', 'function']
+			}
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/django.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/django.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/django.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,97 @@
+if(!dojo._hasResource["dojox.highlight.languages.django"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.highlight.languages.django"] = true;
+dojo.provide("dojox.highlight.languages.django"); 
+
+dojo.require("dojox.highlight._base");
+dojo.require("dojox.highlight.languages.xml");
+dojo.require("dojox.highlight.languages.html");
+
+(function(){ 
+	var dh = dojox.highlight, dhc = dh.constants, dhl = dh.languages, x = dhl.xml, h = dhl.html;
+	dhl.django = {
+		defaultMode: {
+			contains: ['tag', 'comment', 'doctype', 'template_comment', 'template_tag', 'variable']
+		},
+		case_insensitive: true,
+		modes: [
+			x.XML_COMMENT,
+			h.HTML_DOCTYPE,
+			{
+				className: 'tag',
+				lexems: [dhc.IDENT_RE],
+				keywords: h.HTML_TAGS,
+				begin: '<[A-Za-z/]', end: '>',
+				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: '"'
+			}
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/html.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/html.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/html.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: '<!DOCTYPE', end: '>',
+		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
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/javascript.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/javascript.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/javascript.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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']
+			}
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/_html.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/_html.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/_html.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/_www.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/_www.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/_www.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/css.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/css.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/css.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"
+				]
+			}
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/html.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/html.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/html.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: "<!--", end: "-->"
+			},
+			{
+				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: "\\<script\\b", end: "\\</script\\>",
+				relevance: 5
+			},
+			{
+				className: "_style",
+				begin: "\\<style\\b", end: "\\</style\\>",
+				relevance: 5
+			},
+			
+			{
+				className: "_tag",
+				begin: "\\<(?!/)", end: "\\>",
+				contains: ["name tag", "name attribute", "string", "_value"]
+			},
+			{
+				className: "_tag",
+				begin: "\\</", end: "\\>",
+				contains: ["name tag"]
+			},
+			{
+				className: "_value",
+				begin: "[^\\s\\>]+", end: "^"
+			}
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/javascript.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/javascript.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/javascript.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+			}
+			*/
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/xml.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/xml.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/pygments/xml.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: "<!--", end: "-->"
+		},
+		{
+			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: "\\</", end: "\\>",
+			contains: ["name tag"]
+		}
+	]
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/python.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/python.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/python.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: '$'
+        }
+      ]
+    };
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/sql.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/sql.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/sql.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		]
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/xml.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/xml.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/languages/xml.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: '<!--', end: '-->'
+	};
+	
+	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: '</?', end: '>',
+				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
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/highlight.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/highlight.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/highlight.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/highlight.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/highlight.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/highlight.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/autumn.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/autumn.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/autumn.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/autumn.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/autumn.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/autumn.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/borland.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/borland.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/borland.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/borland.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/borland.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/borland.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/colorful.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/colorful.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/colorful.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/colorful.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/colorful.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/colorful.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/default.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/default.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/default.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/default.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/default.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/default.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/emacs.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/emacs.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/emacs.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/emacs.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/emacs.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/emacs.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/friendly.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/friendly.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/friendly.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/friendly.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/friendly.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/friendly.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/fruity.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/fruity.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/fruity.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/fruity.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/fruity.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/fruity.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/manni.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/manni.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/manni.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/manni.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/manni.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/manni.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/murphy.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/murphy.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/murphy.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/murphy.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/murphy.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/murphy.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/native.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/native.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/native.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/native.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/native.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/native.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/pastie.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/pastie.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/pastie.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/pastie.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/pastie.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/pastie.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/perldoc.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/perldoc.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/perldoc.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/perldoc.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/perldoc.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/perldoc.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/trac.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/trac.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/trac.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/trac.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/trac.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight/resources/pygments/trac.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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}

Added: branches/vhffs-design/vhffs-panel/js/dojox/highlight.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/highlight.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/highlight.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"); 
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/Gallery.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/Gallery.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/Gallery.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxx)
+//
+// 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:"<div dojoAttachPoint=\"outerNode\" class=\"imageGalleryWrapper\">\n\t<div dojoAttachPoint=\"thumbPickerNode\"></div>\n\t<div dojoAttachPoint=\"slideShowNode\"></div>\n</div>\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");
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/Lightbox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/Lightbox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/Lightbox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:
+	// |	<a href="image1.jpg" dojoType="dojox.image.Lightbox">show lightbox</a>
+	//
+	// example: 
+	// |	<a href="image2.jpg" dojoType="dojox.image.Lightbox" group="one">show group lightbox</a>
+	// |	<a href="image3.jpg" dojoType="dojox.image.Lightbox" group="one">show group lightbox</a>
+	//
+	// 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.
+	// |	<div dojoType="dojox.image.Lightbox" group="fromStore" store="storeName"></div>
+	//
+	// 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:"<div class=\"dojoxLightbox\" dojoAttachPoint=\"containerNode\">\n\t<div style=\"position:relative\">\n\t\t<div dojoAttachPoint=\"imageContainer\" class=\"dojoxLightboxContainer\">\n\t\t\t<img dojoAttachPoint=\"imgNode\" src=\"${imgUrl}\" class=\"dojoxLightboxImage\" alt=\"${title}\">\n\t\t\t<div class=\"dojoxLightboxFooter\" dojoAttachPoint=\"titleNode\">\n\t\t\t\t<div class=\"dijitInline LightboxClose\" dojoAttachPoint=\"closeNode\"></div>\n\t\t\t\t<div class=\"dijitInline LightboxNext\" dojoAttachPoint=\"nextNode\"></div>\t\n\t\t\t\t<div class=\"dijitInline LightboxPrev\" dojoAttachPoint=\"prevNode\"></div>\n\n\t\t\t\t<div class=\"dojoxLightboxText\"><span dojoAttachPoint=\"textNode\">${title}</span><span dojoAttachPoint=\"groupCount\" class=\"dojoxLightboxGroupText\"></span></div>\n\t\t\t</div>\n\t\t</div>\t\n\t\t\n\t</div>\n</div>\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.inGroup.length){
+			this._positionIndex++;
+		}else{
+			this._positionIndex = 0;
+		}
+		this._loadImage();
+	},
+
+	_prevImage: function(){
+		// summary: Load previous image in group
+
+		if(this.inGroup){ 
+			if(this._positionIndex == 0){
+				this._positionIndex = this.inGroup.length - 1;
+			}else{
+				this._positionIndex--;
+			}
+			this._loadImage();
+		}
+	},
+
+	_loadImage: function(){
+		// summary: Do the prep work before we can show another image 
+		this._loadingAnim.play(1);
+	},
+
+	_prepNodes: function(){
+		// summary: A localized hook to accompany _loadImage
+		this._imageReady = false; 
+		this.show({
+			href: this.inGroup[this._positionIndex].href,
+			title: this.inGroup[this._positionIndex].title
+		});
+	},
+
+	resizeTo: function(/* Object */size){
+		// summary: Resize our dialog container, and fire _showImage
+		
+		if(this.adjust && (size.h + 80 > 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 });
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/Magnifier.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/Magnifier.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/Magnifier.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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(x<this.offset.x || y<this.offset.y || x>xMax || 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 });	
+
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/MagnifierLite.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/MagnifierLite.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/MagnifierLite.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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";
+		}
+
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxx)
+-------------------------------------------------------------------------------
+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)

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/SlideShow.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/SlideShow.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/SlideShow.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxx)
+//
+//	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} <span class="slideShowCounterText">(${current} of ${total})</span>',
+
+	// 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:"<div dojoAttachPoint=\"outerNode\" class=\"slideShowWrapper\">\n\t<div style=\"position:relative;\" dojoAttachPoint=\"innerWrapper\">\n\t\t<div class=\"slideShowNav\" dojoAttachEvent=\"onclick: _handleClick\">\n\t\t\t<div class=\"dijitInline slideShowTitle\" dojoAttachPoint=\"titleNode\">${title}</div>\n\t\t</div>\n\t\t<div dojoAttachPoint=\"navNode\" class=\"slideShowCtrl\" dojoAttachEvent=\"onclick: _handleClick\">\n\t\t\t<span dojoAttachPoint=\"navPrev\" class=\"slideShowCtrlPrev\"></span>\n\t\t\t<span dojoAttachPoint=\"navPlay\" class=\"slideShowCtrlPlay\"></span>\n\t\t\t<span dojoAttachPoint=\"navNext\" class=\"slideShowCtrlNext\"></span>\n\t\t</div>\n\t\t<div dojoAttachPoint=\"largeNode\" class=\"slideShowImageWrapper\"></div>\t\t\n\t\t<div dojoAttachPoint=\"hiddenNode\" class=\"slideShowHidden\"></div>\n\t</div>\n</div>\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 <span>)
+		
+		//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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/ThumbnailPicker.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/ThumbnailPicker.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/ThumbnailPicker.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxx)
+//
+// 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:"<div dojoAttachPoint=\"outerNode\" class=\"thumbOuter\">\n\t<div dojoAttachPoint=\"navPrev\" class=\"thumbNav thumbClickable\">\n\t  <img src=\"\" dojoAttachPoint=\"navPrevImg\"/>    \n\t</div>\n\t<div dojoAttachPoint=\"thumbScroller\" class=\"thumbScroller\">\n\t  <div dojoAttachPoint=\"thumbsNode\" class=\"thumbWrapper\"></div>\n\t</div>\n\t<div dojoAttachPoint=\"navNext\" class=\"thumbNav thumbClickable\">\n\t  <img src=\"\" dojoAttachPoint=\"navNextImg\"/>  \n\t</div>\n</div>\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);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Gallery.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Gallery.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Gallery.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+<div dojoAttachPoint="outerNode" class="imageGalleryWrapper">
+	<div dojoAttachPoint="thumbPickerNode"></div>
+	<div dojoAttachPoint="slideShowNode"></div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Lightbox.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Lightbox.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Lightbox.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,15 @@
+<div class="dojoxLightbox" dojoAttachPoint="containerNode">
+	<div style="position:relative">
+		<div dojoAttachPoint="imageContainer" class="dojoxLightboxContainer">
+			<img dojoAttachPoint="imgNode" src="${imgUrl}" class="dojoxLightboxImage" alt="${title}">
+			<div class="dojoxLightboxFooter" dojoAttachPoint="titleNode">
+				<div class="dijitInline LightboxClose" dojoAttachPoint="closeNode"></div>
+				<div class="dijitInline LightboxNext" dojoAttachPoint="nextNode"></div>	
+				<div class="dijitInline LightboxPrev" dojoAttachPoint="prevNode"></div>
+
+				<div class="dojoxLightboxText"><span dojoAttachPoint="textNode">${title}</span><span dojoAttachPoint="groupCount" class="dojoxLightboxGroupText"></span></div>
+			</div>
+		</div>	
+		
+	</div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Magnifier.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Magnifier.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Magnifier.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+.glassNode {
+	overflow:hidden;
+	position:absolute;
+	visibility:hidden;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Magnifier.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Magnifier.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/resources/Magnifier.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,5 @@
+.glassNode {
+	overflow:hidden;
+	position:absolute;
+	visibility:hidden;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/SlideShow.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/resources/SlideShow.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/resources/SlideShow.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+<div dojoAttachPoint="outerNode" class="slideShowWrapper">
+	<div style="position:relative;" dojoAttachPoint="innerWrapper">
+		<div class="slideShowNav" dojoAttachEvent="onclick: _handleClick">
+			<div class="dijitInline slideShowTitle" dojoAttachPoint="titleNode">${title}</div>
+		</div>
+		<div dojoAttachPoint="navNode" class="slideShowCtrl" dojoAttachEvent="onclick: _handleClick">
+			<span dojoAttachPoint="navPrev" class="slideShowCtrlPrev"></span>
+			<span dojoAttachPoint="navPlay" class="slideShowCtrlPlay"></span>
+			<span dojoAttachPoint="navNext" class="slideShowCtrlNext"></span>
+		</div>
+		<div dojoAttachPoint="largeNode" class="slideShowImageWrapper"></div>		
+		<div dojoAttachPoint="hiddenNode" class="slideShowHidden"></div>
+	</div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/ThumbnailPicker.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/resources/ThumbnailPicker.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/resources/ThumbnailPicker.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,11 @@
+<div dojoAttachPoint="outerNode" class="thumbOuter">
+	<div dojoAttachPoint="navPrev" class="thumbNav thumbClickable">
+	  <img src="" dojoAttachPoint="navPrevImg"/>    
+	</div>
+	<div dojoAttachPoint="thumbScroller" class="thumbScroller">
+	  <div dojoAttachPoint="thumbsNode" class="thumbWrapper"></div>
+	</div>
+	<div dojoAttachPoint="navNext" class="thumbNav thumbClickable">
+	  <img src="" dojoAttachPoint="navNextImg"/>  
+	</div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/image.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/resources/image.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/resources/image.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/image.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/image/resources/image.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/image/resources/image.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/buttons.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/buttons.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/buttons.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/buttons.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/close.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/close.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/close_dark.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/close_dark.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/left.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/left.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/loading.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/loading.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/right.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/warning.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/image/resources/images/warning.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/io/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/io/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/io/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,45 @@
+-------------------------------------------------------------------------------
+DojoX IO
+-------------------------------------------------------------------------------
+Version 0.3.1
+Release date: 09/06/2007
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits
+	Bryan Forbes (bryan@xxxxxxxxxxxxxxxxxx)
+-------------------------------------------------------------------------------
+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.

Added: branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,82 @@
+-------------------------------------------------------------------------------
+Project Name
+-------------------------------------------------------------------------------
+Version 0.6
+Release date: 01/31/2008
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits
+	James Burke (jburke@xxxxxxxxxxxxxxx)
+-------------------------------------------------------------------------------
+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.
+
+
+
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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];
+				}
+			}
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip_client.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip_client.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip_client.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,102 @@
+<!--
+	/*
+		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/community/licensing.shtml
+	*/
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
+
+<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en">
+<head>
+	<title></title>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
+	<!-- Security protection: uncomment the start and end script tags to enable. -->
+	<!-- script type="text/javascript" -->
+	// <!--
+	
+	function pollHash(){
+		//Can't use location.hash because at least Firefox does a decodeURIComponent on it.
+		var urlParts = window.location.href.split("#");
+		if(urlParts.length == 2){
+			var newHash = urlParts[1];
+			if(newHash != xipCurrentHash){
+				try{
+					callMaster(xipStateId, newHash);
+				}catch(e){
+					//Make sure to not keep processing the error hash value.
+					xipCurrentHash = newHash;
+					throw e;
+				}
+				xipCurrentHash = newHash;
+			}
+		}
+	}
+
+	function unpackMessage(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};
+	}
+
+	//************** Init **************************
+	xipCurrentHash = "";
+	
+	//Decode the init params
+	var fragId = window.location.href.split("#")[1];
+	var config = unpackMessage(fragId).config;
+
+	xipStateId = config.id;
+	xipMasterFrame = parent.parent;
+
+	//Set up an HTML5 messaging publisher if postMessage exists.
+	//As of this writing, this is only useful to get Opera 9.25+ to work.
+	if(typeof document.postMessage != "undefined"){
+		callMaster = function(stateId, message){
+			xipMasterFrame.document.postMessage(stateId + "#" + message);
+		}
+	}else{
+		var parts = config.callback.split(".");
+		xipCallbackObject = xipMasterFrame;
+		for(var i = 0; i < parts.length - 1; i++){
+			xipCallbackObject = xipCallbackObject[parts[i]];
+		}
+		xipCallback = parts[parts.length - 1];
+
+		callMaster = function(stateId, message){
+			xipCallbackObject[xipCallback](stateId + "#" + message);
+		}
+	}
+
+	//Call the master frame to let it know it is OK to start sending.
+	callMaster(xipStateId, "0:loaded");
+	
+	//Start counter to inspect hash value.
+	setInterval(pollHash, 10);
+
+	// -->
+	<!-- </script> -->
+</head>
+<body>
+	<h4>The Dojo Toolkit -- xip_client.html</h4>
+
+	<p>This file is used for Dojo's XMLHttpRequest Iframe Proxy. This is the "client" file used
+	internally by dojox.io.proxy.xip.</p>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip_server.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip_server.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/io/proxy/xip_server.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,382 @@
+<!--
+	/*
+		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/community/licensing.shtml
+	*/
+	Pieces taken from Dojo source to make this file stand-alone
+-->
+<html>
+<head>
+	<title></title>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
+	<script type="text/javascript" src="isAllowed.js"></script>
+	<!--
+	BY DEFAULT THIS FILE DOES NOT WORK SO THAT YOU DON'T ACCIDENTALLY EXPOSE
+	ALL OF YOUR XHR-ENABLED SERVICES ON YOUR SITE. 
+	
+	In order for this file to work, you need to uncomment the start and end script tags,
+	and you should define a function with the following signature:
+	
+	function isAllowedRequest(request){
+		return false;	
+	}
+	
+	Return true out of the function if you want to allow the cross-domain request.
+	
+	DON'T DEFINE THIS FUNCTION IN THIS FILE! Define it in a separate file called isAllowed.js
+	and include it in this page with a script tag that has a src attribute pointing to the file.
+	See the very first script tag in this file for an example. You do not have to place the
+	script file in the same directory as this file, just update the path above if you move it
+	somewhere else.
+	
+	Customize the isAllowedRequest function to restrict what types of requests are allowed
+	for this server. The request object has the following properties:
+	- requestHeaders: an object with the request headers that are to be added to
+	                  the XHR request.
+	- method: the HTTP method (GET, POST, etc...)
+	- uri: The URI for the request.
+	- data: The URL-encoded data for the request. For a GET request, this would
+	        be the querystring parameters. For a POST request, it wll be the
+	        body data.
+	        
+	See xip_client.html for more info on the xip fragment identifier protocol.	
+	-->
+	
+	<!-- Security protection: uncomment the script tag to enable. -->
+	<!-- script type="text/javascript" -->
+	// <!--
+		//Core XHR handling taken from Dojo IO code.
+		dojo = {};
+		dojo.hostenv = {};
+		// These are in order of decreasing likelihood; this will change in time.
+		dojo.hostenv._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
+		
+		dojo.hostenv.getXmlhttpObject = function(){
+				var http = null;
+			var last_e = null;
+			try{ http = new XMLHttpRequest(); }catch(e){}
+				if(!http){
+				for(var i=0; i<3; ++i){
+					var progid = dojo.hostenv._XMLHTTP_PROGIDS[i];
+					try{
+						http = new ActiveXObject(progid);
+					}catch(e){
+						last_e = e;
+					}
+		
+					if(http){
+						dojo.hostenv._XMLHTTP_PROGIDS = [progid];  // so faster next time
+						break;
+					}
+				}
+		
+				/*if(http && !http.toString) {
+					http.toString = function() { "[object XMLHttpRequest]"; }
+				}*/
+			}
+		
+			if(!http){
+				throw "xip_server.html: XMLHTTP not available: " + last_e;
+			}
+		
+			return http;
+		}
+
+		dojo.setHeaders = function(http, headers){
+			if(headers) {
+				for(var header in headers) {
+					var headerValue = headers[header];
+					http.setRequestHeader(header, headerValue);
+				}
+			}
+		}
+
+	//MSIE has the lowest limit for URLs with fragment identifiers,
+	//at around 4K. Choosing a slightly smaller number for good measure.
+	xipUrlLimit = 4000;
+	xipIdCounter = 1;
+
+	function xipServerInit(){
+		xipStateId = "";
+		xipCurrentHash = "";
+		xipRequestMessage = "";
+		xipResponseParts = [];
+		xipPartIndex = 0;
+	}
+
+	function pollHash(){
+		//Can't use location.hash because at least Firefox does a decodeURIComponent on it.
+		var urlParts = window.location.href.split("#");
+		if(urlParts.length == 2){
+			var newHash = urlParts[1];
+			if(newHash != xipCurrentHash){
+				try{
+					messageReceived(newHash);
+				}catch(e){
+					//Make sure to not keep processing the error hash value.
+					xipCurrentHash = newHash;
+					throw e;
+				}
+				xipCurrentHash = newHash;
+			}
+		}
+	}
+
+	function messageReceived(encodedData){
+		var msg = unpackMessage(encodedData);
+		
+		switch(msg.command){
+			case "ok":
+				sendResponsePart();
+				break;
+			case "start":
+				xipRequestMessage = "";
+				xipRequestMessage += msg.message;
+				setClientUrl("ok");
+				break;
+			case "part":
+				xipRequestMessage += msg.message;			
+				setClientUrl("ok");
+				break;
+			case "end":
+				setClientUrl("ok");
+				xipRequestMessage += msg.message;
+				sendXhr();
+				break;
+		}
+	}
+
+	function sendResponse(encodedData){
+		//Break the message into parts, if necessary.
+		xipResponseParts = [];
+		var resData = encodedData;
+		var urlLength = xipClientUrl.length;
+		var partLength = xipUrlLimit - urlLength;
+		var resIndex = 0;
+
+		while((resData.length - resIndex) + urlLength > xipUrlLimit){
+			var part = resData.substring(resIndex, resIndex + 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);
+			}
+			xipResponseParts.push(part);
+			resIndex += part.length;
+		}
+		xipResponseParts.push(resData.substring(resIndex, resData.length));
+		
+		xipPartIndex = 0;
+		sendResponsePart();
+	}
+	
+	function sendResponsePart(){
+		if(xipPartIndex < xipResponseParts.length){
+			//Get the message part.
+			var partData = xipResponseParts[xipPartIndex];
+			
+			//Get the command.
+			var cmd = "part";
+			if(xipPartIndex + 1 == xipResponseParts.length){
+				cmd = "end";
+			}else if (xipPartIndex == 0){
+				cmd = "start";
+			}
+
+			setClientUrl(cmd, partData);
+			xipPartIndex++;
+		}else{
+			xipServerInit();
+		}
+	}
+
+	function setClientUrl(cmd, message){
+		var clientUrl = makeClientUrl(cmd, message);
+		//Safari won't let us replace across domains.
+		if(navigator.userAgent.indexOf("Safari") == -1){
+			xipClientWindow.location.replace(clientUrl);
+		}else{
+			xipClientWindow.location = clientUrl;
+		}
+	}
+
+	function makeClientUrl(cmd, message){
+		var clientUrl = xipClientUrl + "#" + (xipIdCounter++) + ":" + cmd;
+		if(message){
+			clientUrl += ":" + message;
+		}
+		return clientUrl
+	}
+
+	function xhrDone(xhr){
+		/* Need to pull off and return the following data:
+			- responseHeaders
+			- status
+			- statusText
+			- responseText
+		*/
+		var response = {};
+	
+		if(typeof(xhr.getAllResponseHeaders) != "undefined"){
+			var allHeaders = xhr.getAllResponseHeaders();
+			if(allHeaders){
+				response.responseHeaders = allHeaders;
+			}
+		}
+		
+		if(xhr.status == 0 || xhr.status){
+			response.status = xhr.status;
+		}
+		
+		if(xhr.statusText){
+			response.statusText = xhr.statusText;
+		}
+		
+		if(xhr.responseText){
+			response.responseText = xhr.responseText;
+		}
+	
+		//Build a string of the response object.
+		var result = "";
+		var isFirst = true;
+		for (var param in response){
+			if(isFirst){
+				isFirst = false;
+			}else{
+				result += "&";
+			}
+			result += param + "=" + encodeURIComponent(response[param]);
+		}
+		sendResponse(result);
+	}
+
+	function sendXhr(){
+		var request = {};
+		var nvPairs = xipRequestMessage.split("&");
+		var i = 0;
+		var nameValue = null;
+		for(i = 0; i < nvPairs.length; i++){
+			if(nvPairs[i]){
+				var nameValue = nvPairs[i].split("=");
+				request[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]);
+			}
+		}
+
+		//Split up the request headers, if any.
+		var headers = {};
+		if(request.requestHeaders){
+			nvPairs = request.requestHeaders.split("\r\n");
+			for(i = 0; i < nvPairs.length; i++){
+				if(nvPairs[i]){
+					nameValue = nvPairs[i].split(": ");
+					headers[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]);
+				}
+			}
+
+			request.requestHeaders = headers;
+		}
+		
+		if(isAllowedRequest(request)){
+		
+			//The request is allowed, so set up the XHR object.
+			var xhr = dojo.hostenv.getXmlhttpObject();
+			
+			//Start timer to look for readyState.
+			var xhrIntervalId = setInterval(function(){
+			
+				if(xhr.readyState == 4){
+					clearInterval(xhrIntervalId);
+					xhrDone(xhr);
+				}
+			}, 10);
+
+			//Actually start up the XHR request.
+			xhr.open(request.method, request.uri, true);
+			dojo.setHeaders(xhr, request.requestHeaders);
+			
+			var content = "";
+			if(request.data){
+				content = request.data;
+			}
+
+			try{
+				xhr.send(content);
+			}catch(e){
+				if(typeof xhr.abort == "function"){
+					xhr.abort();
+					xhrDone({status: 404, statusText: "xip_server.html error: " + e});
+				}
+			}
+		}
+	}
+
+	function unpackMessage(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};
+	}
+
+	function onServerLoad(){
+		xipServerInit();
+
+		//Decode the init params
+		var config = unpackMessage(window.location.href.split("#")[1]).config;
+
+		xipStateId = config.id;
+		xipClientUrl = config.client;
+		
+		//Make sure we don't have a javascript: url, just for good measure.
+		if(xipClientUrl.split(":")[0].match(/javascript/i)){
+			throw "Invalid client URL";
+		}
+		if(!xipStateId.match(/^XhrIframeProxy[0-9]+$/)){
+			throw "Invalid state ID";
+		}
+	
+		setInterval(pollHash, 10);
+		
+		var serverUrl = window.location.href.split("#")[0];
+		document.getElementById("iframeHolder").innerHTML = '<iframe name="'
+			+ xipStateId + '_clientEndPoint'
+			+ '" src="javascript:false">'
+			+ '</iframe>';
+		xipClientWindow = document.getElementsByTagName("iframe")[0];
+		xipClientWindow.src = makeClientUrl("init", 'id=' + xipStateId + "&callback=" + encodeURIComponent(config.callback));
+		if(xipClientWindow.contentWindow){
+			xipClientWindow = xipClientWindow.contentWindow;
+		}
+	}
+
+	if(typeof(window.addEventListener) == "undefined"){
+		window.attachEvent("onload", onServerLoad);
+	}else{
+		window.addEventListener('load', onServerLoad, false);
+	}
+	// -->
+	<!-- </script> -->
+</head>
+<body>
+	<h4>The Dojo Toolkit -- xip_server.html</h4>
+
+	<p>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.</p>
+	<div id="iframeHolder"></div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/io/xhrMultiPart.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/io/xhrMultiPart.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/io/xhrMultiPart.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}));
+	}
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.

Added: branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/query.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/query.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/jsonPath/query.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<paths.length;j++){
+			var p = "$";
+			var x= paths[j];
+			for (var i=1,n=x.length; i<n; i++)
+				p += /^[0-9*]+$/.test(x[i]) ? ("["+x[i]+"]") : ("['"+x[i]+"']");
+			paths[j]=p;
+		  }
+			return paths;
+		},
+		exec: function(locs, val, rb){
+			var path = ['$'];
+			var result=rb?val:[val];
+			var paths=[path];
+			function add(v, p,def){
+			  if (v && v.hasOwnProperty(p) && P.resultType != "VALUE") paths.push(path.concat([p]));
+				if (def) 
+				  result = v[p];
+			  else if (v && v.hasOwnProperty(p))  
+					result.push(v[p]);
+			}
+			function desc(v){
+				result.push(v);
+				paths.push(path);
+				P.walk(v,function(i){
+					if (typeof v[i] ==='object')  {
+						var oldPath = path;
+						path = path.concat(i);
+						desc(v[i]);
+						path = oldPath;
+					}
+				});
+			}
+			function slice(loc, val){
+				if (val instanceof Array){
+					var len=val.length, start=0, end=len, step=1;
+					loc.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g, function($0,$1,$2,$3){start=parseInt($1||start);end=parseInt($2||end);step=parseInt($3||step);});
+					start = (start < 0) ? Math.max(0,start+len) : Math.min(len,start);
+					end = (end < 0) ? Math.max(0,end+len) : Math.min(len,end);
+				  	for (var i=start; i<end; i+=step)
+						add(val,i);
+				}
+			}
+			function repStr(str){
+				var i=loc.match(/^_str\(([0-9]+)\)$/);
+				return i?strs[i[1]]:str;
+			}
+			function oper(val){
+				if (/^\(.*?\)$/.test(loc)) // [(expr)]
+					add(val, P.eval(loc, val),rb);
+				else if (loc === "*"){
+					P.walk(val, rb && val instanceof Array ? // if it is result based, there is no point to just return the same array
+					function(i){P.walk(val[i],function(j){ add(val[i],j); })} :
+					function(i){ add(val,i); });
+				}
+				else if (loc === "..") 
+					desc(val);
+				else if (/,/.test(loc)){ // [name1,name2,...]
+					for (var s=loc.split(/'?,'?/),i=0,n=s.length; i<n; i++)
+						add(val,repStr(s[i])); 
+				}
+				else if (/^\?\(.*?\)$/.test(loc)) // [?(expr)]
+					P.walk(val, function(i){ if (P.eval(loc.replace(/^\?\((.*?)\)$/,"$1"),val[i])) add(val,i); });
+				else if (/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(loc)) // [start:end:step]  python slice syntax
+					slice(loc, val);
+				else {
+					loc=repStr(loc);
+					if (rb && val instanceof Array && !/^[0-9*]+$/.test(loc)) 
+						P.walk(val, function(i){ add(val[i], loc)});
+					else 
+						add(val,loc,rb);		
+				}
+
+			}
+			while (locs.length){
+				var loc = locs.shift();
+				if ((val = result) === null || val===undefined) return val;
+				result = [];
+				var valPaths = paths;
+				paths = [];
+				if (rb) 
+					oper(val)
+				else
+					P.walk(val,function(i){path=valPaths[i]||path;oper(val[i])});
+			}
+			if (P.resultType == "BOTH"){
+				paths = P.asPaths(paths);
+				var newResult = [];
+				for (var i =0;i <paths.length;i++)
+					newResult.push({path:paths[i],value:result[i]});
+				return newResult;
+			}
+			return P.resultType == "PATH" ? P.asPaths(paths):result;
+		},
+		walk: function(val, f){
+			if (val instanceof Array){
+				for (var i=0,n=val.length; i<n; i++)
+					if (i in val)
+						f(i);
+			}
+			else if (typeof val === "object"){
+				for (var m in val)
+					if (val.hasOwnProperty(m))
+						f(m);
+			}
+		},
+		eval: function(x, _v){
+			try { return $ && _v && eval(x.replace(/@/g,'_v')); }
+			catch(e){ throw new SyntaxError("jsonPath: " + e.message + ": " + x.replace(/@/g, "_v").replace(/\^/g, "_a")); }
+		}
+	};
+
+	var $ = obj;
+	if (expr && obj){
+		return P.exec(P.normalize(expr).slice(1), obj, arg.evalType == "RESULT");
+	}	
+
+	return false;
+
+}; 
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/jsonPath.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/jsonPath.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/jsonPath.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+-------------------------------------------------------------------------------
+dojox.lang
+-------------------------------------------------------------------------------
+Version 0.991
+Release date: 07/30/2007
+-------------------------------------------------------------------------------
+Project state:
+[beta]
+-------------------------------------------------------------------------------
+Credits
+	Eugene Lazutkin (eugene.lazutkin@xxxxxxxxx)
+-------------------------------------------------------------------------------
+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.

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/array.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/array.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/array.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/curry.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/curry.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/curry.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+			};
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/fold.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/fold.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/fold.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/lambda.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/lambda.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/lambda.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/listcomp.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/listcomp.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/listcomp.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/object.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/object.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/object.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/reversed.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/reversed.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/reversed.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/scan.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/scan.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/scan.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/sequence.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/sequence.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/sequence.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/zip.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/zip.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional/zip.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/functional.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/functional.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/functional.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/lang/utils.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/lang/utils.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/lang/utils.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/BorderContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/BorderContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/BorderContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/ContentPane.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/ContentPane.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/ContentPane.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:
+	// <input src="..." style="url(..)"/> or <a style="url(..)" href="..">
+	// <img style='filter:progid...AlphaImageLoader(src="noticeTheSrcHereRunsThroughHtmlSrc")' src="img">
+	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 <!DOCTYPE.. and <title>..</title> tag **********/
+		// khtml is picky about dom faults, you can't attach a <style> or <title> node as child of body
+		// must go into head, so we need to cut out those tags
+		return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, "");
+	}
+
+	function snarfStyles(/*String*/cssUrl, /*String*/cont, /*Array*/styles){
+		/****************  cut out all <style> and <link rel="stylesheet" href=".."> **************/
+		// also return any attributes from this tag (might be a media attribute)
+		// if cssUrl is set it will adjust paths accordingly
+		styles.attributes = [];
+
+		return cont.replace(/(?:<style([^>]*)>([\s\S]*?)<\/style>|<link\s+(?=[^>]*rel=['"]?stylesheet)([^>]*?href=(['"])([^>]*?)\4[^>\/]*)\/?>)/gi,
+			function(ignore, styleAttr, cssText, linkAttr, delim, href){
+				// trim attribute
+				var i, attr = (styleAttr||linkAttr||"").replace(/^\s*([\s\S]*?)\s*$/i, "$1"); 
+				if(cssText){
+					i = styles.push(cssUrl ? adjustCssPaths(cssUrl, cssText) : cssText);
+				}else{
+					i = styles.push('@import "' + href + '";')
+					attr = attr.replace(/\s*(?:rel|href)=(['"])?[^\s]*\1\s*/gi, ""); // remove rel=... and href=...
+				}
+				if(attr){
+					attr = attr.split(/\s+/);// split on both "\n", "\t", " " etc
+					var atObj = {}, tmp;
+					for(var j = 0, e = attr.length; j < e; j++){
+						tmp = attr[j].split('=')// split name='value'
+						atObj[tmp[0]] = tmp[1].replace(/^\s*['"]?([\s\S]*?)['"]?\s*$/, "$1"); // trim and remove ''
+					}
+					styles.attributes[i - 1] = atObj;
+				}
+				return ""; // squelsh the <style> or <link>
+			}
+		);
+	}
+
+	function snarfScripts(cont, byRef){
+		// summary
+		//		strips out script tags from cont
+		// invoke with 
+		//	byRef = {errBack:function(){/*add your download error code here*/, downloadRemote: true(default false)}}
+		//	byRef will have {code: 'jscode'} when this scope leaves
+		byRef.code = "";
+
+		function download(src){
+			if(byRef.downloadRemote){
+				// console.debug('downloading',src);
+				dojo.xhrGet({
+					url: src,
+					sync: true,
+					load: function(code){
+						byRef.code += code+";";
+					},
+					error: byRef.errBack
+				});
+			}
+		}
+		
+		// match <script>, <script type="text/..., but not <script type="dojo(/method)...
+		return cont.replace(/<script\s*(?![^>]*type=['"]?dojo)(?:[^>]*?(?:src=(['"]?)([^>]*?)\1[^>]*)?)*>([\s\S]*?)<\/script>/gi,
+			function(ignore, delim, src, code){
+				if(src){
+					download(src);
+				}else{
+					byRef.code += code;
+				}
+				return "";
+			}
+		);
+	}
+
+	function evalInGlobal(code, appendNode){
+		// we do our own eval here as dojo.eval doesn't eval in global crossbrowser
+		// This work X browser but but it relies on a DOM
+		// plus it doesn't return anything, thats unrelevant here but not for dojo core
+		appendNode = appendNode || dojo.doc.body;
+		var n = appendNode.ownerDocument.createElement('script');
+		n.type = "text/javascript";
+		appendNode.appendChild(n);
+		n.text = code; // DOM 1 says this should work
+	}
+
+	/*=====
+	dojox.layout.ContentPane.DeferredHandle = {
+		// cancel: Function
+		cancel: function(){
+			// summary: cancel a in flight download
+		},
+
+		addOnLoad: function(func){
+			// summary: add a callback to the onLoad chain
+			// func: Function
+		},
+
+		addOnUnload: function(func){
+			// summary: add a callback to the onUnload chain
+			// func: Function
+		}
+	}
+	=====*/
+
+
+dojo.declare("dojox.layout.ContentPane", dijit.layout.ContentPane, {
+	// summary:
+	//		An extended version of dijit.layout.ContentPane
+	//		Supports infile scrips and external ones declared by <script src=''
+	//		relative path adjustments (content fetched from a different folder)
+	//		<style> and <link rel='stylesheet' href='..'> tags,
+	//		css paths inside cssText is adjusted (if you set adjustPaths = true)
+	//
+	//		NOTE that dojo.require in script in the fetched file isn't recommended
+	//		Many widgets need to be required at page load to work properly
+
+	// adjustPaths: Boolean
+	//		Adjust relative paths in html string content to point to this page
+	//		Only usefull if you grab content from a another folder then the current one
+	adjustPaths: false,
+
+	// cleanContent: Boolean
+	//	summary:
+	//		cleans content to make it less likly to generate DOM/JS errors.
+	//	description:
+	//		usefull if you send contentpane a complete page, instead of a html fragment
+	//		scans for 
+	//
+	//			* style nodes, inserts in Document head
+	//			* title Node, remove
+	//			* DOCTYPE tag, remove
+	//			* `<!-- *JS code here* -->`
+	//			* `<![CDATA[ *JS code here* ]]>`
+	cleanContent: false,
+
+	// renderStyles: Boolean
+	//		trigger/load styles in the content
+	renderStyles: false,
+
+	// executeScripts: Boolean
+	//		Execute (eval) scripts that is found in the content
+	executeScripts: true,
+
+	// scriptHasHooks: Boolean
+	//		replace keyword '_container_' in scripts with 'dijit.byId(this.id)'
+	// NOTE this name might change in the near future
+	scriptHasHooks: false,
+
+	/*======
+	// ioMethod: dojo.xhrGet|dojo.xhrPost
+	//		reference to the method that should grab the content
+	ioMethod: dojo.xhrGet,
+	
+	// ioArgs: Object
+	//		makes it possible to add custom args to xhrGet, like ioArgs.headers['X-myHeader'] = 'true'
+	ioArgs: {},
+
+	// onLoadDeferred: dojo.Deferred
+	//		callbackchain will start when onLoad occurs
+	onLoadDeferred: new dojo.Deferred(),
+
+	// onUnloadDeferred: dojo.Deferred
+	//		callbackchain will start when onUnload occurs
+	onUnloadDeferred: new dojo.Deferred(),
+
+	setHref: function(url){
+		// summary: replace current content with url's content
+		return ;// dojox.layout.ContentPane.DeferredHandle
+	},
+
+	refresh: function(){
+		summary: force a re-download of content
+		return ;// dojox.layout.ContentPane.DeferredHandle 
+	},
+
+	======*/
+
+	constructor: function(){
+		// init per instance properties, initializer doesn't work here because how things is hooked up in dijit._Widget
+		this.ioArgs = {};
+		this.ioMethod = dojo.xhrGet;
+		this.onLoadDeferred = new dojo.Deferred();
+		this.onUnloadDeferred = new dojo.Deferred();
+	},
+
+	postCreate: function(){
+		// override to support loadDeferred
+		this._setUpDeferreds();
+
+		dijit.layout.ContentPane.prototype.postCreate.apply(this, arguments);
+	},
+
+	onExecError: function(e){
+		// summary
+		//		event callback, called on script error or on java handler error
+		//		overide and return your own html string if you want a some text 
+		//		displayed within the ContentPane
+	},
+
+	setContent: function(data){
+		// summary: set data as new content, sort of like innerHTML
+		// data: String|DomNode|NodeList|dojo.NodeList
+		if(!this._isDownloaded){
+			var defObj = this._setUpDeferreds();
+		}
+
+		dijit.layout.ContentPane.prototype.setContent.apply(this, arguments);
+		return defObj; // dojox.layout.ContentPane.DeferredHandle
+	},
+
+	cancel: function(){
+		// summary: cancels a inflight download
+		if(this._xhrDfd && this._xhrDfd.fired == -1){
+			// we are still in flight, which means we should reset our DeferredHandle
+			// otherwise we will trigger onUnLoad chain of the canceled content,
+			// the canceled content have never gotten onLoad so it shouldn't get onUnload
+			this.onUnloadDeferred = null;
+		}
+		dijit.layout.ContentPane.prototype.cancel.apply(this, arguments);
+	},
+
+	_setUpDeferreds: function(){
+		var _t = this, cancel = function(){ _t.cancel();	}
+		var onLoad = (_t.onLoadDeferred = new dojo.Deferred());
+		var onUnload = (_t._nextUnloadDeferred = new dojo.Deferred());
+		return {
+			cancel: cancel,
+			addOnLoad: function(func){onLoad.addCallback(func);},
+			addOnUnload: function(func){onUnload.addCallback(func);}
+		};
+	},
+
+	_onLoadHandler: function(){
+		dijit.layout.ContentPane.prototype._onLoadHandler.apply(this, arguments);
+		if(this.onLoadDeferred){
+			this.onLoadDeferred.callback(true);
+		}
+	},
+
+	_onUnloadHandler: function(){
+		this.isLoaded = false;
+		this.cancel();// need to cancel so we don't get any inflight suprises
+		if(this.onUnloadDeferred){
+			this.onUnloadDeferred.callback(true);
+		}
+
+		dijit.layout.ContentPane.prototype._onUnloadHandler.apply(this, arguments);
+
+		if(this._nextUnloadDeferred){
+			this.onUnloadDeferred = this._nextUnloadDeferred;
+		}
+	},
+
+	_onError: function(type, err){
+		dijit.layout.ContentPane.prototype._onError.apply(this, arguments);
+		if(this.onLoadDeferred){
+			this.onLoadDeferred.errback(err);
+		}
+	},
+
+	_prepareLoad: function(forceLoad){
+		// sets up for a xhrLoad, load is deferred until widget is showing
+		var defObj = this._setUpDeferreds();
+
+		dijit.layout.ContentPane.prototype._prepareLoad.apply(this, arguments);
+
+		return defObj;
+	},
+
+	_setContent: function(cont){
+		// override dijit.layout.ContentPane._setContent, to enable path adjustments
+		var styles = [];// init vars
+		if(dojo.isString(cont)){
+			if(this.adjustPaths && this.href){
+				cont = adjustHtmlPaths(this.href, cont);
+			}
+			if(this.cleanContent){
+				cont = secureForInnerHtml(cont);
+			}
+			if(this.renderStyles || this.cleanContent){
+				cont = snarfStyles(this.href, cont, styles);
+			}
+
+			// because of a bug in IE, script tags that is first in html hierarchy doesnt make it into the DOM 
+			//	when content is innerHTML'ed, so we can't use dojo.query to retrieve scripts from DOM
+			if(this.executeScripts){
+				var _t = this, code, byRef = {
+					downloadRemote: true,
+					errBack:function(e){
+						_t._onError.call(_t, 'Exec', 'Error downloading remote script in "'+_t.id+'"', e);
+					}
+				};
+				cont = snarfScripts(cont, byRef);
+				code = byRef.code;
+			}
+
+			// rationale for this block:
+			// if containerNode/domNode is a table derivate tag, some browsers dont allow innerHTML on those
+			var node = (this.containerNode || this.domNode), pre = post = '', walk = 0;
+			switch(node.nodeName.toLowerCase()){
+				case 'tr':
+					pre = '<tr>'; post = '</tr>';
+					walk += 1;//fallthrough
+				case 'tbody': case 'thead':// children of THEAD is of same type as TBODY
+					pre = '<tbody>' + pre; post += '</tbody>';
+					walk += 1;// falltrough
+				case 'table':
+					pre = '<table>' + pre; post += '</table>';
+					walk += 1;
+					break;
+			}
+			if(walk){
+				var n = node.ownerDocument.createElement('div');
+				n.innerHTML = pre + cont + post;
+				do{
+					n = n.firstChild;
+				}while(--walk);
+				cont = n.childNodes;
+			}
+		}
+
+		// render the content
+		dijit.layout.ContentPane.prototype._setContent.call(this, cont);
+
+		// clear old stylenodes from the DOM
+		if(this._styleNodes && this._styleNodes.length){
+			while(this._styleNodes.length){
+				dojo._destroyElement(this._styleNodes.pop());
+			}
+		}
+		// render new style nodes
+		if(this.renderStyles && styles && styles.length){
+			this._renderStyles(styles);
+		}
+
+		if(this.executeScripts && code){
+			if(this.cleanContent){
+				// clean JS from html comments and other crap that browser
+				// parser takes care of in a normal page load
+				code = code.replace(/(<!--|(?:\/\/)?-->|<!\[CDATA\[|\]\]>)/g, '');
+			}
+			if(this.scriptHasHooks){
+				// replace _container_ with dijit.byId(this.id)
+				code = code.replace(/_container_(?!\s*=[^=])/g, dijit._scopeName + ".byId('"+this.id+"')");
+			}
+			try{
+				evalInGlobal(code, (this.containerNode || this.domNode));
+			}catch(e){
+				this._onError('Exec', 'Error eval script in '+this.id+', '+e.message, e);
+			}
+		}
+	},
+
+	_renderStyles: function(styles){
+		// insert css from content into document head
+		this._styleNodes = [];
+		var st, att, cssText, doc = this.domNode.ownerDocument;
+		var head = doc.getElementsByTagName('head')[0];
+
+		for(var i = 0, e = styles.length; i < e; i++){
+			cssText = styles[i]; att = styles.attributes[i];
+			st = doc.createElement('style');
+			st.setAttribute("type", "text/css"); // this is required in CSS spec!
+
+			for(var x in att){
+				st.setAttribute(x, att[x])
+			}
+			
+			this._styleNodes.push(st);
+			head.appendChild(st); // must insert into DOM before setting cssText
+
+			if(st.styleSheet){ // IE
+				st.styleSheet.cssText = cssText;
+			}else{ // w3c
+				st.appendChild(doc.createTextNode(cssText));
+			}
+		}
+	}
+});
+
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/DragPane.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/DragPane.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/DragPane.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,65 @@
+if(!dojo._hasResource["dojox.layout.DragPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.layout.DragPane"] = true;
+dojo.provide("dojox.layout.DragPane");
+
+dojo.require("dijit._Widget");
+
+dojo.declare("dojox.layout.DragPane",
+	dijit._Widget, {
+	//
+	// summary: Makes a pane's content dragable by/within it's surface
+	//
+	// description:
+	//		A small widget which takes a node with overflow:auto and
+	//		allows dragging to position the content. Useful with images,
+	//		or for just adding "something" to a overflow-able div.
+	//
+	// invert: Boolean
+	//		Naturally, the behavior is to invert the axis of the drag.
+	//		Setting invert:false will make the pane drag in the same
+	//		direction as the mouse.
+	invert:true,
+	
+	postCreate: function(){
+
+		this.inherited(arguments);
+		this.connect(this.domNode,"onmousedown","_down");
+		this.connect(this.domNode,"onmouseup","_up");
+	},
+	
+	_down: function(e){
+		// summary: mousedown handler, start the dragging
+		var t = this.domNode;
+		dojo.style(t,"cursor","move");
+		this._x = e.pageX;
+		this._y = e.pageY;
+		if ((this._x < t.offsetLeft + t.clientWidth) &&
+			(this._y < t.offsetTop + t.clientHeight)) {
+			dojo.setSelectable(t,false);
+			this._mover = dojo.connect(t,"onmousemove",this,"_move");		
+		}
+	},
+	
+	_up: function(e){
+		// summary: mouseup handler, stop the dragging
+		
+		dojo.setSelectable(this.domNode,true);
+		dojo.style(this.domNode,"cursor","pointer");
+		dojo.disconnect(this._mover);
+	},
+	
+	_move: function(e){
+		// summary: mousemove listener, offset the scroll amount by the delta
+		//		since our last call.
+		
+		var mod = this.invert ? 1 : -1;
+		this.domNode.scrollTop += (this._y - e.pageY) * mod;
+		this.domNode.scrollLeft += (this._x - e.pageX) * mod;
+		this._x = e.pageX;
+		this._y = e.pageY;
+		
+	}
+	
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/ExpandoPane.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/ExpandoPane.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/ExpandoPane.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,208 @@
+if(!dojo._hasResource["dojox.layout.ExpandoPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.layout.ExpandoPane"] = true;
+dojo.provide("dojox.layout.ExpandoPane");
+dojo.experimental("dojox.layout.ExpandoPane"); // just to show it can be done?
+
+dojo.require("dijit.layout.ContentPane");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Container");
+
+dojo.declare("dojox.layout.ExpandoPane",
+	[dijit.layout.ContentPane, dijit._Templated, dijit._Contained],
+	{
+	// summary: An experimental expando-pane for dijit.layout.BorderContainer
+	//
+	// description:
+	//		Works just like a ContentPane inside of a borderContainer. Will expand/collapse on
+	//		command, and supports having Layout Children as direct descendants
+	//		via a custom "attachParent" attribute on the child.
+
+	maxHeight:"",
+	maxWidth:"",
+	splitter:"",
+
+	tamplateString:null,
+	templateString:"<div class=\"dojoxExpandoPane\" dojoAttachEvent=\"ondblclick:toggle\" >\n\t<div dojoAttachPoint=\"titleWrapper\" class=\"dojoxExpandoTitle\">\n\t\t<div class=\"dojoxExpandoIcon\" dojoAttachPoint=\"iconNode\" dojoAttachEvent=\"onclick:toggle\"><span class=\"a11yNode\">X</span></div>\t\t\t\n\t\t<span class=\"dojoxExpandoTitleNode\" dojoAttachPoint=\"titleNode\">${title}</span>\n\t</div>\n\t<div class=\"dojoxExpandoWrapper\" dojoAttachPoint=\"cwrapper\" dojoAttachEvent=\"ondblclick:_trap\">\n\t\t<div class=\"dojoxExpandoContent\" dojoAttachPoint=\"containerNode\"></div>\n\t</div>\n</div>\n",
+
+	_showing:true,
+	_titleHeight: 28, // FIXME: calculate
+
+	// easeOut: String|Function
+	//		easing function used to hide pane
+	easeOut:"dojo._DefaultEasing",
+	// easeIn: String|Function
+	//		easing function use to show pane
+	easeIn:"dojo._DefaultEasing",
+	// duration: Integer
+	//		duration to run show/hide animations
+	duration:420,
+	
+	postCreate:function(){
+
+		this.inherited(arguments);
+		this._animConnects = [];
+
+		this._isHorizontal = true;
+		
+		this._container = this.getParent();
+		this._closedSize = this._titleHeight = dojo.marginBox/*_getBorderBox*/(this.titleWrapper).h;
+	
+		if(typeof this.easeOut == "string"){
+			this.easeOut = dojo.getObject(this.easeOut);
+		}
+		if(typeof this.easeIn == "string"){
+			this.easeIn = dojo.getObject(this.easeIn); 
+		}
+	
+		var thisClass = "";
+		if(this.region){
+			// FIXME: add suport for alternate region types?
+			switch(this.region){
+				case "right" :
+					thisClass = "Right";
+					break;
+				case "left" :
+					thisClass = "Left";
+					break;
+				case "top" :
+					thisClass = "Top";
+					break;
+				case "bottom" :
+					thisClass = "Bottom"; 
+					break;
+			}
+			dojo.addClass(this.domNode,"dojoxExpando"+thisClass);
+			this._isHorizontal = /top|bottom/.test(this.region);
+		}
+		dojo.style(this.domNode,"overflow","hidden");
+	},
+	
+	startup: function(){
+		this.inherited(arguments);
+		if(this.splitter){
+			// find our splitter and tie into it's drag logic
+			var myid = this.id;
+			dijit.registry.filter(function(w){
+				return w && w.child && w.child.id == myid;
+			}).forEach(dojo.hitch(this,function(w){
+				this.connect(w,"_stopDrag","_afterResize");
+			}));
+		}
+		this._currentSize = dojo.marginBox(this.domNode);
+		this._showSize = this._currentSize[(this._isHorizontal ? "h" : "w")];
+		this._setupAnims();
+	},
+	
+	_afterResize: function(e){
+		var tmp = this._currentSize;
+		this._currentSize = dojo.marginBox(this.domNode);
+		var n = this._currentSize[(this._isHorizontal ? "h" : "w")] 
+		if(n> this._titleHeight){
+			if(!this._showing){
+				console.log('done being dragged:',e);			
+				this._showing = !this._showing; 
+				this._showEnd();
+			}
+			this._showSize = n;
+			this._setupAnims();
+		}else{
+			this._showSize = tmp[(this._isHorizontal ? "h" : "w")];
+			this._showing = false;
+			this._hideWrapper();
+			this._hideAnim.gotoPercent(89,true);
+		}
+
+	},
+	
+	_setupAnims:function(){
+		// summary: create the show and hide animations
+		dojo.forEach(this._animConnects,dojo.disconnect);
+		
+		var _common = {
+			node:this.domNode,
+			duration:this.duration
+		};
+
+		var isHorizontal = this._isHorizontal;
+		var showProps = {};
+		var hideProps = {};
+
+		var dimension = isHorizontal ? "height" : "width";
+		showProps[dimension] = { 
+			end: this._showSize, 
+			unit:"px" 
+		};
+		hideProps[dimension] = { 
+			end: this._closedSize, 
+			unit:"px"
+		};
+
+		this._showAnim = dojo.animateProperty(dojo.mixin(_common,{
+			easing:this.easeIn,
+			properties: showProps 
+		}));
+		this._hideAnim = dojo.animateProperty(dojo.mixin(_common,{
+			easing:this.easeOut,
+			properties: hideProps
+		}));
+
+		this._animConnects = [
+			dojo.connect(this._showAnim,"onEnd",this,"_showEnd"),
+			dojo.connect(this._hideAnim,"onEnd",this,"_hideEnd")
+		];
+	},
+	
+	toggle:function(e){
+		// summary: toggle this pane's visibility
+		if(this._showing){
+			this._hideWrapper();
+			if(this._showAnim && this._showAnim.stop()){}
+			this._hideAnim.play();
+		}else{
+			if(this._hideAnim && this._hideAnim.stop()){}
+			this._showAnim.play();
+		}
+		this._showing = !this._showing;
+	},
+	
+	_hideWrapper:function(){
+		dojo.style(this.cwrapper,{
+				"visibility":"hidden",
+				"opacity":"0",
+				"overflow":"hidden"
+		});
+	},
+	
+	_showEnd: function(){
+		// summary: common animation onEnd code
+		dojo.style(this.cwrapper,{ "opacity":"0", "visibility":"visible" });
+		dojo.fadeIn({ node:this.cwrapper, duration:227 }).play(1);
+		dojo.removeClass(this.domNode,"dojoxExpandoClosed");
+		setTimeout(dojo.hitch(this._container, "layout"), 15);
+	},
+	
+	_hideEnd: function(){
+		dojo.addClass(this.domNode,"dojoxExpandoClosed");
+		setTimeout(dojo.hitch(this._container, "layout"), 15);
+	},
+	
+	resize: function(){
+		// summary: we aren't a layout widget, but need to act like one:
+		var size = dojo.marginBox(this.domNode);
+		// FIXME: do i even need to do this query/forEach? why not just set the containerHeight always
+		dojo.query("[attachParent]",this.domNode).forEach(function(n){
+			if(dijit.byNode(n)){
+				var h = size.h - this._titleHeight;
+				dojo.style(this.containerNode,"height", h +"px");
+			}
+		},this);
+		this.inherited(arguments);
+	},
+	
+	_trap: function(e){
+		dojo.stopEvent(e);
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/FloatingPane.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/FloatingPane.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/FloatingPane.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,394 @@
+if(!dojo._hasResource["dojox.layout.FloatingPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.layout.FloatingPane"] = true;
+dojo.provide("dojox.layout.FloatingPane");
+dojo.experimental("dojox.layout.FloatingPane"); 
+
+dojo.require("dojox.layout.ContentPane");
+dojo.require("dijit._Templated"); 
+dojo.require("dijit._Widget"); 
+dojo.require("dojo.dnd.Moveable");
+dojo.require("dojox.layout.ResizeHandle"); 
+
+dojo.declare("dojox.layout.FloatingPane", 
+	[ dojox.layout.ContentPane, dijit._Templated ],
+	{
+	// summary:
+	//		A non-modal Floating window.
+	//
+	// description:
+	// 		Makes a dijit.ContentPane float and draggable by it's title [similar to TitlePane]
+	// 		and over-rides onClick to onDblClick for wipeIn/Out of containerNode
+	// 		provides minimize(dock) / show() and hide() methods, and resize [almost] 
+	//
+	// closable: Boolean
+	//		Allow closure of this Node
+	closable: true,
+
+	// dockable: Boolean
+	//		Allow minimizing of pane if true
+	dockable: true,
+
+	// resizable: Boolean
+	//		Allow resizing of pane true if true
+	resizable: false,
+
+	// maxable: Boolean
+	//		Horrible param name for "Can you maximize this floating pane?"
+	maxable: false,
+
+	// resizeAxis: String
+	//		One of: x | xy | y to limit pane's sizing direction
+	resizeAxis: "xy",
+
+	// title: String
+	//		Title to use in the header
+	title: "",
+
+	// dockTo: DomNode?
+	//		if empty, will create private layout.Dock that scrolls with viewport
+	//		on bottom span of viewport.	
+	dockTo: "",
+
+	// duration: Integer
+	//		Time is MS to spend toggling in/out node
+	duration: 400,
+
+	/*=====
+	// iconSrc: String
+	//		[not implemented yet] will be either icon in titlepane to left
+	//		of Title, and/or icon show when docked in a fisheye-like dock
+	//		or maybe dockIcon would be better?
+	iconSrc: null,
+	=====*/
+
+	// contentClass: String
+	// 		The className to give to the inner node which has the content
+	contentClass: "dojoxFloatingPaneContent",
+
+	// animation holders for toggle
+	_showAnim: null,
+	_hideAnim: null, 
+	// node in the dock (if docked)
+	_dockNode: null,
+
+	// privates:
+	_restoreState: {},
+	_allFPs: [],
+	_startZ: 100,
+
+	templateString: null,
+	templateString:"<div class=\"dojoxFloatingPane\" id=\"${id}\">\n\t<div tabindex=\"0\" waiRole=\"button\" class=\"dojoxFloatingPaneTitle\" dojoAttachPoint=\"focusNode\">\n\t\t<span dojoAttachPoint=\"closeNode\" dojoAttachEvent=\"onclick: close\" class=\"dojoxFloatingCloseIcon\"></span>\n\t\t<span dojoAttachPoint=\"maxNode\" dojoAttachEvent=\"onclick: maximize\" class=\"dojoxFloatingMaximizeIcon\"></span>\n\t\t<span dojoAttachPoint=\"restoreNode\" dojoAttachEvent=\"onclick: _restore\" class=\"dojoxFloatingRestoreIcon\"></span>\t\n\t\t<span dojoAttachPoint=\"dockNode\" dojoAttachEvent=\"onclick: minimize\" class=\"dojoxFloatingMinimizeIcon\"></span>\n\t\t<span dojoAttachPoint=\"titleNode\" class=\"dijitInline dijitTitleNode\"></span>\n\t</div>\n\t<div dojoAttachPoint=\"canvas\" class=\"dojoxFloatingPaneCanvas\">\n\t\t<div dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\" class=\"${contentClass}\">\n\t\t</div>\n\t\t<span dojoAttachPoint=\"resizeHandle\" class=\"dojoxFloatingResizeHandle\"></span>\n\t</div>\n</div>\n",
+	
+	postCreate: function(){
+	
+		this.setTitle(this.title);
+		this.inherited(arguments);
+		var move = new dojo.dnd.Moveable(this.domNode,{ handle: this.focusNode });
+		//this._listener = dojo.subscribe("/dnd/move/start",this,"bringToTop"); 
+
+		if(!this.dockable){ this.dockNode.style.display = "none"; } 
+		if(!this.closable){ this.closeNode.style.display = "none"; } 
+		if(!this.maxable){
+			this.maxNode.style.display = "none";
+			this.restoreNode.style.display = "none";
+		}
+		if(!this.resizable){
+			this.resizeHandle.style.display = "none"; 	
+		}else{
+			var foo = dojo.marginBox(this.domNode); 
+			this.domNode.style.width = foo.w+"px"; 
+		}		
+		this._allFPs.push(this);
+		this.domNode.style.position = "absolute";
+	},
+	
+	startup: function(){
+		if(this._started){ return; }
+		
+		this.inherited(arguments);
+
+		if(this.resizable){
+			if(dojo.isIE){
+					this.canvas.style.overflow = "auto";
+			}else{
+					this.containerNode.style.overflow = "auto";
+			}
+			
+			this._resizeHandle = new dojox.layout.ResizeHandle({ 
+				targetId: this.id, 
+				resizeAxis: this.resizeAxis 
+			},this.resizeHandle);
+
+		}
+
+		if(this.dockable){ 
+			// FIXME: argh.
+			var tmpName = this.dockTo; 
+
+			if(this.dockTo){
+				this.dockTo = dijit.byId(this.dockTo); 
+			}else{
+				this.dockTo = dijit.byId('dojoxGlobalFloatingDock');
+			}
+
+			if(!this.dockTo){
+				var tmpId; var tmpNode;
+				// we need to make our dock node, and position it against
+				// .dojoxDockDefault .. this is a lot. either dockto="node"
+				// and fail if node doesn't exist or make the global one
+				// once, and use it on empty OR invalid dockTo="" node?
+				if(tmpName){ 
+					tmpId = tmpName;
+					tmpNode = dojo.byId(tmpName); 
+				}else{
+					tmpNode = document.createElement('div');
+					dojo.body().appendChild(tmpNode);
+					dojo.addClass(tmpNode,"dojoxFloatingDockDefault");
+					tmpId = 'dojoxGlobalFloatingDock';
+				}
+				this.dockTo = new dojox.layout.Dock({ id: tmpId, autoPosition: "south" },tmpNode);
+				this.dockTo.startup(); 
+			}
+			
+			if((this.domNode.style.display == "none")||(this.domNode.style.visibility == "hidden")){
+				// If the FP is created dockable and non-visible, start up docked.
+				this.minimize();
+			} 
+		} 		
+		this.connect(this.focusNode,"onmousedown","bringToTop");
+		this.connect(this.domNode,	"onmousedown","bringToTop");
+
+		// Initial resize to give child the opportunity to lay itself out
+		this.resize(dojo.coords(this.domNode));
+		
+		this._started = true;
+	},
+
+	setTitle: function(/* String */ title){
+		// summary: Update the Title bar with a new string
+		this.titleNode.innerHTML = title; 
+		this.title = title; 
+	},	
+		
+	close: function(){
+		// summary: Close and destroy this widget
+		if(!this.closable){ return; }
+		dojo.unsubscribe(this._listener);
+		this.hide(dojo.hitch(this,"destroyRecursive",arguments)); 
+	},
+
+	hide: function(/* Function? */ callback){
+		// summary: Close, but do not destroy this FloatingPane
+		dojo.fadeOut({
+			node:this.domNode,
+			duration:this.duration,
+			onEnd: dojo.hitch(this,function() { 
+				this.domNode.style.display = "none";
+				this.domNode.style.visibility = "hidden"; 
+				if(this.dockTo && this.dockable){
+					this.dockTo._positionDock(null);
+				}
+				if(callback){
+					callback();
+				}
+			})
+		}).play();
+	},
+
+	show: function(/* Function? */callback){
+		// summary: Show the FloatingPane
+		var anim = dojo.fadeIn({node:this.domNode, duration:this.duration,
+			beforeBegin: dojo.hitch(this,function(){
+				this.domNode.style.display = ""; 
+				this.domNode.style.visibility = "visible";
+				if (this.dockTo && this.dockable) { this.dockTo._positionDock(null); }
+				if (typeof callback == "function") { callback(); }
+				this._isDocked = false;
+				if (this._dockNode) { 
+					this._dockNode.destroy();
+					this._dockNode = null;
+				}
+			})
+		}).play();
+		this.resize(dojo.coords(this.domNode));
+	},
+
+	minimize: function(){
+		// summary: Hide and dock the FloatingPane
+		if(!this._isDocked){ this.hide(dojo.hitch(this,"_dock")); } 
+	},
+
+	maximize: function(){
+		// summary: Make this FloatingPane full-screen (viewport)	
+		if(this._maximized){ return; }
+		this._naturalState = dojo.coords(this.domNode);
+		if(this._isDocked){
+			this.show();
+			setTimeout(dojo.hitch(this,"maximize"),this.duration);
+		}
+		dojo.addClass(this.focusNode,"floatingPaneMaximized");
+		this.resize(dijit.getViewport());
+		this._maximized = true;
+	},
+
+	_restore: function(){
+		if(this._maximized){
+			this.resize(this._naturalState);
+			dojo.removeClass(this.focusNode,"floatingPaneMaximized");
+			this._maximized = false;
+		}	
+	},
+
+	_dock: function(){
+		if(!this._isDocked && this.dockable){
+			this._dockNode = this.dockTo.addNode(this);
+			this._isDocked = true;
+		}
+	},
+	
+	resize: function(/* Object */dim){
+		// summary: Size the FloatingPane and place accordingly
+		this._currentState = dim;
+
+		// From the ResizeHandle we only get width and height information
+		var dns = this.domNode.style;
+		if(dim.t){ dns.top = dim.t+"px"; }
+		if(dim.l){ dns.left = dim.l+"px"; }
+		dns.width = dim.w+"px"; 
+		dns.height = dim.h+"px";
+
+		// Now resize canvas
+		var mbCanvas = { l: 0, t: 0, w: dim.w, h: (dim.h - this.focusNode.offsetHeight) };
+		dojo.marginBox(this.canvas, mbCanvas);
+
+		// If the single child can resize, forward resize event to it so it can
+		// fit itself properly into the content area
+		this._checkIfSingleChild();
+		if(this._singleChild && this._singleChild.resize){
+			this._singleChild.resize(mbCanvas);
+		}
+	},
+	
+	bringToTop: function(){
+		// summary: bring this FloatingPane above all other panes
+		var windows = dojo.filter(
+			this._allFPs,
+			function(i){
+				return i !== this;
+			}, 
+		this);
+		windows.sort(function(a, b){
+			return a.domNode.style.zIndex - b.domNode.style.zIndex;
+		});
+		windows.push(this);
+		
+		dojo.forEach(windows, function(w, x){
+			w.domNode.style.zIndex = this._startZ + (x * 2);
+			dojo.removeClass(w.domNode, "dojoxFloatingPaneFg");
+		}, this);
+		dojo.addClass(this.domNode, "dojoxFloatingPaneFg");
+	},
+	
+	destroy: function(){
+		// summary: Destroy this FloatingPane completely
+		this._allFPs.splice(dojo.indexOf(this._allFPs, this), 1);
+		if(this._resizeHandle){
+			this._resizeHandle.destroy();
+		}
+		this.inherited(arguments);
+	}
+});
+
+
+dojo.declare("dojox.layout.Dock",
+	[dijit._Widget,dijit._Templated],
+	{
+	// summary:
+	//		A widget that attaches to a node and keeps track of incoming / outgoing FloatingPanes
+	// 		and handles layout
+
+	templateString: '<div class="dojoxDock"><ul dojoAttachPoint="containerNode" class="dojoxDockList"></ul></div>',
+
+	// private _docked: array of panes currently in our dock
+	_docked: [],
+	
+	_inPositioning: false,
+	
+	autoPosition: false,
+	
+	addNode: function(refNode){
+		// summary: Instert a dockNode refernce into the dock
+		
+		var div = document.createElement('li');
+		this.containerNode.appendChild(div);
+		var node = new dojox.layout._DockNode({ title: refNode.title, paneRef: refNode },div);
+		node.startup();
+		return node;
+	},
+
+	startup: function(){
+				
+		if (this.id == "dojoxGlobalFloatingDock" || this.isFixedDock) {
+			// attach window.onScroll, and a position like in presentation/dialog
+			dojo.connect(window,'onresize',this,"_positionDock");
+			dojo.connect(window,'onscroll',this,"_positionDock");
+			if(dojo.isIE){
+				this.connect(this.domNode, "onresize", "_positionDock");
+			}
+		}
+		this._positionDock(null);
+		this.inherited(arguments);
+
+	},
+	
+	_positionDock: function(/* Event? */e){
+		if(!this._inPositioning){	
+			if(this.autoPosition == "south"){
+				// Give some time for scrollbars to appear/disappear
+				setTimeout(dojo.hitch(this, function() {
+					this._inPositiononing = true;
+					var viewport = dijit.getViewport();
+					var s = this.domNode.style;
+					s.left = viewport.l + "px";
+					s.width = (viewport.w-2) + "px";
+					s.top = (viewport.h + viewport.t) - this.domNode.offsetHeight + "px";
+					this._inPositioning = false;
+				}), 125);
+			}
+		}
+	}
+
+
+});
+
+dojo.declare("dojox.layout._DockNode",
+	[dijit._Widget,dijit._Templated],
+	{
+	// summary:
+	//		dojox.layout._DockNode is a private widget used to keep track of
+	//		which pane is docked.
+	//
+	// title: String
+	// 		Shown in dock icon. should read parent iconSrc?	
+	title: "",
+
+	// paneRef: Widget
+	//		reference to the FloatingPane we reprasent in any given dock
+	paneRef: null,
+
+	templateString:
+		'<li dojoAttachEvent="onclick: restore" class="dojoxDockNode">'+
+			'<span dojoAttachPoint="restoreNode" class="dojoxDockRestoreButton" dojoAttachEvent="onclick: restore"></span>'+
+			'<span class="dojoxDockTitleNode" dojoAttachPoint="titleNode">${title}</span>'+
+		'</li>',
+
+	restore: function(){
+		// summary: remove this dock item from parent dock, and call show() on reffed floatingpane
+		this.paneRef.show();
+		this.paneRef.bringToTop();
+		this.destroy();
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,75 @@
+-------------------------------------------------------------------------------
+dojox.layout
+-------------------------------------------------------------------------------
+Version 1.0
+Release date: 10/31/2007
+-------------------------------------------------------------------------------
+Project state:
+[experimental | beta]
+-------------------------------------------------------------------------------
+Credits
+	Pete Higgins (dante)
+	Fredrik Johansson (fj.mumme@xxxxxxxxx)
+	Adam Peller (peller)
+	Bill Keese (bill)
+-------------------------------------------------------------------------------
+Project description
+
+	placeholder for dijit.layout extensions. Currently only:
+	
+	dojox.layout.FloatingPane - an extension on TitlePane for drag/drop
+	operation, "docking" [minimize/maximize], and [soon] resizing.
+
+	dojox.layout.ResizeHandle - resize handle to attach to a domNode.
+	works well on normal domNodes, but will require adding a resizeTo(w,h)
+	method to any widget you wish to use it on. [experimental]
+
+	dojox.layout.ContentPane - an extension on dijit ContentPane.
+	Supports inline scripts, inline styles, relative path adjustments
+	and having a table tag as domNode.
+
+	dojox.layout.RadioGroup - a stack container with sliding or fading transitions
+	(and an internal button set to mimic a tab container, but fires on hover)
+
+	dojox.layout.ScrollPane - a dynamically scrolling pane. Adjusts naturally sized content
+	to a "viewport" and scrolls based on relative mouse position. 
+
+	dojox.layout.DragPane - an experimental start of a simple Dragable pane 
+	(drag larger content around inside of a sized pane) Does not support borderContainer
+	LayoutContainer resizing yet. 
+
+-------------------------------------------------------------------------------
+Dependencies
+
+	require Dojo Core, Dojo Base (fx), and Dijit
+
+-------------------------------------------------------------------------------
+Installation:
+
+	checkout:
+
+	http://svn.dojotoolkit.org/dojo/dojox/layout/*
+	http://svn.dojotoolkit.org/dojo/dijit/*
+
+	and require via:
+		dojo.require("dojox.layout.FloatingPane");
+	or:
+		dojo.require("dojox.layout.ContentPane");
+	etc ...
+
+-------------------------------------------------------------------------------
+Basic Usage:
+
+	<div dojoType="dojox.layout.FloatingPane" title="my title">
+		Content To be Floated
+	</div>
+
+	<div dojoType="dojox.layout.ContentPane"
+		 adjustPaths="true"
+		 renderStyles="true"
+		 executeScripts="true"
+		 href="my/page/containing/scripts/and/styles/in/a/sub/folder.html"
+	>
+		Initial content, will be replace by href.
+		paths in folder.html will be adjusted to match this page
+	</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/RadioGroup.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/RadioGroup.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/RadioGroup.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,233 @@
+if(!dojo._hasResource["dojox.layout.RadioGroup"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.layout.RadioGroup"] = true;
+dojo.provide("dojox.layout.RadioGroup");
+dojo.experimental("dojox.layout.RadioGroup");
+//
+//	dojox.layout.RadioGroup - an experimental (probably poorly named) Layout widget extending StackContainer
+//	that accepts ContentPanes as children, and applies aesthetically pleasing responsive transition animations
+//	attached to :hover of the Buttons created.
+//
+//	FIXME: take the Buttons out of the root template, and allow layoutAlign or similar attrib to use a different
+//	template, or build the template dynamically? 
+//
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Container");
+dojo.require("dijit.layout.StackContainer");
+dojo.require("dojox.fx.easing"); 
+
+dojo.declare("dojox.layout.RadioGroup",
+	[dijit.layout.StackContainer,dijit._Templated],
+	{
+	// summary: A Container that turns its Layout Children into a single Pane and transitions between states
+	//	onHover of the button
+	//
+
+	// duration: Int
+	//	used for Fade and Slide RadioGroup's, the duration to run the transition animation. does not affect anything
+	//	in default RadioGroup
+	duration: 750,
+
+	// hasButtons: Boolean
+	//	toggles internal button making on or off
+	hasButtons: true,
+
+	// templateString: String
+	//	the template for our container
+	templateString: '<div class="dojoxRadioGroup">'
+			+' 	<div dojoAttachPoint="buttonHolder" style="display:none;">'
+			+'		<table class="dojoxRadioButtons"><tbody><tr class="dojoxRadioButtonRow" dojoAttachPoint="buttonNode"></tr></tbody></table>'
+			+'	</div>'
+			+'	<div class="dojoxRadioView" dojoAttachPoint="containerNode"></div>'
+			+'</div>',
+
+	startup: function(){
+		// summary: scan the container for children, and make "tab buttons" for them
+		this.inherited("startup",arguments);
+		this._children = this.getChildren();
+		this._buttons = this._children.length;
+		this._size = dojo.coords(this.containerNode);
+		if(this.hasButtons){
+			dojo.style(this.buttonHolder,"display","block");
+			dojo.forEach(this._children,this._makeButton,this);
+		}
+	},
+
+	// private:
+	_makeButton: function(/* DomNode */n){
+		// summary: creates a hover button for a child node of the RadioGroup
+		dojo.style(n.domNode,"position","absolute");
+		var tmp = document.createElement('td');
+		this.buttonNode.appendChild(tmp);
+		var tmpt = tmp.appendChild(document.createElement('div'));
+		var tmpw = new dojox.layout._RadioButton({
+			label: n.title,
+			page: n
+		},tmpt);
+		tmpw.startup();
+	},
+
+	// FIXME: shouldn't have to rewriting these, need to take styling out of _showChild and _hideChild
+	//		and use classes on the domNode in _transition or something similar (in StackContainer)
+	_transition: function(/*Widget*/newWidget, /*Widget*/oldWidget){
+		// summary: called when StackContainer receives a selectChild call, used to transition the panes.
+		this._showChild(newWidget);
+		if(oldWidget){
+			this._hideChild(oldWidget);
+		}
+		// 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);
+		}
+	},
+
+	_showChild: function(/*Widget*/ page){
+		// summary: show the selected child widget
+		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){
+		// summary: hide the specified child widget
+		page.selected=false;
+		page.domNode.style.display="none";
+		if(page.onHide){
+			page.onHide();
+		}
+	}
+
+});
+
+dojo.declare("dojox.layout.RadioGroupFade",
+	dojox.layout.RadioGroup,
+	{
+	// summary: An extension on a stock RadioGroup, that fades the panes.
+
+	_hideChild: function(page){
+		// summary: hide the specified child widget
+		dojo.fadeOut({
+			node:page.domNode,
+			duration:this.duration,
+			onEnd: this.inherited("_hideChild",arguments)
+		}).play();
+	},
+
+	_showChild: function(page){
+		// summary: show the specified child widget
+		this.inherited("_showChild",arguments);
+		dojo.style(page.domNode,"opacity",0);
+		dojo.fadeIn({
+			node:page.domNode,
+			duration:this.duration
+		}).play();
+	}
+});
+
+dojo.declare("dojox.layout.RadioGroupSlide",
+	dojox.layout.RadioGroup,
+	{
+	// summary: A Sliding Radio Group
+	// description: 
+	//		An extension on a stock RadioGroup widget, sliding the pane
+	//		into view from being hidden. The entry direction is randomized 
+	//		on each view
+	//		
+
+	// easing: dojo._Animation.easing
+	//	A hook to override the default easing of the pane slides.
+	easing: dojox.fx.easing.easeOut,
+
+	startup: function(){
+		// summary: on startup, set each of the panes off-screen (_showChild is called later)
+		this.inherited("startup",arguments);
+		dojo.forEach(this._children,this._positionChild,this);
+	},
+
+	_positionChild: function(page){
+		// summary: randomly set the child out of view
+		// description: 
+		var rA = Math.round(Math.random());
+		var rB = Math.round(Math.random());
+		dojo.style(page.domNode, rA? "top" : "left", (rB ? "-" : "") + this._size[rA?"h":"w"]+"px");
+	},
+
+	_showChild: function(page){
+		// summary: Slide in the selected child widget
+		this.inherited("_showChild",arguments);
+		if(this._anim && this._anim.status()=="playing"){
+			this._anim.gotoPercent(100,true);
+		}
+		this._anim = dojo.animateProperty({
+			node:page.domNode,
+			properties: {
+				// take a performance hit determinging one of these doesn't get modified
+				// but it's better this way than an extra call to mixin in think?
+				left: { end:0, unit:"px" },
+				top: { end:0, unit:"px" }
+			},
+			duration:this.duration,	
+			easing:this.easing
+		});
+		this._anim.play();
+	},
+
+	_hideChild: function(page){
+		// summary: reset the position of the hidden pane out of sight
+		this.inherited("_hideChild",arguments);
+		this._positionChild(page);
+	}
+});
+
+dojo.declare("dojox.layout._RadioButton",
+	[dijit._Widget,dijit._Templated,dijit._Contained],
+	{
+	// summary: The Buttons for a RadioGroup
+	//
+	// description: A private widget used to manipulate the StackContainer (RadioGroup*). Don't create directly. 
+	//	
+	
+	// label: String
+	//	the Text Label of the button
+	label: "",
+
+	// domNode to tell parent to select
+	page: null,
+
+	templateString: '<div dojoAttachPoint="focusNode" class="dojoxRadioButton"><span dojoAttachPoint="titleNode" class="dojoxRadioButtonLabel">${label}</span></div>',
+	
+	startup: function(){
+		// summary: start listening to mouseOver
+		this.connect(this.domNode,"onmouseover","_onMouse");
+	},
+	
+	_onMouse: function(/* Event */e){
+		// summary: set the selected child on hover, and set our hover state class
+		this.getParent().selectChild(this.page);
+		this._clearSelected();
+		dojo.addClass(this.domNode,"dojoxRadioButtonSelected");
+	},
+
+	_clearSelected: function(){
+		// summary: remove hover state class from sibling Buttons. This is easier (and more reliable)
+		//	than setting up an additional connection to onMouseOut
+		// FIXME: this relies on the template being [div][span]node[/span][/div]
+		dojo.query(".dojoxRadioButtonSelected",this.domNode.parentNode.parentNode).forEach(function(n){
+			dojo.removeClass(n,"dojoxRadioButtonSelected");
+		});
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/ResizeHandle.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/ResizeHandle.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/ResizeHandle.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,271 @@
+if(!dojo._hasResource["dojox.layout.ResizeHandle"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.layout.ResizeHandle"] = true;
+dojo.provide("dojox.layout.ResizeHandle");
+dojo.experimental("dojox.layout.ResizeHandle"); 
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated"); 
+dojo.require("dojo.fx"); 
+
+dojo.declare("dojox.layout.ResizeHandle",
+	[dijit._Widget, dijit._Templated],
+	{
+	// summary: A dragable handle used to resize an attached node.
+	// description:
+	//	The handle on the bottom-right corner of FloatingPane or other widgets that allows
+	//	the widget to be resized.
+	//	Typically not used directly.
+	//
+	// targetId: String
+	//	id of the Widget OR DomNode that I will size
+	targetId: '',
+
+	// targetContainer: DomNode
+	//	over-ride targetId and attch this handle directly to a reference of a DomNode
+	targetContainer: null, 
+
+	// resizeAxis: String
+	//	one of: x|y|xy limit resizing to a single axis, default to xy ... 
+	resizeAxis: "xy",
+
+	// activeResize: Boolean
+	// 	if true, node will size realtime with mouse movement, 
+	//	if false, node will create virtual node, and only resize target on mouseUp
+	activeResize: false,
+	
+	// activeResizeClass: String
+	//	css class applied to virtual resize node. 
+	activeResizeClass: 'dojoxResizeHandleClone',
+
+	// animateSizing: Boolean
+	//	only applicable if activeResize = false. onMouseup, animate the node to the
+	//	new size
+	animateSizing: true,
+	
+	// animateMethod: String
+	// 	one of "chain" or "combine" ... visual effect only. combine will "scale" 
+	// 	node to size, "chain" will alter width, then height
+	animateMethod: 'chain',
+
+	// animateDuration: Integer
+	//	time in MS to run sizing animation. if animateMethod="chain", total animation 
+	//	playtime is 2*animateDuration
+	animateDuration: 225,
+
+	// minHeight: Integer
+	//	smallest height in px resized node can be
+	minHeight: 100,
+
+	// minWidth: Integer
+	//	smallest width in px resize node can be
+	minWidth: 100,
+
+	templateString: '<div dojoAttachPoint="resizeHandle" class="dojoxResizeHandle"><div></div></div>',
+
+	postCreate: function(){
+		// summary: setup our one major listener upon creation
+		this.connect(this.resizeHandle, "onmousedown", "_beginSizing");
+		if(!this.activeResize){ 
+			// there shall be only a single resize rubberbox that at the top
+			// level so that we can overlay it on anything whenever the user
+			// resizes something. Since there is only one mouse pointer he
+			// can't at once resize multiple things interactively.
+			this._resizeHelper = dijit.byId('dojoxGlobalResizeHelper');
+
+			if (!this._resizeHelper){
+				var tmpNode = document.createElement('div');
+				tmpNode.style.display = "none";
+				dojo.body().appendChild(tmpNode);
+				dojo.addClass(tmpNode,this.activeResizeClass);
+				this._resizeHelper = new dojox.layout._ResizeHelper({ 
+						id: 'dojoxGlobalResizeHelper'},tmpNode);
+				this._resizeHelper.startup();
+			}
+		}else{ this.animateSizing = false; } 	
+
+		if (!this.minSize) { 
+			this.minSize = { w: this.minWidth, h: this.minHeight };
+		}
+		// should we modify the css for the cursor hover to n-resize nw-resize and w-resize?
+		this._resizeX = this._resizeY = false; 
+		switch (this.resizeAxis.toLowerCase()) {
+		case "xy" : 
+			this._resizeX = this._resizeY = true; 
+			// FIXME: need logic to determine NW or NE class to see
+			// based on which [todo] corner is clicked
+			dojo.addClass(this.resizeHandle,"dojoxResizeNW"); 
+			break; 
+		case "x" : 
+			this._resizeX = true; 
+			dojo.addClass(this.resizeHandle,"dojoxResizeW");
+			break;
+		case "y" : 
+			this._resizeY = true; 
+			dojo.addClass(this.resizeHandle,"dojoxResizeN");
+			break;
+		}
+	},
+
+	_beginSizing: function(/*Event*/ e){
+		// summary: setup movement listeners and calculate initial size
+		
+		if (this._isSizing){ return false; }
+
+		this.targetWidget = dijit.byId(this.targetId);
+
+		this.targetDomNode = this.targetWidget ? this.targetWidget.domNode : dojo.byId(this.targetId);
+		if (this.targetContainer) { this.targetDomNode = this.targetContainer; } 
+		if (!this.targetDomNode){ return false; }
+
+		if (!this.activeResize) {
+			var c = dojo.coords(this.targetDomNode, true);
+			this._resizeHelper.resize({l: c.x, t: c.y, w: c.w, h: c.h});
+			this._resizeHelper.show();
+		}
+
+		this._isSizing = true;
+		this.startPoint  = {'x':e.clientX, 'y':e.clientY};
+
+		// FIXME: this is funky: marginBox adds height, contentBox ignores padding (expected, but foo!)
+		var mb = (this.targetWidget) ? dojo.marginBox(this.targetDomNode) : dojo.contentBox(this.targetDomNode);  
+		this.startSize  = { 'w':mb.w, 'h':mb.h };
+
+		this._pconnects = []; 
+		this._pconnects.push(dojo.connect(document,"onmousemove",this,"_updateSizing")); 
+		this._pconnects.push(dojo.connect(document,"onmouseup", this, "_endSizing"));
+
+		e.preventDefault();
+	},
+
+	_updateSizing: function(/*Event*/ e){
+		// summary: called when moving the ResizeHandle ... determines 
+		//	new size based on settings/position and sets styles.
+
+		if(this.activeResize){
+			this._changeSizing(e);
+		}else{
+			var tmp = this._getNewCoords(e);	
+			if(tmp === false){ return; }
+			this._resizeHelper.resize(tmp);
+		}
+		e.preventDefault();
+	},
+
+	_getNewCoords: function(/* Event */ e){
+		
+		// On IE, if you move the mouse above/to the left of the object being resized,
+		// sometimes clientX/Y aren't set, apparently.  Just ignore the event.
+		try{
+			if(!e.clientX  || !e.clientY){ return false; }
+		}catch(e){
+			// sometimes you get an exception accessing above fields...
+			return false;
+		}
+		this._activeResizeLastEvent = e; 
+
+		var dx = this.startPoint.x - e.clientX;
+		var dy = this.startPoint.y - e.clientY;
+		
+		var newW = (this._resizeX) ? this.startSize.w - dx : this.startSize.w;
+		var newH = (this._resizeY) ? this.startSize.h - dy : this.startSize.h;
+
+		// minimum size check
+		if(this.minSize){
+			//var mb = dojo.marginBox(this.targetDomNode);
+			if(newW < this.minSize.w){
+				newW = this.minSize.w;
+			}
+			if(newH < this.minSize.h){
+				newH = this.minSize.h;
+			}
+		}
+		return {w:newW, h:newH};  // Object
+	},
+	
+	_changeSizing: function(/*Event*/ e){
+		// summary: apply sizing information based on information in (e) to attached node
+		var tmp = this._getNewCoords(e);
+		if(tmp===false){ return; }
+
+		if(this.targetWidget && typeof this.targetWidget.resize == "function"){ 
+			this.targetWidget.resize(tmp);
+		}else{
+			if(this.animateSizing){
+				var anim = dojo.fx[this.animateMethod]([
+					dojo.animateProperty({
+						node: this.targetDomNode,
+						properties: { 
+							width: { start: this.startSize.w, end: tmp.w, unit:'px' } 
+						},	
+						duration: this.animateDuration
+					}),
+					dojo.animateProperty({
+						node: this.targetDomNode,
+						properties: { 
+							height: { start: this.startSize.h, end: tmp.h, unit:'px' }
+						},
+						duration: this.animateDuration
+					})
+				]);
+				anim.play();
+			}else{
+				dojo.style(this.targetDomNode,"width",tmp.w+"px"); 
+				dojo.style(this.targetDomNode,"height",tmp.h+"px");
+			}
+		}	
+	},
+
+	_endSizing: function(/*Event*/ e){
+		// summary: disconnect listenrs and cleanup sizing
+		dojo.forEach(this._pconnects,dojo.disconnect);
+		if(!this.activeResize){
+			this._resizeHelper.hide();
+			this._changeSizing(e);
+		}
+		this._isSizing = false;
+		this.onResize(e);
+	},
+	
+	onResize: function(e){
+		// summary: Stub fired when sizing is done, for things like Grid
+	}
+	
+});
+
+dojo.declare("dojox.layout._ResizeHelper",
+	dijit._Widget,
+	{
+	// summary: A global private resize helper shared between any resizeHandle with activeSizing='false;
+	
+	startup: function(){
+		if(this._started){ return; }	
+		this.inherited(arguments);
+	},
+
+	show: function(){
+		// summary: show helper to start resizing
+		dojo.fadeIn({ node: this.domNode, duration:120, 
+			beforeBegin: dojo.hitch(this,function(){
+				this.domNode.style.display=''; 
+			})
+		}).play();
+	},
+
+	hide: function(){
+		// summary: hide helper after resizing is complete
+		dojo.fadeOut({ node:this.domNode, duration:250,
+			onEnd: dojo.hitch(this,function(){
+				this.domNode.style.display="none";
+			})
+		}).play();
+	},
+	
+	resize: function(/* Object */dim){
+		// summary: size the widget and place accordingly
+		
+		// FIXME: this is off when padding present
+		dojo.marginBox(this.domNode, dim);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/ScrollPane.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/ScrollPane.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/ScrollPane.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,114 @@
+if(!dojo._hasResource["dojox.layout.ScrollPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.layout.ScrollPane"] = true;
+dojo.provide("dojox.layout.ScrollPane");
+dojo.experimental("dojox.layout.ScrollPane");
+
+dojo.require("dijit.layout._LayoutWidget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dojox.layout.ScrollPane",
+	[dijit.layout._LayoutWidget,dijit._Templated],
+	{
+	// summary: A pane that "scrolls" its content based on the mouse poisition inside
+	//
+	// description:
+	//		A sizable container that takes it's content's natural size and creates
+	//		a scroll effect based on the relative mouse position. It is an interesting
+	//		way to display lists of data, or blocks of content, within a confined
+	//		space.
+	//
+	// 		Horizontal scrolling is supported. Combination scrolling is not.
+	//
+	//		FIXME: need to adust the _line somehow, it stops scrolling
+	//		
+	// example:
+	// |	<div dojoType="dojox.layout.ScrollPane" style="width:150px height:300px;">
+	// |		<!-- any height content -->
+	// |	</div>
+	//
+	// _line: dojo._Line
+	// 		storage for our top and bottom most scrollpoints
+	_line: null,
+	
+	// _lo: the height of the visible pane
+	_lo: null,
+	
+	_offset: 15,
+	
+	// orientation: String
+	//		either "horizontal" or "vertical" for scroll orientation. 
+	orientation: "vertical",
+	
+	templateString:"<div class=\"dojoxScrollWindow\" dojoAttachEvent=\"onmouseenter: _enter, onmouseleave: _leave\">\n    <div class=\"dojoxScrollWrapper\" style=\"${style}\" dojoAttachPoint=\"wrapper\" dojoAttachEvent=\"onmousemove: _calc\">\n\t<div class=\"dojoxScrollPane\" dojoAttachPoint=\"containerNode\"></div>\n    </div>\n    <div dojoAttachPoint=\"helper\" class=\"dojoxScrollHelper\"><span class=\"helperInner\">|</span></div>\n</div>\n",
+	
+	layout: function(){
+		// summary: calculates required sizes. call this if we add/remove content manually, or reload the content.
+	
+		dojo.style(this.wrapper,this._dir,this.domNode.style[this._dir]);
+		this._lo = dojo.coords(this.wrapper,true);
+		this._size = Math.max(0,(this._vertical ?
+			(this.containerNode.scrollHeight - this._lo.h)  :
+			(this.containerNode.scrollWidth - this._lo.w)     
+		));
+		this._line = new dojo._Line(0-this._offset,this._size+(this._offset*2));
+	
+		// share a relative position w the scroll offset via a line
+		var u = this._lo[(this._vertical?"h":"w")]
+		var size = u * (u / Math.max(1,this._size));
+		var center = Math.floor(u - size);        
+		this._helpLine = new dojo._Line(0,center);
+	
+		// size the helper
+		dojo.style(this.helper,this._dir,Math.floor(size)+"px");
+		
+	},
+	
+	postCreate: function(){
+		this.inherited(arguments);
+	
+		// for the helper
+		this._showAnim = dojo._fade({ node:this.helper, end:0.5, duration:350 });
+		this._hideAnim = dojo.fadeOut({ node:this.helper, duration: 750 });
+	
+		// orientation helper
+		this._vertical = (this.orientation == "vertical");
+		if(!this._vertical){
+			dojo.addClass(this.containerNode,"dijitInline");
+			this._edge = "left";
+			this._dir = "width";
+		}else{
+			this._dir = "height";
+			this._edge = "top";
+		}
+		
+		this._hideAnim.play();
+		dojo.style(this.wrapper,"overflow","hidden");
+	
+	},	
+	
+	_set: function(/* Float */n){
+		// summary: set the pane's scroll offset, and position the virtual scroll helper 
+		this.wrapper[(this._vertical ? "scrollTop" : "scrollLeft")] = Math.floor(this._line.getValue(n));
+		dojo.style(this.helper,this._edge,Math.floor(this._helpLine.getValue(n))+"px");    
+	},
+	
+	_calc: function(/* Event */e){
+		// summary: calculate the relative offset of the cursor over the node, and call _set
+		this._set(this._vertical ? 
+			((e.pageY-(this._lo.y))/this._lo.h) :
+			((e.pageX-(this._lo.x))/this._lo.w)
+		);
+	},
+	
+	_enter: function(e){
+		if(this._hideAnim && this._hideAnim.status()=="playing"){ this._hideAnim.stop(); }
+		this._showAnim.play();
+	},
+	
+	_leave: function(e){
+		this._hideAnim.play();    
+	}
+    
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,99 @@
+.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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,116 @@
+.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('../../presentation/resources/icons/prev.png') no-repeat;
+	*/
+	background: url('../../../dijit/themes/tundra/images/minusButton.gif') no-repeat;
+}
+
+.tundra .dojoxExpandoRight .dojoxExpandoIcon,
+.nihilo .dojoxExpandoRight .dojoxExpandoIcon {
+	/*
+	background: url('../../presentation/resources/icons/next.png') no-repeat;
+	*/
+	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: #ececec url("../../grid/_grid/images/tabEnabled_rotated.png") repeat-y scroll left top !important;
+	*/
+	background-color: #fafafa;
+}
+.tundra .dojoxExpandoClosed .dojoxExpandoTitle {
+	background-image: none;
+	background-color: transparent;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ExpandoPane.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+<div class="dojoxExpandoPane" dojoAttachEvent="ondblclick:toggle" >
+	<div dojoAttachPoint="titleWrapper" class="dojoxExpandoTitle">
+		<div class="dojoxExpandoIcon" dojoAttachPoint="iconNode" dojoAttachEvent="onclick:toggle"><span class="a11yNode">X</span></div>			
+		<span class="dojoxExpandoTitleNode" dojoAttachPoint="titleNode">${title}</span>
+	</div>
+	<div class="dojoxExpandoWrapper" dojoAttachPoint="cwrapper" dojoAttachEvent="ondblclick:_trap">
+		<div class="dojoxExpandoContent" dojoAttachPoint="containerNode"></div>
+	</div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,152 @@
+.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('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('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("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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,183 @@
+.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;
+}
+
+/* titleNode */
+.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; 	
+}
+
+
+/* Icons */
+.dojoxFloatingCloseIcon {
+	background:url('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('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; 	
+}
+
+/* our un-used dock styles for now */
+.dojoxFloatingDockDefault {
+	position:absolute;
+	bottom:0px;
+	left:0px;
+	overflow:hidden; 
+	margin:0;
+	margin-bottom:3px; 
+	padding:0px; 
+	width:100%;
+	z-index:99; /* position the dock _just_ below the lowest pane */
+
+	background:transparent;
+	/* background-color:#fff; 
+	border-top:1px solid #ccc; 
+	*/
+}
+
+.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;
+}
+
+/* Modifications */
+
+.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("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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/FloatingPane.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+<div class="dojoxFloatingPane" id="${id}">
+	<div tabindex="0" waiRole="button" class="dojoxFloatingPaneTitle" dojoAttachPoint="focusNode">
+		<span dojoAttachPoint="closeNode" dojoAttachEvent="onclick: close" class="dojoxFloatingCloseIcon"></span>
+		<span dojoAttachPoint="maxNode" dojoAttachEvent="onclick: maximize" class="dojoxFloatingMaximizeIcon"></span>
+		<span dojoAttachPoint="restoreNode" dojoAttachEvent="onclick: _restore" class="dojoxFloatingRestoreIcon"></span>	
+		<span dojoAttachPoint="dockNode" dojoAttachEvent="onclick: minimize" class="dojoxFloatingMinimizeIcon"></span>
+		<span dojoAttachPoint="titleNode" class="dijitInline dijitTitleNode"></span>
+	</div>
+	<div dojoAttachPoint="canvas" class="dojoxFloatingPaneCanvas">
+		<div dojoAttachPoint="containerNode" waiRole="region" tabindex="-1" class="${contentClass}">
+		</div>
+		<span dojoAttachPoint="resizeHandle" class="dojoxFloatingResizeHandle"></span>
+	</div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/RadioGroup.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/RadioGroup.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/RadioGroup.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,40 @@
+
+.dojoxRadioButtons {
+	margin:0; padding:4px;
+	width:100%;
+	outline:0;
+}
+.dojoxRadioButtons tbody  {
+	margin:0; padding:0;
+	width:100%;
+}
+.dojoxRadioButton {
+	text-align:center;
+	cursor:pointer;
+	margin:0;
+}
+.dojoxRadioButtonSelected {
+	border:1px solid #ededed;
+}
+.tundra .dojoxRadioButtonSelected {
+	border:1px solid #a0a0a0;
+	background:#b7b7b7;
+}
+.soria .dojoxRadioButtonSelected {
+	background:#b7cdee url('../../../dijit/themes/soria/images/gradientTopBg.png') repeat-x top center;
+}
+.dojoxRadioButtonLabel {
+	padding:8px;
+	text-align:center;
+	display:block;
+}
+.dojoxRadioGroup {
+	overflow:hidden;
+	border:0;
+	margin:0; padding:0;
+}
+.dojoxRadioView {
+	position:relative;
+	overflow:hidden;
+	height:100%;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/RadioGroup.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/RadioGroup.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/RadioGroup.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,45 @@
+/* RadioGroup base Button styling: */
+.dojoxRadioButtons {
+	margin:0; padding:4px;
+	width:100%;
+	outline:0;
+}
+
+.dojoxRadioButtons tbody  {
+	margin:0; padding:0;
+	width:100%;
+}
+
+.dojoxRadioButton {
+	text-align:center;
+	cursor:pointer;
+	margin:0;
+}
+
+.dojoxRadioButtonSelected {
+	border:1px solid #ededed;
+}
+.tundra .dojoxRadioButtonSelected {
+	border:1px solid #a0a0a0;
+	background:#b7b7b7;
+}
+.soria .dojoxRadioButtonSelected {
+	background:#b7cdee url('../../../dijit/themes/soria/images/gradientTopBg.png') repeat-x top center;
+}
+
+.dojoxRadioButtonLabel {
+	padding:8px;
+	text-align:center;
+	display:block;
+}
+
+.dojoxRadioGroup {
+	overflow:hidden;
+	border:0;
+	margin:0; padding:0;
+}
+.dojoxRadioView {
+	position:relative;
+	overflow:hidden;
+	height:100%;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ResizeHandle.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ResizeHandle.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ResizeHandle.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,28 @@
+.dojoxResizeHandle {
+	float: right;
+	position: absolute;
+	right: 2px;
+	bottom: 2px;
+	width: 13px;
+	height: 13px;
+	z-index: 20;
+	background-image: url('icons/resize.png');
+	line-height: 0px;
+}
+.dojoxResizeNW {
+	cursor: nw-resize;
+}
+.dojoxResizeNE {
+	cursor: ne-resize; 
+}
+.dojoxResizeW {
+	cursor: w-resize; 
+}
+.dojoxResizeN { 
+	cursor: n-resize; 
+}
+.dojoxResizeHandleClone {
+	position:absolute; top:0; left:0; 
+	border:1px dashed #666; 
+	z-index:999; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ResizeHandle.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ResizeHandle.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ResizeHandle.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,34 @@
+.dojoxResizeHandle {
+	float: right;
+	position: absolute;
+	right: 2px;
+	bottom: 2px;
+	width: 13px;
+	height: 13px;
+	z-index: 20;
+	background-image: url('icons/resize.png');
+	line-height: 0px;
+}
+
+.dojoxResizeNW {
+	cursor: nw-resize;
+}
+
+.dojoxResizeNE {
+	cursor: ne-resize; 
+}
+
+.dojoxResizeW {
+	cursor: w-resize; 
+}
+
+
+.dojoxResizeN { 
+	cursor: n-resize; 
+}
+
+.dojoxResizeHandleClone {
+	position:absolute; top:0; left:0; 
+	border:1px dashed #666; 
+	z-index:999; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,21 @@
+.dojoxScrollWindow {
+	position:relative;
+}
+.dojoxScrollHelper .helperInner {
+	visibility: hidden;
+}
+.dojoxScrollHelper {
+	border:1px solid #b7b7b7;
+	width:4px;
+	background:#ededed;
+	height:4px;
+	position:absolute;
+	top:4px;
+	left:4px;
+	border-radius: 3px;
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+}
+.dojoxScrollWrapper {
+ 	width:100%; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,24 @@
+.dojoxScrollWindow {
+	position:relative;
+}
+
+.dojoxScrollHelper .helperInner {
+	visibility: hidden;
+}
+
+.dojoxScrollHelper {
+	border:1px solid #b7b7b7;
+	width:4px;
+	background:#ededed;
+	height:4px;
+	position:absolute;
+	top:4px;
+	left:4px;
+	border-radius: 3px;
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+}
+
+.dojoxScrollWrapper {
+ 	width:100%; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/ScrollPane.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+<div class="dojoxScrollWindow" dojoAttachEvent="onmouseenter: _enter, onmouseleave: _leave">
+    <div class="dojoxScrollWrapper" style="${style}" dojoAttachPoint="wrapper" dojoAttachEvent="onmousemove: _calc">
+	<div class="dojoxScrollPane" dojoAttachPoint="containerNode"></div>
+    </div>
+    <div dojoAttachPoint="helper" class="dojoxScrollHelper"><span class="helperInner">|</span></div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/icons/resize.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/layout/resources/icons/resize.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/math/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/math/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/math/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/math/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/math/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/math/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; i<b; i+=s){
+				range.push(i);
+			}
+		}else{
+			if(s<0){
+				for(var i=a; i>b; 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<a.length; i++){
+			m[i]=(a[i]+b[i])/2;
+		}
+		return m;	//	Array
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/math/curves.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/math/curves.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/math/curves.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,193 @@
+if(!dojo._hasResource["dojox.math.curves"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.math.curves"] = true;
+dojo.provide("dojox.math.curves");
+
+dojo.mixin(dojox.math.curves, {
+	Line:function (start, end) {
+		this.start = start;
+		this.end = end;
+		this.dimensions = start.length;
+		for (var i = 0; i < start.length; i++) {
+			start[i] = Number(start[i]);
+		}
+		for (var i = 0; i < end.length; i++) {
+			end[i] = Number(end[i]);
+		}
+		this.getValue = function (n) {
+			var retVal = new Array(this.dimensions);
+			for (var i = 0; i < this.dimensions; i++) {
+				retVal[i] = ((this.end[i] - this.start[i]) * n) + this.start[i];
+			}
+			return retVal;
+		};
+		return this;
+	}, 
+	Bezier:function(pnts) {
+		this.getValue = function (step) {
+			if (step >= 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<a.length; i++){ c[i]=a[i]+b[i]; }
+			return c;
+		}
+		function invert(a){
+			var b = new Array(a.length);
+			for(var i=0; i<a.length; i++){ b[i]=-a[i]; }
+			return b;
+		}
+		var center = dojox.math.midpoint(start, end);
+		var sides = translate(invert(center), start);
+		var rad = Math.sqrt(Math.pow(sides[0], 2) + Math.pow(sides[1], 2));
+		var theta = dojox.math.radiansToDegrees(Math.atan(sides[1] / sides[0]));
+		if (sides[0] < 0){
+			theta -= 90;
+		} else {
+			theta += 90;
+		}
+		dojox.math.curves.CenteredArc.call(this, center, rad, theta, theta + (ccw ? -180 : 180));
+	}, 
+	CenteredArc:function (center, radius, start, end) {
+		this.center = center;
+		this.radius = radius;
+		this.start = start || 0;
+		this.end = end;
+		this.getValue = function (n) {
+			var retVal = new Array(2);
+			var theta = dojox.math.degreesToRadians(this.start + ((this.end - this.start) * n));
+			retVal[0] = this.center[0] + this.radius * Math.sin(theta);
+			retVal[1] = this.center[1] - this.radius * Math.cos(theta);
+			return retVal;
+		};
+		return this;
+	}, 
+	Circle:function(center, radius){
+		dojox.math.curves.CenteredArc.call(this, center, radius, 0, 360);
+		return this;
+	}, 
+	Path:function () {
+		var curves = [];
+		var weights = [];
+		var ranges = [];
+		var totalWeight = 0;
+		this.add = function (curve, weight) {
+			if (weight < 0) {
+				console.error("dojox.math.curves.Path.add: weight cannot be less than 0");
+			}
+			curves.push(curve);
+			weights.push(weight);
+			totalWeight += weight;
+			computeRanges();
+		};
+		this.remove = function (curve) {
+			for (var i = 0; i < curves.length; i++) {
+				if (curves[i] == curve) {
+					curves.splice(i, 1);
+					totalWeight -= weights.splice(i, 1)[0];
+					break;
+				}
+			}
+			computeRanges();
+		};
+		this.removeAll = function () {
+			curves = [];
+			weights = [];
+			totalWeight = 0;
+		};
+		this.getValue = function (n) {
+			var found = false, value = 0;
+			for (var i = 0; i < ranges.length; i++) {
+				var r = ranges[i];
+				if (n >= 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;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/math/matrix.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/math/matrix.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/math/matrix.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<ay; k++) {
+			c[k]=[];
+			for(var i=0; i<bx; i++){
+				c[k][i]=0;
+				for(var m=0; m<ax; m++){
+					c[k][i]+=a[k][m]*b[m][i];
+				}
+			}
+		}
+		return c;	//	Array
+	},
+	product: function(/* Array... */){
+		//	summary
+		//	Return the product of N matrices
+		if (arguments.length==0){
+			console.warn("can't multiply 0 matrices!");
+			return 1;
+		}
+		var m=arguments[0];
+		for(var i=1; i<arguments.length; i++){
+			m=this.multiply(m, arguments[i]);
+		}
+		return m;	//	Array
+	},
+	sum: function(/* Array... */){
+		//	summary
+		//	Return the sum of N matrices
+		if(arguments.length==0){
+			console.warn("can't sum 0 matrices!");
+			return 0;	//	Number
+		}
+		var m=this.copy(arguments[0]);
+		var rows=m.length;
+		if(rows==0){
+			console.warn("can't deal with matrices of 0 rows!");
+			return 0;
+		}
+		var cols=m[0].length;
+		if(cols==0){
+			console.warn("can't deal with matrices of 0 cols!");
+			return 0;
+		}
+		for(var i=1; i<arguments.length; ++i){
+			var arg=arguments[i];
+			if(arg.length!=rows || arg[0].length!=cols){
+				console.warn("can't add matrices of different dimensions: first dimensions were " + rows + "x" + cols + ", current dimensions are " + arg.length + "x" + arg[0].length);
+				return 0;
+			}
+			for(var r=0; r<rows; r++) {
+				for(var c=0; c<cols; c++) {
+					m[r][c]+=arg[r][c];
+				}
+			}
+		}
+		return m;	//	Array
+	},
+	inverse: function(/* Array */a){
+		//	summary
+		//	Return the inversion of the passed matrix
+		if(a.length==1 && a[0].length==1){
+			return [[1/a[0][0]]];	//	Array
+		}
+		var tms=a.length, m=this.create(tms, tms), mm=this.adjoint(a), det=this.determinant(a), dd=0;
+		if(det==0){
+			console.warn("Determinant Equals 0, Not Invertible.");
+			return [[0]];
+		}else{
+			dd=1/det;
+		}
+		for(var i=0; i<tms; i++) {
+			for (var j=0; j<tms; j++) {
+				m[i][j]=dd*mm[i][j];
+			}
+		}
+		return m;	//	Array
+	},
+	determinant: function(/* Array */a){
+		//	summary
+		//	Calculate the determinant of the passed square matrix.
+		if(a.length!=a[0].length){
+			console.warn("Can't calculate the determinant of a non-squre matrix!");
+			return 0;
+		}
+		var tms=a.length, det=1, b=this.upperTriangle(a);
+		for (var i=0; i<tms; i++){
+			var bii=b[i][i];
+			if (Math.abs(bii)<this.ALMOST_ZERO) {
+				return 0;	//	Number
+			}
+			det*=bii;
+		}
+		det*=this.iDF;
+		return det;	//	Number
+	},
+	upperTriangle: function(/* Array */m){
+		//	Summary
+		//	Find the upper triangle of the passed matrix and return it.
+		m=this.copy(m);
+		var f1=0, temp=0, tms=m.length, v=1;
+		this.iDF=1;
+		for(var col=0; col<tms-1; col++){
+			if(typeof m[col][col]!="number") {
+				console.warn("non-numeric entry found in a numeric matrix: m[" + col + "][" + col + "]=" + m[col][col]);
+			}
+			v=1;
+			var stop_loop=0;
+			while((m[col][col] == 0) && !stop_loop){
+				if (col+v>=tms){
+					this.iDF=0;
+					stop_loop=1;
+				}else{
+					for(var r=0; r<tms; r++){
+						temp=m[col][r];
+						m[col][r]=m[col+v][r];
+						m[col+v][r]=temp;
+					}
+					v++;
+					this.iDF*=-1;
+				}
+			}
+			for(var row=col+1; row<tms; row++){
+				if(typeof m[row][col]!="number"){
+					console.warn("non-numeric entry found in a numeric matrix: m[" + row + "][" + col + "]=" + m[row][col]);
+				}
+				if(typeof m[col][row]!="number"){
+					console.warn("non-numeric entry found in a numeric matrix: m[" + col + "][" + row + "]=" + m[col][row]);
+				}
+				if(m[col][col]!=0){
+					var f1=(-1)* m[row][col]/m[col][col];
+					for (var i=col; i<tms; i++){
+						m[row][i]=f1*m[col][i]+m[row][i];
+					}
+				}
+			}
+		}
+		return m;	//	Array
+	},
+	create: function(/* Number */a, /* Number */b, /* Number? */value){
+		//	summary
+		//	Create a new matrix with rows a and cols b, and pre-populate with value.
+		value=value||0;
+		var m=[];
+		for (var i=0; i<b; i++){
+			m[i]=[];
+			for(var j=0; j<a; j++) {
+				m[i][j]=value;
+			}
+		}
+		return m;	//	Array
+	},
+	ones: function(/* Number */a, /* Number */b){
+		//	summary
+		//	Create a matrix pre-populated with ones
+		return this.create(a, b, 1);	//	Array
+	},
+	zeros: function(/* Number */a, /* Number */b){
+		//	summary
+		//	Create a matrix pre-populated with zeros
+		return this.create(a, b);	// Array
+	},
+	identity: function(/* Number */size, /* Number? */scale){
+		//	summary
+		//	Create an identity matrix based on the size and scale.
+		scale=scale||1;
+		var m=[];
+		for(var i=0; i<size; i++){
+			m[i]=[];
+			for(var j=0; j<size; j++){
+				m[i][j]=(i==j?scale:0);
+			}
+		}
+		return m;	//	Array
+	},
+	adjoint: function(/* Array */a){
+		//	summary
+		//	Find the adjoint of the passed matrix
+		var tms=a.length;
+		if(tms<=1){
+			console.warn("Can't find the adjoint of a matrix with a dimension less than 2");
+			return [[0]];
+		}
+		if(a.length!=a[0].length){
+			console.warn("Can't find the adjoint of a non-square matrix");
+			return [[0]];
+		}
+		var m=this.create(tms, tms), ap=this.create(tms-1, tms-1);
+		var ii=0, jj=0, ia=0, ja=0, det=0;
+		for(var i=0; i<tms; i++){
+			for (var j=0; j<tms; j++){
+				ia=0;
+				for(ii=0; ii<tms; ii++){
+					if(ii==i){
+						continue;
+					}
+					ja = 0;
+					for(jj=0; jj<tms; jj++){
+						if(jj==j){
+							continue;
+						}
+						ap[ia][ja] = a[ii][jj];
+						ja++;
+					}
+					ia++;
+				}
+				det=this.determinant(ap);
+				m[i][j]=Math.pow(-1, (i+j))*det;
+			}
+		}
+		return this.transpose(m);	//	Array
+	},
+	transpose: function(/* Array */a){
+		//	summary
+		//	Transpose the passed matrix (i.e. rows to columns)
+		var m=this.create(a.length, a[0].length);
+		for(var i=0; i<a.length; i++){
+			for(var j=0; j<a[i].length; j++){
+				m[j][i]=a[i][j];
+			}
+		}
+		return m;	//	Array
+	},
+	format: function(/* Array */a, /* Number? */points){
+		//	summary
+		//	Return a string representation of the matrix, rounded to points (if needed)
+		points=points||5;
+		function format_int(x, dp){
+			var fac=Math.pow(10, dp);
+			var a=Math.round(x*fac)/fac;
+			var b=a.toString();
+			if(b.charAt(0)!="-"){
+				b=" "+b;
+			}
+			if(b.indexOf(".")>-1){
+				b+=".";
+			}
+			while(b.length<dp+3){
+				b+="0";
+			}
+			return b;
+		}
+		var ya=a.length;
+		var xa=ya>0?a[0].length:0;
+		var buffer="";
+		for(var y=0; y<ya; y++){
+			buffer+="| ";
+			for(var x=0; x<xa; x++){
+				buffer+=format_int(a[y][x], points)+" ";
+			}
+			buffer+="|\n";
+		}
+		return buffer;	//	string
+	},
+	copy: function(/* Array */a){
+		//	summary
+		//	Create a copy of the passed matrix
+		var ya=a.length, xa=a[0].length, m=this.create(xa, ya);
+		for(var y=0; y<ya; y++){
+			for(var x=0; x<xa; x++){
+				m[y][x]=a[y][x];
+			}
+		}
+		return m;	// Array
+	},
+	scale: function(/* Array */a, /* Number */factor){
+		//	summary
+		//	Create a copy of passed matrix and scale each member by factor.
+		a=this.copy(a);
+		var ya=a.length, xa=a[0].length;
+		for(var y=0; y<ya; y++){
+			for(var x=0; x<xa; x++){
+				a[y][x]*=factor;
+			}
+		}
+		return a;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/math.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/math.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/math.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,28 @@
+-------------------------------------------------------------------------------
+Dojo Offline
+-------------------------------------------------------------------------------
+Release date: May 2007 (Release date used as version)
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits
+	Brad Neuberg
+	SitePen
+-------------------------------------------------------------------------------
+Project description
+Toolkit to help build offline web applications; uses Google Gears under the covers.
+-------------------------------------------------------------------------------
+Dependencies:
+Dojo Storage, Dojo Crypto, Dojo Core, Google Gears
+-------------------------------------------------------------------------------
+Documentation
+
+See http://docs.google.com/View?docid=dhkhksk4_8gdp9gr for documentation and a t
+utorial on using Dojo Offline.
+
+-------------------------------------------------------------------------------
+Installation instructions
+
+See full documentation at URL given right above.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/_common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/_common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/_common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,559 @@
+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");
+
+dojo.require("dojox.storage");
+dojo.require("dojox.sql");
+dojo.require("dojox.off.sync");
+
+// Author: Brad Neuberg, bkn3@xxxxxxxxxxxx, 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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/docs/bookmarklets.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/docs/bookmarklets.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/docs/bookmarklets.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,10 @@
+<html>
+<body>
+<h1>Browser Bookmarklets</h1>
+
+<p>Drag the following bookmarklets to your links toolbar and press to clear the Google Gears cache:</p>
+
+<p>Firefox: <a title="Clear Gears Cache" href="javascript:(function(){new GearsFactory().create('beta.localserver', '1.0').removeStore('dot_store_'+window.location.href.replace(/[^0-9A-Za-z_]/g, '_'));dojox.storage.remove('oldVersion', '_dot');}())">Clear Gears Cache</a></p>
+<p>Internet Explorer: <a title="Clear Gears Cache" href="javascript:(function(){new ActiveXObject('Gears.Factory').create('beta.localserver', '1.0').removeStore('dot_store_'+window.location.href.replace(/[^0-9A-Za-z_]/g, '_'));dojox.storage.remove('oldVersion', '_dot');}())">Clear Gears Cache</a></p>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/files.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/files.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/files.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxxxxx, 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:
+		//
+		//	<script>
+		//		dojo.require("dojox.sql");
+		//		dojo.require("dojox.off");
+		//		dojo.require("dojox.off.ui");
+		//		dojo.require("dojox.off.sync");
+		//
+		//		// configure how we should work offline
+		//
+		//		// set our application name
+		//		dojox.off.ui.appName = "Moxie";
+		//
+		//		// automatically "slurp" the page and
+		//		// capture the resources we need offline
+		//		dojox.off.files.slurp();
+		//
+		// 		// tell Dojo Offline we are ready for it to initialize itself now
+		//		// that we have finished configuring it for our application
+		//		dojox.off.initialize();
+		//	</script>
+		//
+		//	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);
+				}
+		});
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/network_check.txt
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/network_check.txt	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/network_check.txt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+1

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/offline.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/offline.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/offline.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;i<this.providers.length;i++){_1c=this.providers[i];if(_1b&&_1b==_1c.declaredClass){_1c.isAvailable();break;}else{if(!_1b&&_1c.isAvailable()){break;}}}if(!_1c){this._initialized=true;this.available=false;this.currentProvider=null;console.warn("No storage provider found for this platform");this.loaded();return;}this.currentProvider=_1c;dojo.mixin(dojox.storage,this.currentProvider);dojox.storage.initialize();this._initialized=true;this.available=true;};this.isAvailable=function(){return this.available;};this.addOnLoad=function(_1e){this._onLoadListeners.push(_1e);if(this.isInitialized()){this._fireLoaded();}};this.removeOnLoad=function(_1f){for(var i=0;i<this._onLoadListeners.length;i++){if(_1f==this._onLoadListeners[i]){this._onLoadListeners=this._onLoadListeners.splice(i,1);break;}}};this.isInitialized=function(){if(this.currentProvider!=null&&this.currentProvider.declaredClass=="dojox.storage.FlashStorageProvider"&&dojox.flash.ready==false){return false;}else{return this._initialized;}};this.supportsProvider=function(_21){try{var _22=eval("new "+_21+"()");var _23=_22.isAvailable();if(!_23){return false;}return _23;}catch(e){return false;}};this.getProvider=function(){return this.currentProvider;};this.loaded=function(){this._fireLoaded();};this._fireLoaded=function(){dojo.forEach(this._onLoadListeners,function(i){try{i();}catch(e){console.debug(e);}});};this.getResourceList=function(){var _25=[];dojo.forEach(dojox.storage.manager.providers,function(_26){_25=_25.concat(_26.getResourceList());});return _25;};};}if(!dojo._hasResource["dojox._sql._crypto"]){dojo._hasResource["dojox._sql._crypto"]=true;dojo.provide("dojox._sql._crypto");dojo.mixin(dojox._sql._crypto,{_POOL_SIZE:100,encrypt:function(_27,_28,_29){this._initWorkerPool();var msg={plaintext:_27,password:_28};msg=dojo.toJson(msg);msg="encr:"+String(msg);this._assignWork(msg,_29);},decrypt:function(_2b,_2c,_2d){this._initWorkerPool();var msg={ciphertext:_2b,password:_2c};msg=dojo.toJson(msg);msg="decr:"+String(msg);this._assignWork(msg,_2d);},_initWorkerPool:function(){if(!this._manager){try{this._manager=google.gears.factory.create("beta.workerpool","1.0");this._unemployed=[];this._employed={};this._handleMessage=[];var _2f=this;this._manager.onmessage=function(msg,_31){var _32=_2f._employed["_"+_31];_2f._employed["_"+_31]=undefined;_2f._unemployed.push("_"+_31);if(_2f._handleMessage.length){var _33=_2f._handleMessage.shift();_2f._assignWork(_33.msg,_33.callback);}_32(msg);};var _34="function _workerInit(){"+"gearsWorkerPool.onmessage = "+String(this._workerHandler)+";"+"}";var _35=_34+" _workerInit();";for(var i=0;i<this._POOL_SIZE;i++){this._unemployed.push("_"+this._manager.createWorker(_35));}}catch(exp){throw exp.message||exp;}}},_assignWork:function(msg,_38){if(!this._handleMessage.length&&this._unemployed.length){var _39=this._unemployed.shift().substring(1);this._employed["_"+_39]=_38;this._manager.sendMessage(msg,_39);}else{this._handleMessage={msg:msg,callback:_38};}},_workerHandler:function(msg,_3b){var _3c=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22];var _3d=[[0,0,0,0],[1,0,0,0],[2,0,0,0],[4,0,0,0],[8,0,0,0],[16,0,0,0],[32,0,0,0],[64,0,0,0],[128,0,0,0],[27,0,0,0],[54,0,0,0]];function Cipher(_3e,w){var Nb=4;var Nr=w.length/Nb-1;var _42=[[],[],[],[]];for(var i=0;i<4*Nb;i++){_42[i%4][Math.floor(i/4)]=_3e[i];}_42=AddRoundKey(_42,w,0,Nb);for(var _44=1;_44<Nr;_44++){_42=SubBytes(_42,Nb);_42=ShiftRows(_42,Nb);_42=MixColumns(_42,Nb);_42=AddRoundKey(_42,w,_44,Nb);}_42=SubBytes(_42,Nb);_42=ShiftRows(_42,Nb);_42=AddRoundKey(_42,w,Nr,Nb);var _45=new Array(4*Nb);for(var i=0;i<4*Nb;i++){_45[i]=_42[i%4][Math.floor(i/4)];}return _45;};function SubBytes(s,Nb){for(var r=0;r<4;r++){for(var c=0;c<Nb;c++){s[r][c]=_3c[s[r][c]];}}return s;};function ShiftRows(s,Nb){var t=new Array(4);for(var r=1;r<4;r++){for(var c=0;c<4;c++){t[c]=s[r][(c+r)%Nb];}for(var c=0;c<4;c++){s[r][c]=t[c];}}return s;};function MixColumns(s,Nb){for(var c=0;c<4;c++){var a=new Array(4);var b=new Array(4);for(var i=0;i<4;i++){a[i]=s[i][c];b[i]=s[i][c]&128?s[i][c]<<1^283:s[i][c]<<1;}s[0][c]=b[0]^a[1]^b[1]^a[2]^a[3];s[1][c]=a[0]^b[1]^a[2]^b[2]^a[3];s[2][c]=a[0]^a[1]^b[2]^a[3]^b[3];s[3][c]=a[0]^b[0]^a[1]^a[2]^b[3];}return s;};function AddRoundKey(_55,w,rnd,Nb){for(var r=0;r<4;r++){for(var c=0;c<Nb;c++){_55[r][c]^=w[rnd*4+c][r];}}return _55;};function KeyExpansion(key){var Nb=4;var Nk=key.length/4;var Nr=Nk+6;var w=new Array(Nb*(Nr+1));var _60=new Array(4);for(var i=0;i<Nk;i++){var r=[key[4*i],key[4*i+1],key[4*i+2],key[4*i+3]];w[i]=r;}for(var i=Nk;i<(Nb*(Nr+1));i++){w[i]=new Array(4);for(var t=0;t<4;t++){_60[t]=w[i-1][t];}if(i%Nk==0){_60=SubWord(RotWord(_60));for(var t=0;t<4;t++){_60[t]^=_3d[i/Nk][t];}}else{if(Nk>6&&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<rs.fieldCount();i++){var _af=rs.fieldName(i);var _b0=rs.field(i);row[_af]=_b0;}_ac.push(row);rs.next();}rs.close();return _ac;},_needsEncrypt:function(sql){return /encrypt\([^\)]*\)/i.test(sql);},_needsDecrypt:function(sql){return /decrypt\([^\)]*\)/i.test(sql);}});dojo.declare("dojox.sql._SQLCrypto",null,{constructor:function(_b3,sql,_b5,_b6,_b7){if(_b3=="encrypt"){this._execEncryptSQL(sql,_b5,_b6,_b7);}else{this._execDecryptSQL(sql,_b5,_b6,_b7);}},_execEncryptSQL:function(sql,_b9,_ba,_bb){var _bc=this._stripCryptoSQL(sql);var _bd=this._flagEncryptedArgs(sql,_ba);var _be=this;this._encrypt(_bc,_b9,_ba,_bd,function(_bf){var _c0=false;var _c1=[];var exp=null;try{_c1=dojox.sql.db.execute(_bc,_bf);}catch(execError){_c0=true;exp=execError.message||execError;}if(exp!=null){if(dojox.sql._autoClose){try{dojox.sql.close();}catch(e){}}_bb(null,true,exp.toString());return;}_c1=dojox.sql._normalizeResults(_c1);if(dojox.sql._autoClose){dojox.sql.close();}if(dojox.sql._needsDecrypt(sql)){var _c3=_be._determineDecryptedColumns(sql);_be._decrypt(_c1,_c3,_b9,function(_c4){_bb(_c4,false,null);});}else{_bb(_c1,false,null);}});},_execDecryptSQL:function(sql,_c6,_c7,_c8){var _c9=this._stripCryptoSQL(sql);var _ca=this._determineDecryptedColumns(sql);var _cb=false;var _cc=[];var exp=null;try{_cc=dojox.sql.db.execute(_c9,_c7);}catch(execError){_cb=true;exp=execError.message||execError;}if(exp!=null){if(dojox.sql._autoClose){try{dojox.sql.close();}catch(e){}}_c8(_cc,true,exp.toString());return;}_cc=dojox.sql._normalizeResults(_cc);if(dojox.sql._autoClose){dojox.sql.close();}this._decrypt(_cc,_ca,_c6,function(_ce){_c8(_ce,false,null);});},_encrypt:function(sql,_d0,_d1,_d2,_d3){this._totalCrypto=0;this._finishedCrypto=0;this._finishedSpawningCrypto=false;this._finalArgs=_d1;for(var i=0;i<_d1.length;i++){if(_d2[i]){var _d5=_d1[i];var _d6=i;this._totalCrypto++;dojox._sql._crypto.encrypt(_d5,_d0,dojo.hitch(this,function(_d7){this._finalArgs[_d6]=_d7;this._finishedCrypto++;if(this._finishedCrypto>=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;i<rs.length;i++){if(rs[i].namespace!=dojox.storage.DEFAULT_NAMESPACE){_104.push(rs[i].namespace);}}return _104;},getKeys:function(_107){_107=_107||this.DEFAULT_NAMESPACE;if(this.isValidKey(_107)==false){throw new Error("Invalid namespace given: "+_107);}var rs=dojox.sql("SELECT key FROM "+this.TABLE_NAME+" WHERE namespace = ?",_107);var _109=[];for(var i=0;i<rs.length;i++){_109.push(rs[i].key);}return _109;},clear:function(_10b){if(this.isValidKey(_10b)==false){throw new Error("Invalid namespace given: "+_10b);}_10b=_10b||this.DEFAULT_NAMESPACE;dojox.sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ?",_10b);},remove:function(key,_10d){_10d=_10d||this.DEFAULT_NAMESPACE;dojox.sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ? AND"+" key = ?",_10d,key);},putMultiple:function(keys,_10f,_110,_111){if(this.isValidKeyArray(keys)===false||!_10f instanceof Array||keys.length!=_10f.length){throw new Error("Invalid arguments: keys = ["+keys+"], values = ["+_10f+"]");}if(_111==null||typeof _111=="undefined"){_111=dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(_111)==false){throw new Error("Invalid namespace given: "+_111);}this._statusHandler=_110;try{dojox.sql.open();dojox.sql.db.execute("BEGIN TRANSACTION");var _112="REPLACE INTO "+this.TABLE_NAME+" VALUES (?, ?, ?)";for(var i=0;i<keys.length;i++){var _114=_10f[i];if(dojo.isString(_114)){_114="string:"+_114;}else{_114=dojo.toJson(_114);}dojox.sql.db.execute(_112,[_111,keys[i],_114]);}dojox.sql.db.execute("COMMIT TRANSACTION");dojox.sql.close();}catch(e){console.debug("dojox.storage.GearsStorageProvider.putMultiple:",e);if(_110){_110(this.FAILED,keys,e.toString());}return;}if(_110){_110(dojox.storage.SUCCESS,key,null);}},getMultiple:function(keys,_116){if(this.isValidKeyArray(keys)===false){throw new ("Invalid key array given: "+keys);}if(_116==null||typeof _116=="undefined"){_116=dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(_116)==false){throw new Error("Invalid namespace given: "+_116);}var _117="SELECT * FROM "+this.TABLE_NAME+" WHERE namespace = ? AND "+" key = ?";var _118=[];for(var i=0;i<keys.length;i++){var _11a=dojox.sql(_117,_116,keys[i]);if(!_11a.length){_118[i]=null;}else{_11a=_11a[0].value;if(dojo.isString(_11a)&&(/^string:/.test(_11a))){_118[i]=_11a.substring("string:".length);}else{_118[i]=dojo.fromJson(_11a);}}}return _118;},removeMultiple:function(keys,_11c){_11c=_11c||this.DEFAULT_NAMESPACE;dojox.sql.open();dojox.sql.db.execute("BEGIN TRANSACTION");var _11d="DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ? AND key = ?";for(var i=0;i<keys.length;i++){dojox.sql.db.execute(_11d,[_11c,keys[i]]);}dojox.sql.db.execute("COMMIT TRANSACTION");dojox.sql.close();},isPermanent:function(){return true;},getMaximumSize:function(){return this.SIZE_NO_LIMIT;},hasSettingsUI:function(){return false;},showSettingsUI:function(){throw new Error(this.declaredClass+" does not support a storage settings user-interface");},hideSettingsUI:function(){throw new Error(this.declaredClass+" does not support a storage settings user-interface");}});dojox.storage.manager.register("dojox.storage.GearsStorageProvider",new dojox.storage.GearsStorageProvider());})();}}if(!dojo._hasResource["dojox.storage.WhatWGStorageProvider"]){dojo._hasResource["dojox.storage.WhatWGStorageProvider"]=true;dojo.provide("dojox.storage.WhatWGStorageProvider");dojo.declare("dojox.storage.WhatWGStorageProvider",[dojox.storage.Provider],{initialized:false,_domain:null,_available:null,_statusHandler:null,_allNamespaces:null,_storageEventListener:null,initialize:function(){if(dojo.config["disableWhatWGStorage"]==true){return;}this._domain=(location.hostname=="localhost")?"localhost.localdomain":location.hostname;this.initialized=true;dojox.storage.manager.loaded();},isAvailable:function(){try{var _11f=globalStorage[((location.hostname=="localhost")?"localhost.localdomain":location.hostname)];}catch(e){this._available=false;return this._available;}this._available=true;return this._available;},put:function(key,_121,_122,_123){if(this.isValidKey(key)==false){throw new Error("Invalid key given: "+key);}_123=_123||this.DEFAULT_NAMESPACE;key=this.getFullKey(key,_123);this._statusHandler=_122;if(dojo.isString(_121)){_121="string:"+_121;}else{_121=dojo.toJson(_121);}var _124=dojo.hitch(this,function(evt){window.removeEventListener("storage",_124,false);if(_122){_122.call(null,this.SUCCESS,key);}});window.addEventListener("storage",_124,false);try{var _126=globalStorage[this._domain];_126.setItem(key,_121);}catch(e){this._statusHandler.call(null,this.FAILED,key,e.toString());}},get:function(key,_128){if(this.isValidKey(key)==false){throw new Error("Invalid key given: "+key);}_128=_128||this.DEFAULT_NAMESPACE;key=this.getFullKey(key,_128);var _129=globalStorage[this._domain];var _12a=_129.getItem(key);if(_12a==null||_12a==""){return null;}_12a=_12a.value;if(dojo.isString(_12a)&&(/^string:/.test(_12a))){_12a=_12a.substring("string:".length);}else{_12a=dojo.fromJson(_12a);}return _12a;},getNamespaces:function(){var _12b=[this.DEFAULT_NAMESPACE];var _12c={};var _12d=globalStorage[this._domain];var _12e=/^__([^_]*)_/;for(var i=0;i<_12d.length;i++){var _130=_12d.key(i);if(_12e.test(_130)==true){var _131=_130.match(_12e)[1];if(typeof _12c[_131]=="undefined"){_12c[_131]=true;_12b.push(_131);}}}return _12b;},getKeys:function(_132){_132=_132||this.DEFAULT_NAMESPACE;if(this.isValidKey(_132)==false){throw new Error("Invalid namespace given: "+_132);}var _133;if(_132==this.DEFAULT_NAMESPACE){_133=new RegExp("^([^_]{2}.*)$");}else{_133=new RegExp("^__"+_132+"_(.*)$");}var _134=globalStorage[this._domain];var _135=[];for(var i=0;i<_134.length;i++){var _137=_134.key(i);if(_133.test(_137)==true){_137=_137.match(_133)[1];_135.push(_137);}}return _135;},clear:function(_138){_138=_138||this.DEFAULT_NAMESPACE;if(this.isValidKey(_138)==false){throw new Error("Invalid namespace given: "+_138);}var _139;if(_138==this.DEFAULT_NAMESPACE){_139=new RegExp("^[^_]{2}");}else{_139=new RegExp("^__"+_138+"_");}var _13a=globalStorage[this._domain];var keys=[];for(var i=0;i<_13a.length;i++){if(_139.test(_13a.key(i))==true){keys[keys.length]=_13a.key(i);}}dojo.forEach(keys,dojo.hitch(_13a,"removeItem"));},remove:function(key,_13e){key=this.getFullKey(key,_13e);var _13f=globalStorage[this._domain];_13f.removeItem(key);},isPermanent:function(){return true;},getMaximumSize:function(){return this.SIZE_NO_LIMIT;},hasSettingsUI:function(){return false;},showSettingsUI:function(){throw new Error(this.declaredClass+" does not support a storage settings user-interface");},hideSettingsUI:function(){throw new Error(this.declaredClass+" does not support a storage settings user-interface");},getFullKey:function(key,_141){_141=_141||this.DEFAULT_NAMESPACE;if(this.isValidKey(_141)==false){throw new Error("Invalid namespace given: "+_141);}if(_141==this.DEFAULT_NAMESPACE){return key;}else{return "__"+_141+"_"+key;}}});dojox.storage.manager.register("dojox.storage.WhatWGStorageProvider",new dojox.storage.WhatWGStorageProvider());}if(!dojo._hasResource["dijit._base.place"]){dojo._hasResource["dijit._base.place"]=true;dojo.provide("dijit._base.place");dijit.getViewport=function(){var _142=dojo.global;var _143=dojo.doc;var w=0,h=0;var de=_143.documentElement;var dew=de.clientWidth,deh=de.clientHeight;if(dojo.isMozilla){var minw,minh,maxw,maxh;var dbw=_143.body.clientWidth;if(dbw>dew){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||_168<best.overflow){best={corner:_15c,aroundCorner:_15b.aroundCorner,x:_162,y:_163,w:_166,h:_167,overflow:_168};}return !_168;});node.style.left=best.x+"px";node.style.top=best.y+"px";if(best.overflow&&_158){_158(node,best.aroundCorner,best.corner);}return best;};dijit.placeOnScreenAroundElement=function(node,_16a,_16b,_16c){_16a=dojo.byId(_16a);var _16d=_16a.style.display;_16a.style.display="";var _16e=_16a.offsetWidth;var _16f=_16a.offsetHeight;var _170=dojo.coords(_16a,true);_16a.style.display=_16d;var _171=[];for(var _172 in _16b){_171.push({aroundCorner:_172,corner:_16b[_172],pos:{x:_170.x+(_172.charAt(1)=="L"?0:_16e),y:_170.y+(_172.charAt(0)=="T"?0:_16f)}});}return dijit._place(node,_171,_16c);};}if(!dojo._hasResource["dojox.flash._base"]){dojo._hasResource["dojox.flash._base"]=true;dojo.provide("dojox.flash._base");dojox.flash=function(){};dojox.flash={ready:false,url:null,_visible:true,_loadedListeners:new Array(),_installingListeners:new Array(),setSwf:function(url,_174){this.url=url;if(typeof _174!="undefined"){this._visible=_174;}this._initialize();},addLoadedListener:function(_175){this._loadedListeners.push(_175);},addInstallingListener:function(_176){this._installingListeners.push(_176);},loaded:function(){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(){if(dojox.flash._installingListeners.length>0){for(var i=0;i<dojox.flash._installingListeners.length;i++){dojox.flash._installingListeners[i].call(null);}}},_initialize:function(){var _179=new dojox.flash.Install();dojox.flash.installer=_179;if(_179.needed()==true){_179.install();}else{dojox.flash.obj=new dojox.flash.Embed(this._visible);dojox.flash.obj.write();dojox.flash.comm=new dojox.flash.Communicator();}}};dojox.flash.Info=function(){if(dojo.isIE){document.write(["<script language=\"VBScript\" type=\"text/vbscript\">","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","</script>"].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="<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" "+"codebase=\""+this.protocol()+"://fpdownload.macromedia.com/pub/shockwave/cabs/flash/"+"swflash.cab#version=8,0,0,0\"\n "+"width=\""+this.width+"\"\n "+"height=\""+this.height+"\"\n "+"id=\""+this.id+"\"\n "+"name=\""+this.id+"\"\n "+"align=\"middle\">\n "+"<param name=\"allowScriptAccess\" value=\"sameDomain\"></param>\n "+"<param name=\"movie\" value=\""+_192+"\"></param>\n "+"<param name=\"quality\" value=\"high\"></param>\n "+"<param name=\"bgcolor\" value=\"#ffffff\"></param>\n "+"<embed src=\""+_193+"\" "+"quality=\"high\" "+"bgcolor=\"#ffffff\" "+"width=\""+this.width+"\" "+"height=\""+this.height+"\" "+"id=\""+this.id+"Embed"+"\" "+"name=\""+this.id+"\" "+"swLiveConnect=\"true\" "+"align=\"middle\" "+"allowScriptAccess=\"sameDomain\" "+"type=\"application/x-shockwave-flash\" "+"pluginspage=\""+this.protocol()+"://www.macromedia.com/go/getflashplayer\" "+"></embed>\n"+"</object>\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<arguments.length;i++){_1a3[i]=this._encodeData(arguments[i]);}var _1a5=this._execFlash(_1a1,_1a3);_1a5=this._decodeData(_1a5);return _1a5;});this[_1a1]=_1a2;},_encodeData:function(data){if(!data||typeof data!="string"){return data;}var _1a7=/\&([^;]*)\;/g;data=data.replace(_1a7,"&amp;$1;");data=data.replace(/</g,"&lt;");data=data.replace(/>/g,"&gt;");data=data.replace("\\","&custom_backslash;");data=data.replace(/\0/g,"\\0");data=data.replace(/\"/g,"&quot;");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("<invoke name=\""+_1a9+"\" returntype=\"javascript\">"+__flash__argumentsToXML(_1aa,0)+"</invoke>"));};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<this.listOfURLs.length;i++){if(this.listOfURLs[i]==url){this.listOfURLs=this.listOfURLs.splice(i,1);break;}}},isAvailable:function(url){for(var i=0;i<this.listOfURLs.length;i++){if(this.listOfURLs[i]==url){return true;}}return false;},refresh:function(_1e1){try{if(dojo.config.isDebug){this.printURLs();}this.refreshing=true;if(this.versionURL){this._getVersionInfo(function(_1e2,_1e3,_1e4){if(dojo.config.isDebug||!_1e3||_1e4||!_1e2||_1e2!=_1e3){console.warn("Refreshing offline file list");this._doRefresh(_1e1,_1e3);}else{console.warn("No need to refresh offline file list");_1e1(false,[]);}});}else{console.warn("Refreshing offline file list");this._doRefresh(_1e1);}}catch(e){this.refreshing=false;dojox.off.coreOpFailed=true;dojox.off.enabled=false;dojox.off.onFrameworkEvent("coreOperationFailed");}},abortRefresh:function(){if(!this.refreshing){return;}this._store.abortCapture(this._cancelID);this.refreshing=false;},_slurp:function(){if(!this._doSlurp){return;}var _1e5=dojo.hitch(this,function(url){if(this._sameLocation(url)){this.cache(url);}});_1e5(window.location.href);dojo.query("script").forEach(function(i){try{_1e5(i.getAttribute("src"));}catch(exp){}});dojo.query("link").forEach(function(i){try{if(!i.getAttribute("rel")||i.getAttribute("rel").toLowerCase()!="stylesheet"){return;}_1e5(i.getAttribute("href"));}catch(exp){}});dojo.query("img").forEach(function(i){try{_1e5(i.getAttribute("src"));}catch(exp){}});dojo.query("a").forEach(function(i){try{_1e5(i.getAttribute("href"));}catch(exp){}});dojo.forEach(document.styleSheets,function(_1eb){try{if(_1eb.cssRules){dojo.forEach(_1eb.cssRules,function(rule){var text=rule.cssText;if(text){var _1ee=text.match(/url\(\s*([^\) ]*)\s*\)/i);if(!_1ee){return;}for(var i=1;i<_1ee.length;i++){_1e5(_1ee[i]);}}});}else{if(_1eb.cssText){var _1f0;var text=_1eb.cssText.toString();var _1f2=text.split(/\f|\r|\n/);for(var i=0;i<_1f2.length;i++){_1f0=_1f2[i].match(/url\(\s*([^\) ]*)\s*\)/i);if(_1f0&&_1f0.length){_1e5(_1f0[1]);}}}}}catch(exp){}});},_sameLocation:function(url){if(!url){return false;}if(url.length&&url.charAt(0)=="#"){return false;}url=new dojo._Url(url);if(!url.scheme&&!url.port&&!url.host){return true;}if(!url.scheme&&url.host&&url.port&&window.location.hostname==url.host&&window.location.port==url.port){return true;}if(!url.scheme&&url.host&&!url.port&&window.location.hostname==url.host&&window.location.port==80){return true;}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(_1f6,_1f7){var _1f8;try{_1f8=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 _1f9="dot_store_"+window.location.href.replace(/[^0-9A-Za-z_]/g,"_");if(_1f9.length>=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<this.entries.length;i++){_216+="{";for(var j in this.entries[i]){_216+=j+": \""+this.entries[i][j]+"\"";_216+=", ";}_216+="}, ";}_216+="]";return _216;},_save:function(_219){if(!_219){_219=function(){};}try{var self=this;var _21b=function(_21c,key,_21e){if(_21c==dojox.storage.FAILED){dojox.off.onFrameworkEvent("save",{status:dojox.storage.FAILED,isCoreSave:true,key:key,value:_21e,namespace:dojox.off.STORAGE_NAMESPACE});_219();}else{if(_21c==dojox.storage.SUCCESS){_219();}}};dojox.storage.put("actionlog",this.entries,_21b,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});_219();}},_load:function(_21f){var _220=dojox.storage.get("actionlog",dojox.off.STORAGE_NAMESPACE);if(!_220){_220=[];}this.entries=_220;_21f();}});dojox.off.sync.actions=new dojox.off.sync.ActionLog();}if(!dojo._hasResource["dojox.off._common"]){dojo._hasResource["dojox.off._common"]=true;dojo.provide("dojox.off._common");dojo.mixin(dojox.off,{isOnline:false,NET_CHECK:5,STORAGE_NAMESPACE:"_dot",enabled:true,availabilityURL:dojo.moduleUrl("dojox","off/network_check.txt"),goingOnline:false,coreOpFailed:false,doNetChecking:true,hasOfflineCache:null,browserRestart:false,_STORAGE_APP_NAME:window.location.href.replace(/[^0-9A-Za-z_]/g,"_"),_initializeCalled:false,_storageLoaded:false,_pageLoaded:false,onLoad:function(){},onNetwork:function(type){},initialize:function(){this._initializeCalled=true;if(this._storageLoaded&&this._pageLoaded){this._onLoad();}},goOffline:function(){if((dojox.off.sync.isSyncing)||(this.goingOnline)){return;}this.goingOnline=false;this.isOnline=false;},goOnline:function(_222){if(dojox.off.sync.isSyncing||dojox.off.goingOnline){return;}this.goingOnline=true;this.isOnline=false;this._isSiteAvailable(_222);},onFrameworkEvent:function(type,_224){if(type=="save"){if(_224.isCoreSave&&(_224.status==dojox.storage.FAILED)){dojox.off.coreOpFailed=true;dojox.off.enabled=false;dojox.off.onFrameworkEvent("coreOperationFailed");}}else{if(type=="coreOperationFailed"){dojox.off.coreOpFailed=true;dojox.off.enabled=false;}}},_checkOfflineCacheAvailable:function(_225){this.hasOfflineCache=dojo.isGears;_225();},_onLoad:function(){dojox.off.files.cache(dojo.moduleUrl("dojo","dojo.js"));this._cacheDojoResources();dojox.off.files.cache(dojox.storage.manager.getResourceList());dojox.off.files._slurp();this._checkOfflineCacheAvailable(dojo.hitch(this,"_onOfflineCacheChecked"));},_onOfflineCacheChecked:function(){if(this.hasOfflineCache&&this.enabled){this._load(dojo.hitch(this,"_finishStartingUp"));}else{if(this.hasOfflineCache&&!this.enabled){this._finishStartingUp();}else{this._keepCheckingUntilInstalled();}}},_keepCheckingUntilInstalled:function(){this._finishStartingUp();},_finishStartingUp:function(){if(!this.hasOfflineCache){this.onLoad();}else{if(this.enabled){this._startNetworkThread();this.goOnline(dojo.hitch(this,function(){dojox.off.onLoad();}));}else{if(this.coreOpFailed){this.onFrameworkEvent("coreOperationFailed");}else{this.onLoad();}}}},_onPageLoad:function(){this._pageLoaded=true;if(this._storageLoaded&&this._initializeCalled){this._onLoad();}},_onStorageLoad:function(){this._storageLoaded=true;if(!dojox.storage.manager.isAvailable()&&dojox.storage.manager.isInitialized()){this.coreOpFailed=true;this.enabled=false;}if(this._pageLoaded&&this._initializeCalled){this._onLoad();}},_isSiteAvailable:function(_226){dojo.xhrGet({url:this._getAvailabilityURL(),handleAs:"text",timeout:this.NET_CHECK*1000,error:dojo.hitch(this,function(err){this.goingOnline=false;this.isOnline=false;if(_226){_226(false);}}),load:dojo.hitch(this,function(data){this.goingOnline=false;this.isOnline=true;if(_226){_226(true);}else{this.onNetwork("online");}})});},_startNetworkThread:function(){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;try{if(typeof d.ioArgs.xhr.abort=="function"){d.ioArgs.xhr.abort();}}catch(e){}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();if(url.indexOf("?")==-1){url+="?";}else{url+="&";}url+="browserbust="+new Date().getTime();return url;},_onOfflineCacheInstalled:function(){this.onFrameworkEvent("offlineCacheInstalled");},_cacheDojoResources:function(){var _22d=true;dojo.forEach(dojo.query("script"),function(i){var src=i.getAttribute("src");if(!src){return;}if(src.indexOf("_base/_loader/bootstrap.js")!=-1){_22d=false;}});if(!_22d){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);dojox.off.files.cache(dojo.moduleUrl("dojo","_base/_loader/hostenv_browser.js").uri);}for(var i=0;i<dojo._loadedUrls.length;i++){dojox.off.files.cache(dojo._loadedUrls[i]);}},_save:function(){},_load:function(_231){dojox.off.sync._load(_231);}});dojox.storage.manager.addOnLoad(dojo.hitch(dojox.off,"_onStorageLoad"));dojo.addOnLoad(dojox.off,"_onPageLoad");}if(!dojo._hasResource["dojox.off"]){dojo._hasResource["dojox.off"]=true;dojo.provide("dojox.off");}if(!dojo._hasResource["dojox.off.ui"]){dojo._hasResource["dojox.off.ui"]=true;dojo.provide("dojox.off.ui");dojo.mixin(dojox.off.ui,{appName:"setme",autoEmbed:true,autoEmbedID:"dot-widget",runLink:window.location.href,runLinkTitle:"Run Application",learnHowPath:dojo.moduleUrl("dojox","off/resources/learnhow.html"),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(){},_initialize:function(){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;}this.runLinkText="Run "+this.appName;dojo.connect(dojox.off,"onNetwork",this,"_onNetwork");dojo.connect(dojox.off.sync,"onSync",this,"_onSync");dojox.off.files.cache([this.htmlTemplatePath,this.cssTemplatePath,this.onlineImagePath,this.offlineImagePath,this.rollerImagePath,this.checkmarkImagePath]);if(this.autoEmbed){this._doAutoEmbed();}},_doAutoEmbed:function(){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){var _234=dojo.byId(this.autoEmbedID);if(_234){_234.innerHTML=data;}this._initImages();this._updateNetIndicator();this._initLearnHow();this._initialized=true;if(!dojox.off.hasOfflineCache){this._showNeedsOfflineCache();return;}if(dojox.off.hasOfflineCache&&dojox.off.browserRestart){this._needsBrowserRestart();return;}else{var _235=dojo.byId("dot-widget-browser-restart");if(_235){_235.style.display="none";}}this._updateSyncUI();this._initMainEvtHandlers();this._setOfflineEnabled(dojox.off.enabled);this._onNetwork(dojox.off.isOnline?"online":"offline");this._testNet();},_testNet:function(){dojox.off.goOnline(dojo.hitch(this,function(_236){this._onNetwork(_236?"online":"offline");this.onLoad();}));},_updateNetIndicator:function(){var _237=dojo.byId("dot-widget-network-indicator-online");var _238=dojo.byId("dot-widget-network-indicator-offline");var _239=dojo.byId("dot-widget-title-text");if(_237&&_238){if(dojox.off.isOnline==true){_237.style.display="inline";_238.style.display="none";}else{_237.style.display="none";_238.style.display="inline";}}if(_239){if(dojox.off.isOnline){_239.innerHTML="Online";}else{_239.innerHTML="Offline";}}},_initLearnHow:function(){var _23a=dojo.byId("dot-widget-learn-how-link");if(!_23a){return;}if(!this.customLearnHowPath){var _23b=dojo.config.baseRelativePath;this.learnHowPath+="?appName="+encodeURIComponent(this.appName)+"&hasOfflineCache="+dojox.off.hasOfflineCache+"&runLink="+encodeURIComponent(this.runLink)+"&runLinkText="+encodeURIComponent(this.runLinkText)+"&baseRelativePath="+encodeURIComponent(_23b);dojox.off.files.cache(this.learnHowJSPath);dojox.off.files.cache(this.learnHowPath);}_23a.setAttribute("href",this.learnHowPath);var _23c=dojo.byId("dot-widget-learn-how-app-name");if(!_23c){return;}_23c.innerHTML="";_23c.appendChild(document.createTextNode(this.appName));},_validateAppName:function(_23d){if(!_23d){return false;}return (/^[a-z0-9 ]*$/i.test(_23d));},_updateSyncUI:function(){var _23e=dojo.byId("dot-roller");var _23f=dojo.byId("dot-success-checkmark");var _240=dojo.byId("dot-sync-messages");var _241=dojo.byId("dot-sync-details");var _242=dojo.byId("dot-sync-cancel");if(dojox.off.sync.isSyncing){this._clearSyncMessage();if(_23e){_23e.style.display="inline";}if(_23f){_23f.style.display="none";}if(_240){dojo.removeClass(_240,"dot-sync-error");}if(_241){_241.style.display="none";}if(_242){_242.style.display="inline";}}else{if(_23e){_23e.style.display="none";}if(_242){_242.style.display="none";}if(_240){dojo.removeClass(_240,"dot-sync-error");}}},_setSyncMessage:function(_243){var _244=dojo.byId("dot-sync-messages");if(_244){while(_244.firstChild){_244.removeChild(_244.firstChild);}_244.appendChild(document.createTextNode(_243));}},_clearSyncMessage:function(){this._setSyncMessage("");},_initImages:function(){var _245=dojo.byId("dot-widget-network-indicator-online");if(_245){_245.setAttribute("src",this.onlineImagePath);}var _246=dojo.byId("dot-widget-network-indicator-offline");if(_246){_246.setAttribute("src",this.offlineImagePath);}var _247=dojo.byId("dot-roller");if(_247){_247.setAttribute("src",this.rollerImagePath);}var _248=dojo.byId("dot-success-checkmark");if(_248){_248.setAttribute("src",this.checkmarkImagePath);}},_showDetails:function(evt){evt.preventDefault();evt.stopPropagation();if(!dojox.off.sync.details.length){return;}var html="";html+="<html><head><title>Sync Details</title><head><body>";html+="<h1>Sync Details</h1>\n";html+="<ul>\n";for(var i=0;i<dojox.off.sync.details.length;i++){html+="<li>";html+=dojox.off.sync.details[i];html+="</li>";}html+="</ul>\n";html+="<a href='javascript:window.close()' "+"style='text-align: right; padding-right: 2em;'>"+"Close Window"+"</a>\n";html+="</body></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");}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/offline.js.uncompressed.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/offline.js.uncompressed.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/offline.js.uncompressed.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxxxxx
+
+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<Nr; round++) {
+			state = SubBytes(state, Nb);
+			state = ShiftRows(state, Nb);
+			state = MixColumns(state, Nb);
+			state = AddRoundKey(state, w, round, Nb);
+		  }
+
+		  state = SubBytes(state, Nb);
+		  state = ShiftRows(state, Nb);
+		  state = AddRoundKey(state, w, Nr, Nb);
+
+		  var output = new Array(4*Nb);	 // convert state to 1-d array before returning [§3.4]
+		  for (var i=0; i<4*Nb; i++) output[i] = state[i%4][Math.floor(i/4)];
+		  return output;
+		}
+
+
+		function SubBytes(s, Nb) {	  // apply SBox to state S [§5.1.1]
+		  for (var r=0; r<4; r++) {
+			for (var c=0; c<Nb; c++) s[r][c] = Sbox[s[r][c]];
+		  }
+		  return s;
+		}
+
+
+		function ShiftRows(s, Nb) {	   // shift row r of state S left by r bytes [§5.1.2]
+		  var t = new Array(4);
+		  for (var r=1; r<4; r++) {
+			for (var c=0; c<4; c++) t[c] = s[r][(c+r)%Nb];	// shift into temp copy
+			for (var c=0; c<4; c++) s[r][c] = t[c];			// and copy back
+		  }			 // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
+		  return s;	 // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf 
+		}
+
+
+		function MixColumns(s, Nb) {   // combine bytes of each col of state S [§5.1.3]
+		  for (var c=0; c<4; c++) {
+			var a = new Array(4);  // 'a' is a copy of the current column from 's'
+			var b = new Array(4);  // 'b' is a•{02} in GF(2^8)
+			for (var i=0; i<4; i++) {
+			  a[i] = s[i][c];
+			  b[i] = s[i][c]&0x80 ? s[i][c]<<1 ^ 0x011b : s[i][c]<<1;
+			}
+			// a[n] ^ b[n] is a•{03} in GF(2^8)
+			s[0][c] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3]; // 2*a0 + 3*a1 + a2 + a3
+			s[1][c] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3]; // a0 * 2*a1 + 3*a2 + a3
+			s[2][c] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3]; // a0 + a1 + 2*a2 + 3*a3
+			s[3][c] = a[0] ^ b[0] ^ a[1] ^ a[2] ^ b[3]; // 3*a0 + a1 + a2 + 2*a3
+		  }
+		  return s;
+		}
+
+
+		function AddRoundKey(state, w, rnd, Nb) {  // xor Round Key into state S [§5.1.4]
+		  for (var r=0; r<4; r++) {
+			for (var c=0; c<Nb; c++) state[r][c] ^= w[rnd*4+c][r];
+		  }
+		  return state;
+		}
+
+
+		function KeyExpansion(key) {  // generate Key Schedule (byte-array Nr+1 x Nb) from Key [§5.2]
+		  var Nb = 4;			 // block size (in words): no of columns in state (fixed at 4 for AES)
+		  var Nk = key.length/4	 // key length (in words): 4/6/8 for 128/192/256-bit keys
+		  var Nr = Nk + 6;		 // no of rounds: 10/12/14 for 128/192/256-bit keys
+
+		  var w = new Array(Nb*(Nr+1));
+		  var temp = new Array(4);
+
+		  for (var i=0; i<Nk; i++) {
+			var r = [key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]];
+			w[i] = r;
+		  }
+
+		  for (var i=Nk; i<(Nb*(Nr+1)); i++) {
+			w[i] = new Array(4);
+			for (var t=0; t<4; t++) temp[t] = w[i-1][t];
+			if (i % Nk == 0) {
+			  temp = SubWord(RotWord(temp));
+			  for (var t=0; t<4; t++) temp[t] ^= Rcon[i/Nk][t];
+			} else if (Nk > 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<nBytes; i++) pwBytes[i] = password.charCodeAt(i) & 0xff;
+
+		  var key = Cipher(pwBytes, KeyExpansion(pwBytes));
+
+		  key = key.concat(key.slice(0, nBytes-16));  // key is now 16/24/32 bytes long
+
+		  // initialise counter block (NIST SP800-38A §B.2): millisecond time-stamp for nonce in 1st 8 bytes,
+		  // block counter in 2nd 8 bytes
+		  var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
+		  var counterBlock = new Array(blockSize);	// block size fixed at 16 bytes / 128 bits (Nb=4) for AES
+		  var nonce = (new Date()).getTime();  // milliseconds since 1-Jan-1970
+
+		  // encode nonce in two stages to cater for JavaScript 32-bit limit on bitwise ops
+		  for (var i=0; i<4; i++) counterBlock[i] = (nonce >>> 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<blockCount; b++) {
+			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
+			// again done in two stages for 32-bit ops
+			for (var c=0; c<4; c++) counterBlock[15-c] = (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<blockCount-1 ? blockSize : (plaintext.length-1)%blockSize+1;
+
+			var ct = '';
+			for (var i=0; i<blockLength; i++) {	 // -- xor plaintext with ciphered counter byte-by-byte --
+			  var plaintextByte = plaintext.charCodeAt(b*blockSize+i);
+			  var cipherByte = plaintextByte ^ cipherCntr[i];
+			  ct += String.fromCharCode(cipherByte);
+			}
+			// ct is now ciphertext for this block
+
+			ciphertext[b] = escCtrlChars(ct);  // escape troublesome characters in ciphertext
+		  }
+
+		  // convert the nonce to a string to go on the front of the ciphertext
+		  var ctrTxt = '';
+		  for (var i=0; i<8; i++) ctrTxt += String.fromCharCode(counterBlock[i]);
+		  ctrTxt = escCtrlChars(ctrTxt);
+
+		  // use '-' to separate blocks, use Array.join to concatenate arrays of strings for efficiency
+		  return ctrTxt + '-' + ciphertext.join('-');
+		}
+
+
+		/* 
+		 * Use AES to decrypt 'ciphertext' with 'password' using 'nBits' key, in Counter mode of operation
+		 *
+		 *	 for each block
+		 *	 - outputblock = cipher(counter, key)
+		 *	 - cipherblock = plaintext xor outputblock
+		 */
+		function AESDecryptCtr(ciphertext, password, nBits) {
+		  if (!(nBits==128 || nBits==192 || nBits==256)) return '';	 // standard allows 128/192/256 bit keys
+
+		  var nBytes = nBits/8;	 // no bytes in key
+		  var pwBytes = new Array(nBytes);
+		  for (var i=0; i<nBytes; i++) pwBytes[i] = password.charCodeAt(i) & 0xff;
+		  var pwKeySchedule = KeyExpansion(pwBytes);
+		  var key = Cipher(pwBytes, pwKeySchedule);
+		  key = key.concat(key.slice(0, nBytes-16));  // key is now 16/24/32 bytes long
+
+		  var keySchedule = KeyExpansion(key);
+
+		  ciphertext = ciphertext.split('-');  // split ciphertext into array of block-length strings 
+
+		  // recover nonce from 1st element of ciphertext
+		  var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
+		  var counterBlock = new Array(blockSize);
+		  var ctrTxt = unescCtrlChars(ciphertext[0]);
+		  for (var i=0; i<8; i++) counterBlock[i] = ctrTxt.charCodeAt(i);
+
+		  var plaintext = new Array(ciphertext.length-1);
+
+		  for (var b=1; b<ciphertext.length; b++) {
+			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
+			for (var c=0; c<4; c++) counterBlock[15-c] = ((b-1) >>> 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<ciphertext[b].length; i++) {
+			  // -- xor plaintext with ciphered counter byte-by-byte --
+			  var ciphertextByte = ciphertext[b].charCodeAt(i);
+			  var plaintextByte = ciphertextByte ^ cipherCntr[i];
+			  pt += String.fromCharCode(plaintextByte);
+			}
+			// pt is now plaintext for this block
+
+			plaintext[b-1] = pt;  // b-1 'cos no initial nonce block in plaintext
+		  }
+
+		  return plaintext.join('');
+		}
+
+		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+
+		function escCtrlChars(str) {  // escape control chars which might cause problems handling ciphertext
+		  return str.replace(/[\0\t\n\v\f\r\xa0!-]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });
+		}  // \xa0 to cater for bug in Firefox; include '-' to leave it free for use as a block marker
+
+		function unescCtrlChars(str) {	// unescape potentially problematic control characters
+		  return str.replace(/!\d\d?\d?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });
+		}
+
+		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+		
+		function encrypt(plaintext, password){
+			return AESEncryptCtr(plaintext, password, 256);
+		}
+
+		function decrypt(ciphertext, password){	
+			return AESDecryptCtr(ciphertext, password, 256);
+		}
+		
+		/* End AES Implementation */
+		
+		var cmd = msg.substr(0,4);
+		var arg = msg.substr(5);
+		if(cmd == "encr"){
+			arg = eval("(" + arg + ")");
+			var plaintext = arg.plaintext;
+			var password = arg.password;
+			var results = encrypt(plaintext, password);
+			gearsWorkerPool.sendMessage(String(results), sender);
+		}else if(cmd == "decr"){
+			arg = eval("(" + arg + ")");
+			var ciphertext = arg.ciphertext;
+			var password = arg.password;
+			var results = decrypt(ciphertext, password);
+			gearsWorkerPool.sendMessage(String(results), sender);
+		}
+	}
+});
+
+}
+
+if(!dojo._hasResource["dojox._sql.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox._sql.common"] = true;
+dojo.provide("dojox._sql.common");
+
+
+
+// summary:
+//	Executes a SQL expression.
+// description:
+// 	There are four ways to call this:
+// 	1) Straight SQL: dojox.sql("SELECT * FROM FOOBAR");
+// 	2) SQL with parameters: dojox.sql("INSERT INTO FOOBAR VALUES (?)", someParam)
+// 	3) Encrypting particular values: 
+//			dojox.sql("INSERT INTO FOOBAR VALUES (ENCRYPT(?))", someParam, "somePassword", callback)
+// 	4) Decrypting particular values:
+//			dojox.sql("SELECT DECRYPT(SOMECOL1), DECRYPT(SOMECOL2) FROM
+//					FOOBAR WHERE SOMECOL3 = ?", someParam,
+//					"somePassword", callback)
+//
+// 	For encryption and decryption the last two values should be the the password for
+// 	encryption/decryption, and the callback function that gets the result set.
+//
+// 	Note: We only support ENCRYPT(?) statements, and
+// 	and DECRYPT(*) statements for now -- you can not have a literal string
+// 	inside of these, such as ENCRYPT('foobar')
+//
+// 	Note: If you have multiple columns to encrypt and decrypt, you can use the following
+// 	convenience form to not have to type ENCRYPT(?)/DECRYPT(*) many times:
+//
+// 	dojox.sql("INSERT INTO FOOBAR VALUES (ENCRYPT(?, ?, ?))", 
+//					someParam1, someParam2, someParam3, 
+//					"somePassword", callback)
+//
+// 	dojox.sql("SELECT DECRYPT(SOMECOL1, SOMECOL2) FROM
+//					FOOBAR WHERE SOMECOL3 = ?", someParam,
+//					"somePassword", callback)
+dojox.sql = new Function("return dojox.sql._exec(arguments);");
+
+dojo.mixin(dojox.sql, {
+	dbName: null,
+	
+	// summary:
+	//	If true, then we print out any SQL that is executed
+	//	to the debug window
+	debug: (dojo.exists("dojox.sql.debug")?dojox.sql.debug:false),
+
+	open: function(dbName){
+		if(this._dbOpen && (!dbName || dbName == this.dbName)){
+			return;
+		}
+		
+		if(!this.dbName){
+			this.dbName = "dot_store_" 
+				+ window.location.href.replace(/[^0-9A-Za-z_]/g, "_");
+			// database names in Gears are limited to 64 characters long
+			if(this.dbName.length > 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@xxxxxxxxxxxx 
+			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<keys.length;i++) {
+						// serialize the value;
+						// handle strings differently so they have better performance
+						var value = values[i];
+						if(dojo.isString(value)){
+							value = "string:" + value;
+						}else{
+							value = dojo.toJson(value);
+						}
+				
+						dojox.sql.db.execute( _stmt,
+							[namespace, keys[i], value]);
+					}
+					dojox.sql.db.execute("COMMIT TRANSACTION");
+					dojox.sql.close();
+				}catch(e){
+					// indicate we failed
+					console.debug("dojox.storage.GearsStorageProvider.putMultiple:", e);
+					if(resultsHandler){
+						resultsHandler(this.FAILED, keys, e.toString());
+					}
+					return;
+				}
+				
+				if(resultsHandler){
+					resultsHandler(dojox.storage.SUCCESS, key, null);
+				}
+			},
+
+			getMultiple: function(keys, namespace){
+				//	TODO: Maybe use SELECT IN instead
+
+				if(this.isValidKeyArray(keys) === false){
+					throw new ("Invalid key array given: " + keys);
+				}
+				
+				if(namespace == null || typeof namespace == "undefined"){
+					namespace = dojox.storage.DEFAULT_NAMESPACE;		
+				}
+				
+				if(this.isValidKey(namespace) == false){
+					throw new Error("Invalid namespace given: " + namespace);
+				}
+		
+				var _stmt = "SELECT * FROM " + this.TABLE_NAME	+ 
+					" WHERE namespace = ? AND "	+ " key = ?";
+				
+				var results = [];
+				for(var i=0;i<keys.length;i++){
+					var result = dojox.sql( _stmt, namespace, keys[i]);
+						
+					if( ! result.length){
+						results[i] = null;
+					}else{
+						result = result[0].value;
+						
+						// destringify the content back into a 
+						// real JavaScript object;
+						// handle strings differently so they have better performance
+						if(dojo.isString(result) && (/^string:/.test(result))){
+							results[i] = result.substring("string:".length);
+						}else{
+							results[i] = dojo.fromJson(result);
+						}
+					}
+				}
+				
+				return results;
+			},
+			
+			removeMultiple: function(keys, namespace){
+				namespace = namespace||this.DEFAULT_NAMESPACE;
+				
+				dojox.sql.open();
+				dojox.sql.db.execute("BEGIN TRANSACTION");
+				var _stmt = "DELETE FROM " + this.TABLE_NAME + " WHERE namespace = ? AND key = ?";
+
+				for(var i=0;i<keys.length;i++){
+					dojox.sql.db.execute( _stmt,
+						[namespace, keys[i]]);
+				}
+				dojox.sql.db.execute("COMMIT TRANSACTION");
+				dojox.sql.close();
+			}, 				
+			
+			isPermanent: function(){ return true; },
+
+			getMaximumSize: function(){ return this.SIZE_NO_LIMIT; },
+
+			hasSettingsUI: function(){ return false; },
+			
+			showSettingsUI: function(){
+				throw new Error(this.declaredClass 
+									+ " does not support a storage settings user-interface");
+			},
+			
+			hideSettingsUI: function(){
+				throw new Error(this.declaredClass 
+									+ " does not support a storage settings user-interface");
+			}
+		});
+
+		// register the existence of our storage providers
+		dojox.storage.manager.register("dojox.storage.GearsStorageProvider",
+										new dojox.storage.GearsStorageProvider());
+	})();
+}
+
+}
+
+if(!dojo._hasResource["dojox.storage.WhatWGStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.storage.WhatWGStorageProvider"] = true;
+dojo.provide("dojox.storage.WhatWGStorageProvider");
+
+
+
+dojo.declare("dojox.storage.WhatWGStorageProvider", [ dojox.storage.Provider ], {
+	// summary:
+	//		Storage provider that uses WHAT Working Group features in Firefox 2 
+	//		to achieve permanent storage.
+	// description: 
+	//		The WHAT WG storage API is documented at 
+	//		http://www.whatwg.org/specs/web-apps/current-work/#scs-client-side
+	//
+	//		You can disable this storage provider with the following djConfig
+	//		variable:
+	//		var djConfig = { disableWhatWGStorage: true };
+	//		
+	//		Authors of this storage provider-	
+	//			JB Boisseau, jb.boisseau@xxxxxxxxxxxxxxx
+	//			Brad Neuberg, bkn3@xxxxxxxxxxxx 
+
+	initialized: false,
+	
+	_domain: null,
+	_available: null,
+	_statusHandler: null,
+	_allNamespaces: null,
+	_storageEventListener: null,
+	
+	initialize: function(){
+		if(dojo.config["disableWhatWGStorage"] == true){
+			return;
+		}
+		
+		// get current domain
+		// see: https://bugzilla.mozilla.org/show_bug.cgi?id=357323
+		this._domain = (location.hostname == "localhost") ? "localhost.localdomain" : location.hostname;
+		// console.debug(this._domain);
+		
+		// indicate that this storage provider is now loaded
+		this.initialized = true;
+		dojox.storage.manager.loaded();	
+	},
+	
+	isAvailable: function(){
+		try{
+			// see: https://bugzilla.mozilla.org/show_bug.cgi?id=357323
+			var myStorage = globalStorage[((location.hostname == "localhost") ? "localhost.localdomain" : location.hostname)];
+		}catch(e){
+			this._available = false;
+			return this._available;
+		}
+		
+		this._available = true;	
+		return this._available;
+	},
+
+	put: function(key, value, resultsHandler, namespace){
+		if(this.isValidKey(key) == false){
+			throw new Error("Invalid key given: " + key);
+		}
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		// get our full key name, which is namespace + key
+		key = this.getFullKey(key, 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);
+		}
+		
+		// register for successful storage events.
+		var storageListener = dojo.hitch(this, function(evt){
+			// remove any old storage event listener we might have added
+			// to the window on old put() requests; Firefox has a bug
+			// where it can occassionaly go into infinite loops calling
+			// our storage event listener over and over -- this is a 
+			// workaround
+			// FIXME: Simplify this into a test case and submit it
+			// to Firefox
+			window.removeEventListener("storage", storageListener, false);
+			
+			// indicate we succeeded
+			if(resultsHandler){
+				resultsHandler.call(null, this.SUCCESS, key);
+			}
+		});
+		
+		window.addEventListener("storage", storageListener, false);
+		
+		// try to store the value	
+		try{
+			var myStorage = globalStorage[this._domain];
+			myStorage.setItem(key, value);
+		}catch(e){
+			// indicate we failed
+			this._statusHandler.call(null, this.FAILED, key, e.toString());
+		}
+	},
+
+	get: function(key, namespace){
+		if(this.isValidKey(key) == false){
+			throw new Error("Invalid key given: " + key);
+		}
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		// get our full key name, which is namespace + key
+		key = this.getFullKey(key, namespace);
+		
+		// sometimes, even if a key doesn't exist, Firefox
+		// will return a blank string instead of a null --
+		// this _might_ be due to having underscores in the
+		// keyname, but I am not sure.
+		
+		// FIXME: Simplify this bug into a testcase and
+		// submit it to Firefox
+		var myStorage = globalStorage[this._domain];
+		var results = myStorage.getItem(key);
+		
+		if(results == null || results == ""){
+			return null;
+		}
+		
+		results = results.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 = [ this.DEFAULT_NAMESPACE ];
+		
+		// simply enumerate through our array and save any string
+		// that starts with __
+		var found = {};
+		var myStorage = globalStorage[this._domain];
+		var tester = /^__([^_]*)_/;
+		for(var i = 0; i < myStorage.length; i++){
+			var currentKey = myStorage.key(i);
+			if(tester.test(currentKey) == true){
+				var currentNS = currentKey.match(tester)[1];
+				// have we seen this namespace before?
+				if(typeof found[currentNS] == "undefined"){
+					found[currentNS] = true;
+					results.push(currentNS);
+				}
+			}
+		}
+		
+		return results;
+	},
+
+	getKeys: function(namespace){
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		if(this.isValidKey(namespace) == false){
+			throw new Error("Invalid namespace given: " + namespace);
+		}
+		
+		// create a regular expression to test the beginning
+		// of our key names to see if they match our namespace;
+		// if it is the default namespace then test for the presence
+		// of no namespace for compatibility with older versions
+		// of dojox.storage
+		var namespaceTester;
+		if(namespace == this.DEFAULT_NAMESPACE){
+			namespaceTester = new RegExp("^([^_]{2}.*)$");	
+		}else{
+			namespaceTester = new RegExp("^__" + namespace + "_(.*)$");
+		}
+		
+		var myStorage = globalStorage[this._domain];
+		var keysArray = [];
+		for(var i = 0; i < myStorage.length; i++){
+			var currentKey = myStorage.key(i);
+			if(namespaceTester.test(currentKey) == true){
+				// strip off the namespace portion
+				currentKey = currentKey.match(namespaceTester)[1];
+				keysArray.push(currentKey);
+			}
+		}
+		
+		return keysArray;
+	},
+
+	clear: function(namespace){
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		if(this.isValidKey(namespace) == false){
+			throw new Error("Invalid namespace given: " + namespace);
+		}
+		
+		// create a regular expression to test the beginning
+		// of our key names to see if they match our namespace;
+		// if it is the default namespace then test for the presence
+		// of no namespace for compatibility with older versions
+		// of dojox.storage
+		var namespaceTester;
+		if(namespace == this.DEFAULT_NAMESPACE){
+			namespaceTester = new RegExp("^[^_]{2}");	
+		}else{
+			namespaceTester = new RegExp("^__" + namespace + "_");
+		}
+		
+		var myStorage = globalStorage[this._domain];
+		var keys = [];
+		for(var i = 0; i < myStorage.length; i++){
+			if(namespaceTester.test(myStorage.key(i)) == true){
+				keys[keys.length] = myStorage.key(i);
+			}
+		}
+		
+		dojo.forEach(keys, dojo.hitch(myStorage, "removeItem"));
+	},
+	
+	remove: function(key, namespace){
+		// get our full key name, which is namespace + key
+		key = this.getFullKey(key, namespace);
+		
+		var myStorage = globalStorage[this._domain];
+		myStorage.removeItem(key);
+	},
+	
+	isPermanent: function(){
+		return true;
+	},
+
+	getMaximumSize: function(){
+		return this.SIZE_NO_LIMIT;
+	},
+
+	hasSettingsUI: function(){
+		return false;
+	},
+	
+	showSettingsUI: function(){
+		throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+	},
+	
+	hideSettingsUI: function(){
+		throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+	},
+	
+	getFullKey: function(key, namespace){
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		if(this.isValidKey(namespace) == false){
+			throw new Error("Invalid namespace given: " + namespace);
+		}
+		
+		// don't append a namespace string for the default namespace,
+		// for compatibility with older versions of dojox.storage
+		if(namespace == this.DEFAULT_NAMESPACE){
+			return key;
+		}else{
+			return "__" + namespace + "_" + key;
+		}
+	}
+});
+
+dojox.storage.manager.register("dojox.storage.WhatWGStorageProvider", 
+								new dojox.storage.WhatWGStorageProvider());
+
+}
+
+if(!dojo._hasResource["dijit._base.place"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.place"] = true;
+dojo.provide("dijit._base.place");
+
+// ported from dojo.html.util
+
+dijit.getViewport = function(){
+	//	summary
+	//	Returns the dimensions and scroll position of the viewable area of a browser window
+
+	var _window = dojo.global;
+	var _document = dojo.doc;
+
+	// get viewport size
+	var w = 0, h = 0;
+	var de = _document.documentElement;
+	var dew = de.clientWidth, deh = de.clientHeight;
+	if(dojo.isMozilla){
+		// mozilla
+		// _window.innerHeight includes the height taken by the scroll bar
+		// clientHeight is ideal but has DTD issues:
+		// #4539: FF reverses the roles of body.clientHeight/Width and documentElement.clientHeight/Width based on the DTD!
+		// check DTD to see whether body or documentElement returns the viewport dimensions using this algorithm:
+		var minw, minh, maxw, maxh;
+		var dbw = _document.body.clientWidth;
+		if(dbw > dew){
+			minw = dew;
+			maxw = dbw;
+		}else{
+			maxw = dew;
+			minw = dbw;
+		}
+		var dbh = _document.body.clientHeight;
+		if(dbh > deh){
+			minh = deh;
+			maxh = dbh;
+		}else{
+			maxh = deh;
+			minh = dbh;
+		}
+		w = (maxw > _window.innerWidth) ? minw : maxw;
+		h = (maxh > _window.innerHeight) ? minh : maxh;
+	}else if(!dojo.isOpera && _window.innerWidth){
+		//in opera9, dojo.body().clientWidth should be used, instead
+		//of window.innerWidth/document.documentElement.clientWidth
+		//so we have to check whether it is opera
+		w = _window.innerWidth;
+		h = _window.innerHeight;
+	}else if(dojo.isIE && de && deh){
+		w = dew;
+		h = deh;
+	}else if(dojo.body().clientWidth){
+		// IE5, Opera
+		w = dojo.body().clientWidth;
+		h = dojo.body().clientHeight;
+	}
+
+	// get scroll position
+	var scroll = dojo._docScroll();
+
+	return { w: w, h: h, l: scroll.x, t: scroll.y };	//	object
+};
+
+dijit.placeOnScreen = function(
+	/* DomNode */	node,
+	/* Object */		pos,
+	/* Object */		corners,
+	/* boolean? */		tryOnly){
+	//	summary:
+	//		Keeps 'node' in the visible area of the screen while trying to
+	//		place closest to pos.x, pos.y. The input coordinates are
+	//		expected to be the desired document position.
+	//
+	//		Set which corner(s) you want to bind to, such as
+	//		
+	//			placeOnScreen(node, {x: 10, y: 20}, ["TR", "BL"])
+	//		
+	//		The desired x/y will be treated as the topleft(TL)/topright(TR) or
+	//		BottomLeft(BL)/BottomRight(BR) corner of the node. Each corner is tested
+	//		and if a perfect match is found, it will be used. Otherwise, it goes through
+	//		all of the specified corners, and choose the most appropriate one.
+	//		
+	//		NOTE: node is assumed to be absolutely or relatively positioned.
+
+	var choices = dojo.map(corners, function(corner){ return { corner: corner, pos: pos }; });
+
+	return dijit._place(node, choices);
+}
+
+dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ layoutNode){
+	// summary:
+	//		Given a list of spots to put node, put it at the first spot where it fits,
+	//		of if it doesn't fit anywhere then the place with the least overflow
+	// choices: Array
+	//		Array of elements like: {corner: 'TL', pos: {x: 10, y: 20} }
+	//		Above example says to put the top-left corner of the node at (10,20)
+	//	layoutNode: Function(node, aroundNodeCorner, nodeCorner)
+	//		for things like tooltip, they are displayed differently (and have different dimensions)
+	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
+
+	// get {x: 10, y: 10, w: 100, h:100} type obj representing position of
+	// viewport over document
+	var view = dijit.getViewport();
+
+	// This won't work if the node is inside a <div style="position: relative">,
+	// so reattach it to dojo.doc.body.   (Otherwise, the positioning will be wrong
+	// and also it might get cutoff)
+	if(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != "body"){
+		dojo.body().appendChild(node);
+	}
+
+	var best = null;
+	dojo.some(choices, function(choice){
+		var corner = choice.corner;
+		var pos = choice.pos;
+
+		// configure node to be displayed in given position relative to button
+		// (need to do this in order to get an accurate size for the node, because
+		// a tooltips size changes based on position, due to triangle)
+		if(layoutNode){
+			layoutNode(node, choice.aroundCorner, corner);
+		}
+
+		// get node's size
+		var style = node.style;
+		var oldDisplay = style.display;
+		var oldVis = style.visibility;
+		style.visibility = "hidden";
+		style.display = "";
+		var mb = dojo.marginBox(node);
+		style.display = oldDisplay;
+		style.visibility = oldVis;
+
+		// coordinates and size of node with specified corner placed at pos,
+		// and clipped by viewport
+		var startX = (corner.charAt(1) == 'L' ? pos.x : Math.max(view.l, pos.x - mb.w)),
+			startY = (corner.charAt(0) == 'T' ? pos.y : Math.max(view.t, pos.y -  mb.h)),
+			endX = (corner.charAt(1) == 'L' ? Math.min(view.l + view.w, startX + mb.w) : pos.x),
+			endY = (corner.charAt(0) == 'T' ? Math.min(view.t + view.h, startY + mb.h) : pos.y),
+			width = endX - startX,
+			height = endY - startY,
+			overflow = (mb.w - width) + (mb.h - height);
+
+		if(best == null || overflow < best.overflow){
+			best = {
+				corner: corner,
+				aroundCorner: choice.aroundCorner,
+				x: startX,
+				y: startY,
+				w: width,
+				h: height,
+				overflow: overflow
+			};
+		}
+		return !overflow;
+	});
+
+	node.style.left = best.x + "px";
+	node.style.top = best.y + "px";
+	if(best.overflow && layoutNode){
+		layoutNode(node, best.aroundCorner, best.corner);
+	}
+	return best;
+}
+
+dijit.placeOnScreenAroundElement = function(
+	/* DomNode */		node,
+	/* DomNode */		aroundNode,
+	/* Object */		aroundCorners,
+	/* Function */		layoutNode){
+
+	//	summary
+	//	Like placeOnScreen, except it accepts aroundNode instead of x,y
+	//	and attempts to place node around it.  Uses margin box dimensions.
+	//
+	//	aroundCorners
+	//		specify Which corner of aroundNode should be
+	//		used to place the node => which corner(s) of node to use (see the
+	//		corners parameter in dijit.placeOnScreen)
+	//		e.g. {'TL': 'BL', 'BL': 'TL'}
+	//
+	//	layoutNode: Function(node, aroundNodeCorner, nodeCorner)
+	//		for things like tooltip, they are displayed differently (and have different dimensions)
+	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
+
+
+	// get coordinates of aroundNode
+	aroundNode = dojo.byId(aroundNode);
+	var oldDisplay = aroundNode.style.display;
+	aroundNode.style.display="";
+	// #3172: use the slightly tighter border box instead of marginBox
+	var aroundNodeW = aroundNode.offsetWidth; //mb.w;
+	var aroundNodeH = aroundNode.offsetHeight; //mb.h;
+	var aroundNodePos = dojo.coords(aroundNode, true);
+	aroundNode.style.display=oldDisplay;
+
+	// Generate list of possible positions for node
+	var choices = [];
+	for(var nodeCorner in aroundCorners){
+		choices.push( {
+			aroundCorner: nodeCorner,
+			corner: aroundCorners[nodeCorner],
+			pos: {
+				x: aroundNodePos.x + (nodeCorner.charAt(1) == 'L' ? 0 : aroundNodeW),
+				y: aroundNodePos.y + (nodeCorner.charAt(0) == 'T' ? 0 : aroundNodeH)
+			}
+		});
+	}
+
+	return dijit._place(node, choices, layoutNode);
+}
+
+}
+
+if(!dojo._hasResource["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([
+			'<script language="VBScript" type="text/vbscript"\>',
+			'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',
+			'</script\>'].join("\r\n"));
+	}
+	
+	this._detectVersion();
+}
+
+dojox.flash.Info.prototype = {
+	// version: String
+	//		The full version string, such as "8r22".
+	version: -1,
+	
+	// versionMajor, versionMinor, versionRevision: String
+	//		The major, minor, and revisions of the plugin. For example, if the
+	//		plugin is 8r22, then the major version is 8, the minor version is 0,
+	//		and the revision is 22. 
+	versionMajor: -1,
+	versionMinor: -1,
+	versionRevision: -1,
+	
+	// capable: Boolean
+	//		Whether this platform has Flash already installed.
+	capable: false,
+	
+	// installing: Boolean
+	//	Set if we are in the middle of a Flash installation session.
+	installing: false,
+	
+	isVersionOrAbove: function(
+							/* int */ reqMajorVer, 
+							/* int */ reqMinorVer, 
+							/* int */ reqVer){ /* Boolean */
+		// summary: 
+		//	Asserts that this environment has the given major, minor, and revision
+		//	numbers for the Flash player.
+		// description:
+		//	Asserts that this environment has the given major, minor, and revision
+		//	numbers for the Flash player. 
+		//	
+		//	Example- To test for Flash Player 7r14:
+		//	
+		//	dojox.flash.info.isVersionOrAbove(7, 0, 14)
+		// returns:
+		//	Returns true if the player is equal
+		//	or above the given version, false otherwise.
+		
+		// make the revision a decimal (i.e. transform revision 14 into
+		// 0.14
+		reqVer = parseFloat("." + reqVer);
+		
+		if(this.versionMajor >= reqMajorVer && this.versionMinor >= reqMinorVer
+			 && this.versionRevision >= reqVer){
+			return true;
+		}else{
+			return false;
+		}
+	},
+	
+	_detectVersion: function(){
+		var versionStr;
+		
+		// loop backwards through the versions until we find the newest version	
+		for(var testVersion = 25; testVersion > 0; testVersion--){
+			if(dojo.isIE){
+				versionStr = VBGetSwfVer(testVersion);
+			}else{
+				versionStr = this._JSFlashInfo(testVersion);		
+			}
+				
+			if(versionStr == -1 ){
+				this.capable = false; 
+				return;
+			}else if(versionStr != 0){
+				var versionArray;
+				if(dojo.isIE){
+					var tempArray = versionStr.split(" ");
+					var tempString = tempArray[1];
+					versionArray = tempString.split(",");
+				}else{
+					versionArray = versionStr.split(".");
+				}
+					
+				this.versionMajor = versionArray[0];
+				this.versionMinor = versionArray[1];
+				this.versionRevision = versionArray[2];
+				
+				// 7.0r24 == 7.24
+				var versionString = this.versionMajor + "." + this.versionRevision;
+				this.version = parseFloat(versionString);
+				
+				this.capable = true;
+				
+				break;
+			}
+		}
+	},
+	 
+	// JavaScript helper required to detect Flash Player PlugIn version 
+	// information. Internet Explorer uses a corresponding Visual Basic
+	// version to interact with the Flash ActiveX control. 
+	_JSFlashInfo: function(testVersion){
+		// NS/Opera version >= 3 check for Flash plugin in plugin array
+		if(navigator.plugins != null && navigator.plugins.length > 0){
+			if(navigator.plugins["Shockwave Flash 2.0"] || 
+				 navigator.plugins["Shockwave Flash"]){
+				var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
+				var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
+				var descArray = flashDescription.split(" ");
+				var tempArrayMajor = descArray[2].split(".");
+				var versionMajor = tempArrayMajor[0];
+				var versionMinor = tempArrayMajor[1];
+				if(descArray[3] != ""){
+					var tempArrayMinor = descArray[3].split("r");
+				}else{
+					var tempArrayMinor = descArray[4].split("r");
+				}
+				var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
+				var version = versionMajor + "." + versionMinor + "." 
+											+ versionRevision;
+											
+				return version;
+			}
+		}
+		
+		return -1;
+	}
+};
+
+dojox.flash.Embed = function(visible){
+	// summary: A class that is used to write out the Flash object into the page.
+	// description:
+	//	Writes out the necessary tags to embed a Flash file into the page. Note that
+	//	these tags are written out as the page is loaded using document.write, so
+	//	you must call this class before the page has finished loading.
+	
+	this._visible = visible;
+}
+
+dojox.flash.Embed.prototype = {
+	// width: int
+	//	The width of this Flash applet. The default is the minimal width
+	//	necessary to show the Flash settings dialog. Current value is 
+	//  215 pixels.
+	width: 215,
+	
+	// height: int 
+	//	The height of this Flash applet. The default is the minimal height
+	//	necessary to show the Flash settings dialog. Current value is
+	// 138 pixels.
+	height: 138,
+	
+	// id: String
+	// 	The id of the Flash object. Current value is 'flashObject'.
+	id: "flashObject",
+	
+	// Controls whether this is a visible Flash applet or not.
+	_visible: true,
+
+	protocol: function(){
+		switch(window.location.protocol){
+			case "https:":
+				return "https";
+				break;
+			default:
+				return "http";
+				break;
+		}
+	},
+	
+	write: function(/* Boolean? */ doExpressInstall){
+		// summary: Writes the Flash into the page.
+		// description:
+		//	This must be called before the page
+		//	is finished loading. 
+		// doExpressInstall: Boolean
+		//	Whether to write out Express Install
+		//	information. Optional value; defaults to false.
+		
+		// determine our container div's styling
+		var containerStyle = "";
+		containerStyle += ("width: " + this.width + "px; ");
+		containerStyle += ("height: " + this.height + "px; ");
+		if(!this._visible){
+			containerStyle += "position: absolute; z-index: 10000; top: -1000px; left: -1000px; ";
+		}
+		
+		// figure out the SWF file to get and how to write out the correct HTML
+		// for this Flash version
+		var objectHTML;
+		var swfloc = dojox.flash.url;
+		var swflocObject = swfloc;
+		var swflocEmbed = swfloc;
+		var dojoUrl = dojo.baseUrl;
+		if(doExpressInstall){
+			// the location to redirect to after installing
+			var redirectURL = escape(window.location);
+			document.title = document.title.slice(0, 47) + " - Flash Player Installation";
+			var docTitle = escape(document.title);
+			swflocObject += "?MMredirectURL=" + redirectURL
+			                + "&MMplayerType=ActiveX"
+			                + "&MMdoctitle=" + docTitle
+							+ "&baseUrl=" + escape(dojoUrl);
+			swflocEmbed += "?MMredirectURL=" + redirectURL 
+							+ "&MMplayerType=PlugIn"
+							+ "&baseUrl=" + escape(dojoUrl);
+		}else{
+		  // IE/Flash has an evil bug that shows up some time: if we load the
+		  // Flash and it isn't in the cache, ExternalInterface works fine --
+		  // however, the second time when its loaded from the cache a timing
+		  // bug can keep ExternalInterface from working. The trick below 
+		  // simply invalidates the Flash object in the cache all the time to
+		  // keep it loading fresh. -- Brad Neuberg
+		  swflocObject += "?cachebust=" + new Date().getTime();
+		}
+
+		if(swflocEmbed.indexOf("?") == -1){
+			swflocEmbed +=  '?baseUrl='+escape(dojoUrl);
+		}else{
+		  swflocEmbed +=  '&baseUrl='+escape(dojoUrl);
+		}
+
+		objectHTML =
+			'<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '
+			  + 'codebase="'
+				+ this.protocol()
+				+ '://fpdownload.macromedia.com/pub/shockwave/cabs/flash/'
+				+ 'swflash.cab#version=8,0,0,0"\n '
+			  + 'width="' + this.width + '"\n '
+			  + 'height="' + this.height + '"\n '
+			  + 'id="' + this.id + '"\n '
+			  + 'name="' + this.id + '"\n '
+			  + 'align="middle">\n '
+			  + '<param name="allowScriptAccess" value="sameDomain"></param>\n '
+			  + '<param name="movie" value="' + swflocObject + '"></param>\n '
+			  + '<param name="quality" value="high"></param>\n '
+			  + '<param name="bgcolor" value="#ffffff"></param>\n '
+			  + '<embed src="' + swflocEmbed + '" '
+			  	  + 'quality="high" '
+				  + 'bgcolor="#ffffff" '
+				  + 'width="' + this.width + '" '
+				  + 'height="' + this.height + '" '
+				  + 'id="' + this.id + 'Embed' + '" '
+				  + 'name="' + this.id + '" '
+				  + 'swLiveConnect="true" '
+				  + 'align="middle" '
+				  + 'allowScriptAccess="sameDomain" '
+				  + 'type="application/x-shockwave-flash" '
+				  + 'pluginspage="'
+				  + this.protocol()
+				  +'://www.macromedia.com/go/getflashplayer" '
+				  + '></embed>\n'
+			+ '</object>\n';
+					
+		// using same mechanism on all browsers now to write out
+		// Flash object into page
+
+		// document.write no longer works correctly
+		// due to Eolas patent workaround in IE;
+		// nothing happens (i.e. object doesn't
+		// go into page if we use it)
+		dojo.connect(dojo, "loaded", dojo.hitch(this, function(){
+			var div = document.createElement("div");
+			div.setAttribute("id", this.id + "Container");
+			div.setAttribute("style", containerStyle);
+			div.innerHTML = objectHTML;
+	
+			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(){ /* Object */
+		// summary: Gets the Flash object DOM node.
+		if(dojo.isIE || dojo.isSafari){
+			return document.getElementById(this.id);
+		}else{
+			// different IDs on OBJECT and EMBED tags or
+			// else Firefox will return wrong one and
+			// communication won't work; 
+			// also, document.getElementById() returns a
+			// plugin but ExternalInterface calls don't
+			// work on it so we have to use
+			// document[id] instead
+			return document[this.id + "Embed"];
+		}
+	},
+	
+	setVisible: function(/* Boolean */ visible){
+	  //console.debug("setVisible, visible="+visible);
+		
+		// summary: Sets the visibility of this Flash object.		
+		var container = dojo.byId(this.id + "Container");
+		if(visible == true){
+		  container.style.position = "absolute"; // IE -- Brad Neuberg
+			container.style.visibility = "visible";
+		}else{
+			container.style.position = "absolute";
+			container.style.x = "-1000px";
+			container.style.y = "-1000px";
+			container.style.visibility = "hidden";
+		}
+	},
+	
+	center: function(){
+		// summary: Centers the flash applet on the page.
+		
+		var elementWidth = this.width;
+		var elementHeight = this.height;
+
+		var viewport = dijit.getViewport();
+
+		// compute the centered position    
+		var x = viewport.l + (viewport.w - elementWidth) / 2;
+		var y = viewport.t + (viewport.h - elementHeight) / 2; 
+		
+		// set the centered position
+		var container = dojo.byId(this.id + "Container");
+		container.style.top = y + "px";
+		container.style.left = x + "px";
+	}
+};
+
+
+dojox.flash.Communicator = function(){
+	// summary:
+	//	A class that is used to communicate between Flash and JavaScript.
+	// description:
+	//	This class helps mediate Flash and JavaScript communication. Internally
+	//	it uses Flash 8's ExternalInterface API, but adds functionality to fix 
+	//	various encoding bugs that ExternalInterface has.
+}
+
+dojox.flash.Communicator.prototype = {
+	// Registers the existence of a Flash method that we can call with
+	// JavaScript, using Flash 8's ExternalInterface. 
+	_addExternalInterfaceCallback: function(methodName){
+		var wrapperCall = dojo.hitch(this, function(){
+			// some browsers don't like us changing values in the 'arguments' array, so
+			// make a fresh copy of it
+			var methodArgs = new Array(arguments.length);
+			for(var i = 0; i < arguments.length; i++){
+				methodArgs[i] = this._encodeData(arguments[i]);
+			}
+			
+			var results = this._execFlash(methodName, methodArgs);
+			results = this._decodeData(results);
+			
+			return results;
+		});
+		
+		this[methodName] = wrapperCall;
+	},
+	
+	// Encodes our data to get around ExternalInterface bugs that are still
+	// present even in Flash 9.
+	_encodeData: function(data){
+		if(!data || typeof data != "string"){
+			return data;
+		}
+		
+		// double encode all entity values, or they will be mis-decoded
+		// by Flash when returned
+		var entityRE = /\&([^;]*)\;/g;
+		data = data.replace(entityRE, "&amp;$1;");
+
+		// entity encode XML-ish characters, or Flash's broken XML serializer
+		// breaks
+		data = data.replace(/</g, "&lt;");
+		data = data.replace(/>/g, "&gt;");
+
+		// transforming \ into \\ doesn't work; just use a custom encoding
+		data = data.replace("\\", "&custom_backslash;");
+
+		data = data.replace(/\0/g, "\\0"); // null character
+		data = data.replace(/\"/g, "&quot;");
+
+		return data;
+	},
+	
+	// Decodes our data to get around ExternalInterface bugs that are still
+	// present even in Flash 9.
+	_decodeData: function(data){
+		// wierdly enough, Flash sometimes returns the result as an
+		// 'object' that is actually an array, rather than as a String;
+		// detect this by looking for a length property; for IE
+		// we also make sure that we aren't dealing with a typeof string
+		// since string objects have length property there
+		if(data && data.length && typeof data != "string"){
+			data = data[0];
+		}
+		
+		if(!data || typeof data != "string"){
+			return data;
+		}
+	
+		// certain XMLish characters break Flash's wire serialization for
+		// ExternalInterface; these are encoded on the 
+		// DojoExternalInterface side 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 = data.replace(/\&custom_lt\;/g, "<");
+		data = data.replace(/\&custom_gt\;/g, ">");
+		data = data.replace(/\&custom_backslash\;/g, '\\');
+		
+		// needed for IE; \0 is the NULL character
+		data = data.replace(/\\0/g, "\0");
+		
+		return data;
+	},
+	
+	// Executes a Flash method; called from the JavaScript wrapper proxy we
+	// create on dojox.flash.comm.
+	_execFlash: function(methodName, methodArgs){
+		var plugin = dojox.flash.obj.get();
+		methodArgs = (methodArgs) ? methodArgs : [];
+		
+		// encode arguments that are strings
+		for(var i = 0; i < methodArgs; i++){
+			if(typeof methodArgs[i] == "string"){
+				methodArgs[i] = this._encodeData(methodArgs[i]);
+			}
+		}
+
+		// we use this gnarly hack below instead of 
+		// plugin[methodName] for two reasons:
+		// 1) plugin[methodName] has no call() method, which
+		// means we can't pass in multiple arguments dynamically
+		// to a Flash method -- we can only have one
+		// 2) On IE plugin[methodName] returns undefined -- 
+		// plugin[methodName] used to work on IE when we
+		// used document.write but doesn't now that
+		// we use dynamic DOM insertion of the Flash object
+		// -- Brad Neuberg
+		var flashExec = function(){ 
+			return eval(plugin.CallFunction(
+						 "<invoke name=\"" + methodName
+						+ "\" returntype=\"javascript\">" 
+						+ __flash__argumentsToXML(methodArgs, 0) 
+						+ "</invoke>")); 
+		};
+		var results = flashExec.call(methodArgs);
+		
+		if(typeof results == "string"){
+			results = this._decodeData(results);
+		}
+			
+		return results;
+	}
+}
+
+// FIXME: dojo.declare()-ify this
+
+// TODO: I did not test the Install code when I refactored Dojo Flash from 0.4 to 
+// 1.0, so am not sure if it works. If Flash is not present I now prefer 
+// that Gears is installed instead of Flash because GearsStorageProvider is
+// much easier to work with than Flash's hacky ExternalInteface. 
+// -- Brad Neuberg
+dojox.flash.Install = function(){
+	// summary: Helps install Flash plugin if needed.
+	// description:
+	//		Figures out the best way to automatically install the Flash plugin
+	//		for this browser and platform. Also determines if installation or
+	//		revving of the current plugin is needed on this platform.
+}
+
+dojox.flash.Install.prototype = {
+	needed: function(){ /* Boolean */
+		// summary:
+		//		Determines if installation or revving of the current plugin is
+		//		needed. 
+	
+		// do we even have flash?
+		if(dojox.flash.info.capable == false){
+			return true;
+		}
+
+		// Must have ExternalInterface which came in Flash 8
+		if(!dojox.flash.info.isVersionOrAbove(8, 0, 0)){
+			return true;
+		}
+
+		// otherwise we don't need installation
+		return false;
+	},
+
+	install: function(){
+		// summary: Performs installation or revving of the Flash plugin.
+	
+		// indicate that we are installing
+		dojox.flash.info.installing = true;
+		dojox.flash.installing();
+		
+		if(dojox.flash.info.capable == false){ // we have no Flash at all
+			// write out a simple Flash object to force the browser to prompt
+			// the user to install things
+			var installObj = new dojox.flash.Embed(false);
+			installObj.write(); // write out HTML for Flash
+		}else if(dojox.flash.info.isVersionOrAbove(6, 0, 65)){ // Express Install
+			var installObj = new dojox.flash.Embed(false);
+			installObj.write(true); // write out HTML for Flash 8 version+
+			installObj.setVisible(true);
+			installObj.center();
+		}else{ // older Flash install than version 6r65
+			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";
+		}
+	},
+	
+	// Called when the Express Install is either finished, failed, or was
+	// rejected by the user.
+	_onInstallStatus: function(msg){
+		if (msg == "Download.Complete"){
+			// Installation is 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"){
+			// The end user failed to download the installer due to a network failure
+			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.");
+		}	
+	}
+}
+
+// find out if Flash is installed
+dojox.flash.info = new dojox.flash.Info();
+
+// vim:ts=4:noet:tw=0:
+
+}
+
+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");
+
+
+}
+
+if(!dojo._hasResource["dojox.storage.FlashStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.storage.FlashStorageProvider"] = true;
+dojo.provide("dojox.storage.FlashStorageProvider");
+
+
+
+
+
+// summary: 
+//		Storage provider that uses features in Flash to achieve permanent
+//		storage
+// description:
+//		Authors of this storage provider-
+//			Brad Neuberg, bkn3@xxxxxxxxxxxx	
+dojo.declare("dojox.storage.FlashStorageProvider", dojox.storage.Provider, {
+		initialized: false,
+		
+		_available: null,
+		_statusHandler: null,
+		_flashReady: false,
+		_pageReady: false,
+		
+		initialize: function(){
+		  //console.debug("FlashStorageProvider.initialize");
+			if(dojo.config["disableFlashStorage"] == true){
+				return;
+			}
+			
+			// initialize our Flash
+			dojox.flash.addLoadedListener(dojo.hitch(this, function(){
+			  //console.debug("flashReady");
+			  // indicate our Flash subsystem is now loaded
+			  this._flashReady = true;
+			  if(this._flashReady && this._pageReady){
+				  this._loaded();
+				}
+			}));
+			var swfLoc = dojo.moduleUrl("dojox", "storage/Storage.swf").toString();
+			dojox.flash.setSwf(swfLoc, false);
+			
+			// wait till page is finished loading
+			dojo.connect(dojo, "loaded", this, function(){
+			  //console.debug("pageReady");
+			  this._pageReady = true;
+			  if(this._flashReady && this._pageReady){
+			    this._loaded();
+			  }
+			});
+		},
+		
+		//	Set a new value for the flush delay timer.
+		//	Possible values:
+		//	  0 : Perform the flush synchronously after each "put" request
+		//	> 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<values.length;i++){
+				if(dojo.isString(values[i])){
+					values[i] = "string:" + values[i];
+				}else{
+					values[i] = dojo.toJson(values[i]);
+				}
+				lengths[i] = values[i].length; 
+			}
+			var metaValue = values.join("");
+			var metaLengths = lengths.join(",");
+			
+			dojox.flash.comm.putMultiple(metaKey, metaValue, metaLengths, this.namespace);
+		},
+
+		get: function(key, 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);
+			}
+			
+			var results = dojox.flash.comm.get(key, namespace);
+
+			if(results == ""){
+				return null;
+			}
+		
+			return this._destringify(results);
+		},
+
+		getMultiple: function(/*array*/ keys, /*string?*/ namespace){ /*Object*/
+			if(!this.isValidKeyArray(keys)){
+				throw new ("Invalid key array given: " + keys);
+			}
+			
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;		
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			var metaKey = keys.join(",");
+			var metaResults = dojox.flash.comm.getMultiple(metaKey, this.namespace);
+			var results = eval("(" + metaResults + ")");
+			
+			//	destringify each entry back into a real JS object
+			//FIXME: use dojo.map
+			for(var i = 0; i < results.length; i++){
+				results[i] = (results[i] == "") ? null : this._destringify(results[i]);
+			}
+			
+			return results;		
+		},
+
+		_destringify: function(results){
+			// 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;
+		},
+		
+		getKeys: function(namespace){
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;		
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			var results = dojox.flash.comm.getKeys(namespace);
+			
+			// Flash incorrectly returns an empty string as "null"
+			if(results == null || results == "null"){
+			  results = "";
+			}
+			
+			results = results.split(",");
+			results.sort();
+			
+			return results;
+		},
+		
+		getNamespaces: function(){
+			var results = dojox.flash.comm.getNamespaces();
+			
+			// Flash incorrectly returns an empty string as "null"
+			if(results == null || results == "null"){
+			  results = dojox.storage.DEFAULT_NAMESPACE;
+			}
+			
+			results = results.split(",");
+			results.sort();
+			
+			return results;
+		},
+
+		clear: function(namespace){
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			dojox.flash.comm.clear(namespace);
+		},
+		
+		remove: function(key, namespace){
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;		
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			dojox.flash.comm.remove(key, namespace);
+		},
+		
+		removeMultiple: function(/*array*/ keys, /*string?*/ namespace){ /*Object*/
+			if(!this.isValidKeyArray(keys)){
+				dojo.raise("Invalid key array given: " + keys);
+			}
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;		
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			var metaKey = keys.join(",");
+			dojox.flash.comm.removeMultiple(metaKey, 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(){
+			// hide the dialog
+			dojox.flash.obj.setVisible(false);
+			
+			// call anyone who wants to know the dialog is
+			// now hidden
+			if(dojo.isFunction(dojox.storage.onHideSettingsUI)){
+				dojox.storage.onHideSettingsUI.call(null);	
+			}
+		},
+		
+		getResourceList: function(){ /* Array[] */
+			// Dojo Offline no longer uses the FlashStorageProvider for offline
+			// storage; Gears is now required
+			return [];
+		},
+		
+		/** Called when Flash and the page are finished loading. */
+		_loaded: function(){
+			// get available namespaces
+			this._allNamespaces = this.getNamespaces();
+			
+			this.initialized = true;
+
+			// indicate that this storage provider is now loaded
+			dojox.storage.manager.loaded();
+		},
+		
+		//	Called if the storage system needs to tell us about the status
+		//	of a put() request. 
+		_onStatus: function(statusResult, key, namespace){
+		  //console.debug("onStatus, statusResult="+statusResult+", key="+key);
+			var ds = dojox.storage;
+			var dfo = dojox.flash.obj;
+			
+			if(statusResult == ds.PENDING){
+				dfo.center();
+				dfo.setVisible(true);
+			}else{
+				dfo.setVisible(false);
+			}
+			
+			if(ds._statusHandler){
+				ds._statusHandler.call(null, statusResult, key, namespace);		
+			}
+		}
+	}
+);
+
+dojox.storage.manager.register("dojox.storage.FlashStorageProvider",
+								new dojox.storage.FlashStorageProvider());
+
+}
+
+if(!dojo._hasResource["dojox.storage._common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.storage._common"] = true;
+dojo.provide("dojox.storage._common");
+
+
+
+/*
+  Note: if you are doing Dojo Offline builds you _must_
+  have offlineProfile=true when you run the build script:
+  ./build.sh action=release profile=offline offlineProfile=true
+*/
+
+
+
+
+// now that we are loaded and registered tell the storage manager to
+// initialize itself
+dojox.storage.manager.initialize();
+
+}
+
+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");
+
+
+}
+
+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@xxxxxxxxxxxx, 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:
+		//
+		//	<script>
+		//		
+		//		
+		//		
+		//		
+		//
+		//		// configure how we should work offline
+		//
+		//		// set our application name
+		//		dojox.off.ui.appName = "Moxie";
+		//
+		//		// automatically "slurp" the page and
+		//		// capture the resources we need offline
+		//		dojox.off.files.slurp();
+		//
+		// 		// tell Dojo Offline we are ready for it to initialize itself now
+		//		// that we have finished configuring it for our application
+		//		dojox.off.initialize();
+		//	</script>
+		//
+		//	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@xxxxxxxxxxxx, 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@xxxxxxxxxxxx, 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@xxxxxxxxxxxx, 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@xxxxxxxxxxxx
+			//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 += "<html><head><title>Sync Details</title><head><body>";
+		html += "<h1>Sync Details</h1>\n";
+		html += "<ul>\n";
+		for(var i = 0; i < dojox.off.sync.details.length; i++){
+			html += "<li>";
+			html += dojox.off.sync.details[i];
+			html += "</li>";	
+		}
+		html += "</ul>\n";
+		html += "<a href='javascript:window.close()' "
+				 + "style='text-align: right; padding-right: 2em;'>"
+				 + "Close Window"
+				 + "</a>\n";
+		html += "</body></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");
+
+
+
+
+
+
+
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/checkmark.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/checkmark.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/greenball.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/greenball.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/learnhow.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/resources/learnhow.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/resources/learnhow.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+<html>
+	<head>
+		<link rel="stylesheet" type="text/css" href="offline-widget.css"></link>
+		
+		<script type="text/javascript" src="learnhow.js"></script>
+	</head>
+	
+	<body id="dot-learn-how-body">
+		<div id="dot-learn-how-contents">
+			<h1><b>Want to use <span id="dot-learn-how-app-name">Application</span> offline?</b></h1> 
+			
+			<p id="dot-toolkit-info">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!</p>
+			
+			<p>Dojo Offline is an open source project brought to you by 
+				<a href="http://dojotoolkit.org";>Dojo</a>, <a href="http://sitepen.com";>SitePen</a>, 
+				and <a href="http://codinginparadise.org";>Brad Neuberg</a>. It incorporates
+				technologies created by <a href="http://google.com";>Google</a>.</p>
+				
+			<h2>To get started:</h2>
+			
+			<ol>
+				<li id="dot-download-step">
+					<a target="_new" href="http://gears.google.com";>Download Gears</a>, 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.
+				</li>
+				<li id="dot-install-step">
+					Once downloaded, run the installer. Restart your web browser when finished installing.
+				</li>
+				<li id="dot-drag-link-step">
+					To access this website even when offline, drag the following link to your 
+					desktop or your browser's link toolbar above: <a id="dot-learn-how-run-link" href="#">Run Application</a>.
+				</li>
+				<li id="dot-run-link-step">
+					Double-click the link on your desktop to start this web application, even 
+					if offline.
+				</li>
+			</ol>
+		</div>
+	</body>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/learnhow.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/resources/learnhow.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/resources/learnhow.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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));
+	}
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/resources/offline-widget.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,40 @@
+<!-- 
+	Note: The elements in this UI can be broken apart
+	and spread around your page, as long as you keep the
+	IDs intact. Elements can also be dropped without
+	Dojo Offline's default UI breaking.
+-->
+
+<div id="dot-widget-container" style="visibility: hidden;">
+	<div id="dot-widget-title-bar">
+		<span id="dot-widget-network-indicator">
+			<img id="dot-widget-network-indicator-online" />
+			<img id="dot-widget-network-indicator-offline" />
+		</span>
+		<span id="dot-widget-title-text"></span>
+	</div>
+	
+	<div id="dot-widget-contents">
+		<div id="dot-widget-browser-restart">
+			Please restart your browser to 
+			use <span id="dot-widget-browser-restart-app-name"></span> Offline
+		</div>
+		
+		<div id="dot-sync-status">
+			<img id="dot-roller" />
+			<img id="dot-success-checkmark" />
+			<span id="dot-sync-messages"></span>
+			<span id="dot-sync-details">
+				(<a id="dot-sync-details-button" href="#">details</a>)
+			</span>
+			<span id="dot-sync-cancel">
+				(<a id="dot-sync-cancel-button" href="#">cancel</a>)
+			</span>
+		</div>
+		
+		<div id="dot-widget-learn-how">
+			<a id="dot-widget-learn-how-link" target="_blank" href="#">Learn How</a> 
+			to use <span id="dot-widget-learn-how-app-name"></span>&nbsp;Offline!
+		</div>
+	</div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/redball.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/redball.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/roller.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/off/resources/roller.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/sync.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/sync.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/sync.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,690 @@
+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");
+
+dojo.require("dojox.storage.GearsStorageProvider");
+dojo.require("dojox.off._common");
+dojo.require("dojox.off.files");
+
+// Author: Brad Neuberg, bkn3@xxxxxxxxxxxx, 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();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off/ui.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off/ui.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off/ui.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,622 @@
+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");
+
+dojo.require("dojox.storage.Provider");
+dojo.require("dojox.storage.manager");
+dojo.require("dojox.storage.GearsStorageProvider");
+
+// Author: Brad Neuberg, bkn3@xxxxxxxxxxxx, 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@xxxxxxxxxxxx
+			//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 += "<html><head><title>Sync Details</title><head><body>";
+		html += "<h1>Sync Details</h1>\n";
+		html += "<ul>\n";
+		for(var i = 0; i < dojox.off.sync.details.length; i++){
+			html += "<li>";
+			html += dojox.off.sync.details[i];
+			html += "</li>";	
+		}
+		html += "</ul>\n";
+		html += "<a href='javascript:window.close()' "
+				 + "style='text-align: right; padding-right: 2em;'>"
+				 + "Close Window"
+				 + "</a>\n";
+		html += "</body></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);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/off.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/off.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/off.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+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");
+dojo.require("dojox.off._common");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/presentation/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/presentation/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/presentation/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/presentation/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:"<div class=\"dojoShow\" dojoAttachPoint=\"showHolder\">\n\t<div class=\"dojoShowNav\" dojoAttachPoint=\"showNav\" dojoAttachEvent=\"onmouseover: _showNav, onmouseout: _hideNav\">\n\t<div class=\"dojoShowNavToggler\" dojoAttachPoint=\"showToggler\">\n\t\t<img dojoAttachPoint=\"prevNode\" src=\"${prevIcon}\" dojoAttachEvent=\"onclick:previousSlide\">\n\t\t<select dojoAttachEvent=\"onchange:_onEvent\" dojoAttachPoint=\"select\">\n\t\t\t<option dojoAttachPoint=\"_option\">Title</option>\n\t\t</select>\n\t\t<img dojoAttachPoint=\"nextNode\" src=\"${nextIcon}\" dojoAttachEvent=\"onclick:nextSlide\">\n\t</div>\n\t</div>\n\t<div dojoAttachPoint=\"containerNode\"></div>\n</div>\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:"<div dojoAttachPoint=\"showSlide\" class=\"dojoShowPrint dojoShowSlide\">\n\t<h1 class=\"showTitle\" dojoAttachPoint=\"slideTitle\"><span class=\"dojoShowSlideTitle\" dojoAttachPoint=\"slideTitleText\">${title}</span></h1>\n\t<div class=\"dojoShowBody\" dojoAttachPoint=\"containerNode\"></div>\n</div>\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);
+	}	
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Show.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+<div class="dojoShow" dojoAttachPoint="showHolder">
+	<div class="dojoShowNav" dojoAttachPoint="showNav" dojoAttachEvent="onmouseover: _showNav, onmouseout: _hideNav">
+	<div class="dojoShowNavToggler" dojoAttachPoint="showToggler">
+		<img dojoAttachPoint="prevNode" src="${prevIcon}" dojoAttachEvent="onclick:previousSlide">
+		<select dojoAttachEvent="onchange:_onEvent" dojoAttachPoint="select">
+			<option dojoAttachPoint="_option">Title</option>
+		</select>
+		<img dojoAttachPoint="nextNode" src="${nextIcon}" dojoAttachEvent="onclick:nextSlide">
+	</div>
+	</div>
+	<div dojoAttachPoint="containerNode"></div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Slide.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Slide.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/Slide.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+<div dojoAttachPoint="showSlide" class="dojoShowPrint dojoShowSlide">
+	<h1 class="showTitle" dojoAttachPoint="slideTitle"><span class="dojoShowSlideTitle" dojoAttachPoint="slideTitleText">${title}</span></h1>
+	<div class="dojoShowBody" dojoAttachPoint="containerNode"></div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/down.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/down.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/next.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/next.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/prev.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/prev.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/up.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/presentation/resources/icons/up.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/presentation.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/presentation.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/presentation.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"); 
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/resources/README.template
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/resources/README.template	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/resources/README.template	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.

Added: branches/vhffs-design/vhffs-panel/js/dojox/resources/_modules.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/resources/_modules.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/resources/_modules.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.
+};
+=====*/

Added: branches/vhffs-design/vhffs-panel/js/dojox/resources/manualTests.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/resources/manualTests.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/resources/manualTests.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+	<head>
+		<title>Dojox Manual Test Runner</title>
+	</head>
+	<body>
+		Redirecting to D.O.H runner
+		<script>
+			window.location.replace("../../util/doh/runner.html?testModule=dojox.resources.manualTests"+window.location.search.replace(/^\?/,"&"));
+		</script>
+	</body>
+</html> 

Added: branches/vhffs-design/vhffs-panel/js/dojox/resources/manualTests.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/resources/manualTests.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/resources/manualTests.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/CouchDBRestStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/CouchDBRestStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/CouchDBRestStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonRPC.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonRPC.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonRPC.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonReferencing.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonReferencing.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonReferencing.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonRestStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonRestStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/JsonRestStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<results.length;i++){	
+						args["onItem"].call(_this, results[i], args);
+					}
+				}					
+				if (args.onComplete){
+					args["onComplete"].call(_this, results, args);
+				}
+				return results;
+			});
+			defResult.addErrback(args.onError);
+			return args;
+		},
+		
+
+		getFeatures: function(){
+			// summary:
+			// 	return the store feature set
+
+			return { 
+				"dojo.data.api.Read": true,
+				"dojo.data.api.Identity": true,
+				"dojo.data.api.Write": true,
+				"dojo.data.api.Notification": true
+			}
+		},
+
+		getLabel: function(item){
+			// summary
+			//	returns the label for an item. Just gets the "label" attribute.
+			//	
+			return this.getValue(item,"label");
+		},
+
+		getLabelAttributes: function(item){
+			// summary:
+			//	returns an array of attributes that are used to create the label of an item
+			return ["label"];
+		},
+
+		sort: function(a,b){
+			console.log("TODO::implement default sort algo");
+		},
+
+		//Identity API Support
+
+		getIdentity: function(item){
+			// summary
+			//	returns the identity of an item or throws
+			//	a not found error.
+			var prefix = this.service.serviceName + '/';
+			if (!item._id){// generate a good random id
+				item._id = prefix + Math.random().toString(16).substring(2,14)+Math.random().toString(16).substring(2,14);
+			}
+			if (item._id.substring(0,prefix.length) != prefix){
+				throw Error("Identity attribute not found");
+			}
+			return item._id.substring(prefix.length);
+		},
+
+		getIdentityAttributes: function(item){
+			// summary:
+			//	returns the attributes which are used to make up the 
+			//	identity of an item.  Basically returns this.idAttribute
+
+			return [this.idAttribute];
+		},
+
+		fetchItemByIdentity: function(args){
+			// summary: 
+			//	fetch an item by its identity. fetch and fetchItemByIdentity work exactly the same
+			return this.fetch(args); 
+		},
+
+		//Write API Support
+		newItem: function(data, parentInfo){
+			// summary:
+			//	adds a new item to the store at the specified point.
+			//	Takes two parameters, data, and options. 
+			//
+			//	data: /* object */
+			//		The data to be added in as an item.
+			//	parentInfo:
+			//		An optional javascript object defining what item is the parent of this item (in a hierarchical store.  Not all stores do hierarchical items), 
+			//		and what attribute of that parent to assign the new item to.  If this is present, and the attribute specified
+			//		is a multi-valued attribute, it will append this item into the array of values for that attribute.  The structure
+			//		of the object is as follows:
+			//		{
+			//			parent: someItem,
+			//		}
+			//  or
+			//		{
+			//			parentId: someItemId,
+			//		}
+			
+			if (this.service._schema && this.service._schema.clazz && data.constructor != this.service._schema.clazz) 
+				data = dojo.mixin(new this.service._schema.clazz,data);
+			this.getIdentity(data);
+			this._getParent(parentInfo).push(data); // essentially what newItem really means
+			this.onNew(data);
+			return data;
+		},
+		_getParent : function(parentInfo){
+			
+			var parentId = (parentInfo && parentInfo.parentId) || this.parentId || '';
+			var parent = (parentInfo && parentInfo.parent) || dojox.rpc._index[this.service.serviceName + '/' + parentId] || [];
+			if (!parent._id){
+				parent._id = this.service.serviceName + '/' + parentId;
+				this._setDirty(parent); // set it dirty so it will be post
+			}
+			return parent;
+		},
+		deleteItem: function(item,/*array*/parentInfo){	
+			// summary
+			//	deletes item any references to that item from the store.
+			//
+			//	item: 
+			//  item to delete
+			//
+			//	removeFrom: This an item or items from which to remove references to this object. This store does not record references,
+			// so if this parameter the entire object graph from load items will be searched for references. Providing this parameter
+			// is vastly faster. An empty object or truthy primitive can be passed if no references need to be removed 
+			
+			//	If the desire is to delete only one reference, unsetAttribute or
+			//	setValue is the way to go.
+			if (this.isItem(item))
+				this._deletedItems.push(item);
+			var _this = this;
+			this._walk(((parentInfo || this.parentId) && this._getParent(parentInfo)) || dojox.rpc._index,function(obj,i,val){
+				if (obj[i] === item){ // find a reference to this object
+					if (_this.isItem(obj)){
+						if (isNaN(i) || !obj.splice){ // remove a property
+							_this.unsetAttribute(obj,i);
+							delete obj[i];
+						}
+						else {// remove an array entry
+							obj.splice(i,1);
+						}
+					}
+				}
+			});
+			this.onDelete(item);
+		},
+
+		_setDirty: function(item){
+			// summary:
+			//	adds an item to the list of dirty items.  This item
+			//	contains a reference to the item itself as well as a
+			//	cloned and trimmed version of old item for use with
+			//	revert.
+			var i;
+			if (!item._id) 
+				return;
+			//if an item is already in the list of dirty items, don't add it again
+			//or it will overwrite the premodification data set.
+			for (i=0; i<this._dirtyItems.length; i++){
+				if (item==this._dirtyItems[i].item){
+					return; 
+				}	
+			}
+			var old = item instanceof Array ? [] : {};
+			for (i in item) 
+				if (item.hasOwnProperty(i))
+					old[i] = item[i];			
+			this._dirtyItems.push({item: item, old: old});
+		},
+
+		setValue: function(item, attribute, value){
+			// summary:
+			//	sets 'attribute' on 'item' to 'value'
+
+			var old = item[attribute];
+			if (old != value){
+				this._setDirty(item);
+				item[attribute]=value;
+				this.onSet(item,attribute,old,value);
+			}
+		},
+
+		setValues: function(item, attribute, values){
+			// summary:
+			//	sets 'attribute' on 'item' to 'value' value
+			//	must be an array.
+
+
+			if (!dojo.isArray(values)){throw new Error("setValues expects to be passed an Array object as its value");}
+			this._setDirty(item);
+			var old = item[attribute];
+			item[attribute]=values;
+			this.onSet(item,attribute,old,values);
+		},
+
+		unsetAttribute: function(item, attribute){
+			// summary:
+			//	unsets 'attribute' on 'item'
+
+			this._setDirty(item);
+			var old = item[attribute];
+			delete item[attribute];
+			this.onSet(item,attribute,old,undefined);
+		},
+		_commitAppend: function(listId,item){
+			return this.service.post(listId,item);
+		},
+		save: function(kwArgs){
+			// summary:
+			//	Saves the dirty data using REST Ajax methods
+
+			var data = [];
+			
+			var left = 0; // this is how many changes are remaining to be received from the server
+			var _this = this;
+			function finishOne(){
+				if (!(--left))
+					_this.onSave(data);
+			}
+			while (this._dirtyItems.length > 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<item.length;i++){
+							deferred = this._commitAppend(this.getIdentity(item),item[i]);
+							deferred.addCallback(finishOne);
+						}
+					}
+				}
+				if (!append){
+					deferred = this.service.put(this.getIdentity(item),item);
+					deferred.addCallback(finishOne);
+				}
+				
+				data.push(item);
+			}
+			while (this._deletedItems.length > 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<l; i++){
+				if (this._dirtyItems[i]==item){return true};
+			}
+		},
+
+
+		//Notifcation Support
+
+		onSet: function(){
+		},
+
+		onNew: function(){
+
+		},
+
+		onDelete: function(){
+
+		},	
+	
+		onSave: function(items){
+			// summary:
+			//	notification of the save event..not part of the notification api, 
+			//	but probably should be.
+			//console.log("onSave() ", items);
+		},
+
+		onRevert: function(){
+			// summary:
+			//	notification of the revert event..not part of the notification api, 
+			//	but probably should be.
+
+		}
+	}
+);
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/PersevereRestStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/PersevereRestStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/PersevereRestStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,39 @@
+if(!dojo._hasResource["dojox.data.PersevereRestStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.data.PersevereRestStore"] = true;
+dojo.provide("dojox.data.PersevereRestStore");
+dojo.require("dojox.data.JsonRestStore");
+dojo.require("dojox.json.ref"); // TODO: Make it work without this dependency
+
+// PersevereRestStore is an extension of JsonRestStore to handle Persevere's special features
+
+
+dojo.declare("dojox.data.PersevereRestStore",
+	dojox.data.JsonRestStore,
+	{
+		getIdentity : function(item) {
+			var prefix = this.service.serviceName + '/';
+			if (!item._id) {
+				item.id = '../' + (item._id = 'client/' + dojox.data.nextClientId++);
+			}
+			if (item._id.substring(0,prefix.length) != prefix) {
+				return '../' + item._id; // use relative url path style referencing
+			}
+			return item._id.substring(prefix.length);
+		}/*,
+		_commitAppend: function(listId,item) {
+			var deferred = this.service.post(listId,item);
+			var prefix = this.service.serviceName + '/';
+			deferred.addCallback(function(result) {
+				item._id = prefix + result[this.idAttribute]; // update the object with the results of the post
+				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;
+		}*/
+	}
+);
+ 
+dojox.data.nextClientId = 0;
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,52 @@
+-------------------------------------------------------------------------------
+DojoX RPC
+-------------------------------------------------------------------------------
+Version 1.0
+Release date: 07/01/2007
+-------------------------------------------------------------------------------
+Project state:
+yahoo.smd: stable (but for old dojo.rpc, not the dojox.service.Rpc)
+Service.js: beta - this will become dojo.rpc.Service eventually and replace
+			the existing rpc system
+JsonRPC.js: beta - plugins for json-rpc for the rpc system
+Rest.js: beta - plugins for REST style services for the rpc system
+
+Stores: CouchDBRestStore.js  JsonReferencing.js  PersevereRestStore.js
+These stores are fresh new and alpha. The will likely be moved to dojox.data 
+after they are well tested and documented.
+
+SMDLibrary contains smd files representing external services
+-------------------------------------------------------------------------------
+Project authors
+	Dustin Machi
+	Kris Zyp
+	Revin Guillen
+-------------------------------------------------------------------------------
+Project description
+
+Extra utilities for use with dojo.rpc as well as additional smd descriptions
+for specific services.
+-------------------------------------------------------------------------------
+Dependencies:
+
+Dojo Core (package loader, dojo.rpc).
+-------------------------------------------------------------------------------
+Documentation
+
+See RPC documentation at http://dojotoolkit.org/
+
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/rpc/*
+
+Install into the following directory structure:
+/dojox/rpc/
+
+...which should be at the same level as your Dojo checkout.
+
+The use of the actual utilities varies, but typically additional software 
+will be included with dojo.require() and smd files for services can be loaded
+manually with an xhr request or can be provided by url to the service when created
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/Rest.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/Rest.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/Rest.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,90 @@
+if(!dojo._hasResource["dojox.rpc.Rest"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.rpc.Rest"] = true;
+dojo.provide("dojox.rpc.Rest");
+dojo.require("dojox.rpc.Service");
+// This provides a HTTP REST service with full range REST verbs include PUT,POST, and DELETE.
+// A normal GET query is done by using the service directly:
+// var services = dojo.rpc.Service({services: {myRestService: {transport: "REST",...
+// services.myRestService("parameters");
+// 
+// The modifying methods can be called as sub-methods of the rest service method like:
+//  services.myRestService.put("parameters","data to put in resource");
+//  services.myRestService.post("parameters","data to post to the resource");
+//  services.myRestService['delete']("parameters");
+dojox.rpc._restMethods = { // these are the common rest methods 
+	put : function(r){
+		// execute a PUT
+		r.url = r.target +'?'+  r.data;
+		r.putData = dojox.rpc._restMethods.sendData;
+		return dojo.rawXhrPut(r);
+	},
+	post : function(r){
+		// execute a POST
+		r.url = r.target +'?'+  r.data;
+		r.postData = dojox.rpc._restMethods.sendData;
+		var def = dojo.rawXhrPost(r);
+		var postObj = dojox.rpc._restMethods.sendObj;
+/*	 This is a possible HTTP-compliant way to determine the id of a posted object	 
+ 		def.addCallback(function(result) {
+		 	dojox._newId = def.ioArgs.xhr.getResponseHeader('Content-Location');
+			if (dojox._newId) {// we need some way to communicate the id of the newly created object
+				dojox.rpc._index[postObj._id = dojox._newId] = postObj;
+			}
+			return result; 
+		});*/
+		return def;
+	},
+	"delete" : function(r){
+		r.url = r.target +'?'+  r.data;
+		return dojo.xhrDelete(r);
+	}
+}
+
+dojox.rpc._restMethods.put.sender =
+dojox.rpc._restMethods.post.sender = true;// must declare that they send data
+
+dojox.rpc.transportRegistry.register(
+	"REST",function(str){return str == "REST"},{// same as GET... for now. Hoping to add put, post, delete as methods of the method 
+		fire: function(r){
+			r.url=  r.target + (r.data ? '?'+  r.data : '');
+			var def = dojo.xhrGet(r);
+			var newId = dojox.rpc._restQuery;
+			def.addCallback(function(res) {
+				dojox._newId = newId; // we need some way to communicate the id of the newly created object
+				delete dojox.rpc._restQuery;
+				return res;
+			});
+			return def;
+		},
+		getExecutor : function(func,method,svc){
+			var executor = function(id) {
+				dojox.rpc._restQuery = id;
+				return func.apply(this,arguments);	
+			};
+			var restMethods = dojox.rpc._restMethods;
+			for (var i in restMethods) { // add the rest methods to the executor
+				executor[i] = (function() {
+					var restMethod = restMethods[i];//let
+					return function() {
+						
+						if (restMethod.sender) {
+							var sendData = dojox.rpc._restMethods.sendObj = arguments[--arguments.length];
+							var isJson = ((method.contentType || svc._smd.contentType) + '').match(/application\/json/);
+							dojox.rpc._restMethods.sendData = isJson ? dojox.rpc.toJson(sendData,false,method._schema || method.returns) : sendData;// serialize with the right schema for the context;
+						}
+						for (var j = arguments.length++; j > 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 		
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/SMDLibrary/yahoo.smd
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/SMDLibrary/yahoo.smd	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/SMDLibrary/yahoo.smd	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 <script> tag)
+		getTime: {
+			target: "http://developer.yahooapis.com/TimeService/V1/getTime";,
+			parameters: [
+				{ name: "format", type: "string", optional: true, "default": "unix" } // can be "unix" for unix timestamp, "ms" for milliseconds
+			]
+		},
+		*/
+
+		//
+		// VIDEO SEARCH
+		//
+
+		// http://developer.yahoo.com/search/video/V1/videoSearch.html
+		videoSearch: {
+			target: "http://search.yahooapis.com/VideoSearchService/V1/videoSearch";,
+			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", "avi", "flash", "mpeg", "msmedia", "quicktime", "realmedia"
+				{ name: "adult_ok", type: "boolean", optional: true, "default": null },
+				{ name: "site", type: "string", optional: true, "default": null }
+			]
+		},
+
+		//
+		// WEB SEARCH
+		//
+
+		// http://developer.yahoo.com/search/web/V1/webSearch.html
+		webSearch: {
+			target: "http://search.yahooapis.com/WebSearchService/V1/webSearch";,
+			parameters: [
+				{ name: "query", type: "string", optional: false, "default": "" }, // must be less than 1kb
+				{ name: "region", type: "string", optional: true, "default": "us" },
+				{ name: "type", type: "string", optional: true, "default": "any" }, // can be "all", "any", "phrase"
+				{ name: "results", type: "integer", optional: true, "default": 10 }, // max 100
+				{ name: "start", type: "integer", optional: true, "default": 1 },
+				{ name: "format", type: "string", optional: true, "default": "any" }, // can be "any", "html", "msword", "pdf", "ppt", "rss", "txt", "xls"
+				{ name: "adult_ok", type: "boolean", optional: true, "default": null },
+				{ name: "similar_ok", type: "boolean", optional: true, "default": null },
+				{ name: "language", type: "string", optional: true, "default": null },
+				{ name: "country", type: "string", optional: true, "default": null },
+				{ name: "site", type: "string", optional: true, "default": null },
+				{ name: "subscription", type: "string", optional: true, "default": null },
+				{ name: "license", type: "string", optional: true, "default": "any" } // can be "any", "cc_any", "cc_commercial", "cc_modifiable"
+			]
+		},
+
+		// http://developer.yahoo.com/search/web/V1/spellingSuggestion.html
+		spellingSuggestion: {
+			target: "http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion";,
+			parameters: [
+				{ name: "query", type: "string", optional: false, "default": "" }
+			]
+		},
+
+		// http://developer.yahoo.com/search/web/V1/relatedSuggestion.html
+		relatedSuggestion: {
+			target: "http://search.yahooapis.com/WebSearchService/V1/relatedSuggestion";,
+			parameters: [
+				{ name: "query", type: "string", optional: false, "default": "" },
+				{ name: "results", type: "integer", optional: true, "default": 10 } // max 50
+			]
+		}
+	}
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/Service.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/Service.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/Service.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,293 @@
+if(!dojo._hasResource["dojox.rpc.Service"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.rpc.Service"] = true;
+dojo.provide("dojox.rpc.Service");
+
+dojo.require("dojo.AdapterRegistry");
+
+dojo.declare("dojox.rpc.Service", null, {
+	constructor: function(smd, options){
+		//summary:
+		//Take a string as a url to retrieve an smd or an object that is an smd or partial smd to use
+		//as a definition for the service
+		//
+		//	smd: object
+		//		Takes a number of properties as kwArgs for defining the service.  It also
+		//		accepts a string.  When passed a string, it is treated as a url from
+		//		which it should synchronously retrieve an smd file.  Otherwise it is a kwArgs
+		//		object.  It accepts serviceUrl, to manually define a url for the rpc service
+		//		allowing the rpc system to be used without an smd definition. strictArgChecks
+		//		forces the system to verify that the # of arguments provided in a call
+		//		matches those defined in the smd.  smdString allows a developer to pass
+		//		a jsonString directly, which will be converted into an object or alternatively
+		//		smdObject is accepts an smdObject directly.
+		//
+		var url;
+		var _this = this;
+		function processSmd(smd){
+			smd._baseUrl = new dojo._Url(location.href,url || '.') + '';
+			_this._smd = smd;
+			
+			//generate the methods
+			for(var serviceName in _this._smd.services){
+				_this[serviceName]=_this._generateService(serviceName, _this._smd.services[serviceName]);
+	
+			}
+		}				
+		if(smd){
+			//if the arg is a string, we assume it is a url to retrieve an smd definition from
+			if( (dojo.isString(smd)) || (smd instanceof dojo._Url)){
+				if (smd instanceof dojo._Url){
+					url = smd + "";
+				}else{
+					url = smd;
+				}
+			
+				var text = dojo._getText(url);
+				if(!text){
+					throw new Error("Unable to load SMD from " + smd)
+				}else{
+					processSmd(dojo.fromJson(text));
+				}
+			}else{
+				processSmd(smd);
+			}
+		}
+
+		if (options){this._options = options}
+		this._requestId=0;
+	},
+
+	_generateService: function(serviceName, method){
+		if(this[method]){
+			throw new Error("WARNING: "+ serviceName+ " already exists for service. Unable to generate function");
+		}
+		method.name = serviceName;
+		var func = dojo.hitch(this, "_executeMethod",method);
+		var transport = dojox.rpc.transportRegistry.match(method.transport || this._smd.transport);
+		if (transport.getExecutor)
+			func = transport.getExecutor(func,method,this);
+		var schema = method.returns || (method._schema = {}); // define the schema
+		schema._idPrefix = serviceName +'/'; // schemas are minimally used to track the id prefixes for the different services
+		dojox.rpc.services[serviceName] = func; // register the service
+		schema._service = func;
+		func.serviceName = serviceName;
+		func._schema = schema;
+		
+		return func; 
+	},
+
+	_executeMethod: function(method){
+		var args = [];
+		var i;
+		for (i=1; i< arguments.length; i++){
+			args.push(arguments[i]);
+		}
+		
+		var smd = this._smd;
+		if (method.parameters && method.parameters[0] && method.parameters[0].name && (args.length==1) && dojo.isObject(args[0])){
+			// if it is the parameters are not named in the definition, then we should use ordered params, otherwise try to determine by parameters 
+			args = args[0];
+			// inherit root-level parameters
+			if (smd.parameters && smd.parameters[0]){
+				for (i=0; i< smd.parameters.length; i++){
+					if (smd.parameters[i]["name"] && smd.parameters[i]["default"]){
+						args[smd.parameters[i]["name"]] = smd.parameters[i]["default"];
+					}
+				}
+			}
+		}
+		if (dojo.isObject(this._options)){
+			args = dojo.mixin(args, this._options);
+		}
+
+		var envelope = method.envelope || smd.envelope || "NONE";
+		var envDef = dojox.rpc.envelopeRegistry.match(envelope);
+		var schema = method._schema || method.returns; // serialize with the right schema for the context;
+		var request = envDef.serialize.apply(this, [smd, method, args]);
+		var contentType = (method.contentType || smd.contentType || request.contentType);
+		var isJson = (contentType + '').match(/application\/json/);
+
+		// this allows to mandate synchronous behavior from elsewhere when necessary, this may need to be changed to be one-shot in FF3 new sync handling model
+		dojo.mixin(request,{sync : dojox.rpc._sync, 
+				handleAs : isJson ? "json" : "text",
+				contentType : contentType,
+				target : request.target || dojox.rpc.getTarget(smd, method),
+				transport: method.transport || smd.transport || request.transport,
+				envelope: method.envelope || smd.envelope || request.envelope,
+				timeout: method.timeout || smd.timeout,
+                callbackParamName: method.callbackParamName || smd.callbackParamName,
+				preventCache: method.preventCache || smd.preventCache});
+		 
+		var deferred = (method.restMethod || dojox.rpc.transportRegistry.match(request.transport).fire).call(this,request);
+		deferred.addBoth(dojo.hitch(this,function(results){
+			// if it is an application/json content type, than it should be handled as json
+			// we have to do conversion here instead of in XHR so that we can set the currentSchema before running it
+			results = envDef.deserialize.call(this,isJson ? dojox.rpc.resolveJson(results,schema) : results); 
+			return results;									
+		}));
+		return deferred;
+	}
+});
+
+dojox.rpc.getTarget = function(smd, method){
+	
+	var dest=smd._baseUrl;
+	if (smd.target){
+		dest = new dojo._Url(dest,smd.target) + '';
+	}
+	if (method.target){
+		dest = new dojo._Url(dest,method.target) + '';
+	}
+	return dest;
+}
+
+dojox.rpc.toNamed=function(method, args, strictParams){
+	var i;
+	if (!dojo.isArray(args)){
+		if (strictParams){
+			//verify that all required parameters were supplied
+			for (i=0; i<method.parameters.length;i++){
+				if ((!method.parameters[i].optional) && (!args[method.parameters[i].name])){
+					throw new Error("Optional Parameter '" + method.parameters[i].name + "' not supplied to " + method.name);
+				}
+			}
+
+			//remove any properties that were not defined
+			for (var x in args){
+				var found=false;
+				for(i=0; i<method.parameters.length;i++){
+					if (method.parameters[i].name==x){found=true;}	
+				}
+				if(!found){
+					delete args[x];
+				}
+			}			
+		}
+		return args;
+	}
+
+	var data={};
+	for(i=0;i<method.parameters.length;i++){
+		data[method.parameters[i].name]=args[i]
+	}	
+	return data;
+}
+
+dojox.rpc.toOrdered=function(method, args){
+	if (dojo.isArray(args)){return args;}
+	var data=[];
+	for(var i=0;i<method.parameters.length;i++){
+		data.push(args[method.parameters[i].name]);
+	}	
+	return data;
+}
+
+dojox.rpc.transportRegistry = new dojo.AdapterRegistry(true);
+dojox.rpc.envelopeRegistry = new dojo.AdapterRegistry(true);
+//Built In Envelopes
+
+dojox.rpc.envelopeRegistry.register(
+	"URL",function(str){return str == "URL"},{
+		serialize:function(smd, method, data ){ 
+			var d = dojo.objectToQuery(dojox.rpc.toNamed(method, data, method.strictParameters||smd.strictParameters));
+	
+			return {
+				data: d,
+		                transport:"POST"
+			}
+		},
+		deserialize:function(results){
+			return results;
+		}
+	}
+);
+
+dojox.rpc.envelopeRegistry.register(
+	"JSON",function(str){return str == "JSON"},{
+		serialize: function(smd, method, data){ 
+			var d = dojox.rpc.toJson(dojox.rpc.toNamed(method, data, method.strictParameters||smd.strictParameters));
+	
+			return {
+				data: d,
+				contentType : 'application/json'
+			}
+		},
+		deserialize: function(results){
+			return results;
+		}
+	}
+);
+dojox.rpc.envelopeRegistry.register(
+	"PATH",function(str){return str == "PATH"},{
+		serialize:function(smd, method, data){
+			var i;
+			var target = dojox.rpc.getTarget(smd, method);
+			if (dojo.isArray(data)){
+				for (i = 0; i < data.length;i++)
+					target += '/' + data[i];
+			}
+			else {
+				for (i in data)
+					target += '/' + i + '/' + data[i];				
+			}
+	
+			return {
+				data:'',
+				target: target
+			}
+		},
+		deserialize:function(results){
+			return results;
+		}
+	}
+);
+
+
+
+//post is registered first because it is the default;
+dojox.rpc.transportRegistry.register(
+	"POST",function(str){return str == "POST"},{
+		fire:function(r){
+			r.url = r.target;
+			r.postData = r.data;
+			return dojo.rawXhrPost(r);
+		}		
+	}
+);
+
+dojox.rpc.transportRegistry.register(
+	"GET",function(str){return str == "GET"},{
+		fire: function(r){
+			r.url=  r.target + (r.data ? '?'+  r.data : '');
+			r.preventCache = r.preventCache || true;
+			return dojo.xhrGet(r);
+		}
+	}
+);
+
+
+//only works if you include dojo.io.script 
+dojox.rpc.transportRegistry.register(
+	"JSONP",function(str){return str == "JSONP"},{	
+		fire:function(r){
+			r.url = r.target + ((r.target.indexOf("?") == -1) ? '?' : '&') + r.data,
+			r.callbackParamName = r.callbackParamName || "callback";
+			return dojo.io.script.get(r);
+		}
+	}
+);
+dojox.rpc.services={};
+// The RPC service can have it's own serializer. It needs to define this if they are not defined by JsonReferencing
+if (!dojox.rpc.toJson){
+	dojox.rpc.toJson = function(){
+		return dojo.toJson.apply(dojo,arguments);
+	}
+	dojox.rpc.fromJson = function(){
+		return dojo.fromJson.apply(dojo,arguments);
+	}
+	dojox.rpc.resolveJson = function(it){
+		return it;
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/demo_JsonRestStore_CouchDB.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/demo_JsonRestStore_CouchDB.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/demo_JsonRestStore_CouchDB.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,125 @@
+<!--
+
+  This file is a demo of the JsonRestStore connected to CouchDB.
+
+-->
+
+<html>
+
+<head>
+
+	<title>Demo of JsonRestStore</title>
+
+	<style type="text/css">
+
+
+
+		@import "../../../dijit/themes/tundra/tundra.css";
+
+		@import "../../../dojo/resources/dojo.css";
+
+	</style>
+
+
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+
+	<script type="text/javascript">
+
+		dojo.require("dojox.rpc.Service");
+		dojo.require("dojox.data.CouchDBRestStore");
+		function init(){
+			var couchSMD = dojox.data.CouchDBRestStore.generateSMD("/couchDB/");
+			var couchServices = new dojox.rpc.Service(couchSMD); // just connect to the auto-generated SMD from persevere
+			friendStore = new dojox.data.CouchDBRestStore({service:couchServices.friends}); // and create a store for it
+		}
+
+		dojo.addOnLoad(init);
+
+		function invokeSearch() {
+			friendStore.fetch({count:3,onComplete:function(friends) {
+				var firstFriend = friendStore.getValue(friends.rows,0);
+				var name = friendStore.getValue(firstFriend,"name");
+				alert("old name " + name);
+				friendStore.setValue(firstFriend,"name","new name" + Math.random());
+				var newItem = {"name":"Another friend",age:31};
+				friendStore.newItem(newItem);
+				friendStore.onSave= function() {
+					delete friendStore.onSave;
+					friendStore.setValue(newItem,"name","change after creating");
+					friendStore.save();
+				}			
+				friendStore.save();
+				
+			}});
+
+		}
+
+	</script>
+
+</head>
+
+
+
+<body class="tundra">
+
+	<h1>
+
+		DEMO:  JsonRestStore Search
+
+	</h1>
+
+	<hr>
+
+	<h3>
+
+		Description:
+
+	</h3>
+
+	<p>
+
+		This simple demo shows how JsonRestStore can be used with Persevere.
+
+	</p>
+
+	<p>
+
+	</p>
+
+
+
+	<blockquote>
+
+
+
+	<!--
+
+		The store instance used by this demo.
+
+	-->
+
+	<table>
+
+		<tbody>
+
+			<tr>
+
+				<td>
+
+					<button name="search" id="searchButton" onclick="invokeSearch()">Search</button>
+
+				</td>
+
+			</tr>
+
+		</tbody>
+
+	</table>
+
+	<hr/>
+
+</body>
+
+</html>
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/demo_JsonRestStore_Persevere.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/demo_JsonRestStore_Persevere.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/demo_JsonRestStore_Persevere.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,65 @@
+<!--
+This file is a demo of the JsonRestStore connected to Persevere
+-->
+<html>
+<head>
+	<title>Demo of JsonRestStore</title>
+	<style type="text/css">
+
+		@import "../../../dijit/themes/tundra/tundra.css";
+		@import "../../../dojo/resources/dojo.css";
+	</style>
+
+	<script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojox.rpc.Service");
+		dojo.require("dojox.data.JsonRestStore");
+
+		function init(){
+			var persevereServices = new dojox.rpc.Service("/persevere/SMD"); // just connect to the auto-generated SMD from persevere
+			dynaStore = new dojox.data.JsonRestStore({service:persevereServices.dyna}); // and create a store for it
+
+		}
+		dojo.addOnLoad(init);
+		function invokeSearch() {
+			dynaStore.fetch({query:"0",onComplete:function(root) {
+				var name = dynaStore.getValue(root,"name");
+				alert("old name " + name);
+				dynaStore.setValue(root,"name","new name" + Math.random());
+				dynaStore.save();
+			}});
+		}
+	</script>
+</head>
+
+<body class="tundra">
+	<h1>
+		DEMO:  JsonRestStore Search
+	</h1>
+	<hr>
+	<h3>
+		Description:
+	</h3>
+	<p>
+		This simple demo shows how JsonRestStore can be used with Persevere.
+	</p>
+	<p>
+	</p>
+
+	<blockquote>
+
+	<!--
+		The store instance used by this demo.
+	-->
+	<table>
+		<tbody>
+			<tr>
+				<td>
+					<button name="search" id="searchButton" onclick="invokeSearch()">Search</button>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	<hr/>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/documentation.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/documentation.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/documentation.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,33 @@
+<html>
+	<head>
+		<script src="../../../dojo/dojo.js" djConfig="parseOnLoad: true"></script>
+		<script>
+			dojo.require("dojo.io.script")
+			dojo.require("dojox.rpc.Service");
+			dojo.require("dijit._Widget");
+			dojo.require("dojox.dtl._Templated");
+			dojo.require("dojo.parser");
+
+			dojo.declare("API", [dijit._Widget, dojox.dtl._Templated], {
+				constructor: function(params, node){
+					this.jsonp = new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc", "documentation.smd"));
+				},
+				onSearch: function(e){
+					if(e.keyCode == dojo.keys.ENTER){
+						this.jsonp.get({
+							name: e.target.value
+						}).addCallback(this, function(results){
+							console.debug(results);
+							this.results = results;
+							this.render();
+						});
+					}
+				},
+				templatePath: dojo.moduleUrl("dojox.rpc.demos.templates", "documentation.html")
+			});
+		</script>
+	</head>
+	<body>
+		<div dojoType="API"></div>
+	</body>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/documentation.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/documentation.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/documentation.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,8 @@
+<div>
+	<input dojotAttachPoint="search" dojoAttachEvent="onkeyup: onSearch">
+	<ul>
+	{% for result in results %}
+		<li>{% if result.type %}<i>{{ result.type }}</i> {% 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 %}<i>{% for type in parameter.types %}{% if not forloop.first %}|{% endif %}{{ type.title }}{% endfor %}{% if parameter.optional %}?{% endif %}{% if parameter.repeating %}...{% endif %}</i> {% endif %}{{ parameter.name }}{% endfor %}{% endif %}{% endifequal %}{% ifequal result.type "Function" %}{% if not result.resources %}){% endif %}{% endifequal %}</li>
+	{% endfor %}
+	</ul>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/yahoo.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/yahoo.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/templates/yahoo.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,31 @@
+<div>
+	<input dojotAttachPoint="search" dojoAttachEvent="onkeyup: onSearch">
+	<ul>
+	{% for result in results.Result %}
+		<li><a href="{{ result.Url }}">{{ result.Title }}</a><br/>{{ result.Summary }}</li>
+	{% endfor %}
+	</ul>
+	<table>
+		{% if results.firstResultPosition %}
+		<tr>
+			<th align="left">First Result</th>
+			<td>{{ results.firstResultPosition }}</td>
+		</tr>
+		{% endif %}{% if results.totalResultsAvailable %}
+		<tr>
+			<th align="left">Total Results Available</th>
+			<td>{{ results.totalResultsAvailable }}</td>
+		</tr>
+		{% endif %}{% if results.totalResultsReturned %}
+		<tr>
+			<th align="left">Results Returned</th>
+			<td>{{ results.totalResultsReturned }}</td>
+		</tr>
+		{% endif %}{% if results.type %}
+		<tr>
+			<th align="left">Type</th>
+			<td>{{ results.type }}</td>
+		</tr>
+		{% endif %}
+	</table>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/yahoo.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/yahoo.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/demos/yahoo.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,39 @@
+<html>
+	<head>
+		<title>
+			Yahoo Search Demo
+		</title>
+		<script src="../../../dojo/dojo.js" type="text/javascript"
+			djConfig="parseOnLoad: true, isDebug: true"></script>
+		<script type="text/javascript">
+			dojo.require("dojo.io.script")
+			dojo.require("dojox.rpc.Service");
+			dojo.require("dijit._Widget");
+			dojo.require("dojox.dtl._Templated");
+			dojo.require("dojo.parser");
+
+			dojo.declare("YahooWebSearchApiWidget", [dijit._Widget, dojox.dtl._Templated], {
+				constructor: function(params, node){
+					var mu = dojo.moduleUrl("dojox.rpc.SMDLibrary", "yahoo.smd");
+					this.yahoo = new dojox.rpc.Service(mu);
+				},
+				onSearch: function(e){
+					if(e.keyCode == dojo.keys.ENTER){
+						this.yahoo.webSearch({
+							query: e.target.value
+						}).addCallback(this, function(results){
+							console.debug(results.ResultSet);
+							this.results = results.ResultSet;
+							this.render();
+						});
+					}
+				},
+				templatePath: dojo.moduleUrl("dojox.rpc.demos.templates", "yahoo.html")
+			});
+		</script>
+	</head>
+	<body>
+		<h1>Yahoo Web Search</h1>
+		<div dojoType="YahooWebSearchApiWidget"></div>
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/documentation.smd
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/rpc/documentation.smd	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/rpc/documentation.smd	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/rpc/test.txt
===================================================================

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/Anchor.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/Anchor.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/Anchor.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/Annotation.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/Annotation.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/Annotation.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 "<!CDATA[properties:"+dojo.toJson(ps)+"]]>";
+//	};
+	p.writeCommonAttrs=function(){
+		return 'id="' + this.id + '" dojoxsketch:type="' + this.type() + '"'
+			+ ' transform="translate('+ this.transform.dx + "," + this.transform.dy + ')"'
+			+ (this.data?(' ><![CDATA[data:'+dojo.toJson(this.data)+']]'):'');
+	};
+	p.readCommonAttrs=function(obj){
+		var i=0,cs=obj.childNodes,c;
+		while((c=cs[i++])){
+			if(c.nodeType==4){ //CDATA
+				if(c.nodeValue.substr(0,11)=='properties:'){
+					this._properties=dojo.fromJson(c.nodeValue.substr(11));
+				}else if(c.nodeValue.substr(0,5)=='data:'){
+					this.data=dojo.fromJson(c.nodeValue.substr(5));
+				}else{
+					console.error('unknown CDATA node in node ',obj);
+				}
+			}
+		}
+
+		if(obj.getAttribute('transform')){
+			var t=obj.getAttribute('transform').replace("translate(","");
+			var pt=t.split(",");
+			this.transform.dx=parseFloat(pt[0],10);
+			this.transform.dy=parseFloat(pt[1],10);
+		}
+	};
+	ta.Annotation.Modes={ View:0, Edit:1 };
+	ta.Annotation.labelFont={family:"Arial", size:"16px", weight:"bold"};
+	ta.Annotation.register=function(name){
+		var cls=ta[name+'Annotation'];
+		ta.registerTool(name, function(p){dojo.mixin(p,{shape: name,annotation:cls});return new ta.AnnotationTool(p)});
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/DoubleArrowAnnotation.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/DoubleArrowAnnotation.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/DoubleArrowAnnotation.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,200 @@
+if(!dojo._hasResource["dojox.sketch.DoubleArrowAnnotation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.sketch.DoubleArrowAnnotation"] = true;
+dojo.provide("dojox.sketch.DoubleArrowAnnotation");
+
+dojo.require("dojox.sketch.Annotation");
+dojo.require("dojox.sketch.Anchor");
+
+(function(){
+	var ta=dojox.sketch;
+	ta.DoubleArrowAnnotation=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=6;
+		this.textYOffset=10;
+		this.textAlign="middle";
+		this.startRotation=0;
+		this.endRotation=0;
+
+//		this.property('label',this.id);
+		this.labelShape=null;
+		this.pathShape=null;
+		this.startArrow=null;
+		this.startArrowGroup=null;
+		this.endArrow=null;
+		this.endArrowGroup=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.DoubleArrowAnnotation.prototype=new ta.Annotation;
+	var p=ta.DoubleArrowAnnotation.prototype;
+	p.constructor=ta.DoubleArrowAnnotation;
+
+	p.type=function(){ return 'DoubleArrow'; };
+	p.getType=function(){ return ta.DoubleArrowAnnotation; };
+
+	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.startRotation=Math.atan(opp/adj);
+		opp=this.control.y-this.end.y;
+		adj=this.control.x-this.end.x;
+		if(!adj) adj=1;
+		this.endRotation=Math.atan(opp/adj);
+	};
+	p._pos=function(){
+		//	text position
+		var offset=this.textOffset;
+
+		//	figure out the pull of the curve and place accordingly
+		if(this.control.y<this.end.y) offset*=-1;
+		else offset+=this.textYOffset;
+		var ab={x:((this.control.x-this.start.x)*.5)+this.start.x, y:((this.control.y-this.start.y)*.5)+this.start.y};
+		var bc={x:((this.end.x-this.control.x)*.5)+this.control.x, y:((this.end.y-this.control.y)*.5)+this.control.y};
+		this.textPosition={x:((bc.x-ab.x)*.5)+ab.x, y:(((bc.y-ab.y)*.5)+ab.y)+offset};
+	};
+	
+	p.apply=function(obj){
+		if(!obj) return;
+		if(obj.documentElement) obj=obj.documentElement;
+		this.readCommonAttrs(obj);
+		
+		for(var i=0; i<obj.childNodes.length; i++){
+			var c=obj.childNodes[i];
+			if(c.localName=="text") this.property('label',c.childNodes.length?c.childNodes[0].nodeValue:'');
+			else if(c.localName=="path"){
+				//	the line
+				var d=c.getAttribute('d').split(" ");
+				var s=d[0].split(",");
+				this.start.x=parseFloat(s[0].substr(1),10);
+				this.start.y=parseFloat(s[1],10);
+				s=d[1].split(",");
+				this.control.x=parseFloat(s[0].substr(1),10);
+				this.control.y=parseFloat(s[1],10);
+				s=d[2].split(",");
+				this.end.x=parseFloat(s[0],10);
+				this.end.y=parseFloat(s[1],10);
+			}
+		}
+	};
+	p.initialize=function(obj){
+		//	create, based on passed DOM node if available.
+		var font=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times", size:"16px"};
+		this.apply(obj);
+
+		//	calculate the other positions
+		this._rot();
+		this._pos();
+
+		//	rotation matrix
+		var rot=this.startRotation;
+		if(this.control.x<this.start.x) rot+=Math.PI;
+		var startRot=dojox.gfx.matrix.rotate(rot);
+
+		rot=this.endRotation;
+		if(this.control.x>=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.start.x) rot+=Math.PI;
+		var startRot=dojox.gfx.matrix.rotate(rot);
+		rot=this.endRotation;
+		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 '<g '+this.writeCommonAttrs()+'>'
+			+ '<path style="stroke:'+s.color+';stroke-width:'+s.width+';fill:none;" d="'
+			+ "M"+this.start.x+","+this.start.y+" "
+			+ "Q"+this.control.x+","+this.control.y+" "
+			+ this.end.x+","+this.end.y
+			+ '" />'
+			+ '<g transform="translate(' + this.start.x + "," + this.start.y + ") "
+			+ 'rotate(' + (Math.round((this.startRotation*(180/Math.PI))*Math.pow(10,4))/Math.pow(10,4)) + ')">'
+			+ '<path style="fill:'+s.color+';" d="M0,0 l20,-5, -3,5, 3,5 Z" />'
+			+ '</g>'
+			+ '<g transform="rotate('
+			+ (Math.round((this.endRotation*(180/Math.PI))*Math.pow(10,4))/Math.pow(10,4))
+			+ ", "+this.end.x+", "+this.end.y
+			+ ')">'
+			+ '<path style="fill:'+s.color+';" d="M'+this.end.x+","+this.end.y+' l-20,-5, 3,5, -3,5 Z" />'
+			+ '</g>'
+			+ '<text style="fill:'+s.color+';text-anchor:'+this.textAlign+'" font-weight="bold" '
+			+ 'x="' + this.textPosition.x + '" '
+			+ 'y="' + this.textPosition.y + '">'
+			+ this.property('label')
+			+ '</text>'
+			+ '</g>';
+	};
+
+	ta.Annotation.register("DoubleArrow");
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/Figure.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/Figure.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/Figure.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<self.selected.length; i++){
+				if(self.selected[i]==obj) return true;
+			}
+			return false;
+		};
+		this.select=function(obj){
+			//	TODO: deal with multiple vs. single selections.
+			if(!self.isSelected(obj)){
+				//	force single select
+				self.clearSelections();
+				self.selected=[ obj ];
+			}
+			//	force a bbox update, regardless
+			obj.setMode(ta.Annotation.Modes.View);
+			obj.setMode(ta.Annotation.Modes.Edit);
+		};
+		this.deselect=function(obj){
+			var idx=-1;
+			for(var i=0; i<self.selected.length; i++){
+				if(self.selected[i]==obj){
+					idx=i;
+					break;
+				}
+			}
+			if(idx>-1){
+				obj.setMode(ta.Annotation.Modes.View);
+				self.selected.splice(idx,1);
+			}
+			return obj;
+		};
+		this.clearSelections=function(){
+			for(var i=0; i<self.selected.length; i++) 
+				self.selected[i].setMode(ta.Annotation.Modes.View);
+			self.selected=[]; 
+		};
+		this.replaceSelection=function(n, o){
+			if(!self.isSelected(o)){
+				self.select(n);
+				return;
+			}
+			var idx=-1;
+			for(var i=0; i<self.selected.length; i++){
+				if(self.selected[i]==o){
+					idx=i; break;
+				}
+			}
+			if(idx>-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<arr.length; i++){
+				//var before=arr[i].serialize();
+				if(!noundo){
+					arr[i].remove();
+				}
+				arr[i].setMode(ta.Annotation.Modes.View);
+				arr[i].destroy();
+				self.remove(arr[i]);
+				self._remove(arr[i]);
+			}
+			arr.splice(0,arr.length);
+		};
+	};
+
+	var p=ta.Figure.prototype;
+	p.initUndoStack=function(){
+			this.history=new ta.UndoStack(this);
+	};
+	p.setTool=function(/*dojox.sketch._Plugin*/t){
+		this._ctool=t;
+	};
+	p.onDblClickShape=function(shape,e){
+		if(shape['onDblClick']){
+			shape.onDblClick(e);
+		}
+	};
+
+	p.onCreateShape=function(shape){};
+	p.onBeforeCreateShape=function(shape){};
+	p.initialize=function(node){
+		this.node=node;
+		this.surface=dojox.gfx.createSurface(node, this.size.w, this.size.h);
+		this.surface.createRect({ x:0, y:0, width:this.size.w, height:this.size.h })
+			.setFill("white");
+		this.group=this.surface.createGroup();
+
+		//	kill any dragging events.
+		this._cons=[];
+		this._cons.push(dojo.connect(this.node, "ondragstart",   dojo, "stopEvent"));
+		this._cons.push(dojo.connect(this.node, "onselectstart", dojo, "stopEvent"));
+
+		//	hook up the drag system.
+		this._cons.push(dojo.connect(this.surface.getEventSource(), 'onmousedown', this._md));
+		this._cons.push(dojo.connect(this.surface.getEventSource(), 'onmousemove', this._mm));
+		this._cons.push(dojo.connect(this.surface.getEventSource(), 'onmouseup', this._mu));
+
+		this._cons.push(dojo.connect(this.surface.getEventSource(), 'ondblclick', this._dblclick));
+		this._cons.push(dojo.connect(this.surface.getEventSource().ownerDocument, 'onkeydown', this._keydown));
+		
+		//	rect hack.  Fcuking VML>
+		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<this.shapes.length; i++){
+			if(this.shapes[i]==annotation){ return true; }
+		}
+		this.shapes.push(annotation);
+		return true;
+	};
+	p.remove=function(annotation){
+		var idx=-1;
+		for(var i=0; i<this.shapes.length; i++){
+			if(this.shapes[i]==annotation){
+				idx=i;
+				break;
+			}
+		}
+		if(idx>-1) this.shapes.splice(idx, 1);
+		return annotation;
+	};
+	p.get=function(id){
+		for(var i=0; i<this.shapes.length; i++){
+			if(this.shapes[i].id==id) {
+				return this.shapes[i];
+			}
+		}
+		return null;
+	};
+
+	p.convert=function(ann, t){
+		//	convert an existing annotation to a different kind of annotation
+		var ctor=t+"Annotation";
+		if(!ta[ctor]) return;
+		var type=ann.type(), id=ann.id, label=ann.label, mode=ann.mode; tokenId=ann.tokenId;
+		var start, end, control, transform;
+		switch(type){
+			case "Preexisting":
+			case "Lead":{
+				transform={dx:ann.transform.dx, dy:ann.transform.dy };
+				start={x:ann.start.x, y:ann.start.y};
+				end={x:ann.end.x, y:ann.end.y };
+				var cx=end.x-((end.x-start.x)/2);
+				var cy=end.y-((end.y-start.y)/2);
+				control={x:cx, y:cy};
+				break;
+			}
+			case "SingleArrow":
+			case "DoubleArrow":{
+				transform={dx:ann.transform.dx, dy:ann.transform.dy };
+				start={x:ann.start.x, y:ann.start.y};
+				end={x:ann.end.x, y:ann.end.y };
+				control={x:ann.control.x, y:ann.control.y};
+				break;
+			}
+			case "Underline":{
+				transform={dx:ann.transform.dx, dy:ann.transform.dy };
+				start={x:ann.start.x, y:ann.start.y};
+				control={x:start.x+50, y:start.y+50 };
+				end={x:start.x+100, y:start.y+100 };
+				break;
+			}
+			case "Brace":{ }
+		}
+		var n=new ta[ctor](this, id);
+
+		if(n.type()=="Underline"){
+			//	special handling, since we never move the start point.
+			n.transform={dx:transform.dx+start.x, dy:transform.dy+start.y };
+		} else {
+			if(n.transform) n.transform=transform;
+			if(n.start) n.start=start;
+		}
+		if(n.end) n.end=end;
+		if(n.control) n.control=control;
+		n.label=label;
+		n.token=dojo.lang.shallowCopy(ann.token);
+		n.initialize();
+
+		this.replaceSelection(n, ann);
+		this._remove(ann);
+		this.remove(ann);
+		ann.destroy();
+
+		//	this should do all the things we need it to do for getting it registered.
+		n.setMode(mode);
+	};
+	p.setValue=function(text){
+		var obj=dojox.xml.DomParser.parse(text);
+		var node=this.node;
+		this.load(obj,node);
+		this.zoom(this.zoomFactor*100); //zoom to orignal scale
+	};
+	p.load=function(obj, n){
+		//	create from pseudo-DOM
+		if(this.surface){ this.destroy(true); }
+		var node=obj.documentElement;	//	should be either the document or the docElement
+		this.size={ w:parseFloat(node.getAttribute('width'),10), h:parseFloat(node.getAttribute('height'),10) };
+		var g=node.childrenByName("g")[0];
+		var img=g.childrenByName("image")[0];
+		this.imageSrc=img.getAttribute("xlink:href");
+		this.initialize(n);
+
+		//	now let's do the annotations.
+		var ann=g.childrenByName("g");
+		for(var i=0; i<ann.length; i++) this._loadAnnotation(ann[i]);
+		if(this._loadDeferred){
+			this._loadDeferred.callback(this);
+			this._loadDeferred=null;
+		}
+		this.onLoad();
+	};
+	p.onLoad=function(){};
+	p._loadAnnotation=function(obj){
+		var ctor=obj.getAttribute('dojoxsketch:type')+"Annotation";
+		if(ta[ctor]){
+			var a=new ta[ctor](this, obj.id);
+			a.initialize(obj);
+			this.nextKey();
+			a.setMode(ta.Annotation.Modes.View);
+			this._add(a);
+			return a;
+		}
+		return null;
+	};
+	
+	p.onUndo=function(){};
+	p.onBeforeUndo=function(){};
+	p.onRedo=function(){};
+	p.onBeforeRedo=function(){};
+	p.undo=function(){
+		if(this.history){
+			this.onBeforeUndo();
+			this.history.undo();
+			this.onUndo();
+		}
+	};
+	p.redo=function(){
+		if(this.history){
+			this.onBeforeRedo();
+			this.history.redo();
+			this.onRedo();
+		}
+	};
+	p.serialize=function(){
+		var s='<svg xmlns="http://www.w3.org/2000/svg"; '
+			+ 'xmlns:xlink="http://www.w3.org/1999/xlink"; '
+			+ 'xmlns:dojoxsketch="http://dojotoolkit.org/dojox/sketch"; '
+			+ 'width="' + this.size.w + '" height="' + this.size.h + '">'
+			+ '<g>'
+			+ '<image xlink:href="' + this.imageSrc + '" x="0" y="0" width="' 
+			+ this.size.w + '" height="' + this.size.h + '" />';
+		for(var i=0; i<this.shapes.length; i++) s+= this.shapes[i].serialize();
+		s += '</g></svg>';
+		return s;
+	};
+	p.getValue=p.serialize;
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/LeadAnnotation.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/LeadAnnotation.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/LeadAnnotation.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,141 @@
+if(!dojo._hasResource["dojox.sketch.LeadAnnotation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.sketch.LeadAnnotation"] = true;
+dojo.provide("dojox.sketch.LeadAnnotation");
+dojo.require("dojox.sketch.Annotation");
+dojo.require("dojox.sketch.Anchor");
+
+(function(){
+	var ta=dojox.sketch;
+	ta.LeadAnnotation=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.property('label',this.id);
+		this.pathShape=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.LeadAnnotation.prototype=new ta.Annotation;
+	var p=ta.LeadAnnotation.prototype;
+	p.constructor=ta.LeadAnnotation;
+
+	p.type=function(){ return 'Lead'; }
+	p.getType=function(){ return ta.LeadAnnotation; };
+
+	p._pos=function(){
+		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.y) y=this.end.y+this.calculate.dy(this.control, this.end, offset)+this.textYOffset;
+			else y=this.end.y+this.calculate.dy(this.control, this.end, -offset);
+		}
+		this.textPosition={ x:x, y:y };
+	};
+	p.apply=function(obj){
+		if(!obj) return;
+		if(obj.documentElement) obj=obj.documentElement;
+		this.readCommonAttrs(obj);
+		
+		for(var i=0; i<obj.childNodes.length; i++){
+			var c=obj.childNodes[i];
+			if(c.localName=="text") this.property('label',c.childNodes.length?c.childNodes[0].nodeValue:'');
+			else if(c.localName=="path"){
+				//	the line
+				var d=c.getAttribute('d').split(" ");
+				var s=d[0].split(",");
+				this.start.x=parseFloat(s[0].substr(1),10);
+				this.start.y=parseFloat(s[1],10);
+				s=d[1].split(",");
+				this.control.x=parseFloat(s[0].substr(1),10);
+				this.control.y=parseFloat(s[1],10);
+				s=d[2].split(",");
+				this.end.x=parseFloat(s[0],10);
+				this.end.y=parseFloat(s[1],10);
+			}
+		}
+	};
+
+	p.initialize=function(obj){
+		var font=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times", size:"16px"};
+		this.apply(obj);
+		this._pos();
+
+		//	create either from scratch or based on the passed node
+		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.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.shape.remove(this.pathShape);
+		this.shape.remove(this.labelShape);
+		this.figure.group.remove(this.shape);
+		this.shape=this.pathShape=this.labelShape=null;
+	};
+	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.draw=function(obj){
+		this.apply(obj);
+		this._pos();
+		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.labelShape.setShape({ x:this.textPosition.x, y:this.textPosition.y, text:this.property('label') })
+			.setFill(this.property('fill'));
+	};
+	p.serialize=function(){
+		var stroke=this.property('stroke');
+		return '<g '+this.writeCommonAttrs()+'>'
+			+ '<path style="stroke:'+stroke.color+';stroke-width:'+stroke.width+';fill:none;" d="'
+			+ "M"+this.start.x+","+this.start.y+" "
+			+ "Q"+this.control.x+","+this.control.y+" "
+			+ this.end.x+","+this.end.y
+			+ '" />'
+			+ '<text style="fill:'+stroke.color+';text-anchor:'+this.textAlign+'" font-weight="bold" '
+			+ 'x="' + this.textPosition.x + '" '
+			+ 'y="' + this.textPosition.y + '">'
+			+ this.property('label')
+			+ '</text>'
+			+ '</g>';
+	};
+
+	ta.Annotation.register("Lead");
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/PreexistingAnnotation.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/PreexistingAnnotation.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/PreexistingAnnotation.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<obj.childNodes.length; i++){
+			var c=obj.childNodes[i];
+			if(c.localName=="text") this.property('label',c.childNodes.length?c.childNodes[0].nodeValue:'');
+			else if(c.localName=="rect"){
+				if(c.getAttribute('x')!==null) this.start.x=parseFloat(c.getAttribute('x'), 10);
+				if(c.getAttribute('width')!==null) this.end.x=parseFloat(c.getAttribute('width'), 10)+parseFloat(c.getAttribute('x'), 10);
+				if(c.getAttribute('y')!==null) this.start.y=parseFloat(c.getAttribute('y'), 10);
+				if(c.getAttribute('height')!==null) this.end.y=parseFloat(c.getAttribute('height'), 10)+parseFloat(c.getAttribute('y'), 10);
+				if(c.getAttribute('r')!==null) this.radius=parseFloat(c.getAttribute('r'),10);
+			}
+		}
+	};
+	p.initialize=function(obj){
+		var font=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times", size:"16px"};
+		this.apply(obj);
+		this._pos();
+
+		//	create either from scratch or based on the passed node
+		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.rectShape=this.shape.createRect({
+			x:this.start.x, y: this.start.y, width: this.end.x-this.start.x, height:this.end.y-this.start.y, r:this.radius
+		}).setStroke({color:this.property('fill'), width:1}).setFill([255,255,255,0.1]);
+		this.rectShape.getEventSource().setAttribute("shape-rendering","crispEdges");
+		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.shape.remove(this.rectShape);
+		this.shape.remove(this.labelShape);
+		this.figure.group.remove(this.shape);
+		this.shape=this.rectShape=this.labelShape=null;
+	};
+	p.getBBox=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)-x;
+		var h=Math.max(this.start.y, this.end.y)-y;
+		return { x:x-2, y:y-2, width:w+4, height:h+4 };
+	};
+	p.draw=function(obj){
+		this.apply(obj);
+		this._pos();
+		this.shape.setTransform(this.transform);
+		this.rectShape.setShape({x:this.start.x, y: this.start.y, width: this.end.x-this.start.x, height:this.end.y-this.start.y, r:this.radius})
+			.setStroke({ color:this.property('fill'), width:1 }).setFill([255,255,255,0.1]);
+		this.labelShape.setShape({ x:this.textPosition.x, y:this.textPosition.y, text:this.property('label') }).setFill(this.property('fill'));
+	};
+	p.serialize=function(){
+		var s=this.property('stroke');
+		return '<g '+this.writeCommonAttrs()+'>'
+			+ '<rect style="stroke:'+s.color+';stroke-weight:1;fill:none;" '
+			+ 'x="' + this.start.x + '" '
+			+ 'width="' + (this.end.x-this.start.x) + '" '
+			+ 'y="' + this.start.y + '" '
+			+ 'height="' + (this.end.y-this.start.y) + '" '
+			+ 'rx="' + this.radius + '" '
+			+ 'ry="' + this.radius + '" '
+			+ ' />'
+			+ '<text style="fill:'+s.color+';text-anchor:'+this.textAlign+'" font-weight="bold" '
+			+ 'x="' + this.textPosition.x + '" '
+			+ 'y="' + this.textPosition.y + '">'
+			+ this.property('label')
+			+ '</text>'
+			+ '</g>';
+	};
+
+	ta.Annotation.register("Preexisting");
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxx)
+  Heng Liu/LiuCougar (heng@xxxxxxxxxxxxxx)
+-------------------------------------------------------------------------------
+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.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/SingleArrowAnnotation.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/SingleArrowAnnotation.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/SingleArrowAnnotation.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.y) y=this.end.y+this.calculate.dy(this.control, this.end, offset)+this.textYOffset;
+			else y=this.end.y+this.calculate.dy(this.control, this.end, -offset);
+		}
+		this.textPosition={ x:x, y:y };
+	};
+	
+	p.apply=function(obj){
+		if(!obj) return;
+		if(obj.documentElement) obj=obj.documentElement;
+		this.readCommonAttrs(obj);
+		
+		for(var i=0; i<obj.childNodes.length; i++){
+			var c=obj.childNodes[i];
+			if(c.localName=="text") this.property('label',c.childNodes.length?c.childNodes[0].nodeValue:'');
+			else if(c.localName=="path"){
+				//	the line
+				var d=c.getAttribute('d').split(" ");
+				var s=d[0].split(",");
+				this.start.x=parseFloat(s[0].substr(1),10);
+				this.start.y=parseFloat(s[1],10);
+				s=d[1].split(",");
+				this.control.x=parseFloat(s[0].substr(1),10);
+				this.control.y=parseFloat(s[1],10);
+				s=d[2].split(",");
+				this.end.x=parseFloat(s[0],10);
+				this.end.y=parseFloat(s[1],10);
+			}
+		}
+	};
+	p.initialize=function(obj){
+		//	create, based on passed DOM node if available.
+		var font=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times", size:"16px"};
+		this.apply(obj);
+
+		//	calculate the other positions
+		this._rot();
+		this._pos();
+
+		//	rotation matrix
+		var rot=this.rotation;
+		if(this.control.x>=this.end.x&&this.control.x<this.start.x) rot+=Math.PI;
+		var tRot=dojox.gfx.matrix.rotate(rot);
+
+		//	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.arrowheadGroup=this.shape.createGroup().setTransform({ dx:this.start.x, dy:this.start.y }).applyTransform(tRot);
+		this.arrowhead=this.arrowheadGroup.createPath("M0,0 l20,-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.arrowheadGroup.remove(this.arrowhead);
+		this.shape.remove(this.arrowheadGroup);
+		this.shape.remove(this.pathShape);
+		this.shape.remove(this.labelShape);
+		this.figure.group.remove(this.shape);
+		this.shape=this.pathShape=this.labelShape=this.arrowheadGroup=this.arrowhead=null;
+	};
+	p.draw=function(obj){
+		this.apply(obj);
+		this._rot();
+		this._pos();
+
+		//	rotation matrix
+		var rot=this.rotation;
+		if(this.control.x<this.start.x) rot+=Math.PI;
+		var tRot=dojox.gfx.matrix.rotate(rot);
+
+		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.arrowheadGroup.setTransform({dx:this.start.x,dy:this.start.y}).applyTransform(tRot);
+		this.arrowhead.setFill(this.property('fill'));
+		this.labelShape.setShape({x:this.textPosition.x, y:this.textPosition.y, text:this.property('label'), align:this.textAlign})
+			.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');
+		var r=this.rotation*(180/Math.PI);
+		if(this.start.x>this.end.x) r-=180;
+		r=Math.round(r*Math.pow(10,4))/Math.pow(10,4);
+		return '<g '+this.writeCommonAttrs()+'>'
+			+ '<path style="stroke:'+s.color+';stroke-width:'+s.width+';fill:none;" d="'
+			+ "M"+this.start.x+","+this.start.y+" "
+			+ "Q"+this.control.x+","+this.control.y+" "
+			+ this.end.x+","+this.end.y
+			+ '" />'
+			+ '<g transform="translate(' + this.start.x + "," + this.start.y + ") "
+			+ 'rotate(' + r + ')">'
+			+ '<path style="fill:'+s.color+';" d="M0,0 l20,-5, -3,5, 3,5 Z" />'
+			+ '</g>'
+			+ '<text style="fill:'+s.color+';text-anchor:'+this.textAlign+'" font-weight="bold" '
+			+ 'x="' + this.textPosition.x + '" '
+			+ 'y="' + this.textPosition.y + '">'
+			+ this.property('label')
+			+ '</text>'
+			+ '</g>';
+	};
+
+	ta.Annotation.register("SingleArrow");
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/Slider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/Slider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/Slider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/Toolbar.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/Toolbar.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/Toolbar.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.figure.selected.length; i++){
+				var before=this.figure.selected[i].serialize();
+				this.figure.convert(this.figure.selected[i], s);
+				this.figure.history.add(ta.CommandTypes.Convert, this.figure.selected[i], before);
+			}
+		}
+	}
+});
+
+dojox.sketch.makeToolbar=function(node,figure){
+	var toolbar=new dojox.sketch.Toolbar({"figure":figure});
+	node.appendChild(toolbar.domNode);
+	return toolbar;
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/UnderlineAnnotation.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/UnderlineAnnotation.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/UnderlineAnnotation.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,82 @@
+if(!dojo._hasResource["dojox.sketch.UnderlineAnnotation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.sketch.UnderlineAnnotation"] = true;
+dojo.provide("dojox.sketch.UnderlineAnnotation");
+dojo.require("dojox.sketch.Annotation");
+dojo.require("dojox.sketch.Anchor");
+
+(function(){
+	var ta=dojox.sketch;
+	ta.UnderlineAnnotation=function(figure, id){
+		ta.Annotation.call(this, figure, id);
+		this.transform={dx:0, dy:0};
+		this.start={x:0, y:0};
+		this.property('label',this.id);
+		this.labelShape=null;
+		this.lineShape=null;
+		this.anchors.start=new ta.Anchor(this, "start", false);
+	};
+	ta.UnderlineAnnotation.prototype=new ta.Annotation;
+	var p=ta.UnderlineAnnotation.prototype;
+	p.constructor=ta.UnderlineAnnotation;
+
+	p.type=function(){ return 'Underline'; };
+	p.getType=function(){ return ta.UnderlineAnnotation; };
+
+	p.apply=function(obj){
+		if(!obj) return;
+		if(obj.documentElement) obj=obj.documentElement;
+		this.readCommonAttrs(obj);
+		
+		for(var i=0; i<obj.childNodes.length; i++){
+			var c=obj.childNodes[i];
+			if(c.localName=="text") this.property('label',c.childNodes[0].nodeValue);
+		}
+	};
+	
+	p.initialize=function(obj){
+		var font=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times", size:"16px"};
+		this.apply(obj);
+
+		//	create either from scratch or based on the passed node
+		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.labelShape=this.shape.createText({
+			x:0, y:0, text:this.property('label'), align:"start"
+		}).setFont(font).setFill(this.property('fill'));
+		this.lineShape=this.shape.createLine({ x1:1, x2:this.labelShape.getTextWidth(), y1:2, y2:2 }).setStroke({ color:this.property('fill'), width:1 });
+		this.lineShape.getEventSource().setAttribute("shape-rendering","crispEdges");
+	};
+	p.destroy=function(){
+		if(!this.shape) return;
+		this.shape.remove(this.labelShape);
+		this.shape.remove(this.lineShape);
+		this.figure.group.remove(this.shape);
+		this.shape=this.lineShape=this.labelShape=null;
+	};
+	p.getBBox=function(){
+		var b=this.getTextBox();
+//		console.log('getBBox',b,this.getLabel());
+		return { x:0, y:b.h*-1+4, width:b.w+2, height:b.h };
+	};
+	p.draw=function(obj){
+		this.apply(obj);
+		this.shape.setTransform(this.transform);
+		this.labelShape.setShape({ x:0, y:0, text:this.property('label') }).setFill(this.property('fill'));
+		this.lineShape.setShape({ x1:1, x2:this.labelShape.getTextWidth()+1, y1:2, y2:2 }).setStroke({ color:this.property('fill'), width:1 });
+	};
+	p.serialize=function(){
+		var s=this.property('stroke');
+		return '<g '+this.writeCommonAttrs()+'>'
+			+ '<line x1="1" x2="'+this.labelShape.getTextWidth()+1+'" y1="5" y2="5" style="stroke:'+s.color+';stroke-weight:'+s.width+'" />'
+			+ '<text style="fill:'+this.property('fill')+';" font-weight="bold" '
+			+ 'x="0" y="0">'
+			+ this.property('label')
+			+ '</text>'
+			+ '</g>';
+	};
+
+	ta.Annotation.register("Underline");
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/UndoStack.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/UndoStack.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/UndoStack.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+			}
+		}
+	});
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/_Plugin.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/_Plugin.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/_Plugin.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/images/icons.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/images/icons.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/sketch.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/sketch.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/sketch.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; }

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/sketch.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/sketch.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch/resources/sketch.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; }

Added: branches/vhffs-design/vhffs-panel/js/dojox/sketch.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sketch.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sketch.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/sql.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/sql.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/sql.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/AirDBStorageProvider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/AirDBStorageProvider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/AirDBStorageProvider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<keys.length;i++) {
+						this._sql("DELETE FROM " + this.TABLE_NAME + " WHERE namespace = :namespace AND key = :key",
+							{ ":namespace":namespace, ":key":key[i] });
+						this._sql("INSERT INTO " + this.TABLE_NAME + " VALUES (:namespace, :key, :value)",
+						 	{ ":namespace":namespace, ":key":key[i], ":value":value });
+					}
+					this._commitTransaction();
+				}catch(e){
+					// indicate we failed
+					console.debug("dojox.storage.AirDBStorageProvider.putMultiple:", e);
+					if(resultsHandler){
+						resultsHandler(this.FAILED, keys, e.toString());
+					}
+					return;
+				}
+				
+				if(resultsHandler){
+					resultsHandler(this.SUCCESS, key, null);
+				}
+			},
+
+			getMultiple: function(keys, namespace){
+				if(this.isValidKeyArray(keys) === false){
+					throw new Error("Invalid key array given: " + keys);
+				}
+				
+				if(namespace == null || typeof namespace == "undefined"){
+					namespace = this.DEFAULT_NAMESPACE;		
+				}
+				
+				if(this.isValidKey(namespace) == false){
+					throw new Error("Invalid namespace given: " + namespace);
+				}
+		
+				var results = [];
+				for(var i=0;i<keys.length;i++){
+					var result = this._sql("SELECT * FROM " + this.TABLE_NAME + " WHERE namespace = :namespace AND key = :key",
+						{ ":namespace":namespace, ":key":keys[i] });
+					results[i] = result.data && result.data.length ? result.data[0].value : null;
+				}
+				
+				return results;
+			},
+			
+			removeMultiple: function(keys, namespace){
+				namespace = namespace||this.DEFAULT_NAMESPACE;
+				
+				this._beginTransaction();
+				for(var i=0;i<keys.length;i++){
+					this._sql("DELETE FROM " + this.TABLE_NAME + " WHERE namespace = namespace = :namespace AND key = :key",
+						{ ":namespace":namespace, ":key":keys[i] });
+				}
+				this._commitTransaction();
+			},			
+			
+			isPermanent: function(){ return true; },
+
+			getMaximumSize: function(){ return this.SIZE_NO_LIMIT; },
+
+			hasSettingsUI: function(){ return false; },
+			
+			showSettingsUI: function(){
+				throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+			},
+			
+			hideSettingsUI: function(){
+				throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+			}
+		});
+
+		dojox.storage.manager.register("dojox.storage.AirDBStorageProvider", new dojox.storage.AirDBStorageProvider());
+		dojox.storage.manager.initialize();
+	})();
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/AirEncryptedLocalStorageProvider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/AirEncryptedLocalStorageProvider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/AirEncryptedLocalStorageProvider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,221 @@
+if(!dojo._hasResource["dojox.storage.AirEncryptedLocalStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.storage.AirEncryptedLocalStorageProvider"] = true;
+dojo.provide("dojox.storage.AirEncryptedLocalStorageProvider");
+dojo.require("dojox.storage.manager");
+dojo.require("dojox.storage.Provider");
+
+if (dojo.isAIR) {
+	(function(){
+		
+		if (!air) {
+			var air = {};
+		}
+		air.ByteArray = window.runtime.flash.utils.ByteArray;
+		air.EncryptedLocalStore = window.runtime.flash.data.EncryptedLocalStore,
+
+		// summary: 
+		//		Storage provider that uses features in the Adobe AIR runtime to achieve
+		//		permanent storage
+		dojo.declare("dojox.storage.AirEncryptedLocalStorageProvider", [ dojox.storage.Provider ], {
+			initialize: function(){
+				// indicate that this storage provider is now loaded
+				dojox.storage.manager.loaded();
+			},
+	
+			isAvailable: function(){
+				return true;
+			},
+			
+			_getItem: function(key){
+				var storedValue = air.EncryptedLocalStore.getItem("__dojo_" + key);
+				return storedValue ? storedValue.readUTFBytes(storedValue.length) : "";
+			},
+			
+			_setItem: function(key, value){
+				var bytes = new air.ByteArray();
+				bytes.writeUTFBytes(value);
+				air.EncryptedLocalStore.setItem("__dojo_" + key, bytes);
+			},
+			
+			_removeItem: function(key){
+				air.EncryptedLocalStore.removeItem("__dojo_" + key);
+			},
+			
+			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{
+					var namespaces = this._getItem("namespaces")||'|';
+					if(namespaces.indexOf('|'+namespace+'|')==-1){
+						this._setItem("namespaces", namespaces + namespace + '|');
+					}
+					var keys = this._getItem(namespace + "_keys")||'|';
+					if(keys.indexOf('|'+key+'|')==-1){
+						this._setItem(namespace + "_keys", keys + key + '|');
+					}
+					this._setItem('_' + namespace + '_' + key, value);
+				}catch(e){
+					// indicate we failed
+					console.debug("dojox.storage.AirEncryptedLocalStorageProvider.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;
+				return this._getItem('_' + namespace + '_' + key);
+			},
+			
+			getNamespaces: function(){
+				var results = [ this.DEFAULT_NAMESPACE ];
+				var namespaces = (this._getItem("namespaces")||'|').split('|');
+				for (var i=0;i<namespaces.length;i++){
+					if(namespaces[i].length && namespaces[i] != this.DEFAULT_NAMESPACE){
+						results.push(namespaces[i]);
+					}
+				}
+				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 keys = (this._getItem(namespace + "_keys")||'|').split('|');
+				for (var i=0;i<keys.length;i++){
+					if (keys[i].length){
+						results.push(keys[i]);
+					}
+				}
+				return results;
+			},
+			
+			clear: function(namespace){
+				if(this.isValidKey(namespace) == false){
+					throw new Error("Invalid namespace given: " + namespace);
+				}
+				var namespaces = this._getItem("namespaces")||'|';
+				if(namespaces.indexOf('|'+namespace+'|')!=-1){
+					this._setItem("namespaces", namespaces.replace('|' + namespace + '|', '|'));
+				}
+				var keys = (this._getItem(namespace + "_keys")||'|').split('|');
+				for (var i=0;i<keys.length;i++){
+					if (keys[i].length){
+						this._removeItem(namespace + "_" + keys[i]);
+					}
+				}
+				this._removeItem(namespace + "_keys");
+			},
+			
+			remove: function(key, namespace){
+				namespace = namespace||this.DEFAULT_NAMESPACE;
+				
+				var keys = this._getItem(namespace + "_keys")||'|';
+				if(keys.indexOf('|'+key+'|')!=-1){
+					this._setItem(namespace + "_keys", keys.replace('|' + key + '|', '|'));
+				}
+				this._removeItem('_' + 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 = this.DEFAULT_NAMESPACE;		
+				}
+	
+				if(this.isValidKey(namespace) == false){
+					throw new Error("Invalid namespace given: " + namespace);
+				}
+	
+				this._statusHandler = resultsHandler;
+
+				// try to store the value	
+				try{
+					for(var i=0;i<keys.length;i++) {
+						this.put(keys[i], value[i], null, namespace);
+					}
+				}catch(e){
+					// indicate we failed
+					console.debug("dojox.storage.AirEncryptedLocalStorageProvider.putMultiple:", e);
+					if(resultsHandler){
+						resultsHandler(this.FAILED, keys, e.toString());
+					}
+					return;
+				}
+				
+				if(resultsHandler){
+					resultsHandler(this.SUCCESS, key, null);
+				}
+			},
+
+			getMultiple: function(keys, namespace){
+				if(this.isValidKeyArray(keys) === false){
+					throw new Error("Invalid key array given: " + keys);
+				}
+				
+				if(namespace == null || typeof namespace == "undefined"){
+					namespace = this.DEFAULT_NAMESPACE;		
+				}
+				
+				if(this.isValidKey(namespace) == false){
+					throw new Error("Invalid namespace given: " + namespace);
+				}
+		
+				var results = [];
+				for(var i=0;i<keys.length;i++){
+					results[i] = this.get(keys[i], namespace);
+				}
+				return results;
+			},
+			
+			removeMultiple: function(keys, namespace){
+				namespace = namespace||this.DEFAULT_NAMESPACE;
+				for(var i=0;i<keys.length;i++){
+					this.remove(keys[i], namespace);
+				}
+			}, 				
+			
+			isPermanent: function(){ return true; },
+
+			getMaximumSize: function(){ return this.SIZE_NO_LIMIT; },
+
+			hasSettingsUI: function(){ return false; },
+			
+			showSettingsUI: function(){
+				throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+			},
+			
+			hideSettingsUI: function(){
+				throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+			}
+		});
+
+		dojox.storage.manager.register("dojox.storage.AirEncryptedLocalStorageProvider", new dojox.storage.AirEncryptedLocalStorageProvider());
+		dojox.storage.manager.initialize();
+	})();
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/AirFileStorageProvider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/AirFileStorageProvider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/AirFileStorageProvider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,232 @@
+if(!dojo._hasResource["dojox.storage.AirFileStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.storage.AirFileStorageProvider"] = true;
+dojo.provide("dojox.storage.AirFileStorageProvider");
+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.FileStream = window.runtime.flash.filesystem.FileStream;
+		air.FileMode = window.runtime.flash.filesystem.FileMode;
+		
+		// summary: 
+		//		Storage provider that uses features in the Adobe AIR runtime to achieve
+		//		permanent storage
+		dojo.declare("dojox.storage.AirFileStorageProvider", [ dojox.storage.Provider ], {
+			initialized: false,
+			
+			_storagePath: "__DOJO_STORAGE/",
+	
+			initialize: function(){
+				this.initialized = false;
+
+				// need to initialize our storage directory
+				try{
+					var dir = air.File.applicationStorageDirectory.resolvePath(this._storagePath);
+					if (!dir.exists){
+						dir.createDirectory();
+					}
+					this.initialized = true;
+				}catch(e){
+					console.debug("dojox.storage.AirFileStorageProvider.initialize:", e);
+				}
+				
+				// indicate that this storage provider is now loaded
+				dojox.storage.manager.loaded();
+			},
+	
+			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.remove(key, namespace);
+					
+					var dir = air.File.applicationStorageDirectory.resolvePath(this._storagePath + namespace);
+					if (!dir.exists){
+						dir.createDirectory();
+					}
+					
+					var file = dir.resolvePath(key);
+					var stream = new air.FileStream();
+					stream.open(file, air.FileMode.WRITE);
+					stream.writeObject(value);
+					stream.close();
+				}catch(e){
+					// indicate we failed
+					console.debug("dojox.storage.AirFileStorageProvider.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 = null;
+				
+				var file = air.File.applicationStorageDirectory.resolvePath(this._storagePath + namespace + '/' + key);
+				if (file.exists && !file.isDirectory){
+					var stream = new air.FileStream();
+					stream.open(file, air.FileMode.READ);
+					results = stream.readObject();
+					stream.close();
+				}
+				
+				return results;
+			},
+			
+			getNamespaces: function(){
+				var results = [ this.DEFAULT_NAMESPACE ];
+				var dir = air.File.applicationStorageDirectory.resolvePath(this._storagePath);
+				var files = dir.getDirectoryListing();
+				for (i = 0; i < files.length; i++) {
+					if(files[i].isDirectory && files[i].name != this.DEFAULT_NAMESPACE){
+						results.push(files[i].name);
+					}
+				}
+				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 dir = air.File.applicationStorageDirectory.resolvePath(this._storagePath + namespace);
+				if (dir.exists && dir.isDirectory){
+					var files = dir.getDirectoryListing();
+					for (i = 0; i < files.length; i++) {
+						results.push(files[i].name);
+					}
+				}
+				return results;
+			},
+			
+			clear: function(namespace){
+				if(this.isValidKey(namespace) == false){
+					throw new Error("Invalid namespace given: " + namespace);
+				}
+				var dir = air.File.applicationStorageDirectory.resolvePath(this._storagePath + namespace);
+				if (dir.exists && dir.isDirectory){
+					dir.deleteDirectory(true);
+				}
+			},
+			
+			remove: function(key, namespace){
+				namespace = namespace||this.DEFAULT_NAMESPACE;
+				var file = air.File.applicationStorageDirectory.resolvePath(this._storagePath + namespace + '/' + key);
+				if (file.exists && !file.isDirectory){
+					file.deleteFile();
+				}
+			},
+			
+			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{
+					for(var i=0;i<keys.length;i++) {
+						this.put(keys[i], value[i], null, namespace);
+					}
+				}catch(e){
+					// indicate we failed
+					console.debug("dojox.storage.AirFileStorageProvider.putMultiple:", e);
+					if(resultsHandler){
+						resultsHandler(this.FAILED, keys, e.toString());
+					}
+					return;
+				}
+				
+				if(resultsHandler){
+					resultsHandler(this.SUCCESS, key, null);
+				}
+			},
+
+			getMultiple: function(keys, namespace){
+				if(this.isValidKeyArray(keys) === false){
+					throw new Error("Invalid key array given: " + keys);
+				}
+				
+				if(namespace == null || typeof namespace == "undefined"){
+					namespace = this.DEFAULT_NAMESPACE;		
+				}
+				
+				if(this.isValidKey(namespace) == false){
+					throw new Error("Invalid namespace given: " + namespace);
+				}
+		
+				var results = [];
+				for(var i=0;i<keys.length;i++){
+					results[i] = this.get(keys[i], namespace);
+				}
+				return results;
+			},
+			
+			removeMultiple: function(keys, namespace){
+				namespace = namespace||this.DEFAULT_NAMESPACE;
+				
+				for(var i=0;i<keys.length;i++){
+					this.remove(keys[i], namespace);
+				}
+			}, 				
+			
+			isPermanent: function(){ return true; },
+
+			getMaximumSize: function(){ return this.SIZE_NO_LIMIT; },
+
+			hasSettingsUI: function(){ return false; },
+			
+			showSettingsUI: function(){
+				throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+			},
+			
+			hideSettingsUI: function(){
+				throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+			}
+		});
+
+		dojox.storage.manager.register("dojox.storage.AirFileStorageProvider", new dojox.storage.AirFileStorageProvider());
+		dojox.storage.manager.initialize();
+	})();
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/FlashStorageProvider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/FlashStorageProvider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/FlashStorageProvider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,346 @@
+if(!dojo._hasResource["dojox.storage.FlashStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.storage.FlashStorageProvider"] = true;
+dojo.provide("dojox.storage.FlashStorageProvider");
+
+dojo.require("dojox.flash");
+dojo.require("dojox.storage.manager");
+dojo.require("dojox.storage.Provider");
+
+// summary: 
+//		Storage provider that uses features in Flash to achieve permanent
+//		storage
+// description:
+//		Authors of this storage provider-
+//			Brad Neuberg, bkn3@xxxxxxxxxxxx	
+dojo.declare("dojox.storage.FlashStorageProvider", dojox.storage.Provider, {
+		initialized: false,
+		
+		_available: null,
+		_statusHandler: null,
+		_flashReady: false,
+		_pageReady: false,
+		
+		initialize: function(){
+		  //console.debug("FlashStorageProvider.initialize");
+			if(dojo.config["disableFlashStorage"] == true){
+				return;
+			}
+			
+			// initialize our Flash
+			dojox.flash.addLoadedListener(dojo.hitch(this, function(){
+			  //console.debug("flashReady");
+			  // indicate our Flash subsystem is now loaded
+			  this._flashReady = true;
+			  if(this._flashReady && this._pageReady){
+				  this._loaded();
+				}
+			}));
+			var swfLoc = dojo.moduleUrl("dojox", "storage/Storage.swf").toString();
+			dojox.flash.setSwf(swfLoc, false);
+			
+			// wait till page is finished loading
+			dojo.connect(dojo, "loaded", this, function(){
+			  //console.debug("pageReady");
+			  this._pageReady = true;
+			  if(this._flashReady && this._pageReady){
+			    this._loaded();
+			  }
+			});
+		},
+		
+		//	Set a new value for the flush delay timer.
+		//	Possible values:
+		//	  0 : Perform the flush synchronously after each "put" request
+		//	> 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<values.length;i++){
+				if(dojo.isString(values[i])){
+					values[i] = "string:" + values[i];
+				}else{
+					values[i] = dojo.toJson(values[i]);
+				}
+				lengths[i] = values[i].length; 
+			}
+			var metaValue = values.join("");
+			var metaLengths = lengths.join(",");
+			
+			dojox.flash.comm.putMultiple(metaKey, metaValue, metaLengths, this.namespace);
+		},
+
+		get: function(key, 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);
+			}
+			
+			var results = dojox.flash.comm.get(key, namespace);
+
+			if(results == ""){
+				return null;
+			}
+		
+			return this._destringify(results);
+		},
+
+		getMultiple: function(/*array*/ keys, /*string?*/ namespace){ /*Object*/
+			if(!this.isValidKeyArray(keys)){
+				throw new ("Invalid key array given: " + keys);
+			}
+			
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;		
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			var metaKey = keys.join(",");
+			var metaResults = dojox.flash.comm.getMultiple(metaKey, this.namespace);
+			var results = eval("(" + metaResults + ")");
+			
+			//	destringify each entry back into a real JS object
+			//FIXME: use dojo.map
+			for(var i = 0; i < results.length; i++){
+				results[i] = (results[i] == "") ? null : this._destringify(results[i]);
+			}
+			
+			return results;		
+		},
+
+		_destringify: function(results){
+			// 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;
+		},
+		
+		getKeys: function(namespace){
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;		
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			var results = dojox.flash.comm.getKeys(namespace);
+			
+			// Flash incorrectly returns an empty string as "null"
+			if(results == null || results == "null"){
+			  results = "";
+			}
+			
+			results = results.split(",");
+			results.sort();
+			
+			return results;
+		},
+		
+		getNamespaces: function(){
+			var results = dojox.flash.comm.getNamespaces();
+			
+			// Flash incorrectly returns an empty string as "null"
+			if(results == null || results == "null"){
+			  results = dojox.storage.DEFAULT_NAMESPACE;
+			}
+			
+			results = results.split(",");
+			results.sort();
+			
+			return results;
+		},
+
+		clear: function(namespace){
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			dojox.flash.comm.clear(namespace);
+		},
+		
+		remove: function(key, namespace){
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;		
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			dojox.flash.comm.remove(key, namespace);
+		},
+		
+		removeMultiple: function(/*array*/ keys, /*string?*/ namespace){ /*Object*/
+			if(!this.isValidKeyArray(keys)){
+				dojo.raise("Invalid key array given: " + keys);
+			}
+			if(!namespace){
+				namespace = dojox.storage.DEFAULT_NAMESPACE;		
+			}
+			
+			if(!this.isValidKey(namespace)){
+				throw new Error("Invalid namespace given: " + namespace);
+			}
+			
+			var metaKey = keys.join(",");
+			dojox.flash.comm.removeMultiple(metaKey, 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(){
+			// hide the dialog
+			dojox.flash.obj.setVisible(false);
+			
+			// call anyone who wants to know the dialog is
+			// now hidden
+			if(dojo.isFunction(dojox.storage.onHideSettingsUI)){
+				dojox.storage.onHideSettingsUI.call(null);	
+			}
+		},
+		
+		getResourceList: function(){ /* Array[] */
+			// Dojo Offline no longer uses the FlashStorageProvider for offline
+			// storage; Gears is now required
+			return [];
+		},
+		
+		/** Called when Flash and the page are finished loading. */
+		_loaded: function(){
+			// get available namespaces
+			this._allNamespaces = this.getNamespaces();
+			
+			this.initialized = true;
+
+			// indicate that this storage provider is now loaded
+			dojox.storage.manager.loaded();
+		},
+		
+		//	Called if the storage system needs to tell us about the status
+		//	of a put() request. 
+		_onStatus: function(statusResult, key, namespace){
+		  //console.debug("onStatus, statusResult="+statusResult+", key="+key);
+			var ds = dojox.storage;
+			var dfo = dojox.flash.obj;
+			
+			if(statusResult == ds.PENDING){
+				dfo.center();
+				dfo.setVisible(true);
+			}else{
+				dfo.setVisible(false);
+			}
+			
+			if(ds._statusHandler){
+				ds._statusHandler.call(null, statusResult, key, namespace);		
+			}
+		}
+	}
+);
+
+dojox.storage.manager.register("dojox.storage.FlashStorageProvider",
+								new dojox.storage.FlashStorageProvider());
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/GearsStorageProvider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/GearsStorageProvider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/GearsStorageProvider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,320 @@
+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");
+dojo.require("dojox.storage.Provider");
+dojo.require("dojox.storage.manager");
+dojo.require("dojox.sql");
+
+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@xxxxxxxxxxxx 
+			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<keys.length;i++) {
+						// serialize the value;
+						// handle strings differently so they have better performance
+						var value = values[i];
+						if(dojo.isString(value)){
+							value = "string:" + value;
+						}else{
+							value = dojo.toJson(value);
+						}
+				
+						dojox.sql.db.execute( _stmt,
+							[namespace, keys[i], value]);
+					}
+					dojox.sql.db.execute("COMMIT TRANSACTION");
+					dojox.sql.close();
+				}catch(e){
+					// indicate we failed
+					console.debug("dojox.storage.GearsStorageProvider.putMultiple:", e);
+					if(resultsHandler){
+						resultsHandler(this.FAILED, keys, e.toString());
+					}
+					return;
+				}
+				
+				if(resultsHandler){
+					resultsHandler(dojox.storage.SUCCESS, key, null);
+				}
+			},
+
+			getMultiple: function(keys, namespace){
+				//	TODO: Maybe use SELECT IN instead
+
+				if(this.isValidKeyArray(keys) === false){
+					throw new ("Invalid key array given: " + keys);
+				}
+				
+				if(namespace == null || typeof namespace == "undefined"){
+					namespace = dojox.storage.DEFAULT_NAMESPACE;		
+				}
+				
+				if(this.isValidKey(namespace) == false){
+					throw new Error("Invalid namespace given: " + namespace);
+				}
+		
+				var _stmt = "SELECT * FROM " + this.TABLE_NAME	+ 
+					" WHERE namespace = ? AND "	+ " key = ?";
+				
+				var results = [];
+				for(var i=0;i<keys.length;i++){
+					var result = dojox.sql( _stmt, namespace, keys[i]);
+						
+					if( ! result.length){
+						results[i] = null;
+					}else{
+						result = result[0].value;
+						
+						// destringify the content back into a 
+						// real JavaScript object;
+						// handle strings differently so they have better performance
+						if(dojo.isString(result) && (/^string:/.test(result))){
+							results[i] = result.substring("string:".length);
+						}else{
+							results[i] = dojo.fromJson(result);
+						}
+					}
+				}
+				
+				return results;
+			},
+			
+			removeMultiple: function(keys, namespace){
+				namespace = namespace||this.DEFAULT_NAMESPACE;
+				
+				dojox.sql.open();
+				dojox.sql.db.execute("BEGIN TRANSACTION");
+				var _stmt = "DELETE FROM " + this.TABLE_NAME + " WHERE namespace = ? AND key = ?";
+
+				for(var i=0;i<keys.length;i++){
+					dojox.sql.db.execute( _stmt,
+						[namespace, keys[i]]);
+				}
+				dojox.sql.db.execute("COMMIT TRANSACTION");
+				dojox.sql.close();
+			}, 				
+			
+			isPermanent: function(){ return true; },
+
+			getMaximumSize: function(){ return this.SIZE_NO_LIMIT; },
+
+			hasSettingsUI: function(){ return false; },
+			
+			showSettingsUI: function(){
+				throw new Error(this.declaredClass 
+									+ " does not support a storage settings user-interface");
+			},
+			
+			hideSettingsUI: function(){
+				throw new Error(this.declaredClass 
+									+ " does not support a storage settings user-interface");
+			}
+		});
+
+		// register the existence of our storage providers
+		dojox.storage.manager.register("dojox.storage.GearsStorageProvider",
+										new dojox.storage.GearsStorageProvider());
+	})();
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/Provider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/Provider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/Provider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,331 @@
+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 [];
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,76 @@
+-------------------------------------------------------------------------------
+Dojo Storage
+-------------------------------------------------------------------------------
+Version X.XXX (does not have separate versioning -- versioned by release date)
+Last Release date: March 2008
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits
+	Brad Neuberg
+	Alex Russell
+-------------------------------------------------------------------------------
+Project description
+
+dojox.storage provides a JavaScript abstraction for persistent storage
+as well as pluggable implementations which typically use native browser extensions
+(e.g. Flash player, Gears)
+
+-------------------------------------------------------------------------------
+Dependencies:
+
+FlashStorageProvider requires the Flash player
+GearsStorageProvider requires the Gears extension
+The various Air*StorageProviders require Adobe's AIR software
+
+The open source mtasc compiler (www.mtasc.org) is needed to build the
+ActionScript into SWF format.  The SWF object is maintained within svn, so
+this step is only necessary if Storage.as is modified.  A sample build script
+is provided (buildFlashStorage.sh)
+
+-------------------------------------------------------------------------------
+Documentation
+
+See http://manual.dojotoolkit.org/WikiHome/DojoDotBook/Book50 for the
+authoritative Dojo Storage docs.
+
+See dojox/storage/demos/helloworld.html for a simple Hello World example
+you can base your code off of.
+
+-------------------------------------------------------------------------------
+Installation instructions
+
+If you want to use Dojo Storage in a web browser:
+
+These installation instructions are to use Dojo Storage in a web browser; at
+runtime, Dojo Storage will autodetect and use the best available storage
+option. This includes:
+
+  * Google Gears
+  * HTML 5 Web Browsers (Firefox 2+)
+  * Hidden Flash
+  
+If you are using a release build (if you downloaded Dojo from the Dojo
+website then this is a release build -- if you checked it out from
+Subversion yourself then you will have to build things yourself), if you 
+only want to grab just the files from Dojo to use Dojo Storage
+in the browser, take the following (but make sure to keep the directory
+layout the same, or else things won't work correctly!):
+
+* dojo/dojo.js
+* dojox/storage/storage-browser.js
+* dojox/storage/Storage.swf
+
+To help with testing and development and to make sure you have everything 
+right, its also useful to grab the following files:
+
+* dojox/storage/README
+* dojox/storage/demos/helloworld.html
+
+If you want to use Dojo Storage with Adobe AIR:
+
+[TBD! Why don't you write this and contribute!]
+
+-------------------------------------------------------------------------------
+Additional Notes

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/Storage.as
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/Storage.as	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/Storage.as	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,399 @@
+import DojoExternalInterface;
+
+class Storage{
+	public static var SUCCESS = "success";
+	public static var FAILED = "failed";
+	public static var PENDING = "pending";
+	
+	//	Wait the following number of milliseconds before flushing
+	public static var FLUSH_DELAY_DEFAULT = 500;
+	
+	public var flush_delay;
+	public var so;
+	public var timer;
+	
+	private var _NAMESPACE_KEY = "allNamespaces";
+	
+	public function Storage(){
+		flush_delay = Storage.FLUSH_DELAY_DEFAULT;
+	
+		DojoExternalInterface.initialize();
+		DojoExternalInterface.addCallback("put", this, put);
+		DojoExternalInterface.addCallback("putMultiple", this, putMultiple);
+		DojoExternalInterface.addCallback("get", this, get);
+		DojoExternalInterface.addCallback("getMultiple", this, getMultiple);
+		DojoExternalInterface.addCallback("showSettings", this, showSettings);
+		DojoExternalInterface.addCallback("clear", this, clear);
+		DojoExternalInterface.addCallback("getKeys", this, getKeys);
+		DojoExternalInterface.addCallback("getNamespaces", this, getNamespaces);
+		DojoExternalInterface.addCallback("remove", this, remove);
+		DojoExternalInterface.addCallback("removeMultiple", this, removeMultiple);
+		DojoExternalInterface.addCallback("flush", this, flush);
+		DojoExternalInterface.addCallback("setFlushDelay", this, setFlushDelay);
+		DojoExternalInterface.addCallback("getFlushDelay", this, getFlushDelay);
+		DojoExternalInterface.loaded();
+		
+		// preload the System Settings finished button movie for offline
+		// access so it is in the cache
+		_root.createEmptyMovieClip("_settingsBackground", 1);
+		_root._settingsBackground.loadMovie(DojoExternalInterface.dojoPath + "storage_dialog.swf");
+	}
+
+  //  FIXME: Whoever added this Flush code did not document why it
+  //  exists. Please also put your name and a bug number so I know 
+  //  who to contact. -- Brad Neuberg
+	
+	//	Set a new value for the flush delay timer.
+	//	Possible values:
+	//	  0 : Perform the flush synchronously after each "put" request
+	//	> 0 : Wait until 'newDelay' ms have passed without any "put" request to flush
+	//	 -1 : Do not automatically flush
+	public function setFlushDelay(newDelay){
+		flush_delay = Number(newDelay);
+	}
+	
+	public function getFlushDelay(){
+		return String(flush_delay);
+	}
+	
+	public function flush(namespace){
+		if(timer){
+			_global.clearTimeout(timer);
+			delete timer;
+		}
+	
+		var so = SharedObject.getLocal(namespace);
+		var flushResults = so.flush();
+
+		// return results of this command to JavaScript
+		var statusResults;
+		if(flushResults == true){
+			statusResults = Storage.SUCCESS;
+		}else if(flushResults == "pending"){
+			statusResults = Storage.PENDING;
+		}else{
+			statusResults = Storage.FAILED;
+		}
+		
+		DojoExternalInterface.call("dojox.storage._onStatus", statusResults, 
+		                            null, namespace);
+	}
+
+	public function put(keyName, keyValue, namespace){
+		// Get the SharedObject for these values and save it
+		so = SharedObject.getLocal(namespace);
+		
+		//  Save the key and value
+		so.data[keyName] = keyValue;
+		
+		// Save the namespace
+		// FIXME: Tie this into the flush/no-flush stuff below; right now
+		// we immediately write out this namespace. -- Brad Neuberg
+    addNamespace(namespace, keyName);
+
+		//	Do all the flush/no-flush stuff
+		var keyNames = new Array(); 
+		keyNames[0] = keyName;
+		postWrite(so, keyNames, namespace);
+	}
+	
+	//  FIXME: Whoever added this code did not document what the
+	//  put/get multiple functionality is and why it exists. Please
+	//  also put your name and a bug number so I know who to contact.
+	//  -- Brad Neuberg
+	public function putMultiple(metaKey, metaValue, metaLengths, namespace){
+		// Get the SharedObject for these values and save it
+		so = SharedObject.getLocal(namespace);
+		
+		//	Create array of keys and value lengths
+		var keys = metaKey.split(",");
+		var lengths = metaLengths.split(",");
+		
+		//	Loop through the array and write the values
+		for(var i=0;i<keys.length;i++){
+			so.data[keys[i]] = metaValue.slice(0,lengths[i]);
+			metaValue = metaValue.slice(lengths[i]);
+		}
+		
+		//	Do all the flush/no-flush stuff
+		postWrite(so, keys, namespace);
+	}
+
+	public function postWrite(so, keyNames, namespace){
+		//	TODO: Review all this 'handler' stuff. In particular, the flush 
+		//  could now be with keys pending from several different requests, not 
+		//  only the ones passed in this method call
+
+		// prepare a storage status handler
+		var self = this;
+		so.onStatus = function(infoObject:Object){
+			//trace("onStatus, infoObject="+infoObject.code);
+			
+			// delete the data value if the request was denied
+			if(infoObject.code == "SharedObject.Flush.Failed"){
+				for(var i=0;i<keyNames.length;i++){
+					delete self.so.data[keyNames[i]];
+				}
+			}
+			
+			var statusResults;
+			if(infoObject.code == "SharedObject.Flush.Failed"){
+				statusResults = Storage.FAILED;
+			}else if(infoObject.code == "SharedObject.Flush.Pending"){
+				statusResults = Storage.PENDING;
+			}else if(infoObject.code == "SharedObject.Flush.Success"){
+				// if we have succeeded saving our value, see if we
+				// need to update our list of namespaces
+				if(self.hasNamespace(namespace) == true){
+					statusResults = Storage.SUCCESS;
+				}else{
+					// we have a new namespace we must store
+					self.addNamespace(namespace, keyNames[0]);
+					return;
+				}
+			}
+			//trace("onStatus, statusResults="+statusResults);
+			
+			// give the status results to JavaScript
+			DojoExternalInterface.call("dojox.storage._onStatus", statusResults, 
+			                            keyNames[0], namespace);
+		}
+		
+		//	Clear any pending flush timers
+		if(timer){
+			_global.clearTimeout(timer);
+		}
+		
+		//	If we have a flush delay set, set a timer for its execution
+		if(flush_delay > 0){
+			timer = _global.setTimeout(flush, flush_delay, namespace);
+		//	With a flush_delay value of 0, execute the flush request synchronously
+		}else if(flush_delay == 0){
+			flush(namespace);
+		}
+		//	Otherwise just don't flush - will be probably be flushed manually
+	}
+
+	public function get(keyName, namespace){
+		// Get the SharedObject for these values and save it
+		so = SharedObject.getLocal(namespace);
+		var results = so.data[keyName];
+		
+		return results;
+	}
+	
+	//	Returns an array with the contents of each key value on the metaKeys array
+	public function getMultiple(metaKeys, namespace){
+		//	get the storage object
+		so = SharedObject.getLocal(namespace);
+		
+		//	Create array of keys to read
+		var keys = metaKeys.split(",");
+		var results = new Array();
+		
+		//	Read from storage into results array
+		for(var i = 0;i < keys.length;i++){
+			var val = so.data[keys[i]];
+			val = val.split("\\").join("\\\\");
+			val = val.split('"').join('\\"');
+			results.push( val);
+		}
+			
+		//	Make the results array into a string
+		var metaResults = '["' + results.join('","') + '"]';
+		
+		return metaResults;
+	}	
+	
+	public function showSettings(){
+		// Show the configuration options for the Flash player, opened to the
+		// section for local storage controls (pane 1)
+		System.showSettings(1);
+		
+		// there is no way we can intercept when the Close button is pressed, allowing us
+		// to hide the Flash dialog. Instead, we need to load a movie in the
+		// background that we can show a close button on.
+		_root.createEmptyMovieClip("_settingsBackground", 1);
+		_root._settingsBackground.loadMovie(DojoExternalInterface.dojoPath + "storage_dialog.swf");
+	}
+	
+	public function clear(namespace){
+		so = SharedObject.getLocal(namespace);
+		so.clear();
+		so.flush();
+		
+		// remove this namespace entry now
+		removeNamespace(namespace);
+	}
+	
+	public function getKeys(namespace) : String{
+		// Returns a list of the available keys in this namespace
+		
+		// get the storage object
+		so = SharedObject.getLocal(namespace);
+		// get all of the keys
+		var results = [];
+		for(var i in so.data){
+			results.push(i);	
+		}
+		
+		// remove our key that records our list of namespaces
+		for(var i = 0; i < results.length; i++){
+			if(results[i] == _NAMESPACE_KEY){
+				results.splice(i, 1);
+				break;
+			}
+		}
+		
+		// a bug in ExternalInterface transforms Arrays into
+		// Strings, so we can't use those here! -- BradNeuberg
+		results = results.join(",");
+		
+		return results;
+	}
+	
+	public function getNamespaces() : String{
+		var allNamespaces = SharedObject.getLocal(_NAMESPACE_KEY);
+		var results = [];
+		
+		for(var i in allNamespaces.data){
+			results.push(i);
+		}
+		
+		// a bug in ExternalInterface transforms Arrays into
+		// Strings, so we can use those here! -- BradNeuberg
+		results = results.join(",");
+		
+		return results;
+	}
+	
+	public function remove(keyName, namespace){
+		// Removes a key
+
+		// get the storage object
+		so = SharedObject.getLocal(namespace);
+		
+		// delete this value
+		delete so.data[keyName];
+		
+		// save the changes
+		so.flush();
+		
+		// see if we are the last entry for this namespace
+		var availableKeys = getKeys(namespace);
+		if(availableKeys == ""){
+			// we are empty
+			removeNamespace(namespace);
+		}
+	}
+	
+	//	Removes all the values for each keys on the metaKeys array
+	public function removeMultiple(metaKeys, namespace){		
+		//	get the storage object
+		so = SharedObject.getLocal(namespace);
+		
+		//	Create array of keys to read
+		var keys = metaKeys.split(",");
+		var results = new Array();
+
+		//	Delete elements
+		for(var i=0;i<keys.length;i++){
+			delete so.data[keys[i]];
+		}
+
+		// see if there are no more entries for this namespace
+		var availableKeys = getKeys(namespace);
+		if(availableKeys == ""){
+			// we are empty
+			removeNamespace(namespace);
+		}
+	}
+	
+	private function hasNamespace(namespace):Boolean{
+		// Get the SharedObject for the namespace list
+		var allNamespaces = SharedObject.getLocal(_NAMESPACE_KEY);
+		
+		var results = false;
+		for(var i in allNamespaces.data){
+			if(i == namespace){
+				results = true;
+				break;
+			}
+		}
+		
+		return results;
+	}
+	
+	// FIXME: This code has gotten ugly -- refactor
+	private function addNamespace(namespace, keyName){
+		if(hasNamespace(namespace) == true){
+			return;
+		}
+		
+		// Get the SharedObject for the namespace list
+		var allNamespaces = SharedObject.getLocal(_NAMESPACE_KEY);
+		
+		// prepare a storage status handler if the keyName is
+		// not null
+		if(keyName != null && typeof keyName != "undefined"){
+			var self = this;
+			allNamespaces.onStatus = function(infoObject:Object){
+				// delete the data value if the request was denied
+				if(infoObject.code == "SharedObject.Flush.Failed"){
+					delete self.so.data[keyName];
+				}
+				
+				var statusResults;
+				if(infoObject.code == "SharedObject.Flush.Failed"){
+					statusResults = Storage.FAILED;
+				}else if(infoObject.code == "SharedObject.Flush.Pending"){
+					statusResults = Storage.PENDING;
+				}else if(infoObject.code == "SharedObject.Flush.Success"){
+					statusResults = Storage.SUCCESS;
+				}
+				
+				// give the status results to JavaScript
+				DojoExternalInterface.call("dojox.storage._onStatus", statusResults, 
+				                            keyName, namespace);
+			}
+		}
+		
+		// save the namespace list
+		allNamespaces.data[namespace] = true;
+		var flushResults = allNamespaces.flush();
+		
+		// return results of this command to JavaScript
+		if(keyName != null && typeof keyName != "undefined"){
+			var statusResults;
+			if(flushResults == true){
+				statusResults = Storage.SUCCESS;
+			}else if(flushResults == "pending"){
+				statusResults = Storage.PENDING;
+			}else{
+				statusResults = Storage.FAILED;
+			}
+			
+			DojoExternalInterface.call("dojox.storage._onStatus", statusResults, 
+			                            keyName, namespace);
+		}
+	}
+	
+	// FIXME: This code has gotten ugly -- refactor
+	private function removeNamespace(namespace){
+		if(hasNamespace(namespace) == false){
+			return;
+		}
+		
+		// try to save the namespace list; don't have a return
+		// callback; if we fail on this, the worst that will happen
+		// is that we have a spurious namespace entry
+		var allNamespaces = SharedObject.getLocal(_NAMESPACE_KEY);
+		delete allNamespaces.data[namespace];
+		allNamespaces.flush();
+	}
+
+	static function main(mc){
+		_root.app = new Storage(); 
+	}
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/Storage.swf
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/storage/Storage.swf
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/WhatWGStorageProvider.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/WhatWGStorageProvider.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/WhatWGStorageProvider.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,278 @@
+if(!dojo._hasResource["dojox.storage.WhatWGStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.storage.WhatWGStorageProvider"] = true;
+dojo.provide("dojox.storage.WhatWGStorageProvider");
+dojo.require("dojox.storage.Provider");
+dojo.require("dojox.storage.manager");
+
+dojo.declare("dojox.storage.WhatWGStorageProvider", [ dojox.storage.Provider ], {
+	// summary:
+	//		Storage provider that uses WHAT Working Group features in Firefox 2 
+	//		to achieve permanent storage.
+	// description: 
+	//		The WHAT WG storage API is documented at 
+	//		http://www.whatwg.org/specs/web-apps/current-work/#scs-client-side
+	//
+	//		You can disable this storage provider with the following djConfig
+	//		variable:
+	//		var djConfig = { disableWhatWGStorage: true };
+	//		
+	//		Authors of this storage provider-	
+	//			JB Boisseau, jb.boisseau@xxxxxxxxxxxxxxx
+	//			Brad Neuberg, bkn3@xxxxxxxxxxxx 
+
+	initialized: false,
+	
+	_domain: null,
+	_available: null,
+	_statusHandler: null,
+	_allNamespaces: null,
+	_storageEventListener: null,
+	
+	initialize: function(){
+		if(dojo.config["disableWhatWGStorage"] == true){
+			return;
+		}
+		
+		// get current domain
+		// see: https://bugzilla.mozilla.org/show_bug.cgi?id=357323
+		this._domain = (location.hostname == "localhost") ? "localhost.localdomain" : location.hostname;
+		// console.debug(this._domain);
+		
+		// indicate that this storage provider is now loaded
+		this.initialized = true;
+		dojox.storage.manager.loaded();	
+	},
+	
+	isAvailable: function(){
+		try{
+			// see: https://bugzilla.mozilla.org/show_bug.cgi?id=357323
+			var myStorage = globalStorage[((location.hostname == "localhost") ? "localhost.localdomain" : location.hostname)];
+		}catch(e){
+			this._available = false;
+			return this._available;
+		}
+		
+		this._available = true;	
+		return this._available;
+	},
+
+	put: function(key, value, resultsHandler, namespace){
+		if(this.isValidKey(key) == false){
+			throw new Error("Invalid key given: " + key);
+		}
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		// get our full key name, which is namespace + key
+		key = this.getFullKey(key, 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);
+		}
+		
+		// register for successful storage events.
+		var storageListener = dojo.hitch(this, function(evt){
+			// remove any old storage event listener we might have added
+			// to the window on old put() requests; Firefox has a bug
+			// where it can occassionaly go into infinite loops calling
+			// our storage event listener over and over -- this is a 
+			// workaround
+			// FIXME: Simplify this into a test case and submit it
+			// to Firefox
+			window.removeEventListener("storage", storageListener, false);
+			
+			// indicate we succeeded
+			if(resultsHandler){
+				resultsHandler.call(null, this.SUCCESS, key);
+			}
+		});
+		
+		window.addEventListener("storage", storageListener, false);
+		
+		// try to store the value	
+		try{
+			var myStorage = globalStorage[this._domain];
+			myStorage.setItem(key, value);
+		}catch(e){
+			// indicate we failed
+			this._statusHandler.call(null, this.FAILED, key, e.toString());
+		}
+	},
+
+	get: function(key, namespace){
+		if(this.isValidKey(key) == false){
+			throw new Error("Invalid key given: " + key);
+		}
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		// get our full key name, which is namespace + key
+		key = this.getFullKey(key, namespace);
+		
+		// sometimes, even if a key doesn't exist, Firefox
+		// will return a blank string instead of a null --
+		// this _might_ be due to having underscores in the
+		// keyname, but I am not sure.
+		
+		// FIXME: Simplify this bug into a testcase and
+		// submit it to Firefox
+		var myStorage = globalStorage[this._domain];
+		var results = myStorage.getItem(key);
+		
+		if(results == null || results == ""){
+			return null;
+		}
+		
+		results = results.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 = [ this.DEFAULT_NAMESPACE ];
+		
+		// simply enumerate through our array and save any string
+		// that starts with __
+		var found = {};
+		var myStorage = globalStorage[this._domain];
+		var tester = /^__([^_]*)_/;
+		for(var i = 0; i < myStorage.length; i++){
+			var currentKey = myStorage.key(i);
+			if(tester.test(currentKey) == true){
+				var currentNS = currentKey.match(tester)[1];
+				// have we seen this namespace before?
+				if(typeof found[currentNS] == "undefined"){
+					found[currentNS] = true;
+					results.push(currentNS);
+				}
+			}
+		}
+		
+		return results;
+	},
+
+	getKeys: function(namespace){
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		if(this.isValidKey(namespace) == false){
+			throw new Error("Invalid namespace given: " + namespace);
+		}
+		
+		// create a regular expression to test the beginning
+		// of our key names to see if they match our namespace;
+		// if it is the default namespace then test for the presence
+		// of no namespace for compatibility with older versions
+		// of dojox.storage
+		var namespaceTester;
+		if(namespace == this.DEFAULT_NAMESPACE){
+			namespaceTester = new RegExp("^([^_]{2}.*)$");	
+		}else{
+			namespaceTester = new RegExp("^__" + namespace + "_(.*)$");
+		}
+		
+		var myStorage = globalStorage[this._domain];
+		var keysArray = [];
+		for(var i = 0; i < myStorage.length; i++){
+			var currentKey = myStorage.key(i);
+			if(namespaceTester.test(currentKey) == true){
+				// strip off the namespace portion
+				currentKey = currentKey.match(namespaceTester)[1];
+				keysArray.push(currentKey);
+			}
+		}
+		
+		return keysArray;
+	},
+
+	clear: function(namespace){
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		if(this.isValidKey(namespace) == false){
+			throw new Error("Invalid namespace given: " + namespace);
+		}
+		
+		// create a regular expression to test the beginning
+		// of our key names to see if they match our namespace;
+		// if it is the default namespace then test for the presence
+		// of no namespace for compatibility with older versions
+		// of dojox.storage
+		var namespaceTester;
+		if(namespace == this.DEFAULT_NAMESPACE){
+			namespaceTester = new RegExp("^[^_]{2}");	
+		}else{
+			namespaceTester = new RegExp("^__" + namespace + "_");
+		}
+		
+		var myStorage = globalStorage[this._domain];
+		var keys = [];
+		for(var i = 0; i < myStorage.length; i++){
+			if(namespaceTester.test(myStorage.key(i)) == true){
+				keys[keys.length] = myStorage.key(i);
+			}
+		}
+		
+		dojo.forEach(keys, dojo.hitch(myStorage, "removeItem"));
+	},
+	
+	remove: function(key, namespace){
+		// get our full key name, which is namespace + key
+		key = this.getFullKey(key, namespace);
+		
+		var myStorage = globalStorage[this._domain];
+		myStorage.removeItem(key);
+	},
+	
+	isPermanent: function(){
+		return true;
+	},
+
+	getMaximumSize: function(){
+		return this.SIZE_NO_LIMIT;
+	},
+
+	hasSettingsUI: function(){
+		return false;
+	},
+	
+	showSettingsUI: function(){
+		throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+	},
+	
+	hideSettingsUI: function(){
+		throw new Error(this.declaredClass + " does not support a storage settings user-interface");
+	},
+	
+	getFullKey: function(key, namespace){
+		namespace = namespace||this.DEFAULT_NAMESPACE;
+		
+		if(this.isValidKey(namespace) == false){
+			throw new Error("Invalid namespace given: " + namespace);
+		}
+		
+		// don't append a namespace string for the default namespace,
+		// for compatibility with older versions of dojox.storage
+		if(namespace == this.DEFAULT_NAMESPACE){
+			return key;
+		}else{
+			return "__" + namespace + "_" + key;
+		}
+	}
+});
+
+dojox.storage.manager.register("dojox.storage.WhatWGStorageProvider", 
+								new dojox.storage.WhatWGStorageProvider());
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/_common.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/_common.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/_common.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,20 @@
+if(!dojo._hasResource["dojox.storage._common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.storage._common"] = true;
+dojo.provide("dojox.storage._common");
+dojo.require("dojox.storage.Provider");
+dojo.require("dojox.storage.manager");
+
+/*
+  Note: if you are doing Dojo Offline builds you _must_
+  have offlineProfile=true when you run the build script:
+  ./build.sh action=release profile=offline offlineProfile=true
+*/
+dojo.require("dojox.storage.GearsStorageProvider");
+dojo.require("dojox.storage.WhatWGStorageProvider");
+dojo.require("dojox.storage.FlashStorageProvider");
+
+// now that we are loaded and registered tell the storage manager to
+// initialize itself
+dojox.storage.manager.initialize();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/buildFlashStorage.sh
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/buildFlashStorage.sh	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/buildFlashStorage.sh	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+#!/bin/sh
+# TODO: FIXME: Get rid of this and hook it into Dojo's general build script
+# You must have mtasc to run this
+mtasc -trace DojoExternalInterface.trace -main -cp ../flash -swf Storage.swf -version 8 -header 215:138:10 Storage.as

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/demos/helloworld.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/demos/helloworld.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/demos/helloworld.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,90 @@
+<html>
+  <head>
+    <script src="../../../dojo/dojo.js"></script>
+    <script src="../storage-browser.js"></script>
+    
+    <script>
+      dojo.require("dojox.storage");
+      
+      function runDemo(){
+        // setup event handlers
+        dojo.byId("saveButton").onclick = saveValue;
+        
+        // write out what our storage provider is for debugging
+        dojo.byId("currentProvider").innerHTML = 
+          dojox.storage.manager.currentProvider.declaredClass;
+          
+        loadValues();
+      }
+      
+      function loadValues(){
+        // get any values that were saved before and write them into the page
+        var results = dojox.storage.get("myValues");
+      
+        if(results){
+          var printMe = "<ul>";
+          for(var i = 0; i < results.length; i++){
+            printMe += "<li>" + results[i] + "</li>";
+          }
+          printMe += "</ul>";
+          dojo.byId("allValues").innerHTML = printMe;
+        }
+      }
+      
+      function saveValue(){
+        var value = dojo.byId("saveValue").value;
+        if(value == undefined || value === ""){
+          alert("Please enter a correct value");
+          return;
+        }
+        
+        // get the old values first, since we are saving everything
+        // as one key
+        var results = dojox.storage.get("myValues");
+        if(!results){
+          results = new Array();
+        }
+        
+        // add new value
+        results.push(value);
+        
+        dojox.storage.put("myValues", results, function(status, keyName){
+    			if(status == dojox.storage.FAILED){
+    				alert("You do not have permission to store data for this web site.");
+    			}else if(status == dojox.storage.SUCCESS){
+    			  loadValues();
+    			}
+    		});
+      }
+      
+      // wait until the storage system is finished loading
+      if(!dojox.storage.manager.isInitialized()){
+      	dojo.connect(dojox.storage.manager, "loaded", runDemo);
+      }else{
+      	dojo.connect(dojo, "loaded", runDemo);
+      }
+    </script>
+  </head>
+  
+  <body>
+    <h1>Dojo Storage Hello World</h1>
+    
+    <p>Simple Dojo Storage example. Enter values below to have them
+      persisted in Dojo Storage; refresh browser page or close browser
+      and then return to this page to see the values again. Note that
+      Dojo Storage will not work from file:// URLs.</p>
+      
+    <h2>Save Values:</h2>
+    <div>
+      <input id="saveValue" type="text"></input>
+      <button id="saveButton">Save Value</button>
+    </div>
+    
+    <h2>All Saved Values:</h2>
+    <p id="allValues"></p>
+    
+    <p>Using Dojo Storage Provider (autodetected): 
+      <span id="currentProvider"></span>
+    <p>
+  </body>
+</html>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/manager.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage/manager.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage/manager.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,261 @@
+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;
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage/storage_dialog.fla
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/storage/storage_dialog.fla
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/storage.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/storage.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/storage.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/string/Builder.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/string/Builder.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/string/Builder.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,101 @@
+if(!dojo._hasResource["dojox.string.Builder"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.string.Builder"] = true;
+dojo.provide("dojox.string.Builder");
+
+(function(){
+	dojox.string.Builder = function(/*String?*/str){
+		// summary:
+		//		A fast buffer for creating large strings
+		// str: The initial string to seed the buffer with
+		this.b = dojo.isIE ? [] : "";
+		if(str){ this.append(str); }
+	};
+	
+	var m = {
+	 	append: function(/*String*/s){ 
+			// summary: Append all arguments to the end of the buffer 
+			return this.appendArray(dojo._toArray(arguments)); // dojox.string.Builder
+		},
+		concat: function(/*String*/s){
+			return this.append(s);
+		},
+		appendArray: function(/*Array*/strings) {
+			this.b = String.prototype.concat.apply(this.b, strings);
+			return this;
+		},
+		clear: function(){
+			// summary: Remove all characters from the buffer
+			this._clear();
+			this.length = 0;
+			return this;
+		},
+		replace: function(oldStr,newStr){
+			// summary: Replace instances of one string with another in the buffer
+			var s = this.toString();
+			s = s.replace(oldStr,newStr);
+			this._reset(s);
+			this.length = s.length;
+			return this;
+		},
+		remove: function(start, len){
+			// summary: Remove len characters starting at index start
+			if(len == 0){ return this; }
+			var s = this.toString();
+			this.clear();
+			if(start > 0){
+				this.append(s.substring(0, start));
+			}
+			if(start+len < s.length){
+				this.append(s.substring(start+len));
+			}
+			return this;
+		},
+		insert: function(index, str){
+			// summary: Insert string str starting at index
+			var s = this.toString();
+			this.clear();
+			if(index == 0){
+				this.append(str);
+				this.append(s);
+				return this;
+			}else{
+				this.append(s.substring(0, index));
+				this.append(str);
+				this.append(s.substring(index));
+			}
+			return this;
+		},
+		toString: function(){
+			return this.b;
+		},
+		_clear: function(){
+			this.b = "";
+		},
+		_reset: function(s){
+			this.b = s;
+		}
+	}; // will hold methods for Builder
+	
+	if(dojo.isIE){
+		dojo.mixin(m, {
+			toString: function(){ 
+				// Summary: Get the buffer as a string
+				return this.b.join(""); 
+			},
+			appendArray: function(strings){
+				this.b = this.b.concat(strings);
+				return this;
+			},
+			_clear: function(){
+				this.b = [];
+			},
+			_reset: function(s){
+				this.b = [ s ];
+			}
+		});
+	}
+	
+	dojo.extend(dojox.string.Builder, m);
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/string/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/string/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/string/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,39 @@
+-------------------------------------------------------------------------------
+DojoX String Utilities
+-------------------------------------------------------------------------------
+Version 0.9
+Release date: 05/08/2007
+-------------------------------------------------------------------------------
+Project state:
+dojox.string.Builder: stable
+dojox.string.sprintf: beta
+dojox.string.tokenize: beta
+-------------------------------------------------------------------------------
+Project authors
+	Ben Lowery
+	Tom Trenka (ttrenka@xxxxxxxxx)
+	Neil Roberts
+-------------------------------------------------------------------------------
+Project description
+
+The DojoX String utilties project is a placeholder for miscellaneous string
+utility functions.  At the time of writing, only the Builder object has been
+added; but we anticipate other string utilities may end up living here as well.
+-------------------------------------------------------------------------------
+Dependencies:
+
+Dojo Core (package loader).
+-------------------------------------------------------------------------------
+Documentation
+
+See the Dojo Toolkit API docs (http://dojotookit.org/api), dojo.string.Builder.
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/string/*
+
+Install into the following directory structure:
+/dojox/string/
+
+...which should be at the same level as your Dojo checkout.

Added: branches/vhffs-design/vhffs-panel/js/dojox/string/sprintf.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/string/sprintf.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/string/sprintf.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,406 @@
+if(!dojo._hasResource["dojox.string.sprintf"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.string.sprintf"] = true;
+dojo.provide("dojox.string.sprintf");
+
+dojo.require("dojox.string.tokenize");
+
+dojox.string.sprintf = function(/*String*/ format, /*mixed...*/ filler){
+	for(var args = [], i = 1; i < arguments.length; i++){
+		args.push(arguments[i]);
+	}
+	var formatter = new dojox.string.sprintf.Formatter(format);
+	return formatter.format.apply(formatter, args);
+}
+
+dojox.string.sprintf.Formatter = function(/*String*/ format){
+	var tokens = [];
+	this._mapped = false;
+	this._format = format;
+	this._tokens = dojox.string.tokenize(format, this._re, this._parseDelim, this);
+}
+dojo.extend(dojox.string.sprintf.Formatter, {
+	_re: /\%(?:\(([\w_]+)\)|([1-9]\d*)\$)?([0 +\-\#]*)(\*|\d+)?(\.)?(\*|\d+)?[hlL]?([\%scdeEfFgGiouxX])/g,
+	_parseDelim: function(mapping, intmapping, flags, minWidth, period, precision, specifier){
+		if(mapping){
+			this._mapped = true;
+		}
+		return {
+			mapping: mapping,
+			intmapping: intmapping,
+			flags: flags,
+			_minWidth: minWidth, // May be dependent on parameters
+			period: period,
+			_precision: precision, // May be dependent on parameters
+			specifier: specifier
+		};
+	},
+	_specifiers: {
+		b: {
+			base: 2,
+			isInt: true
+		},
+		o: {
+			base: 8,
+			isInt: true
+		},
+		x: {
+			base: 16,
+			isInt: true
+		},
+		X: {
+			extend: ["x"],
+			toUpper: true
+		},
+		d: {
+			base: 10,
+			isInt: true
+		},
+		i: {
+			extend: ["d"]
+		},
+		u: {
+			extend: ["d"],
+			isUnsigned: true
+		},
+		c: {
+			setArg: function(token){
+				if(!isNaN(token.arg)){
+					var num = parseInt(token.arg);
+					if(num < 0 || num > 127){
+						throw new Error("invalid character code passed to %c in sprintf");
+					}
+					token.arg = isNaN(num) ? "" + num : String.fromCharCode(num);
+				}
+			}
+		},
+		s: {
+			setMaxWidth: function(token){
+				token.maxWidth = (token.period == ".") ? token.precision : -1;
+			}
+		},
+		e: {
+			isDouble: true,
+			doubleNotation: "e"
+		},
+		E: {
+			extend: ["e"],
+			toUpper: true
+		},
+		f: {
+			isDouble: true,
+			doubleNotation: "f"
+		},
+		F: {
+			extend: ["f"]
+		},
+		g: {
+			isDouble: true,
+			doubleNotation: "g"
+		},
+		G: {
+			extend: ["g"],
+			toUpper: true
+		}
+	},
+	format: function(/*mixed...*/ filler){
+		if(this._mapped && typeof filler != "object"){
+			throw new Error("format requires a mapping");
+		}
+
+		var str = "";
+		var position = 0;
+		for(var i = 0, token; i < this._tokens.length; i++){
+			token = this._tokens[i];
+			if(typeof token == "string"){
+				str += token;
+			}else{
+				if(this._mapped){
+					if(typeof filler[token.mapping] == "undefined"){
+						throw new Error("missing key " + token.mapping);
+					}
+					token.arg = filler[token.mapping];
+				}else{
+					if(token.intmapping){
+						var position = parseInt(token.intmapping) - 1;
+					}
+					if(position >= arguments.length){
+						throw new Error("got " + arguments.length + " printf arguments, insufficient for '" + this._format + "'");
+					}
+					token.arg = arguments[position++];
+				}
+
+				if(!token.compiled){
+					token.compiled = true;
+					token.sign = "";
+					token.zeroPad = false;
+					token.rightJustify = false;
+					token.alternative = false;
+
+					var flags = {};
+					for(var fi = token.flags.length; fi--;){
+						var flag = token.flags.charAt(fi);
+						flags[flag] = true;
+						switch(flag){
+							case " ":
+								token.sign = " ";
+								break;
+							case "+":
+								token.sign = "+";
+								break;
+							case "0":
+								token.zeroPad = (flags["-"]) ? false : true;
+								break;
+							case "-":
+								token.rightJustify = true;
+								token.zeroPad = false;
+								break;
+							case "\#":
+								token.alternative = true;
+								break;
+							default:
+								throw Error("bad formatting flag '" + token.flags.charAt(fi) + "'");
+						}
+					}
+
+					token.minWidth = (token._minWidth) ? parseInt(token._minWidth) : 0;
+					token.maxWidth = -1;
+					token.toUpper = false;
+					token.isUnsigned = false;
+					token.isInt = false;
+					token.isDouble = false;
+					token.precision = 1;
+					if(token.period == '.'){
+						if(token._precision){
+							token.precision = parseInt(token._precision);
+						}else{
+							token.precision = 0;
+						}
+					}
+
+					var mixins = this._specifiers[token.specifier];
+					if(typeof mixins == "undefined"){
+						throw new Error("unexpected specifier '" + token.specifier + "'");
+					}
+					if(mixins.extend){
+						dojo.mixin(mixins, this._specifiers[mixins.extend]);
+						delete mixins.extend;
+					}
+					dojo.mixin(token, mixins);
+				}
+
+				if(typeof token.setArg == "function"){
+					token.setArg(token);
+				}
+
+				if(typeof token.setMaxWidth == "function"){
+					token.setMaxWidth(token);
+				}
+
+				if(token._minWidth == "*"){
+					if(this._mapped){
+						throw new Error("* width not supported in mapped formats");
+					}
+					token.minWidth = parseInt(arguments[position++]);
+					if(isNaN(token.minWidth)){
+						throw new Error("the argument for * width at position " + position + " is not a number in " + this._format);
+					}
+					// negative width means rightJustify
+					if (token.minWidth < 0) {
+						token.rightJustify = true;
+						token.minWidth = -token.minWidth;
+					}
+				}
+
+				if(token._precision == "*" && token.period == "."){
+					if(this._mapped){
+						throw new Error("* precision not supported in mapped formats");
+					}
+					token.precision = parseInt(arguments[position++]);
+					if(isNaN(token.precision)){
+						throw Error("the argument for * precision at position " + position + " is not a number in " + this._format);
+					}
+					// negative precision means unspecified
+					if (token.precision < 0) {
+						token.precision = 1;
+						token.period = '';
+					}
+				}
+
+				if(token.isInt){
+					// a specified precision means no zero padding
+					if(token.period == '.'){
+						token.zeroPad = false;
+					}
+					this.formatInt(token);
+				}else if(token.isDouble){
+					if(token.period != '.'){
+						token.precision = 6;
+					}
+					this.formatDouble(token); 
+				}
+				this.fitField(token);
+
+				str += "" + token.arg;
+			}
+		}
+
+		return str;
+	},
+	_zeros10: '0000000000',
+	_spaces10: '          ',
+	formatInt: function(token) {
+		var i = parseInt(token.arg);
+		if(!isFinite(i)){ // isNaN(f) || f == Number.POSITIVE_INFINITY || f == Number.NEGATIVE_INFINITY)
+			// allow this only if arg is number
+			if(typeof token.arg != "number"){
+				throw new Error("format argument '" + token.arg + "' not an integer; parseInt returned " + i);
+			}
+			//return '' + i;
+			i = 0;
+		}
+
+		// if not base 10, make negatives be positive
+		// otherwise, (-10).toString(16) is '-a' instead of 'fffffff6'
+		if(i < 0 && (token.isUnsigned || token.base != 10)){
+			i = 0xffffffff + i + 1;
+		} 
+
+		if(i < 0){
+			token.arg = (- i).toString(token.base);
+			this.zeroPad(token);
+			token.arg = "-" + token.arg;
+		}else{
+			token.arg = i.toString(token.base);
+			// need to make sure that argument 0 with precision==0 is formatted as ''
+			if(!i && !token.precision){
+				token.arg = "";
+			}else{
+				this.zeroPad(token);
+			}
+			if(token.sign){
+				token.arg = token.sign + token.arg;
+			}
+		}
+		if(token.base == 16){
+			if(token.alternative){
+				token.arg = '0x' + token.arg;
+			}
+			toke.art = token.toUpper ? token.arg.toUpperCase() : token.arg.toLowerCase();
+		}
+		if(token.base == 8){
+			if(token.alternative && token.arg.charAt(0) != '0'){
+				token.arg = '0' + token.arg;
+			}
+		}
+	},
+	formatDouble: function(token) {
+		var f = parseFloat(token.arg);
+		if(!isFinite(f)){ // isNaN(f) || f == Number.POSITIVE_INFINITY || f == Number.NEGATIVE_INFINITY)
+			// allow this only if arg is number
+			if(typeof token.arg != "number"){
+				throw new Error("format argument '" + token.arg + "' not a float; parseFloat returned " + f);
+			}
+			// C99 says that for 'f':
+			//   infinity -> '[-]inf' or '[-]infinity' ('[-]INF' or '[-]INFINITY' for 'F')
+			//   NaN -> a string  starting with 'nan' ('NAN' for 'F')
+			// this is not commonly implemented though.
+			//return '' + f;
+			f = 0;
+		}
+
+		switch(token.doubleNotation) {
+			case 'e': {
+				token.arg = f.toExponential(token.precision); 
+				break;
+			}
+			case 'f': {
+				token.arg = f.toFixed(token.precision); 
+				break;
+			}
+			case 'g': {
+				// C says use 'e' notation if exponent is < -4 or is >= prec
+				// ECMAScript for toPrecision says use exponential notation if exponent is >= prec,
+				// though step 17 of toPrecision indicates a test for < -6 to force exponential.
+				if(Math.abs(f) < 0.0001){
+					//print("forcing exponential notation for f=" + f);
+					token.arg = f.toExponential(token.precision > 0 ? token.precision - 1 : token.precision);
+				}else{
+					token.arg = f.toPrecision(token.precision); 
+				}
+
+				// In C, unlike 'f', 'gG' removes trailing 0s from fractional part, unless alternative format flag ("#").
+				// But ECMAScript formats toPrecision as 0.00100000. So remove trailing 0s.
+				if(!token.alternative){ 
+					//print("replacing trailing 0 in '" + s + "'");
+					token.arg = token.arg.replace(/(\..*[^0])0*/, "$1");
+					// if fractional part is entirely 0, remove it and decimal point
+					token.arg = token.arg.replace(/\.0*e/, 'e').replace(/\.0$/,'');
+				}
+				break;
+			}
+			default: throw new Error("unexpected double notation '" + token.doubleNotation + "'");
+		}
+
+		// C says that exponent must have at least two digits.
+		// But ECMAScript does not; toExponential results in things like "1.000000e-8" and "1.000000e+8".
+		// Note that s.replace(/e([\+\-])(\d)/, "e$10$2") won't work because of the "$10" instead of "$1".
+		// And replace(re, func) isn't supported on IE50 or Safari1.
+		token.arg = token.arg.replace(/e\+(\d)$/, "e+0$1").replace(/e\-(\d)$/, "e-0$1");
+
+		// Ensure a '0' before the period.
+		// Opera implements (0.001).toString() as '0.001', but (0.001).toFixed(1) is '.001'
+		if(dojo.isOpera){
+			token.arg = token.arg.replace(/^\./, '0.');
+		}
+
+		// if alt, ensure a decimal point
+		if(token.alternative){
+			token.arg = token.arg.replace(/^(\d+)$/,"$1.");
+			token.arg = token.arg.replace(/^(\d+)e/,"$1.e");
+		}
+
+		if(f >= 0 && token.sign){
+			token.arg = token.sign + token.arg;
+		}
+
+		token.arg = token.toUpper ? token.arg.toUpperCase() : token.arg.toLowerCase();
+	},
+	zeroPad: function(token, /*Int*/ length) {
+		length = (arguments.length == 2) ? length : token.precision;
+		if(typeof token.arg != "string"){
+			token.arg = "" + token.arg;
+		}
+
+		var tenless = length - 10;
+		while(token.arg.length < tenless){
+			token.arg = (token.rightJustify) ? token.arg + this._zeros10 : this._zeros10 + token.arg;
+		}
+		var pad = length - token.arg.length;
+		token.arg = (token.rightJustify) ? token.arg + this._zeros10.substring(0, pad) : this._zeros10.substring(0, pad) + token.arg;
+	},
+	fitField: function(token) {
+		if(token.maxWidth >= 0 && token.arg.length > token.maxWidth){
+			return token.arg.substring(0, token.maxWidth);
+		}
+		if(token.zeroPad){
+			this.zeroPad(token, token.minWidth);
+			return;
+		}
+		this.spacePad(token);
+	},
+	spacePad: function(token, /*Int*/ length) {
+		length = (arguments.length == 2) ? length : token.minWidth;
+		if(typeof token.arg != 'string'){
+			token.arg = '' + token.arg;
+		}
+
+		var tenless = length - 10;
+		while(token.arg.length < tenless){
+			token.arg = (token.rightJustify) ? token.arg + this._spaces10 : this._spaces10 + token.arg;
+		}
+		var pad = length - token.arg.length;
+		token.arg = (token.rightJustify) ? token.arg + this._spaces10.substring(0, pad) : this._spaces10.substring(0, pad) + token.arg;
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/string/tokenize.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/string/tokenize.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/string/tokenize.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,42 @@
+if(!dojo._hasResource["dojox.string.tokenize"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.string.tokenize"] = true;
+dojo.provide("dojox.string.tokenize");
+
+dojox.string.tokenize = function(/*String*/ str, /*RegExp*/ re, /*Function?*/ parseDelim, /*Object?*/ instance){
+	// summary:
+	//		Split a string by a regular expression with the ability to capture the delimeters
+	// parseDelim:
+	//		Each group (excluding the 0 group) is passed as a parameter. If the function returns
+	//		a value, it's added to the list of tokens.
+	// instance:
+	//		Used as the "this" instance when calling parseDelim
+	var tokens = [];
+	var match, content, lastIndex = 0;
+	while(match = re.exec(str)){
+		content = str.slice(lastIndex, re.lastIndex - match[0].length);
+		if(content.length){
+			tokens.push(content);
+		}
+		if(parseDelim){
+			if(dojo.isOpera){
+				var copy = match.slice(0);
+				while(copy.length < match.length){
+					copy.push(null);
+				}
+				match = copy;
+			}
+			var parsed = parseDelim.apply(instance, match.slice(1).concat(tokens.length));
+			if(typeof parsed != "undefined"){
+				tokens.push(parsed);
+			}
+		}
+		lastIndex = re.lastIndex;
+	}
+	content = str.slice(lastIndex);
+	if(content.length){
+		tokens.push(content);
+	}
+	return tokens;
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/timing/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/timing/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/timing/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,58 @@
+-------------------------------------------------------------------------------
+DojoX Timing
+-------------------------------------------------------------------------------
+Version 0.1.0
+Release date: 08/08/2007
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits
+	Tom Trenka (ttrenka AT gmail.com): original Timer, Streamer, Thread and ThreadPool
+	Wolfram Kriesing (http://wolfram.kriesing.de/blog/): Sequence
+	Jonathan Bond-Caron (jbondc AT gmail.com): port of Timer and Streamer
+	Pete Higgins (phiggins AT gmail.com): port of Sequence
+-------------------------------------------------------------------------------
+Project description
+
+DojoX Timing is a project that deals with any kind of advanced use of timing
+constructs.  The central object, dojox.timing.Timer (included by default), is
+a simple object that fires a callback on each tick of the timer, as well as 
+when starting or stopping it.  The interval of each tick is settable, but the
+default is 1 second--useful for driving something such as a clock.
+
+dojox.timing.Streamer is an object designed to facilitate streaming/buffer-type
+scenarios; it takes an input and an output function, will execute the output
+function onTick, and run the input function when the internal buffer gets 
+beneath a certain threshold of items.  This can be useful for something timed--
+such as updating a data plot at every N interval, and getting new data from
+a source when there's less than X data points in the internal buffer (think
+real-time data updating).
+
+dojox.timing.Sequencer is an object, similar to Streamer, that will allow you
+to set up a set of functions to be executed in a specific order, at specific
+intervals.
+
+The DojoX Timing ThreadPool is a port from the original implementation in the
+f(m) library.  It allows a user to feed a set of callback functions (wrapped
+in a Thread constructor) to a pool for background processing.
+-------------------------------------------------------------------------------
+Dependencies:
+
+DojoX Timing only relies on the Dojo Base.
+-------------------------------------------------------------------------------
+Documentation
+
+TBD.
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/timing.js
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/timing/*
+
+Install into the following directory structure:
+/dojox/timing.js
+/dojox/timing/
+
+...which should be at the same level as your Dojo checkout.

Added: branches/vhffs-design/vhffs-panel/js/dojox/timing/Sequence.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/timing/Sequence.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/timing/Sequence.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,145 @@
+if(!dojo._hasResource["dojox.timing.Sequence"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.timing.Sequence"] = true;
+dojo.provide("dojox.timing.Sequence");
+dojo.experimental("dojox.timing.Sequence"); // in case it gets moved/renamed somewhere soon
+
+dojo.declare("dojox.timing.Sequence",null,{
+	// summary: 
+	//	This class provides functionality to really sequentialize 
+	//	function calls. You need to provide a list of functions and 
+	//	some parameters for each (like: pauseBefore) and they will
+	//	be run one after another. This can be very useful for slideshows
+	//	or alike things.
+	//
+	// description: 
+	//	This array will contain the sequence defines resolved, so that
+	// 	ie. repeat:10 will result in 10 elements in the sequence, so 
+	// 	the repeat handling is easier and we don't need to handle that
+	// 	many extra cases. Also the doneFunction, if given is added at the
+	// 	end of the resolved-sequences.
+
+	// _defsResolved: Array
+	// 	The resolved sequence, for easier handling.
+	_defsResolved: [],
+
+	// This is the time to wait before goOn() calls _go(), which 
+	// mostly results from a pauseAfter for a function that returned
+	// false and is later continued by the external goOn() call.
+	// The time to wait needs to be waited in goOn() where the
+	// sequence is continued.
+
+	// _goOnPause: Integer
+	//	The pause to wait before really going on.
+	_goOnPause: 0,
+
+	_running: false,
+	
+	go: function(/* Array */defs, /* function|Array? */doneFunction){
+		// summary:
+		//
+		// defs: Array
+		//	the sequence of actions
+		// doneFunction: Function|Array?
+		//	The function to call when done
+		this._running = true;
+		var self = this;	
+		dojo.forEach(defs, function(cur){
+			if(cur.repeat > 1){
+				var repeat = cur.repeat;
+				for(var j=0; j<repeat ;j++){
+					cur.repeat = 1;
+					self._defsResolved.push(cur);
+				}
+			}else{
+				self._defsResolved.push(cur);				
+			}
+		});
+		var last = defs[defs.length-1];
+		if (doneFunction) {
+			self._defsResolved.push({func: doneFunction});
+		}
+		// stop the sequence, this actually just sets this._running to false
+		self._defsResolved.push({func: [this.stop, this]});
+		this._curId = 0;
+		this._go();
+	},
+
+	_go: function(){
+		// summary: Execute one task of this._defsResolved.
+		//
+		// if _running was set to false stop the sequence, this is the
+		// case when i.e. stop() was called.
+		if(!this._running){
+			return;
+		}
+		var cur = this._defsResolved[this._curId];
+		this._curId += 1;
+		// create the function to call, the func property might be an array, which means
+		// [function, context, parameter1, parameter2, ...]
+		function resolveAndCallFunc(func) {
+			var ret = null;
+			if(dojo.isArray(func)){
+				// Two elements might only be given when the function+context
+				// is given, this is nice for using this, ie: [this.func, this]
+				if(func.length>2){
+					ret = func[0].apply(func[1], func.slice(2));
+				}else{
+					ret = func[0].apply(func[1]);
+				}
+			}else{
+				ret = func();
+			}
+			return ret;
+		}
+
+		if(this._curId >= this._defsResolved.length){
+			resolveAndCallFunc(cur.func); // call the last function, since it is the doneFunction we dont need to handle pause stuff
+			// don't go on and call this._go() again, we are done
+			return;
+		}
+		var self = this;
+		if(cur.pauseAfter){
+			if(resolveAndCallFunc(cur.func)!==false){
+				window.setTimeout(function() {self._go()}, cur.pauseAfter);
+			}else{
+				this._goOnPause = cur.pauseAfter;
+			}
+		}else if(cur.pauseBefore){
+			var x = function(){
+				if(resolveAndCallFunc(cur.func)!==false){
+					self._go()
+				}
+			};
+			window.setTimeout(x, cur.pauseBefore);
+		}else{
+			if(resolveAndCallFunc(cur.func)!==false){
+				this._go();
+			}
+		}
+	},
+
+	goOn: function(){
+		// summary: This method just provides a hook from the outside, so that
+		// an interrupted sequence can be continued.
+		if(this._goOnPause){
+			var self = this;
+			setTimeout(function(){ self._go() }, this._goOnPause);
+			this._goOnPause = 0; // reset it, so if the next one doesnt set it we dont use the old pause
+		}else{ this._go(); }
+	},
+	
+	stop: function(){
+		// summary:  Stop the currently running sequence.
+		// description: 
+		//	This can only interrupt the sequence not the last function that
+		//	had been started. If the last function was i.e. a slideshow
+		//	that is handled inside a function that you have given as
+		//	one sequence item it cant be stopped, since it is not controlled
+		//	by this object here. In this case it would be smarter to 
+		//	run the slideshow using a sequence object so you can also stop 
+		//	it using this method.
+		this._running = false;
+	}
+}); 
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/timing/Streamer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/timing/Streamer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/timing/Streamer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,94 @@
+if(!dojo._hasResource["dojox.timing.Streamer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.timing.Streamer"] = true;
+dojo.provide("dojox.timing.Streamer");
+
+dojo.require("dojox.timing._base");
+
+dojox.timing.Streamer = function(
+	/* function */input, 
+	/* function */output, 
+	/* int */interval, 
+	/* int */minimum,
+	/* array */initialData
+){
+	//	summary
+	//	Streamer will take an input function that pushes N datapoints into a
+	//		queue, and will pass the next point in that queue out to an
+	//		output function at the passed interval; this way you can emulate
+	//		a constant buffered stream of data.
+	//	input: the function executed when the internal queue reaches minimumSize
+	//	output: the function executed on internal tick
+	//	interval: the interval in ms at which the output function is fired.
+	//	minimum: the minimum number of elements in the internal queue.
+
+	var self = this;
+	var queue = [];
+
+	//	public properties
+	this.interval = interval || 1000;
+	this.minimumSize = minimum || 10;	//	latency usually == interval * minimumSize
+	this.inputFunction = input || function(q){ };
+	this.outputFunction = output || function(point){ };
+
+	//	more setup
+	var timer = new dojox.timing.Timer(this.interval);
+	var tick = function(){
+		self.onTick(self);
+
+		if(queue.length < self.minimumSize){
+			self.inputFunction(queue);
+		}
+
+		var obj = queue.shift();
+		while(typeof(obj) == "undefined" && queue.length > 0){
+			obj = queue.shift();
+		}
+		
+		//	check to see if the input function needs to be fired
+		//	stop before firing the output function
+		//	TODO: relegate this to the output function?
+		if(typeof(obj) == "undefined"){
+			self.stop();
+			return;
+		}
+
+		//	call the output function.
+		self.outputFunction(obj);
+	};
+
+	this.setInterval = function(/* int */ms){
+		//	summary
+		//	sets the interval in milliseconds of the internal timer
+		this.interval = ms;
+		timer.setInterval(ms);
+	};
+
+	this.onTick = function(/* dojox.timing.Streamer */obj){ };
+	// wrap the timer functions so that we can connect to them if needed.
+	this.start = function(){
+		//	summary
+		//	starts the Streamer
+		if(typeof(this.inputFunction) == "function" && typeof(this.outputFunction) == "function"){
+			timer.start();
+			return;
+		}
+		throw new Error("You cannot start a Streamer without an input and an output function.");
+	};
+	this.onStart = function(){ };
+	this.stop = function(){
+		//	summary
+		//	stops the Streamer
+		timer.stop();
+	};
+	this.onStop = function(){ };
+
+	//	finish initialization
+	timer.onTick = this.tick;
+	timer.onStart = this.onStart;
+	timer.onStop = this.onStop;
+	if(initialData){
+		queue.concat(initialData);
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/timing/ThreadPool.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/timing/ThreadPool.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/timing/ThreadPool.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,157 @@
+if(!dojo._hasResource["dojox.timing.ThreadPool"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.timing.ThreadPool"] = true;
+dojo.provide("dojox.timing.ThreadPool");
+dojo.require("dojox.timing");
+
+dojo.experimental("dojox.timing.ThreadPool");
+
+//	dojox.timing.Timer is included as part of _base
+/********************************************************************
+	This is a port of the original System.Threading.ThreadPool from 
+	the f(m) class library.
+	
+	Donated to the Dojo toolkit by the author :)
+*********************************************************************/
+(function(){
+	var t=dojox.timing;
+	t.threadStates={ 
+		UNSTARTED:"unstarted", 
+		STOPPED:"stopped", 
+		PENDING:"pending", 
+		RUNNING:"running", 
+		SUSPENDED:"suspended", 
+		WAITING:"waiting", 
+		COMPLETE:"complete",
+		ERROR:"error"
+	};
+
+	//	Before rar says a word, we actually *use* these numbers for a purpose :)
+	t.threadPriorities={ 
+		LOWEST:1, 
+		BELOWNORMAL:2, 
+		NORMAL:3, 
+		ABOVENORMAL:4, 
+		HIGHEST:5 
+	};
+	
+	t.Thread=function(/* Function */fn, /* dojox.timing.threadPriorities? */priority){
+		var self=this;
+		this.state=t.threadStates.UNSTARTED;
+		this.priority=priority||t.threadPriorities.NORMAL;
+		this.lastError=null;
+		this.func=fn;	//	for lookup purposes.
+		this.invoke=function(){
+			self.state=t.threadStates.RUNNING;
+			try{
+				fn(this);
+				self.state=t.threadStates.COMPLETE;
+			}catch(e){
+				self.lastError=e;
+				self.state=t.threadStates.ERROR;
+			}
+		};
+	};
+
+	//	TODO: allow for changing of maxThreads and tick interval
+	t.ThreadPool=new (function(/* Number */mxthrs, /* Number */intvl){
+		var self=this;
+		var maxThreads=mxthrs;
+		var availableThreads=maxThreads;
+		var interval=intvl;
+		var fireInterval=Math.floor((interval/2)/maxThreads);
+		var queue=[];
+		var timers=new Array(maxThreads+1);
+		var timer=new dojox.timing.Timer();
+		var invoke=function(){
+			var tracker=timers[0]={};
+			for(var i=0; i<timers.length; i++){
+				window.clearTimeout(timers[i]);
+				var thread=queue.shift();
+				if(typeof(thread)=="undefined"){ break; }
+				tracker["thread-"+i]=thread;
+				timers[i]=window.setTimeout(thread.invoke,(fireInterval*i));
+			}
+			availableThreads=maxThreads-(i-1);
+		};
+
+		//	public methods
+		this.getMaxThreads=function(){ return maxThreads; };
+		this.getAvailableThreads=function(){ return availableThreads; };
+		this.getTickInterval=function(){ return interval; };
+		this.queueUserWorkItem=function(/* Function || dojox.timing.Thread */fn){
+			var item=fn;
+			if(item instanceof Function){
+				item=new t.Thread(item);
+			}
+			var idx=queue.length;
+			for(var i=0; i<queue.length; i++){
+				if(queue[i].priority<item.priority){
+					idx=i;
+					break;
+				}
+			}
+			if(idx<queue.length){
+				queue.splice(idx, 0, item);
+			} else {
+				queue.push(item);
+			}
+			return true;
+		};
+		this.removeQueuedUserWorkItem=function(/* Function || dojox.timing.Thread */item){
+			if(item instanceof Function){
+				var idx=-1;
+				for(var i=0; i<queue.length; i++){
+					if(queue[i].func==item){
+						idx=i;
+						break;
+					}
+				}
+				if(idx>-1){
+					queue.splice(idx,1);
+					return true;
+				}
+				return false;
+			}
+
+			var idx=-1;
+			for(var i=0; i<queue.length; i++){
+				if(queue[i]==item){
+					idx=i;
+					break;
+				}
+			}
+			if(idx>-1){
+				queue.splice(idx,1);
+				return true;
+			}
+			return false;
+		};
+		this.start=function(){ timer.start(); };
+		this.stop=function(){ timer.stop(); };
+		this.abort=function(){
+			this.stop();
+			for(var i=1; i<timers.length; i++){
+				if(timers[i]){
+					window.clearTimeout(timers[i]);
+				}
+			}
+			for(var thread in timers[0]){
+				this.queueUserWorkItem(thread);
+			}
+			timers[0]={};
+		};
+		this.reset=function(){
+			this.abort();
+			queue=[];
+		};
+		this.sleep=function(/* Number */nSleep){
+			timer.stop();
+			window.setTimeout(timer.start, nSleep);
+		};
+
+		//	dedicate the timer to us.
+		timer.onTick=self.invoke;
+	})(16, 5000);
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/timing/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/timing/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/timing/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,58 @@
+if(!dojo._hasResource["dojox.timing._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.timing._base"] = true;
+dojo.provide("dojox.timing._base");
+dojo.experimental("dojox.timing"); 
+
+dojox.timing.Timer = function(/*int*/ interval){
+	// summary: Timer object executes an "onTick()" method repeatedly at a specified interval. 
+	//			repeatedly at a given interval.
+	// interval: Interval between function calls, in milliseconds.
+	this.timer = null;
+	this.isRunning = false;
+	this.interval = interval;
+
+	this.onStart = null;
+	this.onStop = null;
+};
+
+dojo.extend(dojox.timing.Timer, {
+	onTick : function(){
+		// summary: Method called every time the interval passes.  Override to do something useful.
+	},
+		
+	setInterval : function(interval){
+		// summary: Reset the interval of a timer, whether running or not.
+		// interval: New interval, in milliseconds.
+		if (this.isRunning){
+			window.clearInterval(this.timer);
+		}
+		this.interval = interval;
+		if (this.isRunning){
+			this.timer = window.setInterval(dojo.hitch(this, "onTick"), this.interval);
+		}
+	},
+	
+	start : function(){
+		// summary: Start the timer ticking.
+		// description: Calls the "onStart()" handler, if defined.
+		// 				Note that the onTick() function is not called right away, 
+		//				only after first interval passes.
+		if (typeof this.onStart == "function"){
+			this.onStart();
+		}
+		this.isRunning = true;
+		this.timer = window.setInterval(dojo.hitch(this, "onTick"), this.interval);
+	},
+	
+	stop : function(){
+		// summary: Stop the timer.
+		// description: Calls the "onStop()" handler, if defined.
+		if (typeof this.onStop == "function"){
+			this.onStop();
+		}
+		this.isRunning = false;
+		window.clearInterval(this.timer);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/timing.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/timing.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/timing.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+if(!dojo._hasResource["dojox.timing"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.timing"] = true;
+dojo.provide("dojox.timing");
+dojo.require("dojox.timing._base"); 
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/uuid/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/uuid/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/uuid/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+-------------------------------------------------------------------------------
+DojoX UUID
+-------------------------------------------------------------------------------
+Version 0.9
+Release date: 06/21/2007
+-------------------------------------------------------------------------------
+Project state: stable
+-------------------------------------------------------------------------------
+Project authors
+	Brian Douglas Skinner (skinner@xxxxxxxxxxxxxxx)
+-------------------------------------------------------------------------------
+Project description
+
+DojoX UUID is the port of the original Dojo 0.4.x UUID classes.  The UUID 
+classes can be used to represent Universally Unique IDentifiers (UUIDs), as
+described in the IETF's RFC 4122: 
+  http://tools.ietf.org/html/rfc4122
+
+The DojoX UUID classes provide support for generating both "time-based" UUIDs
+and lightweight "random" UUIDs.  DojoX UUID does not yet have support for 
+generating new "name-based" UUIDs, but the dojo.uuid.Uuid class can represent
+existing name-based UUIDs, such as UUIDs read from a file or from a server. 
+
+-------------------------------------------------------------------------------
+Dependencies:
+
+DojoX UUID has no dependencies, outside of Dojo Core.
+-------------------------------------------------------------------------------
+Documentation
+
+See the API documentation for Dojo (http://dojotoolkit.org/api).
+-------------------------------------------------------------------------------
+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/
+
+...which should be at the same level as your Dojo checkout.
+-------------------------------------------------------------------------------

Added: branches/vhffs-design/vhffs-panel/js/dojox/uuid/Uuid.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/uuid/Uuid.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/uuid/Uuid.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,200 @@
+if(!dojo._hasResource["dojox.uuid.Uuid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.uuid.Uuid"] = true;
+dojo.provide("dojox.uuid.Uuid");
+dojo.require("dojox.uuid");
+
+dojox.uuid.Uuid = function(/*String?*/ input){
+	// summary: 
+	//		This is the constructor for the Uuid class.  The Uuid class offers 
+	//		methods for inspecting existing UUIDs.
+	// input: A 36-character string that conforms to the UUID spec.
+	// examples:
+	//		var uuid;
+	//		uuid = new dojox.uuid.Uuid("3b12f1df-5232-4804-897e-917bf397618a");
+	//		uuid = new dojox.uuid.Uuid(); // "00000000-0000-0000-0000-000000000000"
+	//		uuid = new dojox.uuid.Uuid(dojox.uuid.generateRandomUuid());
+	//		uuid = new dojox.uuid.Uuid(dojox.uuid.generateTimeBasedUuid());
+	//		dojox.uuid.Uuid.setGenerator(dojox.uuid.generateRandomUuid);
+	//		uuid = new dojox.uuid.Uuid();
+	//		dojox.uuid.assert(!uuid.isEqual(dojox.uuid.NIL_UUID));
+	this._uuidString = dojox.uuid.NIL_UUID;
+	if(input){
+		dojox.uuid.assert(dojo.isString(input));
+		this._uuidString = input.toLowerCase();
+		dojox.uuid.assert(this.isValid());
+	}else{
+		var ourGenerator = dojox.uuid.Uuid.getGenerator();
+		if(ourGenerator){
+			this._uuidString = ourGenerator();
+			dojox.uuid.assert(this.isValid());
+		}
+	}
+};
+
+dojox.uuid.Uuid.compare = function(/*dojox.uuid.Uuid*/ uuidOne, /*dojox.uuid.Uuid*/ uuidTwo){
+	// summary: 
+	//		Given two UUIDs to compare, this method returns 0, 1, or -1.
+	// description:
+	//		This method is designed to be used by sorting routines, like the
+	//		JavaScript built-in Array sort() method. This implementation is 
+	//		intended to match the sample implementation in IETF RFC 4122:
+	//		http://www.ietf.org/rfc/rfc4122.txt
+	// uuidOne: Any object that has toString() method that returns a 36-character string that conforms to the UUID spec.
+	// uuidTwo: Any object that has toString() method that returns a 36-character string that conforms to the UUID spec.
+
+	// examples:
+	//		var uuid;
+	//		var generator = dojox.uuid.TimeBasedGenerator;
+	//		var a = new dojox.uuid.Uuid(generator);
+	//		var b = new dojox.uuid.Uuid(generator);
+	//		var c = new dojox.uuid.Uuid(generator);
+	//		var array = new Array(a, b, c);
+	//		array.sort(dojox.uuid.Uuid.compare);
+	var uuidStringOne = uuidOne.toString();
+	var uuidStringTwo = uuidTwo.toString();
+	if (uuidStringOne > uuidStringTwo) return 1;   // integer
+	if (uuidStringOne < uuidStringTwo) return -1;  // integer
+	return 0; // integer (either 0, 1, or -1)
+};
+
+dojox.uuid.Uuid.setGenerator = function(/*Function?*/ generator){
+	// summary: 
+	//		Sets the default generator, which will be used by the 
+	//		"new dojox.uuid.Uuid()" constructor if no parameters
+	//		are passed in.
+	// generator: A UUID generator function, such as dojox.uuid.generateTimeBasedUuid.
+	dojox.uuid.assert(!generator || dojo.isFunction(generator));
+	dojox.uuid.Uuid._ourGenerator = generator;
+};
+
+dojox.uuid.Uuid.getGenerator = function(){
+	// summary: 
+	//		Returns the default generator.  See setGenerator().
+	return dojox.uuid.Uuid._ourGenerator; // generator (A UUID generator, such as dojox.uuid.TimeBasedGenerator).
+};
+
+dojox.uuid.Uuid.prototype.toString = function(){
+	// summary: 
+	//		This method returns a standard 36-character string representing 
+	//		the UUID, such as "3b12f1df-5232-4804-897e-917bf397618a".
+	return this._uuidString; // string
+};
+
+dojox.uuid.Uuid.prototype.compare = function(/*dojox.uuid.Uuid*/ otherUuid){
+	// summary: 
+	//		Compares this UUID to another UUID, and returns 0, 1, or -1.
+	// description:
+	//		This implementation is intended to match the sample implementation
+	//		in IETF RFC 4122: http://www.ietf.org/rfc/rfc4122.txt
+	// otherUuid: Any object that has toString() method that returns a 36-character string that conforms to the UUID spec.
+	return dojox.uuid.Uuid.compare(this, otherUuid); // integer (either 0, 1, or -1)
+};
+
+dojox.uuid.Uuid.prototype.isEqual = function(/*dojox.uuid.Uuid*/ otherUuid){
+	// summary: 
+	//		Returns true if this UUID is equal to the otherUuid, or false otherwise.
+	// otherUuid: Any object that has toString() method that returns a 36-character string that conforms to the UUID spec.
+	return (this.compare(otherUuid) == 0); // boolean
+};
+
+dojox.uuid.Uuid.prototype.isValid = function(){
+	// summary: 
+	//		Returns true if the UUID was initialized with a valid value.
+	return dojox.uuid.isValid(this);
+};
+
+dojox.uuid.Uuid.prototype.getVariant = function(){
+	// summary: 
+	//		Returns a variant code that indicates what type of UUID this is.
+	//		Returns one of the enumerated dojox.uuid.variant values.
+
+	// example: 
+	//		var uuid = new dojox.uuid.Uuid("3b12f1df-5232-4804-897e-917bf397618a");
+	//		var variant = uuid.getVariant();
+	//		dojox.uuid.assert(variant == dojox.uuid.variant.DCE);
+	// example: 
+	// "3b12f1df-5232-4804-897e-917bf397618a"
+	//                     ^
+	//                     |
+	//         (variant "10__" == DCE)
+	return dojox.uuid.getVariant(this);
+};
+
+dojox.uuid.Uuid.prototype.getVersion = function(){
+	// summary: 
+	//		Returns a version number that indicates what type of UUID this is.
+	//		Returns one of the enumerated dojox.uuid.version values.
+	// example: 
+	//		var uuid = new dojox.uuid.Uuid("b4308fb0-86cd-11da-a72b-0800200c9a66");
+	//		var version = uuid.getVersion();
+	//		dojox.uuid.assert(version == dojox.uuid.version.TIME_BASED);
+	// exceptions: 
+	//		Throws an Error if this is not a DCE Variant UUID.
+	if(!this._versionNumber){
+		this._versionNumber = dojox.uuid.getVersion(this);
+	}
+	return this._versionNumber; // dojox.uuid.version
+};
+
+dojox.uuid.Uuid.prototype.getNode = function(){
+	// summary: 
+	//		If this is a version 1 UUID (a time-based UUID), getNode() returns a 
+	//		12-character string with the "node" or "pseudonode" portion of the UUID, 
+	//		which is the rightmost 12 characters.  
+	// exceptions: 
+	//		Throws an Error if this is not a version 1 UUID.
+	if (!this._nodeString) {
+		this._nodeString = dojox.uuid.getNode(this);
+	}
+	return this._nodeString; // String (a 12-character string, which will look something like "917bf397618a")
+};
+
+dojox.uuid.Uuid.prototype.getTimestamp = function(/*String?*/ returnType){
+	// summary: 
+	//		If this is a version 1 UUID (a time-based UUID), this method returns
+	//		the timestamp value encoded in the UUID.  The caller can ask for the
+	//		timestamp to be returned either as a JavaScript Date object or as a 
+	//		15-character string of hex digits.
+	// returnType: Any of these five values: "string", String, "hex", "date", Date
+	// returns: 
+	//		Returns the timestamp value as a JavaScript Date object or a 15-character string of hex digits.
+	// examples: 
+	//		var uuid = new dojox.uuid.Uuid("b4308fb0-86cd-11da-a72b-0800200c9a66");
+	//		var date, string, hexString;
+	//		date   = uuid.getTimestamp();         // returns a JavaScript Date
+	//		date   = uuid.getTimestamp(Date);     // 
+	//		string = uuid.getTimestamp(String);   // "Mon, 16 Jan 2006 20:21:41 GMT"
+	//		hexString = uuid.getTimestamp("hex"); // "1da86cdb4308fb0"
+	// exceptions: 
+	//		Throws an Error if this is not a version 1 UUID.
+	if(!returnType){returnType = null};
+	switch(returnType){
+		case "string":
+		case String:
+			return this.getTimestamp(Date).toUTCString(); // String (e.g. "Mon, 16 Jan 2006 20:21:41 GMT")
+			break;
+		case "hex":
+			// Return a 15-character string of hex digits containing the 
+			// timestamp for this UUID, with the high-order bits first.
+			if (!this._timestampAsHexString) {
+				this._timestampAsHexString = dojox.uuid.getTimestamp(this, "hex");
+			}
+			return this._timestampAsHexString; // String (e.g. "1da86cdb4308fb0")
+			break;
+		case null: // no returnType was specified, so default to Date
+		case "date":
+		case Date:
+			// Return a JavaScript Date object. 
+			if (!this._timestampAsDate) {
+				this._timestampAsDate = dojox.uuid.getTimestamp(this, Date);
+			}
+			return this._timestampAsDate; // Date
+			break;
+		default:
+			// we got passed something other than a valid returnType
+			dojox.uuid.assert(false, "The getTimestamp() method dojox.uuid.Uuid was passed a bogus returnType: " + returnType);
+			break;
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/uuid/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/uuid/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/uuid/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,245 @@
+if(!dojo._hasResource["dojox.uuid._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.uuid._base"] = true;
+dojo.provide("dojox.uuid._base");
+
+// Public constants:
+dojox.uuid.NIL_UUID = "00000000-0000-0000-0000-000000000000";
+dojox.uuid.version = {
+	//	Enumeration for the different UUID versions.
+	UNKNOWN: 0,
+	TIME_BASED: 1,
+	DCE_SECURITY: 2,
+	NAME_BASED_MD5: 3,
+	RANDOM: 4,
+	NAME_BASED_SHA1: 5 };
+dojox.uuid.variant = {
+	//	Enumeration for the different UUID variants.
+	NCS: "0",
+	DCE: "10",
+	MICROSOFT: "110",
+	UNKNOWN: "111" };
+
+dojox.uuid.assert = function(/*Boolean*/ booleanValue, /*String?*/ message){
+	// summary: 
+	//		Throws an exception if the assertion fails.
+	// description: 
+	//		If the asserted condition is true, this method does nothing. If the
+	//		condition is false, we throw an error with a error message. 
+	// booleanValue: Must be true for the assertion to succeed.
+	// message: A string describing the assertion.
+	// throws: Throws an Error if 'booleanValue' is false.
+	if(!booleanValue){
+		if(!message){
+			message = "An assert statement failed.\n" +
+			"The method dojox.uuid.assert() was called with a 'false' value.\n";
+		}
+		throw new Error(message);
+	}
+};
+
+dojox.uuid.generateNilUuid = function(){
+	// summary: 
+	//		This function returns the Nil UUID: "00000000-0000-0000-0000-000000000000".
+	// description: 
+	//		The Nil UUID is described in section 4.1.7 of
+	//		RFC 4122: http://tools.ietf.org/html/rfc4122#section-4.1.7
+	// examples: 
+	//		var string = dojox.uuid.generateNilUuid();
+	return dojox.uuid.NIL_UUID;; // String
+};
+
+dojox.uuid.isValid = function(/*String*/ uuidString){
+	// summary: 
+	//		Returns true if the UUID was initialized with a valid value.
+	uuidString = uuidString.toString();
+	var valid = (dojo.isString(uuidString) &&
+		(uuidString.length == 36) &&
+		(uuidString == uuidString.toLowerCase()));
+	if(valid){
+		var arrayOfParts = uuidString.split("-");
+		valid = ((arrayOfParts.length == 5) &&
+			(arrayOfParts[0].length == 8) &&
+			(arrayOfParts[1].length == 4) &&
+			(arrayOfParts[2].length == 4) &&
+			(arrayOfParts[3].length == 4) &&
+			(arrayOfParts[4].length == 12));
+		var HEX_RADIX = 16;
+		for (var i in arrayOfParts) {
+			var part = arrayOfParts[i];
+			var integer = parseInt(part, HEX_RADIX);
+			valid = valid && isFinite(integer);
+		}
+	}
+	return valid; // boolean
+};
+
+dojox.uuid.getVariant = function(/*String*/ uuidString){
+	// summary: 
+	//		Returns a variant code that indicates what type of UUID this is.
+	//		Returns one of the enumerated dojox.uuid.variant values.
+	// example: 
+	//		var variant = dojox.uuid.getVariant("3b12f1df-5232-4804-897e-917bf397618a");
+	//		dojox.uuid.assert(variant == dojox.uuid.variant.DCE);
+	// example: 
+	// "3b12f1df-5232-4804-897e-917bf397618a"
+	//                     ^
+	//                     |
+	//         (variant "10__" == DCE)
+	if(!dojox.uuid._ourVariantLookupTable){
+		var variant = dojox.uuid.variant;
+		var lookupTable = [];
+
+		lookupTable[0x0] = variant.NCS;       // 0000
+		lookupTable[0x1] = variant.NCS;       // 0001
+		lookupTable[0x2] = variant.NCS;       // 0010
+		lookupTable[0x3] = variant.NCS;       // 0011
+
+		lookupTable[0x4] = variant.NCS;       // 0100
+		lookupTable[0x5] = variant.NCS;       // 0101
+		lookupTable[0x6] = variant.NCS;       // 0110
+		lookupTable[0x7] = variant.NCS;       // 0111
+
+		lookupTable[0x8] = variant.DCE;       // 1000
+		lookupTable[0x9] = variant.DCE;       // 1001
+		lookupTable[0xA] = variant.DCE;       // 1010
+		lookupTable[0xB] = variant.DCE;       // 1011
+
+		lookupTable[0xC] = variant.MICROSOFT; // 1100
+		lookupTable[0xD] = variant.MICROSOFT; // 1101
+		lookupTable[0xE] = variant.UNKNOWN;   // 1110
+		lookupTable[0xF] = variant.UNKNOWN;   // 1111
+		
+		dojox.uuid._ourVariantLookupTable = lookupTable;
+	}
+
+	uuidString = uuidString.toString();
+	var variantCharacter = uuidString.charAt(19);
+	var HEX_RADIX = 16;
+	var variantNumber = parseInt(variantCharacter, HEX_RADIX);
+	dojox.uuid.assert((variantNumber >= 0) && (variantNumber <= 16));
+	return dojox.uuid._ourVariantLookupTable[variantNumber]; // dojox.uuid.variant
+};
+
+dojox.uuid.getVersion = function(/*String*/ uuidString){
+	// summary: 
+	//		Returns a version number that indicates what type of UUID this is.
+	//		Returns one of the enumerated dojox.uuid.version values.
+	// example: 
+	//		var version = dojox.uuid.getVersion("b4308fb0-86cd-11da-a72b-0800200c9a66");
+	//		dojox.uuid.assert(version == dojox.uuid.version.TIME_BASED);
+	// exceptions: 
+	//		Throws an Error if this is not a DCE Variant UUID.
+	var errorMessage = "dojox.uuid.getVersion() was not passed a DCE Variant UUID.";
+	dojox.uuid.assert(dojox.uuid.getVariant(uuidString) == dojox.uuid.variant.DCE, errorMessage);
+	uuidString = uuidString.toString();
+	
+		// "b4308fb0-86cd-11da-a72b-0800200c9a66"
+		//                ^
+		//                |
+		//       (version 1 == TIME_BASED)
+	var versionCharacter = uuidString.charAt(14);
+	var HEX_RADIX = 16;
+	var versionNumber = parseInt(versionCharacter, HEX_RADIX);
+	return versionNumber; // dojox.uuid.version
+};
+
+dojox.uuid.getNode = function(/*String*/ uuidString){
+	// summary: 
+	//		If this is a version 1 UUID (a time-based UUID), getNode() returns a 
+	//		12-character string with the "node" or "pseudonode" portion of the UUID, 
+	//		which is the rightmost 12 characters. 
+	// exceptions: 
+	//		Throws an Error if this is not a version 1 UUID.
+	var errorMessage = "dojox.uuid.getNode() was not passed a TIME_BASED UUID.";
+	dojox.uuid.assert(dojox.uuid.getVersion(uuidString) == dojox.uuid.version.TIME_BASED, errorMessage);
+
+	uuidString = uuidString.toString();
+	var arrayOfStrings = uuidString.split('-');
+	var nodeString = arrayOfStrings[4];
+	return nodeString; // String (a 12-character string, which will look something like "917bf397618a")
+};
+
+dojox.uuid.getTimestamp = function(/*String*/ uuidString, /*String?*/ returnType){
+	// summary: 
+	//		If this is a version 1 UUID (a time-based UUID), this method returns
+	//		the timestamp value encoded in the UUID.  The caller can ask for the
+	//		timestamp to be returned either as a JavaScript Date object or as a 
+	//		15-character string of hex digits.
+	// returnType: Any of these five values: "string", String, "hex", "date", Date
+	// returns: 
+	//		Returns the timestamp value as a JavaScript Date object or a 15-character string of hex digits.
+	// examples: 
+	//		var uuidString = "b4308fb0-86cd-11da-a72b-0800200c9a66";
+	//		var date, string, hexString;
+	//		date   = dojox.uuid.getTimestamp(uuidString);         // returns a JavaScript Date
+	//		date   = dojox.uuid.getTimestamp(uuidString, Date);     // 
+	//		string = dojox.uuid.getTimestamp(uuidString, String);   // "Mon, 16 Jan 2006 20:21:41 GMT"
+	//		hexString = dojox.uuid.getTimestamp(uuidString, "hex"); // "1da86cdb4308fb0"
+	// exceptions: 
+	//		Throws an Error if this is not a version 1 UUID.
+	var errorMessage = "dojox.uuid.getTimestamp() was not passed a TIME_BASED UUID.";
+	dojox.uuid.assert(dojox.uuid.getVersion(uuidString) == dojox.uuid.version.TIME_BASED, errorMessage);
+	
+	uuidString = uuidString.toString();
+	if(!returnType){returnType = null};
+	switch(returnType){
+		case "string":
+		case String:
+			return dojox.uuid.getTimestamp(uuidString, Date).toUTCString(); // String (e.g. "Mon, 16 Jan 2006 20:21:41 GMT")
+			break;
+		case "hex":
+			// Return a 15-character string of hex digits containing the 
+			// timestamp for this UUID, with the high-order bits first.
+			var arrayOfStrings = uuidString.split('-');
+			var hexTimeLow = arrayOfStrings[0];
+			var hexTimeMid = arrayOfStrings[1];
+			var hexTimeHigh = arrayOfStrings[2];
+		
+			// Chop off the leading "1" character, which is the UUID 
+			// version number for time-based UUIDs.
+			hexTimeHigh = hexTimeHigh.slice(1);
+		
+			var timestampAsHexString = hexTimeHigh + hexTimeMid + hexTimeLow;
+			dojox.uuid.assert(timestampAsHexString.length == 15);
+			return timestampAsHexString; // String (e.g. "1da86cdb4308fb0")
+			break;
+		case null: // no returnType was specified, so default to Date
+		case "date":
+		case Date:
+			// Return a JavaScript Date object. 
+			var GREGORIAN_CHANGE_OFFSET_IN_HOURS = 3394248;
+			var HEX_RADIX = 16;
+		
+			var arrayOfParts = uuidString.split('-');
+			var timeLow = parseInt(arrayOfParts[0], HEX_RADIX);
+			var timeMid = parseInt(arrayOfParts[1], HEX_RADIX);
+			var timeHigh = parseInt(arrayOfParts[2], HEX_RADIX);
+			var hundredNanosecondIntervalsSince1582 = timeHigh & 0x0FFF;
+			hundredNanosecondIntervalsSince1582 <<= 16;
+			hundredNanosecondIntervalsSince1582 += timeMid;
+			// What we really want to do next is shift left 32 bits, but the 
+			// result will be too big to fit in an int, so we'll multiply by 2^32,
+			// and the result will be a floating point approximation.
+			hundredNanosecondIntervalsSince1582 *= 0x100000000;
+			hundredNanosecondIntervalsSince1582 += timeLow;
+			var millisecondsSince1582 = hundredNanosecondIntervalsSince1582 / 10000;
+		
+			// Again, this will be a floating point approximation.
+			// We can make things exact later if we need to.
+			var secondsPerHour = 60 * 60;
+			var hoursBetween1582and1970 = GREGORIAN_CHANGE_OFFSET_IN_HOURS;
+			var secondsBetween1582and1970 = hoursBetween1582and1970 * secondsPerHour;
+			var millisecondsBetween1582and1970 = secondsBetween1582and1970 * 1000;
+			var millisecondsSince1970 = millisecondsSince1582 - millisecondsBetween1582and1970;
+		
+			var timestampAsDate = new Date(millisecondsSince1970);
+			return timestampAsDate; // Date
+			break;
+		default:
+			// we got passed something other than a valid returnType
+			dojox.uuid.assert(false, "dojox.uuid.getTimestamp was not passed a valid returnType: " + returnType);
+			break;
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/uuid/generateRandomUuid.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/uuid/generateRandomUuid.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/uuid/generateRandomUuid.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,56 @@
+if(!dojo._hasResource["dojox.uuid.generateRandomUuid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.uuid.generateRandomUuid"] = true;
+dojo.provide("dojox.uuid.generateRandomUuid");
+
+dojox.uuid.generateRandomUuid = function(){
+	// summary:
+	//		This function generates random UUIDs, meaning "version 4" UUIDs.
+	// description:
+	//		A typical generated value would be something like this:
+	//		"3b12f1df-5232-4804-897e-917bf397618a"
+	//		
+	//		For more information about random UUIDs, see sections 4.4 and 
+	//		4.5 of RFC 4122: http://tools.ietf.org/html/rfc4122#section-4.4
+	//		
+	//		This generator function is designed to be small and fast,
+	//		but not necessarily good.
+	//		
+	//		Small: This generator has a small footprint. Once comments are
+	//		stripped, it's only about 25 lines of code, and it doesn't 
+	//		dojo.require() any other modules.
+	//		
+	//		Fast: This generator can generate lots of new UUIDs fairly quickly 
+	//		(at least, more quickly than the other dojo UUID generators).
+	//		
+	//		Not necessarily good: We use Math.random() as our source
+	//		of randomness, which may or may not provide much randomness. 
+	// examples: 
+	//		var string = dojox.uuid.generateRandomUuid();
+	var HEX_RADIX = 16;
+
+	function _generateRandomEightCharacterHexString(){
+		// Make random32bitNumber be a randomly generated floating point number
+		// between 0 and (4,294,967,296 - 1), inclusive.
+		var random32bitNumber = Math.floor( (Math.random() % 1) * Math.pow(2, 32) );
+		var eightCharacterHexString = random32bitNumber.toString(HEX_RADIX);
+		while(eightCharacterHexString.length < 8){
+			eightCharacterHexString = "0" + eightCharacterHexString;
+		}
+		return eightCharacterHexString; // for example: "3B12F1DF"
+	}
+
+	var hyphen = "-";
+	var versionCodeForRandomlyGeneratedUuids = "4"; // 8 == binary2hex("0100")
+	var variantCodeForDCEUuids = "8"; // 8 == binary2hex("1000")
+	var a = _generateRandomEightCharacterHexString();
+	var b = _generateRandomEightCharacterHexString();
+	b = b.substring(0, 4) + hyphen + versionCodeForRandomlyGeneratedUuids + b.substring(5, 8);
+	var c = _generateRandomEightCharacterHexString();
+	c = variantCodeForDCEUuids + c.substring(1, 4) + hyphen + c.substring(4, 8);
+	var d = _generateRandomEightCharacterHexString();
+	var returnValue = a + hyphen + b + hyphen + c + d;
+	returnValue = returnValue.toLowerCase();
+	return returnValue; // String
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/uuid/generateTimeBasedUuid.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/uuid/generateTimeBasedUuid.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/uuid/generateTimeBasedUuid.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,290 @@
+if(!dojo._hasResource["dojox.uuid.generateTimeBasedUuid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.uuid.generateTimeBasedUuid"] = true;
+dojo.provide("dojox.uuid.generateTimeBasedUuid");
+
+dojox.uuid.generateTimeBasedUuid = function(/*String?*/ node){
+	// summary: 
+	//		This function generates time-based UUIDs, meaning "version 1" UUIDs. 
+	// description: 
+	// For more info, see
+	//		http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt
+	//		http://www.infonuovo.com/dma/csdocs/sketch/instidid.htm
+	//		http://kruithof.xs4all.nl/uuid/uuidgen
+	//		http://www.opengroup.org/onlinepubs/009629399/apdxa.htm#tagcjh_20
+	//		http://jakarta.apache.org/commons/sandbox/id/apidocs/org/apache/commons/id/uuid/clock/Clock.html
+	// node:
+	//		A 12-character hex string representing either a pseudo-node or 
+	//		hardware-node (an IEEE 802.3 network node).  A hardware-node 
+	//		will be something like "017bf397618a", always with the first bit 
+	//		being 0.  A pseudo-node will be something like "f17bf397618a", 
+	//		always with the first bit being 1.
+	// examples: 
+	//		string = dojox.uuid.generateTimeBasedUuid();
+	//		string = dojox.uuid.generateTimeBasedUuid("017bf397618a");
+	//		dojox.uuid.generateTimeBasedUuid.setNode("017bf397618a");
+	//		string = dojox.uuid.generateTimeBasedUuid(); // the generated UUID has node == "017bf397618a"	
+	var uuidString = dojox.uuid.generateTimeBasedUuid._generator.generateUuidString(node);
+	return uuidString; // String
+};
+
+dojox.uuid.generateTimeBasedUuid.isValidNode = function(/*String?*/ node){
+	var HEX_RADIX = 16;
+	var integer = parseInt(node, HEX_RADIX);
+	var valid = dojo.isString(node) && node.length == 12 && isFinite(integer);
+	return valid; // Boolean
+};
+
+dojox.uuid.generateTimeBasedUuid.setNode = function(/*String?*/ node){
+	// summary: 
+	//		Sets the 'node' value that will be included in generated UUIDs.
+	// node: A 12-character hex string representing a pseudoNode or hardwareNode.
+	dojox.uuid.assert((node === null) || this.isValidNode(node));
+	this._uniformNode = node;
+};
+
+dojox.uuid.generateTimeBasedUuid.getNode = function(){
+	// summary: 
+	//		Returns the 'node' value that will be included in generated UUIDs.
+	return this._uniformNode; // String (a 12-character hex string representing a pseudoNode or hardwareNode)
+};
+
+	
+dojox.uuid.generateTimeBasedUuid._generator = new function(){
+	// Number of hours between October 15, 1582 and January 1, 1970:
+	this.GREGORIAN_CHANGE_OFFSET_IN_HOURS = 3394248;
+	
+	// Number of seconds between October 15, 1582 and January 1, 1970:
+	//   dojox.uuid.generateTimeBasedUuid.GREGORIAN_CHANGE_OFFSET_IN_SECONDS = 12219292800;	
+	
+	// --------------------------------------------------
+	// Private variables:
+	var _uuidPseudoNodeString = null;
+	var _uuidClockSeqString = null;
+	var _dateValueOfPreviousUuid = null;
+	var _nextIntraMillisecondIncrement = 0;
+	var _cachedMillisecondsBetween1582and1970 = null;
+	var _cachedHundredNanosecondIntervalsPerMillisecond = null;
+	
+	// --------------------------------------------------
+	// Private constants:
+	var HEX_RADIX = 16;
+
+	function _carry(/* array */ arrayA){
+		// summary: 
+		//		Given an array which holds a 64-bit number broken into 4 16-bit 
+		//		elements, this method carries any excess bits (greater than 16-bits) 
+		//		from each array element into the next.
+		// arrayA: An array with 4 elements, each of which is a 16-bit number.
+		arrayA[2] += arrayA[3] >>> 16;
+		arrayA[3] &= 0xFFFF;
+		arrayA[1] += arrayA[2] >>> 16;
+		arrayA[2] &= 0xFFFF;
+		arrayA[0] += arrayA[1] >>> 16;
+		arrayA[1] &= 0xFFFF;
+		dojox.uuid.assert((arrayA[0] >>> 16) === 0);
+	}
+
+	function _get64bitArrayFromFloat(/* float */ x){
+		// summary: 
+		//		Given a floating point number, this method returns an array which 
+		//		holds a 64-bit number broken into 4 16-bit elements.
+		var result = new Array(0, 0, 0, 0);
+		result[3] = x % 0x10000;
+		x -= result[3];
+		x /= 0x10000;
+		result[2] = x % 0x10000;
+		x -= result[2];
+		x /= 0x10000;
+		result[1] = x % 0x10000;
+		x -= result[1];
+		x /= 0x10000;
+		result[0] = x;
+		return result; // Array with 4 elements, each of which is a 16-bit number.
+	}
+
+	function _addTwo64bitArrays(/* array */ arrayA, /* array */ arrayB){
+		// summary: 
+		//		Takes two arrays, each of which holds a 64-bit number broken into 4
+		//		16-bit elements, and returns a new array that holds a 64-bit number
+		//		that is the sum of the two original numbers.
+		// arrayA: An array with 4 elements, each of which is a 16-bit number.
+		// arrayB: An array with 4 elements, each of which is a 16-bit number.
+		dojox.uuid.assert(dojo.isArray(arrayA));
+		dojox.uuid.assert(dojo.isArray(arrayB));
+		dojox.uuid.assert(arrayA.length == 4);
+		dojox.uuid.assert(arrayB.length == 4);
+	
+		var result = new Array(0, 0, 0, 0);
+		result[3] = arrayA[3] + arrayB[3];
+		result[2] = arrayA[2] + arrayB[2];
+		result[1] = arrayA[1] + arrayB[1];
+		result[0] = arrayA[0] + arrayB[0];
+		_carry(result);
+		return result; // Array with 4 elements, each of which is a 16-bit number.
+	}
+
+	function _multiplyTwo64bitArrays(/* array */ arrayA, /* array */ arrayB){
+		// summary: 
+		//		Takes two arrays, each of which holds a 64-bit number broken into 4
+		//		16-bit elements, and returns a new array that holds a 64-bit number
+		//		that is the product of the two original numbers.
+		// arrayA: An array with 4 elements, each of which is a 16-bit number.
+		// arrayB: An array with 4 elements, each of which is a 16-bit number.
+		dojox.uuid.assert(dojo.isArray(arrayA));
+		dojox.uuid.assert(dojo.isArray(arrayB));
+		dojox.uuid.assert(arrayA.length == 4);
+		dojox.uuid.assert(arrayB.length == 4);
+	
+		var overflow = false;
+		if(arrayA[0] * arrayB[0] !== 0){ overflow = true; }
+		if(arrayA[0] * arrayB[1] !== 0){ overflow = true; }
+		if(arrayA[0] * arrayB[2] !== 0){ overflow = true; }
+		if(arrayA[1] * arrayB[0] !== 0){ overflow = true; }
+		if(arrayA[1] * arrayB[1] !== 0){ overflow = true; }
+		if(arrayA[2] * arrayB[0] !== 0){ overflow = true; }
+		dojox.uuid.assert(!overflow);
+	
+		var result = new Array(0, 0, 0, 0);
+		result[0] += arrayA[0] * arrayB[3];
+		_carry(result);
+		result[0] += arrayA[1] * arrayB[2];
+		_carry(result);
+		result[0] += arrayA[2] * arrayB[1];
+		_carry(result);
+		result[0] += arrayA[3] * arrayB[0];
+		_carry(result);
+		result[1] += arrayA[1] * arrayB[3];
+		_carry(result);
+		result[1] += arrayA[2] * arrayB[2];
+		_carry(result);
+		result[1] += arrayA[3] * arrayB[1];
+		_carry(result);
+		result[2] += arrayA[2] * arrayB[3];
+		_carry(result);
+		result[2] += arrayA[3] * arrayB[2];
+		_carry(result);
+		result[3] += arrayA[3] * arrayB[3];
+		_carry(result);
+		return result; // Array with 4 elements, each of which is a 16-bit number.
+	}
+
+	function _padWithLeadingZeros(/* string */ string, /* int */ desiredLength){
+		// summary: 
+		//		Pads a string with leading zeros and returns the result.
+		// string: A string to add padding to.
+		// desiredLength: The number of characters the return string should have.
+
+		// examples: 
+		//		result = _padWithLeadingZeros("abc", 6);
+		//		dojox.uuid.assert(result == "000abc");
+		while(string.length < desiredLength){
+			string = "0" + string;
+		}
+		return string; // string
+	}
+
+	function _generateRandomEightCharacterHexString() {
+		// summary: 
+		//		Returns a randomly generated 8-character string of hex digits.
+
+		// FIXME: This probably isn't a very high quality random number.
+	
+		// Make random32bitNumber be a randomly generated floating point number
+		// between 0 and (4,294,967,296 - 1), inclusive.
+		var random32bitNumber = Math.floor( (Math.random() % 1) * Math.pow(2, 32) );
+	
+		var eightCharacterString = random32bitNumber.toString(HEX_RADIX);
+		while(eightCharacterString.length < 8){
+			eightCharacterString = "0" + eightCharacterString;
+		}
+		return eightCharacterString; // String (an 8-character hex string)
+	}
+	
+	this.generateUuidString = function(/*String?*/ node){
+		// summary: 
+		//		Generates a time-based UUID, meaning a version 1 UUID.  
+		// description: 
+		//		JavaScript code running in a browser doesn't have access to the 
+		//		IEEE 802.3 address of the computer, so if a node value isn't 
+		//		supplied, we generate a random pseudonode value instead.
+		// node: An optional 12-character string to use as the node in the new UUID.
+		if(node){
+			dojox.uuid.assert(dojox.uuid.generateTimeBasedUuid.isValidNode(node));
+		}else{
+			if(dojox.uuid.generateTimeBasedUuid._uniformNode){
+				node = dojox.uuid.generateTimeBasedUuid._uniformNode;
+			}else{
+				if(!_uuidPseudoNodeString){
+					var pseudoNodeIndicatorBit = 0x8000;
+					var random15bitNumber = Math.floor( (Math.random() % 1) * Math.pow(2, 15) );
+					var leftmost4HexCharacters = (pseudoNodeIndicatorBit | random15bitNumber).toString(HEX_RADIX);
+					_uuidPseudoNodeString = leftmost4HexCharacters + _generateRandomEightCharacterHexString();
+				}
+				node = _uuidPseudoNodeString;
+			}
+		}
+		if(!_uuidClockSeqString){
+			var variantCodeForDCEUuids = 0x8000; // 10--------------, i.e. uses only first two of 16 bits.
+			var random14bitNumber = Math.floor( (Math.random() % 1) * Math.pow(2, 14) );
+			_uuidClockSeqString = (variantCodeForDCEUuids | random14bitNumber).toString(HEX_RADIX);
+		}
+	
+		// Maybe we should think about trying to make the code more readable to
+		// newcomers by creating a class called "WholeNumber" that encapsulates
+		// the methods and data structures for working with these arrays that
+		// hold 4 16-bit numbers?  And then these variables below have names
+		// like "wholeSecondsPerHour" rather than "arraySecondsPerHour"?
+		var now = new Date();
+		var millisecondsSince1970 = now.valueOf(); // milliseconds since midnight 01 January, 1970 UTC.
+		var nowArray = _get64bitArrayFromFloat(millisecondsSince1970);
+		if(!_cachedMillisecondsBetween1582and1970){
+			var arraySecondsPerHour = _get64bitArrayFromFloat(60 * 60);
+			var arrayHoursBetween1582and1970 = _get64bitArrayFromFloat(dojox.uuid.generateTimeBasedUuid._generator.GREGORIAN_CHANGE_OFFSET_IN_HOURS);
+			var arraySecondsBetween1582and1970 = _multiplyTwo64bitArrays(arrayHoursBetween1582and1970, arraySecondsPerHour);
+			var arrayMillisecondsPerSecond = _get64bitArrayFromFloat(1000);
+			_cachedMillisecondsBetween1582and1970 = _multiplyTwo64bitArrays(arraySecondsBetween1582and1970, arrayMillisecondsPerSecond);
+			_cachedHundredNanosecondIntervalsPerMillisecond = _get64bitArrayFromFloat(10000);
+		}
+		var arrayMillisecondsSince1970 = nowArray;
+		var arrayMillisecondsSince1582 = _addTwo64bitArrays(_cachedMillisecondsBetween1582and1970, arrayMillisecondsSince1970);
+		var arrayHundredNanosecondIntervalsSince1582 = _multiplyTwo64bitArrays(arrayMillisecondsSince1582, _cachedHundredNanosecondIntervalsPerMillisecond);
+	
+		if(now.valueOf() == _dateValueOfPreviousUuid){
+			arrayHundredNanosecondIntervalsSince1582[3] += _nextIntraMillisecondIncrement;
+			_carry(arrayHundredNanosecondIntervalsSince1582);
+			_nextIntraMillisecondIncrement += 1;
+			if (_nextIntraMillisecondIncrement == 10000) {
+				// If we've gotten to here, it means we've already generated 10,000
+				// UUIDs in this single millisecond, which is the most that the UUID
+				// timestamp field allows for.  So now we'll just sit here and wait
+				// for a fraction of a millisecond, so as to ensure that the next
+				// time this method is called there will be a different millisecond
+				// value in the timestamp field.
+				while (now.valueOf() == _dateValueOfPreviousUuid) {
+					now = new Date();
+				}
+			}
+		}else{
+			_dateValueOfPreviousUuid = now.valueOf();
+			_nextIntraMillisecondIncrement = 1;
+		}
+	
+		var hexTimeLowLeftHalf  = arrayHundredNanosecondIntervalsSince1582[2].toString(HEX_RADIX);
+		var hexTimeLowRightHalf = arrayHundredNanosecondIntervalsSince1582[3].toString(HEX_RADIX);
+		var hexTimeLow = _padWithLeadingZeros(hexTimeLowLeftHalf, 4) + _padWithLeadingZeros(hexTimeLowRightHalf, 4);
+		var hexTimeMid = arrayHundredNanosecondIntervalsSince1582[1].toString(HEX_RADIX);
+		hexTimeMid = _padWithLeadingZeros(hexTimeMid, 4);
+		var hexTimeHigh = arrayHundredNanosecondIntervalsSince1582[0].toString(HEX_RADIX);
+		hexTimeHigh = _padWithLeadingZeros(hexTimeHigh, 3);
+		var hyphen = "-";
+		var versionCodeForTimeBasedUuids = "1"; // binary2hex("0001")
+		var resultUuid = hexTimeLow + hyphen + hexTimeMid + hyphen +
+					versionCodeForTimeBasedUuids + hexTimeHigh + hyphen +
+					_uuidClockSeqString + hyphen + node;
+		resultUuid = resultUuid.toLowerCase();
+		return resultUuid; // String (a 36 character string, which will look something like "b4308fb0-86cd-11da-a72b-0800200c9a66")
+	}
+
+}();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/uuid.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/uuid.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/uuid.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+if(!dojo._hasResource["dojox.uuid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.uuid"] = true;
+dojo.provide("dojox.uuid");
+dojo.require("dojox.uuid._base");
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+-------------------------------------------------------------------------------
+dojox.validate
+-------------------------------------------------------------------------------
+Version 0.01
+Release date: 07/12/2007
+-------------------------------------------------------------------------------
+Project state: experimental / beta
+-------------------------------------------------------------------------------
+Credits
+	port: Peter Higgins (dante)
+	contributions: Kun Xi (bookstack@xxxxxxxxx)
+-------------------------------------------------------------------------------
+Project description
+
+	Provides a set of validation functions to match
+	values against known constants for use in form
+	validation, such as email address, TLD, ipAddress,
+	country-specific phone numbers and SSN, among
+	others.. 
+
+-------------------------------------------------------------------------------
+Dependencies:
+
+	Requires dojo base and dojo.regexp.
+
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+
+http://svn.dojotoolkit.org/dojo/dojox/trunk/validate.js
+http://svn.dojotoolkit.org/dojo/dojox/trunk/validate
+
+Install into the following directory structure:
+/dojox/validate/
+
+...which should be at the same level as your Dojo checkout.

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,183 @@
+if(!dojo._hasResource["dojox.validate._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate._base"] = true;
+dojo.provide("dojox.validate._base");
+
+dojo.require("dojo.regexp");		// dojo core expressions
+dojo.require("dojo.number");		// dojo number expressions
+dojo.require("dojox.validate.regexp"); 	// additional expressions
+
+dojox.validate.isText = function(/*String*/value, /*Object?*/flags){
+	// summary:
+	//	Checks if a string has non whitespace characters. 
+	//	Parameters allow you to constrain the length.
+	//
+	// value: A string
+	// flags: {length: Number, minlength: Number, maxlength: Number}
+	//    flags.length  If set, checks if there are exactly flags.length number of characters.
+	//    flags.minlength  If set, checks if there are at least flags.minlength number of characters.
+	//    flags.maxlength  If set, checks if there are at most flags.maxlength number of characters.
+	
+	flags = (typeof flags == "object") ? flags : {};
+	
+	// test for text
+	if(/^\s*$/.test(value)){ return false; } // Boolean
+	
+	// length tests
+	if(typeof flags.length == "number" && flags.length != value.length){ return false; } // Boolean
+	if(typeof flags.minlength == "number" && flags.minlength > value.length){ return false; } // Boolean
+	if(typeof flags.maxlength == "number" && flags.maxlength < value.length){ return false; } // Boolean
+	
+	return true; // Boolean
+
+}
+
+dojox.validate._isInRangeCache = {};
+dojox.validate.isInRange = function(/*String*/value, /*Object?*/flags){
+	// summary:
+	//	Validates whether a string denoting an integer, 
+	//	real number, or monetary value is between a max and min. 
+	//
+	// value: A string
+	// flags: {max:Number, min:Number, decimal:String}
+	//    flags.max  A number, which the value must be less than or equal to for the validation to be true.
+	//    flags.min  A number, which the value must be greater than or equal to for the validation to be true.
+	//    flags.decimal  The character used for the decimal point.  Default is ".".
+	
+    // fixes ticket #2908
+    value = dojo.number.parse(value, flags);
+	if(isNaN(value)){
+		return false; // Boolean
+	}
+    
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	var max = (typeof flags.max == "number") ? flags.max : Infinity;
+	var min = (typeof flags.min == "number") ? flags.min : -Infinity;
+	var dec = (typeof flags.decimal == "string") ? flags.decimal : ".";
+	
+	var cache = dojox.validate._isInRangeCache;
+	var cacheIdx = value+"max"+max+"min"+min+"dec"+dec;
+	if(typeof cache[cacheIdx] != "undefined"){
+		return cache[cacheIdx];
+	}
+
+	if ( value < min || value > max ) { cache[cacheIdx] = false; return false; } // Boolean
+
+	cache[cacheIdx] = true; return true; // Boolean
+}
+
+dojox.validate.isNumberFormat = function(/*String*/value, /*Object?*/flags){
+	// summary:
+	//	Validates any sort of number based format
+	//
+	// description:
+	//	Use it for phone numbers, social security numbers, zip-codes, etc.
+	//	The value can be validated against one format or one of multiple formats.
+	//
+	//  Format
+	//    #        Stands for a digit, 0-9.
+	//    ?        Stands for an optional digit, 0-9 or nothing.
+	//    All other characters must appear literally in the expression.
+	//
+	//  Example   
+	//    "(###) ###-####"       ->   (510) 542-9742
+	//    "(###) ###-#### x#???" ->   (510) 542-9742 x153
+	//    "###-##-####"          ->   506-82-1089       i.e. social security number
+	//    "#####-####"           ->   98225-1649        i.e. zip code
+	//
+	// value: A string
+	// flags: {format:String}
+	//    flags.format  A string or an Array of strings for multiple formats.
+
+	var re = new RegExp("^" + dojox.regexp.numberFormat(flags) + "$", "i");
+	return re.test(value); // Boolean
+}
+
+dojox.validate.isValidLuhn = function(/*String*/value){
+	//summary: Compares value against the Luhn algorithm to verify its integrity
+	var sum, parity, curDigit;
+	if(typeof value!='string'){
+		value = String(value);
+	}
+	value = value.replace(/[- ]/g,''); //ignore dashes and whitespaces
+	parity = value.length%2;
+	sum=0;
+	for(var i=0;i<value.length;i++){
+		curDigit = parseInt(value.charAt(i));
+		if(i%2==parity){
+			curDigit*=2;
+		}
+		if(curDigit>9){
+			curDigit-=9;
+		}
+		sum+=curDigit;
+	}
+	return !(sum%10); //Boolean
+}
+
+/**
+	Procedural API Description
+
+		The main aim is to make input validation expressible in a simple format.
+		You define profiles which declare the required and optional fields and any constraints they might have.
+		The results are provided as an object that makes it easy to handle missing and invalid input.
+
+	Usage
+
+		var results = dojo.validate.check(form, profile);
+
+	Profile Object
+
+		var profile = {
+			// filters change the field value and are applied before validation.
+			trim: ["tx1", "tx2"],
+			uppercase: ["tx9"],
+			lowercase: ["tx5", "tx6", "tx7"],
+			ucfirst: ["tx10"],
+			digit: ["tx11"],
+
+			// required input fields that are blank will be reported missing.
+			// required radio button groups and drop-down lists with no selection will be reported missing.
+			// checkbox groups and selectboxes can be required to have more than one value selected.
+			// List required fields by name and use this notation to require more than one value: {checkboxgroup: 2}, {selectboxname: 3}.
+			required: ["tx7", "tx8", "pw1", "ta1", "rb1", "rb2", "cb3", "s1", {"doubledip":2}, {"tripledip":3}],
+
+			// dependant/conditional fields are required if the target field is present and not blank.
+			// At present only textbox, password, and textarea fields are supported.
+			dependencies:	{
+				cc_exp: "cc_no",	
+				cc_type: "cc_no",	
+			},
+
+			// Fields can be validated using any boolean valued function.  
+			// Use arrays to specify parameters in addition to the field value.
+			constraints: {
+				field_name1: myValidationFunction,
+				field_name2: dojo.validate.isInteger,
+				field_name3: [myValidationFunction, additional parameters],
+				field_name4: [dojo.validate.isValidDate, "YYYY.MM.DD"],
+				field_name5: [dojo.validate.isEmailAddress, false, true],
+			},
+
+			// Confirm is a sort of conditional validation.
+			// It associates each field in its property list with another field whose value should be equal.
+			// If the values are not equal, the field in the property list is reported as Invalid. Unless the target field is blank.
+			confirm: {
+				email_confirm: "email",	
+				pw2: "pw1",	
+			}
+		};
+
+	Results Object
+
+		isSuccessful(): Returns true if there were no invalid or missing fields, else it returns false.
+		hasMissing():  Returns true if the results contain any missing fields.
+		getMissing():  Returns a list of required fields that have values missing.
+		isMissing(field):  Returns true if the field is required and the value is missing.
+		hasInvalid():  Returns true if the results contain fields with invalid data.
+		getInvalid():  Returns a list of fields that have invalid values.
+		isInvalid(field):  Returns true if the field has an invalid value.
+
+*/
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/ca.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/ca.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/ca.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,44 @@
+if(!dojo._hasResource["dojox.validate.ca"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate.ca"] = true;
+dojo.provide("dojox.validate.ca");
+
+dojo.require("dojox.validate._base");
+
+dojox.validate.ca.isPhoneNumber = function(/* String */value) {
+	// summary: Validates 10 Canadian digit phone number for several common formats
+	// returns: Boolean
+        return dojox.validate.us.isPhoneNumber(value);  // same as US
+};
+
+dojox.validate.ca.isProvince = function(/* String[2] */value) {
+	// summary: Validates Canadian province abbreviations (2 chars)
+	// returns: Boolean
+	var re = new RegExp("^" + dojox.regexp.ca.province() + "$", "i");
+	return re.test(value);
+}; 
+ 
+dojox.validate.ca.isSocialInsuranceNumber = function(/* String */value) {
+	// summary: Validates Canadian 9 digit social insurance number for several common formats
+	// This routine only pattern matches and does not use the Luhn Algorithm to validate number.
+	// returns: Boolean
+        var flags = {
+                format: [
+                        "###-###-###",
+                        "### ### ###",
+                        "#########" 
+                ]
+        };
+        return dojox.validate.isNumberFormat(value, flags);
+};
+
+dojox.validate.ca.isPostalCode = function(value) {
+	// summary: Validates Canadian 6 digit postal code:
+	//	Canadian postal codes are in the format ANA NAN,
+	//	where A is a letter and N is a digit, with a space
+	//	separating the third and fourth characters.
+	// returns: Boolean
+        var re = new RegExp("^" + dojox.regexp.ca.postalCode() + "$", "i");
+        return re.test(value);
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/check.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/check.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/check.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,261 @@
+if(!dojo._hasResource["dojox.validate.check"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate.check"] = true;
+dojo.provide("dojox.validate.check");
+
+dojo.require("dojox.validate._base");
+
+dojox.validate.check = function(/*HTMLFormElement*/form, /*Object*/profile){
+	// summary: validates user input of an HTML form based on input profile
+	//
+	// description:
+	//	returns an object that contains several methods summarizing the results of the validation
+	//
+	// form: form to be validated
+	// profile: specifies how the form fields are to be validated
+	// {trim:Array, uppercase:Array, lowercase:Array, ucfirst:Array, digit:Array,
+	//	required:Array, dependencies:Object, constraints:Object, confirm:Object}
+
+	// Essentially private properties of results object
+	var missing = [];
+	var invalid = [];
+
+	// results object summarizes the validation
+	var results = {
+		isSuccessful: function() {return ( !this.hasInvalid() && !this.hasMissing() );},
+		hasMissing: function() {return ( missing.length > 0 );},
+		getMissing: function() {return missing;},
+		isMissing: function(elemname) {
+			for(var i = 0; i < missing.length; i++){
+				if(elemname == missing[i]){ return true; }
+			}
+			return false;
+		},
+		hasInvalid: function() {return ( invalid.length > 0 );},
+		getInvalid: function() {return invalid;},
+		isInvalid: function(elemname){
+			for(var i = 0; i < invalid.length; i++){
+				if(elemname == invalid[i]){ return true; }
+			}
+			return false;
+		}
+	};
+
+	var _undef = function(name,object){
+                return (typeof object[name] == "undefined");
+        };
+
+	// Filters are applied before fields are validated.
+	// Trim removes white space at the front and end of the fields.
+	if(profile.trim instanceof Array){
+		for(var i = 0; i < profile.trim.length; i++){
+			var elem = form[profile.trim[i]];
+			if(_undef("type", elem) || elem.type != "text" && elem.type != "textarea" && elem.type != "password"){ continue; }
+			elem.value = elem.value.replace(/(^\s*|\s*$)/g, "");
+		}
+	}
+	// Convert to uppercase
+	if(profile.uppercase instanceof Array){
+		for(var i = 0; i < profile.uppercase.length; i++){
+			var elem = form[profile.uppercase[i]];
+			if(_undef("type", elem) || elem.type != "text" && elem.type != "textarea" && elem.type != "password"){ continue; }
+			elem.value = elem.value.toUpperCase();
+		}
+	}
+	// Convert to lowercase
+	if(profile.lowercase instanceof Array){
+		for (var i = 0; i < profile.lowercase.length; i++){
+			var elem = form[profile.lowercase[i]];
+			if(_undef("type", elem) || elem.type != "text" && elem.type != "textarea" && elem.type != "password"){ continue; }
+			elem.value = elem.value.toLowerCase();
+		}
+	}
+	// Uppercase first letter
+	if(profile.ucfirst instanceof Array){
+		for(var i = 0; i < profile.ucfirst.length; i++){
+			var elem = form[profile.ucfirst[i]];
+			if(_undef("type", elem) || elem.type != "text" && elem.type != "textarea" && elem.type != "password"){ continue; }
+			elem.value = elem.value.replace(/\b\w+\b/g, function(word) { return word.substring(0,1).toUpperCase() + word.substring(1).toLowerCase(); });
+		}
+	}
+	// Remove non digits characters from the input.
+	if(profile.digit instanceof Array){
+		for(var i = 0; i < profile.digit.length; i++){
+			var elem = form[profile.digit[i]];
+			if(_undef("type", elem) || elem.type != "text" && elem.type != "textarea" && elem.type != "password"){ continue; }
+			elem.value = elem.value.replace(/\D/g, "");
+		}
+	}
+
+	// See if required input fields have values missing.
+	if(profile.required instanceof Array){
+		for(var i = 0; i < profile.required.length; i++){ 
+			if(!dojo.isString(profile.required[i])){ continue; }
+			var elem = form[profile.required[i]];
+			// Are textbox, textarea, or password fields blank.
+			if(!_undef("type", elem) 
+				&& (elem.type == "text" || elem.type == "textarea" || elem.type == "password" || elem.type == "file") 
+				&& /^\s*$/.test(elem.value)){	
+				missing[missing.length] = elem.name;
+			}
+			// Does drop-down box have option selected.
+			else if(!_undef("type", elem) && (elem.type == "select-one" || elem.type == "select-multiple") 
+						&& (elem.selectedIndex == -1 
+						|| /^\s*$/.test(elem.options[elem.selectedIndex].value))){
+				missing[missing.length] = elem.name;
+			}
+			// Does radio button group (or check box group) have option checked.
+			else if(elem instanceof Array){
+				var checked = false;
+				for(var j = 0; j < elem.length; j++){
+					if (elem[j].checked) { checked = true; }
+				}
+				if(!checked){	
+					missing[missing.length] = elem[0].name;
+				}
+			}
+		}
+	}
+
+	// See if checkbox groups and select boxes have x number of required values.
+	if(profile.required instanceof Array){
+		for (var i = 0; i < profile.required.length; i++){ 
+			if(!dojo.isObject(profile.required[i])){ continue; }
+			var elem, numRequired;
+			for(var name in profile.required[i]){ 
+				elem = form[name]; 
+				numRequired = profile.required[i][name];
+			}
+			// case 1: elem is a check box group
+			if(elem instanceof Array){
+				var checked = 0;
+				for(var j = 0; j < elem.length; j++){
+					if(elem[j].checked){ checked++; }
+				}
+				if(checked < numRequired){	
+					missing[missing.length] = elem[0].name;
+				}
+			}
+			// case 2: elem is a select box
+			else if(!_undef("type", elem) && elem.type == "select-multiple" ){
+				var selected = 0;
+				for(var j = 0; j < elem.options.length; j++){
+					if (elem.options[j].selected && !/^\s*$/.test(elem.options[j].value)) { selected++; }
+				}
+				if(selected < numRequired){	
+					missing[missing.length] = elem.name;
+				}
+			}
+		}
+	}
+
+	// Dependent fields are required when the target field is present (not blank).
+	// Todo: Support dependent and target fields that are radio button groups, or select drop-down lists.
+	// Todo: Make the dependency based on a specific value of the target field.
+	// Todo: allow dependent fields to have several required values, like {checkboxgroup: 3}.
+	if(dojo.isObject(profile.dependencies)){
+		// properties of dependencies object are the names of dependent fields to be checked
+		for(name in profile.dependencies){
+			var elem = form[name];	// the dependent element
+			if(_undef("type", elem)){continue;}
+			if(elem.type != "text" && elem.type != "textarea" && elem.type != "password"){ continue; } // limited support
+			if(/\S+/.test(elem.value)){ continue; }	// has a value already
+			if(results.isMissing(elem.name)){ continue; }	// already listed as missing
+			var target = form[profile.dependencies[name]];
+			if(target.type != "text" && target.type != "textarea" && target.type != "password"){ continue; }	// limited support
+			if(/^\s*$/.test(target.value)){ continue; }	// skip if blank
+			missing[missing.length] = elem.name;	// ok the dependent field is missing
+		}
+	}
+
+	// Find invalid input fields.
+	if(dojo.isObject(profile.constraints)){
+		// constraint properties are the names of fields to bevalidated
+		for(name in profile.constraints){
+			var elem = form[name];
+			if(!elem) {continue;}
+			
+			// skip if blank - its optional unless required, in which case it
+			// is already listed as missing.
+			if(!_undef("tagName",elem) 
+				&& (elem.tagName.toLowerCase().indexOf("input") >= 0
+					|| elem.tagName.toLowerCase().indexOf("textarea") >= 0) 
+				&& /^\s*$/.test(elem.value)){ 
+				continue; 
+			}
+			
+			var isValid = true;
+			// case 1: constraint value is validation function
+			if(dojo.isFunction(profile.constraints[name])){
+				isValid = profile.constraints[name](elem.value);
+			}else if(dojo.isArray(profile.constraints[name])){
+				
+				// handle nested arrays for multiple constraints
+				if(dojo.isArray(profile.constraints[name][0])){
+					for (var i=0; i<profile.constraints[name].length; i++){
+						isValid = dojox.validate.evaluateConstraint(profile, profile.constraints[name][i], name, elem);
+						if(!isValid){ break; }
+					}
+				}else{
+					// case 2: constraint value is array, first elem is function,
+					// tail is parameters
+					isValid = dojox.validate.evaluateConstraint(profile, profile.constraints[name], name, elem);
+				}
+			}
+			
+			if(!isValid){	
+				invalid[invalid.length] = elem.name;
+			}
+		}
+	}
+
+	// Find unequal confirm fields and report them as Invalid.
+	if(dojo.isObject(profile.confirm)){
+		for(name in profile.confirm){
+			var elem = form[name];	// the confirm element
+			var target = form[profile.confirm[name]];
+			if (_undef("type", elem) || _undef("type", target) || (elem.type != "text" && elem.type != "textarea" && elem.type != "password") 
+				||(target.type != elem.type)
+				||(target.value == elem.value)	// it's valid
+				||(results.isInvalid(elem.name))// already listed as invalid
+				||(/^\s*$/.test(target.value)))	// skip if blank - only confirm if target has a value
+			{
+				continue; 
+			}
+			invalid[invalid.length] = elem.name;
+		}
+	}
+	return results; // Object
+};
+
+//TODO: evaluateConstraint doesn't use profile or fieldName args?
+dojox.validate.evaluateConstraint=function(profile, /*Array*/constraint, fieldName, elem){
+	// summary:
+	//	Evaluates dojo.validate.check() constraints that are specified as array
+	//	arguments
+	//
+	// description: The arrays are expected to be in the format of:
+	//      constraints:{
+	//              fieldName: [functionToCall, param1, param2, etc.],
+	//              fieldName: [[functionToCallFirst, param1],[functionToCallSecond,param2]]
+	//      }
+	// 
+	//  This function evaluates a single array function in the format of:
+	//      [functionName, argument1, argument2, etc]
+	// 
+	//  The function will be parsed out and evaluated against the incoming parameters.
+	//
+	// profile: The dojo.validate.check() profile that this evaluation is against.
+	// constraint: The single [] array of function and arguments for the function.
+	// fieldName: The form dom name of the field being validated.
+	// elem: The form element field.
+	
+ 	var isValidSomething = constraint[0];
+	var params = constraint.slice(1);
+	params.unshift(elem.value);
+	if(typeof isValidSomething != "undefined"){
+		return isValidSomething.apply(null, params);
+	}
+	return false; // Boolean
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/creditCard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/creditCard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/creditCard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,92 @@
+if(!dojo._hasResource["dojox.validate.creditCard"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate.creditCard"] = true;
+dojo.provide("dojox.validate.creditCard");
+
+dojo.require("dojox.validate._base");
+
+/*
+	Validates Credit Cards using account number rules in conjunction with the Luhn algorigthm
+	
+ */
+
+dojox.validate.isValidCreditCard = function(/*String|Int*/value, /*String*/ccType){
+	//Summary:
+	//  checks if ccType matches the # scheme in value, and if Luhn checksum is accurate (unless its an Enroute card, the checkSum is skipped)
+	
+	//Value: Boolean
+	return ((ccType.toLowerCase() == 'er' || dojox.validate.isValidLuhn(value)) &&
+			dojox.validate.isValidCreditCardNumber(value,ccType.toLowerCase())); //Boolean
+}
+
+dojox.validate.isValidCreditCardNumber = function(/*String|Int*/value,/*String?*/ccType){
+	// summary:
+	//  checks if value matches the pattern for that card or any card types if none is specified
+	//
+	// value: Boolean
+	// CC #, white spaces and dashes are ignored
+	//
+	// ccType: String?
+	// one of the values in cardinfo -- if Omitted it it returns a | delimited string of matching card types, or false if no matches found
+
+	value = String(value).replace(/[- ]/g,''); //ignore dashes and whitespaces
+
+	/* 	FIXME: not sure on all the abbreviations for credit cards,below is what each stands for atleast to my knowledge
+		mc: Mastercard
+		ec: Eurocard
+		vi: Visa
+		ax: American Express
+		dc: Diners Club
+		bl: Carte Blanch
+		di: Discover
+		jcb: JCB
+		er: Enroute
+	 */
+	var cardinfo = {
+		'mc':'5[1-5][0-9]{14}','ec':'5[1-5][0-9]{14}','vi':'4(?:[0-9]{12}|[0-9]{15})',
+		'ax':'3[47][0-9]{13}', 'dc':'3(?:0[0-5][0-9]{11}|[68][0-9]{12})',
+		'bl':'3(?:0[0-5][0-9]{11}|[68][0-9]{12})','di':'6011[0-9]{12}',
+		'jcb':'(?:3[0-9]{15}|(2131|1800)[0-9]{11})','er':'2(?:014|149)[0-9]{11}'
+	};
+	if(ccType){
+		var expr = cardinfo[ccType.toLowerCase()];
+		return expr ? !!(value.match(cardinfo[ccType.toLowerCase()])) : false; // boolean
+	}
+	var results=[];
+	for(var p in cardinfo){
+		if(value.match('^'+cardinfo[p]+'$')){
+			results.push(p);
+		}
+	}
+	return results.length ? results.join('|') : false; // string | boolean
+}
+
+dojox.validate.isValidCvv = function(/*String|Int*/value, /*String*/ccType) {
+	//Summary:
+	//  returns true if the security code (CCV) matches the correct format for supplied ccType
+	
+	//Value: Boolean
+	
+	if(typeof value!='string'){
+		value=String(value);
+	}
+	var format;
+	switch (ccType.toLowerCase()){
+		case 'mc':
+		case 'ec':
+		case 'vi':
+		case 'di':
+			format = '###';
+			break;
+		case 'ax':
+			format = '####';
+			break;
+		default:
+			return false; //Boolean
+	}
+	var flags = {format:format};
+	//FIXME? Why does isNumberFormat take an object for flags when its only parameter is either a string or an array inside the object?
+	//FIXME: um... just check value.length?
+	return (value.length == format.length && dojox.validate.isNumberFormat(value, flags)); //Boolean
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/isbn.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/isbn.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/isbn.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+if(!dojo._hasResource["dojox.validate.isbn"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate.isbn"] = true;
+dojo.provide("dojox.validate.isbn");
+
+dojox.validate.isValidIsbn = function(/* String */value) {
+	// summary: Vadlidate ISBN-10 or ISBN-13 based on the length of value
+	// returns: Boolean
+	var len, sum, weight;
+	if(typeof value!='string'){
+		value = String(value);
+	}
+	value = value.replace(/[- ]/g,''); //ignore dashes and whitespaces
+	len = value.length;
+	sum = 0;
+	if(len == 10){
+		weight = 10;
+		// ISBN-10 validation algorithm
+		for(var i = 0; i< 9; i++){
+			sum += parseInt(value.charAt(i)) * weight;
+			weight --;
+		}
+		var t = value.charAt(9).toUpperCase();
+		sum += t == 'X' ? 10 : parseInt(t);
+		return sum % 11 == 0;
+	}else if(len == 13) {
+		weight = -1;
+		for(var i=0; i< len; i++){
+			sum += parseInt(value.charAt(i)) * (2 + weight);
+			weight *= -1;
+		}
+		return sum % 10 == 0;
+	}else{
+		return false;
+	}
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/regexp.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/regexp.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/regexp.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,331 @@
+if(!dojo._hasResource["dojox.validate.regexp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate.regexp"] = true;
+dojo.provide("dojox.validate.regexp");
+
+dojo.require("dojo.regexp"); 
+
+// *** Regular Expression Generator does not entirely live here ***
+// FIXME: is this useful enough to be in /dojox/regexp/_base.js, or
+// should it respect namespace and be dojox.validate.regexp?
+// some say a generic regexp to match zipcodes and urls would be useful
+// others would say it's a spare tire. 
+dojox.regexp = { ca: {}, us: {} }; 
+
+dojox.regexp.tld = function(/*Object?*/flags){
+	// summary: Builds a RE that matches a top-level domain
+	//
+	// flags:
+	//    flags.allowCC  Include 2 letter country code domains.  Default is true.
+	//    flags.allowGeneric  Include the generic domains.  Default is true.
+	//    flags.allowInfra  Include infrastructure domains.  Default is true.
+
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	if(typeof flags.allowCC != "boolean"){ flags.allowCC = true; }
+	if(typeof flags.allowInfra != "boolean"){ flags.allowInfra = true; }
+	if(typeof flags.allowGeneric != "boolean"){ flags.allowGeneric = true; }
+
+	// Infrastructure top-level domain - only one at present
+	var infraRE = "arpa";
+
+	// Generic top-level domains RE.
+	var genericRE = 
+		"aero|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|xxx|jobs|mobi|post";
+	
+	// Country Code top-level domains RE
+	var ccRE = 
+		"ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|" +
+		"bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|" +
+		"ec|ee|eg|er|eu|es|et|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|"
+		+
+		"gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|" +
+		"la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|" +
+		"my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|" +
+		"re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|" +
+		"tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw";
+
+	// Build top-level domain RE
+	var a = [];
+	if(flags.allowInfra){ a.push(infraRE); }
+	if(flags.allowGeneric){ a.push(genericRE); }
+	if(flags.allowCC){ a.push(ccRE); }
+
+	var tldRE = "";
+	if (a.length > 0) {
+		tldRE = "(" + a.join("|") + ")";
+	}
+
+	return tldRE; // String
+}
+
+dojox.regexp.ipAddress = function(/*Object?*/flags){
+	// summary: Builds a RE that matches an IP Address
+	//
+	// description:
+	//  Supports 5 formats for IPv4: dotted decimal, dotted hex, dotted octal, decimal and hexadecimal.
+	//  Supports 2 formats for Ipv6.
+	//
+	// flags  An object.  All flags are boolean with default = true.
+	//    flags.allowDottedDecimal  Example, 207.142.131.235.  No zero padding.
+	//    flags.allowDottedHex  Example, 0x18.0x11.0x9b.0x28.  Case insensitive.  Zero padding allowed.
+	//    flags.allowDottedOctal  Example, 0030.0021.0233.0050.  Zero padding allowed.
+	//    flags.allowDecimal  Example, 3482223595.  A decimal number between 0-4294967295.
+	//    flags.allowHex  Example, 0xCF8E83EB.  Hexadecimal number between 0x0-0xFFFFFFFF.
+	//      Case insensitive.  Zero padding allowed.
+	//    flags.allowIPv6   IPv6 address written as eight groups of four hexadecimal digits.
+	//	FIXME: ipv6 can be written multiple ways IIRC
+	//    flags.allowHybrid   IPv6 address written as six groups of four hexadecimal digits
+	//      followed by the usual 4 dotted decimal digit notation of IPv4. x:x:x:x:x:x:d.d.d.d
+
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	if(typeof flags.allowDottedDecimal != "boolean"){ flags.allowDottedDecimal = true; }
+	if(typeof flags.allowDottedHex != "boolean"){ flags.allowDottedHex = true; }
+	if(typeof flags.allowDottedOctal != "boolean"){ flags.allowDottedOctal = true; }
+	if(typeof flags.allowDecimal != "boolean"){ flags.allowDecimal = true; }
+	if(typeof flags.allowHex != "boolean"){ flags.allowHex = true; }
+	if(typeof flags.allowIPv6 != "boolean"){ flags.allowIPv6 = true; }
+	if(typeof flags.allowHybrid != "boolean"){ flags.allowHybrid = true; }
+
+	// decimal-dotted IP address RE.
+	var dottedDecimalRE = 
+		// Each number is between 0-255.  Zero padding is not allowed.
+		"((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])";
+
+	// dotted hex IP address RE.  Each number is between 0x0-0xff.  Zero padding is allowed, e.g. 0x00.
+	var dottedHexRE = "(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]";
+
+	// dotted octal IP address RE.  Each number is between 0000-0377.  
+	// Zero padding is allowed, but each number must have at least 4 characters.
+	var dottedOctalRE = "(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]";
+
+	// decimal IP address RE.  A decimal number between 0-4294967295.  
+	var decimalRE =  "(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}|429[0-3]\\d{6}|" +
+		"4294[0-8]\\d{5}|42949[0-5]\\d{4}|429496[0-6]\\d{3}|4294967[01]\\d{2}|42949672[0-8]\\d|429496729[0-5])";
+
+	// hexadecimal IP address RE. 
+	// A hexadecimal number between 0x0-0xFFFFFFFF. Case insensitive.  Zero padding is allowed.
+	var hexRE = "0[xX]0*[\\da-fA-F]{1,8}";
+
+	// IPv6 address RE. 
+	// The format is written as eight groups of four hexadecimal digits, x:x:x:x:x:x:x:x,
+	// where x is between 0000-ffff. Zero padding is optional. Case insensitive. 
+	var ipv6RE = "([\\da-fA-F]{1,4}\\:){7}[\\da-fA-F]{1,4}";
+
+	// IPv6/IPv4 Hybrid address RE. 
+	// The format is written as six groups of four hexadecimal digits, 
+	// followed by the 4 dotted decimal IPv4 format. x:x:x:x:x:x:d.d.d.d
+	var hybridRE = "([\\da-fA-F]{1,4}\\:){6}" + 
+		"((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])";
+
+	// Build IP Address RE
+	var a = [];
+	if(flags.allowDottedDecimal){ a.push(dottedDecimalRE); }
+	if(flags.allowDottedHex){ a.push(dottedHexRE); }
+	if(flags.allowDottedOctal){ a.push(dottedOctalRE); }
+	if(flags.allowDecimal){ a.push(decimalRE); }
+	if(flags.allowHex){ a.push(hexRE); }
+	if(flags.allowIPv6){ a.push(ipv6RE); }
+	if(flags.allowHybrid){ a.push(hybridRE); }
+
+	var ipAddressRE = "";
+	if(a.length > 0){
+		ipAddressRE = "(" + a.join("|") + ")";
+	}
+	return ipAddressRE; // String
+}
+
+dojox.regexp.host = function(/*Object?*/flags){
+	// summary: Builds a RE that matches a host
+	// description: A host is a named host (A-z0-9_- but not starting with -), a domain name or an IP address, possibly followed by a port number.
+	// flags: An object.
+	//	  flags.allowNamed Allow a named host for local networks. Default is false.
+	//    flags.allowIP  Allow an IP address for hostname.  Default is true.
+	//    flags.allowLocal  Allow the host to be "localhost".  Default is false.
+	//    flags.allowPort  Allow a port number to be present.  Default is true.
+	//    flags in regexp.ipAddress can be applied.
+	//    flags in regexp.tld can be applied.
+
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	if(typeof flags.allowIP != "boolean"){ flags.allowIP = true; }
+	if(typeof flags.allowLocal != "boolean"){ flags.allowLocal = false; }
+	if(typeof flags.allowPort != "boolean"){ flags.allowPort = true; }
+	if(typeof flags.allowNamed != "boolean"){ flags.allowNamed = false; }
+
+	// Domain names can not end with a dash.
+	var domainNameRE = "([0-9a-zA-Z]([-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?\\.)+" + dojox.regexp.tld(flags);
+
+	// port number RE
+	var portRE = flags.allowPort ? "(\\:\\d+)?" : "";
+
+	// build host RE
+	var hostNameRE = domainNameRE;
+	if(flags.allowIP){ hostNameRE += "|" +  dojox.regexp.ipAddress(flags); }
+	if(flags.allowLocal){ hostNameRE += "|localhost"; }
+	if(flags.allowNamed){ hostNameRE += "|^[^-][a-zA-Z0-9_-]*"; }
+	return "(" + hostNameRE + ")" + portRE; // String
+}
+
+dojox.regexp.url = function(/*Object?*/flags){
+	// summary: Builds a regular expression that matches a URL
+	//
+	// flags: An object
+	//    flags.scheme  Can be true, false, or [true, false]. 
+	//      This means: required, not allowed, or match either one.
+	//    flags in regexp.host can be applied.
+	//    flags in regexp.ipAddress can be applied.
+	//    flags in regexp.tld can be applied.
+
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	if(!("scheme" in flags)){ flags.scheme = [true, false]; }
+
+	// Scheme RE
+	var protocolRE = dojo.regexp.buildGroupRE(flags.scheme,
+		function(q){ if(q){ return "(https?|ftps?)\\://"; } return ""; }
+	);
+
+	// Path and query and anchor RE
+	var pathRE = "(/([^?#\\s/]+/)*)?([^?#\\s/]+(\\?[^?#\\s/]*)?(#[A-Za-z][\\w.:-]*)?)?";
+
+	return protocolRE + dojox.regexp.host(flags) + pathRE;
+}
+
+dojox.regexp.emailAddress = function(/*Object?*/flags){
+
+	// summary: Builds a regular expression that matches an email address
+	//
+	//flags: An object
+	//    flags.allowCruft  Allow address like <mailto:foo@xxxxxxxxx>.  Default is false.
+	//    flags in regexp.host can be applied.
+	//    flags in regexp.ipAddress can be applied.
+	//    flags in regexp.tld can be applied.
+
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	if (typeof flags.allowCruft != "boolean") { flags.allowCruft = false; }
+	flags.allowPort = false; // invalid in email addresses
+
+	// user name RE - apostrophes are valid if there's not 2 in a row
+	var usernameRE = "([\\da-zA-Z]+[-._+&'])*[\\da-zA-Z]+";
+
+	// build emailAddress RE
+	var emailAddressRE = usernameRE + "@" + dojox.regexp.host(flags);
+
+	// Allow email addresses with cruft
+	if ( flags.allowCruft ) {
+		emailAddressRE = "<?(mailto\\:)?" + emailAddressRE + ">?";
+	}
+
+	return emailAddressRE; // String
+}
+
+dojox.regexp.emailAddressList = function(/*Object?*/flags){
+	// summary: Builds a regular expression that matches a list of email addresses.
+	//
+	// flags: An object.
+	//    flags.listSeparator  The character used to separate email addresses.  Default is ";", ",", "\n" or " ".
+	//    flags in regexp.emailAddress can be applied.
+	//    flags in regexp.host can be applied.
+	//    flags in regexp.ipAddress can be applied.
+	//    flags in regexp.tld can be applied.
+
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	if(typeof flags.listSeparator != "string"){ flags.listSeparator = "\\s;,"; }
+
+	// build a RE for an Email Address List
+	var emailAddressRE = dojox.regexp.emailAddress(flags);
+	var emailAddressListRE = "(" + emailAddressRE + "\\s*[" + flags.listSeparator + "]\\s*)*" + 
+		emailAddressRE + "\\s*[" + flags.listSeparator + "]?\\s*";
+
+	return emailAddressListRE; // String
+}
+
+dojox.regexp.us.state = function(/*Object?*/flags){
+	// summary: A regular expression to match US state and territory abbreviations
+	//
+	// flags  An object.
+	//    flags.allowTerritories  Allow Guam, Puerto Rico, etc.  Default is true.
+	//    flags.allowMilitary  Allow military 'states', e.g. Armed Forces Europe (AE).  Default is true.
+
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	if(typeof flags.allowTerritories != "boolean"){ flags.allowTerritories = true; }
+	if(typeof flags.allowMilitary != "boolean"){ flags.allowMilitary = true; }
+
+	// state RE
+	var statesRE = 
+		"AL|AK|AZ|AR|CA|CO|CT|DE|DC|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|" + 
+		"NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY";
+
+	// territories RE
+	var territoriesRE = "AS|FM|GU|MH|MP|PW|PR|VI";
+
+	// military states RE
+	var militaryRE = "AA|AE|AP";
+
+	// Build states and territories RE
+	if(flags.allowTerritories){ statesRE += "|" + territoriesRE; }
+	if(flags.allowMilitary){ statesRE += "|" + militaryRE; }
+
+	return "(" + statesRE + ")"; // String
+}
+
+dojox.regexp.ca.postalCode = function(){
+	var postalRE =
+		"[A-Z][0-9][A-Z] [0-9][A-Z][0-9]";
+	return "(" + postalRE + ")";
+}
+
+dojox.regexp.ca.province = function(){
+	// summary: a regular expression to match Canadian Province Abbreviations
+	var stateRE = 
+		"AB|BC|MB|NB|NL|NS|NT|NU|ON|PE|QC|SK|YT";
+	return "(" + statesRE + ")";
+}
+
+dojox.regexp.numberFormat = function(/*Object?*/flags){
+	// summary: Builds a regular expression to match any sort of number based format
+	// description:
+	//  Use this method for phone numbers, social security numbers, zip-codes, etc.
+	//  The RE can match one format or one of multiple formats.
+	//
+	//  Format
+	//    #        Stands for a digit, 0-9.
+	//    ?        Stands for an optional digit, 0-9 or nothing.
+	//    All other characters must appear literally in the expression.
+	//
+	//  Example   
+	//    "(###) ###-####"       ->   (510) 542-9742
+	//    "(###) ###-#### x#???" ->   (510) 542-9742 x153
+	//    "###-##-####"          ->   506-82-1089       i.e. social security number
+	//    "#####-####"           ->   98225-1649        i.e. zip code
+	//
+	// flags:  An object
+	//    flags.format  A string or an Array of strings for multiple formats.
+
+	// assign default values to missing paramters
+	flags = (typeof flags == "object") ? flags : {};
+	if(typeof flags.format == "undefined"){ flags.format = "###-###-####"; }
+
+	// Converts a number format to RE.
+	var digitRE = function(format){
+		// escape all special characters, except '?'
+		format = dojo.regexp.escapeString(format, "?");
+
+		// Now replace '?' with Regular Expression
+		format = format.replace(/\?/g, "\\d?");
+
+		// replace # with Regular Expression
+		format = format.replace(/#/g, "\\d");
+
+		return format; // String
+	};
+
+	// build RE for multiple number formats
+	return dojo.regexp.buildGroupRE(flags.format, digitRE); //String
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/us.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/us.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/us.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,67 @@
+if(!dojo._hasResource["dojox.validate.us"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate.us"] = true;
+dojo.provide("dojox.validate.us");
+dojo.require("dojox.validate._base");
+
+dojox.validate.us.isState = function(/*String*/value, /*Object?*/flags){
+	// summary: Validates US state and territory abbreviations.
+	//
+	// value: A two character string
+	// flags: An object
+	//    flags.allowTerritories  Allow Guam, Puerto Rico, etc.  Default is true.
+	//    flags.allowMilitary  Allow military 'states', e.g. Armed Forces Europe (AE).  Default is true.
+
+	var re = new RegExp("^" + dojox.regexp.us.state(flags) + "$", "i");
+	return re.test(value); // Boolean
+}
+
+dojox.validate.us.isPhoneNumber = function(/*String*/value){
+	// summary: Validates 10 US digit phone number for several common formats
+	// value: The telephone number string
+
+	var flags = {
+		format: [
+			"###-###-####",
+			"(###) ###-####",
+			"(###) ### ####",
+			"###.###.####",
+			"###/###-####",
+			"### ### ####",
+			"###-###-#### x#???",
+			"(###) ###-#### x#???",
+			"(###) ### #### x#???",
+			"###.###.#### x#???",
+			"###/###-#### x#???",
+			"### ### #### x#???",
+			"##########"
+		]
+	};
+	return dojox.validate.isNumberFormat(value, flags); // Boolean
+}
+
+dojox.validate.us.isSocialSecurityNumber = function(/*String*/value){
+	// summary: Validates social security number
+	var flags = {
+		format: [
+			"###-##-####",
+			"### ## ####",
+			"#########"
+		]
+	};
+	return dojox.validate.isNumberFormat(value, flags); // Boolean
+}
+
+dojox.validate.us.isZipCode = function(/*String*/value){
+	// summary: Validates U.S. zip-code
+	var flags = {
+		format: [
+			"#####-####",
+			"##### ####",
+			"#########",
+			"#####"
+		]
+	};
+	return dojox.validate.isNumberFormat(value, flags); // Boolean
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate/web.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate/web.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate/web.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,89 @@
+if(!dojo._hasResource["dojox.validate.web"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate.web"] = true;
+dojo.provide("dojox.validate.web");
+dojo.require("dojox.validate._base");
+
+dojox.validate.isIpAddress = function(/*String*/value, /*Object?*/flags) {
+	// summary: Validates an IP address
+	//
+	// description:
+	//  Supports 5 formats for IPv4: dotted decimal, dotted hex, dotted octal, decimal and hexadecimal.
+	//  Supports 2 formats for Ipv6.
+	//
+	// value  A string.
+	// flags  An object.  All flags are boolean with default = true.
+	//    flags.allowDottedDecimal  Example, 207.142.131.235.  No zero padding.
+	//    flags.allowDottedHex  Example, 0x18.0x11.0x9b.0x28.  Case insensitive.  Zero padding allowed.
+	//    flags.allowDottedOctal  Example, 0030.0021.0233.0050.  Zero padding allowed.
+	//    flags.allowDecimal  Example, 3482223595.  A decimal number between 0-4294967295.
+	//    flags.allowHex  Example, 0xCF8E83EB.  Hexadecimal number between 0x0-0xFFFFFFFF.
+	//      Case insensitive.  Zero padding allowed.
+	//    flags.allowIPv6   IPv6 address written as eight groups of four hexadecimal digits.
+	//    flags.allowHybrid   IPv6 address written as six groups of four hexadecimal digits
+	//      followed by the usual 4 dotted decimal digit notation of IPv4. x:x:x:x:x:x:d.d.d.d
+
+	var re = new RegExp("^" + dojox.regexp.ipAddress(flags) + "$", "i");
+	return re.test(value); // Boolean
+}
+
+
+dojox.validate.isUrl = function(/*String*/value, /*Object?*/flags) {
+	// summary: Checks if a string could be a valid URL
+	// value: A string
+	// flags: An object
+	//    flags.scheme  Can be true, false, or [true, false]. 
+	//      This means: required, not allowed, or either.
+	//    flags in regexp.host can be applied.
+	//    flags in regexp.ipAddress can be applied.
+	//    flags in regexp.tld can be applied.
+
+	var re = new RegExp("^" + dojox.regexp.url(flags) + "$", "i");
+	return re.test(value); // Boolean
+}
+
+dojox.validate.isEmailAddress = function(/*String*/value, /*Object?*/flags) {
+	// summary: Checks if a string could be a valid email address
+	//
+	// value: A string
+	// flags: An object
+	//    flags.allowCruft  Allow address like <mailto:foo@xxxxxxxxx>.  Default is false.
+	//    flags in regexp.host can be applied.
+	//    flags in regexp.ipAddress can be applied.
+	//    flags in regexp.tld can be applied.
+
+	var re = new RegExp("^" + dojox.regexp.emailAddress(flags) + "$", "i");
+	return re.test(value); // Boolean
+}
+
+dojox.validate.isEmailAddressList = function(/*String*/value, /*Object?*/flags) {
+	// summary: Checks if a string could be a valid email address list.
+	//
+	// value  A string.
+	// flags  An object.
+	//    flags.listSeparator  The character used to separate email addresses.  Default is ";", ",", "\n" or " ".
+	//    flags in regexp.emailAddress can be applied.
+	//    flags in regexp.host can be applied.
+	//    flags in regexp.ipAddress can be applied.
+	//    flags in regexp.tld can be applied.
+
+	var re = new RegExp("^" + dojox.regexp.emailAddressList(flags) + "$", "i");
+	return re.test(value); // Boolean
+}
+
+dojox.validate.getEmailAddressList = function(/*String*/value, /*Object?*/flags) {
+	// summary: Check if value is an email address list. If an empty list
+	//  is returned, the value didn't pass the test or it was empty.
+	//
+	// value: A string
+	// flags: An object (same as dojo.validate.isEmailAddressList)
+
+	if(!flags) { flags = {}; }
+	if(!flags.listSeparator) { flags.listSeparator = "\\s;,"; }
+
+	if ( dojox.validate.isEmailAddressList(value, flags) ) {
+		return value.split(new RegExp("\\s*[" + flags.listSeparator + "]\\s*")); // Array
+	}
+	return []; // Array
+}
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/validate.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/validate.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/validate.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,6 @@
+if(!dojo._hasResource["dojox.validate"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.validate"] = true;
+dojo.provide("dojox.validate");
+dojo.require("dojox.validate._base"); 
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,78 @@
+.dojoxColorPicker {
+	padding:8px;
+	border:1px solid #a0a0a0;
+	background:#ededed;
+	width:300px;
+	height:150px; 
+	-moz-border-radius:4pt;
+	-webkit-border-radius:5pt;
+}
+.dojoxColorPickerBox {
+	position:relative;
+	width:150px;	
+	height:150px;	
+	margin:0; padding:0;
+}
+.dojoxColorPickerUnderlay {
+	position:absolute; 
+	top:0; left:0;
+	width:150px; 
+	height:150px;
+	z-index:1;
+	border:1px solid #a0a0a0;
+}
+.dojoxHuePickerUnderlay {
+	background:url(images/hue.png) no-repeat top center; 
+	position:absolute;
+	top:0; left:0;
+	height:150px;
+	width:20px;
+	z-index:1;
+}
+.dojoxHuePicker { position:relative; top:-150px; left:157px; }
+.dojoxHuePickerPoint {
+	position:absolute;
+	top:0; left:0;
+	width:20px;
+	height:8px;
+	z-index:3; 
+	background-color:#666; 
+	cursor:pointer;
+	background:url(images/hueHandle.png) no-repeat center center; 
+}
+.dojoxColorPickerPoint {
+	position:absolute;
+	width:10px; 
+	height:10px;
+	background: url(images/pickerPointer.png) no-repeat center center; 
+	border:0;
+	z-index:3; 
+	cursor:pointer; 
+}
+.dojoxColorPickerPreview {
+	display:block;	
+	width:45px;	
+	height:45px;
+	border:1px solid #333;
+	background-color:#fff; 
+	position:relative;
+	top:-150px;
+	left: 185px; 
+}
+.dojoxColorPickerWebSafePreview {
+	display:block;
+	width:25px; 
+	height:25px; 
+	position:relative;
+	top:-197px;
+	left:240px; 
+	border:1px solid #333; 
+}
+.dojoxColorPickerOptional {
+	position:relative;
+	top:-170px;
+	left:185px;
+}
+.dojoxColorPickerRgb { position:absolute; top:0; left:0;  } 
+.dojoxColorPickerHsv { position:absolute; top:0; left:50px;  } 
+.dojoxColorPickerHex { position:absolute; top:73px; left:2px;  } 

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,89 @@
+.dojoxColorPicker {
+	padding:8px;
+	border:1px solid #a0a0a0;
+	background:#ededed;
+	width:300px;
+	height:150px; 
+	-moz-border-radius:4pt;
+	-webkit-border-radius:5pt;
+}
+
+
+.dojoxColorPickerBox {
+	position:relative;
+	width:150px;	
+	height:150px;	
+	margin:0; padding:0;
+}
+
+.dojoxColorPickerUnderlay {
+	position:absolute; 
+	top:0; left:0;
+	width:150px; 
+	height:150px;
+	z-index:1;
+	border:1px solid #a0a0a0;
+}
+
+.dojoxHuePickerUnderlay {
+	background:url(images/hue.png) no-repeat top center; 
+	position:absolute;
+	top:0; left:0;
+	height:150px;
+	width:20px;
+	z-index:1;
+}
+
+.dojoxHuePicker { position:relative; top:-150px; left:157px; }
+
+.dojoxHuePickerPoint {
+	position:absolute;
+	top:0; left:0;
+	width:20px;
+	height:8px;
+	z-index:3; 
+	background-color:#666; 
+	cursor:pointer;
+	background:url(images/hueHandle.png) no-repeat center center; 
+}
+
+
+.dojoxColorPickerPoint {
+	position:absolute;
+	width:10px; 
+	height:10px;
+	background: url(images/pickerPointer.png) no-repeat center center; 
+	border:0;
+	z-index:3; 
+	cursor:pointer; 
+}
+
+.dojoxColorPickerPreview {
+	display:block;	
+	width:45px;	
+	height:45px;
+	border:1px solid #333;
+	background-color:#fff; 
+	position:relative;
+	top:-150px;
+	left: 185px; 
+}
+.dojoxColorPickerWebSafePreview {
+	display:block;
+	width:25px; 
+	height:25px; 
+	position:relative;
+	top:-197px;
+	left:240px; 
+	border:1px solid #333; 
+}
+
+.dojoxColorPickerOptional {
+	position:relative;
+	top:-170px;
+	left:185px;
+}
+
+.dojoxColorPickerRgb { position:absolute; top:0; left:0;  } 
+.dojoxColorPickerHsv { position:absolute; top:0; left:50px;  } 
+.dojoxColorPickerHex { position:absolute; top:73px; left:2px;  } 

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/ColorPicker.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,31 @@
+<div class="dojoxColorPicker">
+	<div class="dojoxColorPickerBox">
+		<div dojoAttachPoint="cursorNode" class="dojoxColorPickerPoint"></div>
+		<img dojoAttachPoint="colorUnderlay" dojoAttachEvent="onclick: _setPoint" class="dojoxColorPickerUnderlay" src="${_underlay}">
+	</div>
+	<div class="dojoxHuePicker">
+		<div dojoAttachPoint="hueCursorNode" class="dojoxHuePickerPoint"></div>
+		<div dojoAttachPoint="hueNode" class="dojoxHuePickerUnderlay" dojoAttachEvent="onclick: _setHuePoint"></div>
+	</div>
+	<div dojoAttachPoint="previewNode" class="dojoxColorPickerPreview"></div>
+	<div dojoAttachPoint="safePreviewNode" class="dojoxColorPickerWebSafePreview"></div>
+	<div class="dojoxColorPickerOptional">
+		<div class="dijitInline dojoxColorPickerRgb" dojoAttachPoint="rgbNode">
+			<table>
+			<tr><td>r</td><td><input dojoAttachPoint="Rval" size="1"></td></tr>
+			<tr><td>g</td><td><input dojoAttachPoint="Gval" size="1"></td></tr>
+			<tr><td>b</td><td><input dojoAttachPoint="Bval" size="1"></td></tr>
+			</table>
+		</div>
+		<div class="dijitInline dojoxColorPickerHsv" dojoAttachPoint="hsvNode">
+			<table>
+			<tr><td>h</td><td><input dojoAttachPoint="Hval"size="1"> &deg;</td></tr>
+			<tr><td>s</td><td><input dojoAttachPoint="Sval" size="1"> %</td></tr>
+			<tr><td>v</td><td><input dojoAttachPoint="Vval" size="1"> %</td></tr>
+			</table>
+		</div>
+		<div class="dojoxColorPickerHex" dojoAttachPoint="hexNode">	
+			hex: <input dojoAttachPoint="hexCode, focusNode" size="6" class="dojoxColorPickerHexCode">
+		</div>
+	</div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/hue.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/hue.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/hueHandle.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/hueHandle.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/pickerPointer.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/pickerPointer.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/underlay.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker/images/underlay.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/ColorPicker.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,284 @@
+if(!dojo._hasResource["dojox.widget.ColorPicker"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.widget.ColorPicker"] = true;
+dojo.provide("dojox.widget.ColorPicker");
+dojo.experimental("dojox.widget.ColorPicker"); // level: prototype
+
+dojo.require("dijit.form._FormWidget");
+dojo.require("dojo.dnd.move"); 
+dojo.require("dojo.fx"); 
+
+dojo.declare("dojox.widget.ColorPicker",
+	dijit.form._FormWidget,
+	{
+	// summary: a HSV color picker - like PhotoShop
+	//
+	// description: 
+	//	provides an interactive HSV ColorPicker similar to
+	//	PhotoShop's color selction tool. Will eventually
+	//	mixin FormWidget and be used as a suplement or a
+	//	'more interactive' replacement for ColorPalette
+	//	
+	// example:
+	//
+	//	code: 
+	//	var picker = new dojox.widget.ColorPicker({
+	//		// a couple of example toggles:
+	//		animatePoint:false,
+	//		showHsv: false,
+	//		webSafe: false,
+	//		showRgb: false 	
+	//	});
+	//	
+	//	markup:
+	//	<div dojoType="dojox.widget.ColorPicker"></div>
+	//
+
+	// showRgb: Boolean
+	//	show/update RGB input nodes
+	showRgb: true,
+	
+	// showHsv: Boolean
+	//	show/update HSV input nodes
+	showHsv: true,
+	
+	// showHex: Boolean
+	//	show/update Hex value field
+	showHex: true,
+
+	// webSafe: Boolean
+	//	deprecated? or just use a toggle to show/hide that node, too?
+	webSafe: true,
+
+	// animatePoint: Boolean
+	//	toggle to use slideTo (true) or just place the cursor (false) on click
+	animatePoint: true,
+
+	// slideDuration: Integer
+	//	time in ms picker node will slide to next location (non-dragging) when animatePoint=true
+	slideDuration: 250, 
+
+	_underlay: dojo.moduleUrl("dojox.widget","ColorPicker/images/underlay.png"),
+	templateString:"<div class=\"dojoxColorPicker\">\n\t<div class=\"dojoxColorPickerBox\">\n\t\t<div dojoAttachPoint=\"cursorNode\" class=\"dojoxColorPickerPoint\"></div>\n\t\t<img dojoAttachPoint=\"colorUnderlay\" dojoAttachEvent=\"onclick: _setPoint\" class=\"dojoxColorPickerUnderlay\" src=\"${_underlay}\">\n\t</div>\n\t<div class=\"dojoxHuePicker\">\n\t\t<div dojoAttachPoint=\"hueCursorNode\" class=\"dojoxHuePickerPoint\"></div>\n\t\t<div dojoAttachPoint=\"hueNode\" class=\"dojoxHuePickerUnderlay\" dojoAttachEvent=\"onclick: _setHuePoint\"></div>\n\t</div>\n\t<div dojoAttachPoint=\"previewNode\" class=\"dojoxColorPickerPreview\"></div>\n\t<div dojoAttachPoint=\"safePreviewNode\" class=\"dojoxColorPickerWebSafePreview\"></div>\n\t<div class=\"dojoxColorPickerOptional\">\n\t\t<div class=\"dijitInline dojoxColorPickerRgb\" dojoAttachPoint=\"rgbNode\">\n\t\t\t<table>\n\t\t\t<tr><td>r</td><td><input dojoAttachPoint=\"Rval\" size=\"1\"></td></tr>\n\t\t\t<tr><td>g</td><td><input dojoAttachPoint=\"Gval\" size=\"1\"></td></tr>\n\t\t\t<tr><td>b</td><td><input dojoAttachPoint=\"Bval\" size=\"1\"></td></tr>\n\t\t\t</table>\n\t\t</div>\n\t\t<div class=\"dijitInline dojoxColorPickerHsv\" dojoAttachPoint=\"hsvNode\">\n\t\t\t<table>\n\t\t\t<tr><td>h</td><td><input dojoAttachPoint=\"Hval\"size=\"1\"> &deg;</td></tr>\n\t\t\t<tr><td>s</td><td><input dojoAttachPoint=\"Sval\" size=\"1\"> %</td></tr>\n\t\t\t<tr><td>v</td><td><input dojoAttachPoint=\"Vval\" size=\"1\"> %</td></tr>\n\t\t\t</table>\n\t\t</div>\n\t\t<div class=\"dojoxColorPickerHex\" dojoAttachPoint=\"hexNode\">\t\n\t\t\thex: <input dojoAttachPoint=\"hexCode, focusNode\" size=\"6\" class=\"dojoxColorPickerHexCode\">\n\t\t</div>\n\t</div>\n</div>\n",
+
+	postCreate: function(){
+		// summary: As quickly as we can, set up ie6 alpha-filter support for our
+		// 	underlay.  we don't do image handles (done in css), just the 'core' 
+		//	of this widget: the underlay. 
+		if(dojo.isIE && dojo.isIE<7){ 
+			this.colorUnderlay.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this._underlay+"', sizingMethod='scale')";
+			this.colorUnderlay.src = dojo.moduleUrl("dojo","resources/blank.gif").toString();
+		}
+		// hide toggle-able nodes:
+		if (!this.showRgb){ this.rgbNode.style.display = "none"; }
+		if (!this.showHsv){ this.hsvNode.style.display = "none"; }
+		if (!this.showHex){ this.hexNode.style.display = "none"; } 
+		if (!this.webSafe){ this.safePreviewNode.style.display = "none"; } 
+	},
+
+	startup: function(){
+		// summary: defer all additional calls until we're started, and our
+		// embeded sliders are loaded? (not implemented yet)
+
+		// this._offset = ((dojo.marginBox(this.cursorNode).w)/2); 
+		this._offset = 0; 
+
+		this._mover = new dojo.dnd.Moveable(this.cursorNode, {
+			mover: dojo.dnd.boxConstrainedMover({ t:0, l:0, w:150, h:150 })
+		}); 
+		this._hueMover = new dojo.dnd.Moveable(this.hueCursorNode, {
+			mover: dojo.dnd.boxConstrainedMover({ t:0, l:0, w:0, h:150 })
+		});
+
+		// no dnd/move/move published ... use a timer:
+		dojo.subscribe("/dnd/move/stop",dojo.hitch(this,"_clearTimer"));
+		dojo.subscribe("/dnd/move/start",dojo.hitch(this,"_setTimer"));
+
+		// ugly scaling calculator.  need a XYslider badly
+		this._sc = (1/dojo.coords(this.colorUnderlay).w);  
+		this._hueSc = (255/(dojo.coords(this.hueNode).h+this._offset)); 
+		
+		// initial color
+		this._updateColor(); 
+		
+	},
+
+	_setTimer: function(/* dojo.dnd.Mover */mover){
+		this._timer = setInterval(dojo.hitch(this,"_updateColor"),45);	
+	},
+	_clearTimer: function(/* dojo.dnd.Mover */mover){
+		clearInterval(this._timer);
+		this.onChange(this.value);
+	},
+
+	_setHue: function(/* Decimal */h){
+		// summary: sets a natural color background for the 
+		// 	underlay image against closest hue value (full saturation) 
+		// h: 0..255 
+
+		// this is not a pretty conversion:
+		var hue = dojo.colorFromArray(this._hsv2rgb(h,1,1,{ inputRange: 1 })).toHex();
+		dojo.style(this.colorUnderlay,"backgroundColor",hue);
+	},
+
+	_updateColor: function(){
+		// summary: update the previewNode color, and input values [optional]
+		var h = Math.round((255+(this._offset))-((dojo.style(this.hueCursorNode,"top")+this._offset)*this._hueSc));
+		var s = Math.round((dojo.style(this.cursorNode,"left")*this._sc)*100); 
+		var v = Math.round(100-(dojo.style(this.cursorNode,"top")*this._sc)*100);
+
+		// limit hue calculations to only when it changes
+		if(h != this._hue){ this._setHue(h); }
+
+		var rgb = this._hsv2rgb(h,s/100,v/100,{ inputRange: 1 }); 
+		var hex = (dojo.colorFromArray(rgb).toHex());
+
+		this.previewNode.style.backgroundColor = hex;	
+		if(this.webSafe){ this.safePreviewNode.style.backgroundColor = hex; }
+		if(this.showHex){ this.hexCode.value = hex; }
+		if(this.showRgb){
+			this.Rval.value = rgb[0];
+			this.Gval.value = rgb[1];	
+			this.Bval.value = rgb[2];
+		}
+		if(this.showHsv){
+			this.Hval.value = Math.round((h*360)/255); // convert to 0..360
+			this.Sval.value = s;
+			this.Vval.value = v;
+		}
+		this.value=hex;
+
+		// anytime we muck with the color, fire onChange?
+		if (!this._timer && !(arguments[1])){
+			this.setValue(this.value);	
+			this.onChange(this.value);
+		}
+	},
+
+	_setHuePoint: function(/* Event */evt){ 
+		// summary: set the hue picker handle on relative y coordinates
+		if(this.animatePoint){
+			dojo.fx.slideTo({ 
+				node: this.hueCursorNode, 
+				duration:this.slideDuration,
+				top: evt.layerY,
+				left: 0,
+				onEnd: dojo.hitch(this,"_updateColor")
+			}).play();
+		}else{
+			dojo.style(this.hueCursorNode,"top",(evt.layerY)+"px");
+			this._updateColor(false); 
+		}
+	},
+
+	_setPoint: function(/* Event */evt){
+		// summary: set our picker point based on relative x/y coordinates
+		if(this.animatePoint){
+			dojo.fx.slideTo({ 
+				node: this.cursorNode, 
+				duration:this.slideDuration,
+				top: evt.layerY-this._offset, 
+				left: evt.layerX-this._offset,
+				onEnd: dojo.hitch(this,"_updateColor")
+			}).play();
+		}else{
+			dojo.style(this.cursorNode,"left",(evt.layerX-this._offset)+"px");
+			dojo.style(this.cursorNode,"top",(evt.layerY-this._offset)+"px");
+			this._updateColor(false); 
+		}
+	},
+
+	// this ported directly from 0.4 dojo.gfx.colors.hsv, with bugs :)
+	// FIXME: use ttrenka's HSB ?
+	_hsv2rgb: function(/* int || Array */h, /* int */s, /* int */v, /* Object? */options){
+		//	summary
+		//	converts an HSV value set to RGB, ranges depending on optional options object.
+		//	patch for options by Matthew Eernisse 	
+		if (dojo.isArray(h)) {
+			if(s){
+				options = s;
+			}
+			v = h[2] || 0;
+			s = h[1] || 0;
+			h = h[0] || 0;
+		}
+	
+		var opt = {
+			inputRange:  (options && options.inputRange)  ? options.inputRange : [255, 255, 255],
+			outputRange: (options && options.outputRange) ? options.outputRange : 255
+		};
+	
+	    switch(opt.inputRange[0]) { 
+			// 0.0-1.0 
+			case 1: h = h * 360; break; 
+			// 0-100 
+			case 100: h = (h / 100) * 360; break; 
+			// 0-360 
+			case 360: h = h; break; 
+			// 0-255 
+			default: h = (h / 255) * 360; 
+		} 
+		if (h == 360){ h = 0;}
+	
+		//	no need to alter if inputRange[1] = 1
+		switch(opt.inputRange[1]){
+			case 100: s /= 100; break;
+			case 255: s /= 255;
+		}
+	
+		//	no need to alter if inputRange[1] = 1
+		switch(opt.inputRange[2]){
+			case 100: v /= 100; break;
+			case 255: v /= 255;
+		}
+	
+		var r = null;
+		var g = null;
+		var b = null;
+	
+		if (s == 0){
+			// color is on black-and-white center line
+			// achromatic: shades of gray
+			r = v;
+			g = v;
+			b = v;
+		}else{
+			// chromatic color
+			var hTemp = h / 60;		// h is now IN [0,6]
+			var i = Math.floor(hTemp);	// largest integer <= h
+			var f = hTemp - i;		// fractional part of h
+	
+			var p = v * (1 - s);
+			var q = v * (1 - (s * f));
+			var t = v * (1 - (s * (1 - f)));
+	
+			switch(i){
+				case 0: r = v; g = t; b = p; break;
+				case 1: r = q; g = v; b = p; break;
+				case 2: r = p; g = v; b = t; break;
+				case 3: r = p; g = q; b = v; break;
+				case 4: r = t; g = p; b = v; break;
+				case 5: r = v; g = p; b = q; break;
+			}
+		}
+	
+		switch(opt.outputRange){
+			case 1:
+				r = dojo.math.round(r, 2);
+				g = dojo.math.round(g, 2);
+				b = dojo.math.round(b, 2);
+				break;
+			case 100:
+				r = Math.round(r * 100);
+				g = Math.round(g * 100);
+				b = Math.round(b * 100);
+				break;
+			default:
+				r = Math.round(r * 255);
+				g = Math.round(g * 255);
+				b = Math.round(b * 255);
+		}
+		return [r, g, b];
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,70 @@
+.dijitFileInput {
+	position:relative;
+	height:1.3em;
+	padding:2px;  
+}
+.dijitFileInputReal {
+	position:absolute;
+	z-index:2;
+	opacity:0;
+	filter:alpha(opacity:0);
+}
+.dijitFileInputRealBlind {
+	right:0;
+}
+.dijitFileInputReal:hover { cursor:pointer; } 
+.dijitFileInputButton,
+.dijitFileInputText {
+	border:1px solid #333;
+	padding:2px 12px 2px 12px; 
+	cursor:pointer;
+}
+.dijitFileInputButton {
+	z-index:3;
+	visibility:hidden;
+}
+.dijitFakeInput { position:absolute; top:0; left:0; z-index:1; }
+.dijitProgressOverlay {
+	display:none;
+	width:250px;
+	height:1em;
+	position:absolute;
+	top:0; left:0;
+	border:1px solid #333;
+	background:#cad2de url('../../../dijit/themes/tundra/images/dijitProgressBarAnim.gif') repeat-x top left;
+	padding:2px;	
+}
+.tundra .dijitProgressOverlay {
+	border:1px solid #84a3d1;
+	background-color:#cad2de;
+}
+.tundra .dijitFakeInput input {
+	font-size: inherit;
+	background:#fff url("../../../dijit/themes/tundra/images/validationInputBg.png") repeat-x top left;
+	border:1px solid #9b9b9b;
+	line-height: normal;
+	padding: 0.2em 0.3em;
+}
+.tundra .dijitFileInputButton, 
+.tundra .dijitFileInputText {
+	border:1px solid #9b9b9b;
+	padding:2px 12px 2px 12px; 
+	background:#e9e9e9 url("../../../dijit/themes/tundra/images/buttonEnabled.png") repeat-x top;
+}
+.soria .dijitProgressOverlay {
+	border:1px solid #333;
+	background-color:#cad2de; 
+}
+.soria .dijitFakeInput input {
+	border:1px solid #333;
+	background:#fff url("../../../dijit/themes/soria/images/gradientInverseTopBg.png") repeat-x top left;
+	line-height:normal;
+	background-position:0 -30px; 
+	padding:0.2em 0.3em;
+}
+.soria .dijitFileInputButton,
+.soria .dijitFileInputText {
+	border:1px solid #333;
+	padding:2px 12px 2px 12px;
+	background:#b7cdee url('../../../dijit/themes/soria/images/gradientTopBg.png') repeat-x; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,79 @@
+.dijitFileInput {
+	position:relative;
+	height:1.3em;
+	padding:2px;  
+}
+
+.dijitFileInputReal {
+	position:absolute;
+	z-index:2;
+	opacity:0;
+	filter:alpha(opacity:0);
+}
+.dijitFileInputRealBlind {
+	right:0;
+}
+.dijitFileInputReal:hover { cursor:pointer; } 
+
+.dijitFileInputButton,
+.dijitFileInputText {
+	border:1px solid #333;
+	padding:2px 12px 2px 12px; 
+	cursor:pointer;
+}
+
+.dijitFileInputButton {
+	z-index:3;
+	visibility:hidden;
+}
+.dijitFakeInput { position:absolute; top:0; left:0; z-index:1; }
+
+.dijitProgressOverlay {
+	display:none;
+	width:250px;
+	height:1em;
+	position:absolute;
+	top:0; left:0;
+	border:1px solid #333;
+	background:#cad2de url('../../../dijit/themes/tundra/images/dijitProgressBarAnim.gif') repeat-x top left;
+	padding:2px;	
+}
+
+/* tundra */
+.tundra .dijitProgressOverlay {
+	border:1px solid #84a3d1;
+	background-color:#cad2de;
+}
+.tundra .dijitFakeInput input {
+	font-size: inherit;
+	background:#fff url("../../../dijit/themes/tundra/images/validationInputBg.png") repeat-x top left;
+	border:1px solid #9b9b9b;
+	line-height: normal;
+	padding: 0.2em 0.3em;
+}
+.tundra .dijitFileInputButton, 
+.tundra .dijitFileInputText {
+	border:1px solid #9b9b9b;
+	padding:2px 12px 2px 12px; /* .3em .4em .2em .4em; */
+	background:#e9e9e9 url("../../../dijit/themes/tundra/images/buttonEnabled.png") repeat-x top;
+}
+
+/* Soria */
+.soria .dijitProgressOverlay {
+	border:1px solid #333;
+	background-color:#cad2de; 
+}
+
+.soria .dijitFakeInput input {
+	border:1px solid #333;
+	background:#fff url("../../../dijit/themes/soria/images/gradientInverseTopBg.png") repeat-x top left;
+	line-height:normal;
+	background-position:0 -30px; 
+	padding:0.2em 0.3em;
+}
+.soria .dijitFileInputButton,
+.soria .dijitFileInputText {
+	border:1px solid #333;
+	padding:2px 12px 2px 12px;
+	background:#b7cdee url('../../../dijit/themes/soria/images/gradientTopBg.png') repeat-x; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInput.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+<div class="dijitFileInput">
+	<input id="${id}" class="dijitFileInputReal" type="file" dojoAttachPoint="fileInput" name="${name}" />
+	<div class="dijitFakeInput">
+		<input class="dijitFileInputVisible" type="text" dojoAttachPoint="focusNode, inputNode" />
+		<div class="dijitInline dijitFileInputText" dojoAttachPoint="titleNode">${label}</div>
+		<div class="dijitInline dijitFileInputButton" dojoAttachPoint="cancelNode" 
+			dojoAttachEvent="onclick:_onClick">${cancelText}</div>
+	</div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInputAuto.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInputAuto.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/FileInputAuto.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+<div class="dijitFileInput">
+	<input id="${id}" name="${name}" class="dijitFileInputReal" type="file" dojoAttachPoint="fileInput" />
+	<div class="dijitFakeInput" dojoAttachPoint="fakeNodeHolder">
+		<input class="dijitFileInputVisible" type="text" dojoAttachPoint="focusNode, inputNode" />
+		<div class="dijitInline dijitFileInputText" dojoAttachPoint="titleNode">${label}</div>
+		<div class="dijitInline dijitFileInputButton" dojoAttachPoint="cancelNode" dojoAttachEvent="onclick:_onClick">${cancelText}</div>
+	</div>
+	<div class="dijitProgressOverlay" dojoAttachPoint="overlay">&nbsp;</div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/ReceiveFile.php
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/ReceiveFile.php	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput/ReceiveFile.php	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,37 @@
+<?php
+
+// THIS IS AN EXAMPLE
+// you will obviously need to do more server side work than I am doing here to check and move your upload.
+// API is up for discussion, jump on http://dojotoolkit.org/forums
+
+// JSON.php is available in dojo svn checkout
+require("../../../dojo/tests/resources/JSON.php");
+$json = new Services_JSON();
+
+// fake delay
+sleep(3);
+$name = empty($_REQUEST['name'])? "default" : $_REQUEST['name'];
+if(is_array($_FILES)){
+	$ar = array(
+		// lets just pass lots of stuff back and see what we find.
+		// the _FILES aren't coming through in IE6 (maybe 7)
+		'status' => "success",
+		'name' => $name,
+		'request' => $_REQUEST,
+		'postvars' => $_POST,
+		'details' => $_FILES,
+		// and some static subarray just to see
+		'foo' => array('foo'=>"bar")
+	);
+
+}else{
+	$ar = array(
+		'status' => "failed",
+		'details' => ""
+	);
+}
+
+// yeah, seems you have to wrap iframeIO stuff in textareas?
+$foo = $json->encode($ar);
+?>
+<textarea><?php print $foo; ?></textarea>

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInput.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,75 @@
+if(!dojo._hasResource["dojox.widget.FileInput"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.widget.FileInput"] = true;
+dojo.provide("dojox.widget.FileInput");
+dojo.experimental("dojox.widget.FileInput"); 
+
+dojo.require("dijit.form._FormWidget");
+dojo.require("dijit._Templated"); 
+
+dojo.declare("dojox.widget.FileInput",
+	dijit.form._FormWidget,
+	{
+	// summary: A styled input type="file"
+	//
+	// description: A input type="file" form widget, with a button for uploading to be styled via css,
+	//	a cancel button to clear selection, and FormWidget mixin to provide standard dijit.form.Form
+	//	support (FIXME: maybe not fully implemented) 
+
+	// label: String
+	//	the title text of the "Browse" button
+	label: "Browse ...",
+
+	// cancelText: String
+	//	the title of the "Cancel" button
+	cancelText: "Cancel",
+
+	// name: String
+	//	ugh, this should be pulled from this.domNode
+	name: "uploadFile",
+
+	templateString:"<div class=\"dijitFileInput\">\n\t<input id=\"${id}\" class=\"dijitFileInputReal\" type=\"file\" dojoAttachPoint=\"fileInput\" name=\"${name}\" />\n\t<div class=\"dijitFakeInput\">\n\t\t<input class=\"dijitFileInputVisible\" type=\"text\" dojoAttachPoint=\"focusNode, inputNode\" />\n\t\t<div class=\"dijitInline dijitFileInputText\" dojoAttachPoint=\"titleNode\">${label}</div>\n\t\t<div class=\"dijitInline dijitFileInputButton\" dojoAttachPoint=\"cancelNode\" \n\t\t\tdojoAttachEvent=\"onclick:_onClick\">${cancelText}</div>\n\t</div>\n</div>\n",
+	
+	startup: function(){
+		// summary: listen for changes on our real file input
+		this._listener = dojo.connect(this.fileInput,"onchange",this,"_matchValue");
+		this._keyListener = dojo.connect(this.fileInput,"onkeyup",this,"_matchValue");
+	},
+
+	_matchValue: function(){
+		// summary: set the content of the upper input based on the semi-hidden file input
+		this.inputNode.value = this.fileInput.value;
+		if(this.inputNode.value){
+			this.cancelNode.style.visibility = "visible";
+			dojo.fadeIn({ node: this.cancelNode, duration:275 }).play();
+		}
+	},
+
+	setLabel: function(/* String */label,/* String? */cssClass){
+		// summary: method to allow use to change button label
+		this.titleNode.innerHTML = label;
+	},
+
+	_onClick: function(/* Event */e){
+		// summary: on click of cancel button, since we can't clear the input because of
+		// 	security reasons, we destroy it, and add a new one in it's place.
+		dojo.disconnect(this._listener);
+		dojo.disconnect(this._keyListener); 
+		this.domNode.removeChild(this.fileInput);
+		dojo.fadeOut({ node: this.cancelNode, duration:275 }).play(); 
+
+		// should we use cloneNode()? can we?
+		this.fileInput = document.createElement('input');
+		this.fileInput.setAttribute("type","file");
+		this.fileInput.setAttribute("id",this.id);
+		this.fileInput.setAttribute("name",this.name);
+		dojo.addClass(this.fileInput,"dijitFileInputReal");
+		this.domNode.appendChild(this.fileInput);
+
+		this._keyListener = dojo.connect(this.fileInput,"onkeyup",this,"_matchValue");
+		this._listener = dojo.connect(this.fileInput,"onchange",this,"_matchValue"); 
+		this.inputNode.value = ""; 
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInputAuto.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInputAuto.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FileInputAuto.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,185 @@
+if(!dojo._hasResource["dojox.widget.FileInputAuto"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.widget.FileInputAuto"] = true;
+dojo.provide("dojox.widget.FileInputAuto");
+
+dojo.require("dojox.widget.FileInput");
+dojo.require("dojo.io.iframe"); 
+
+dojo.declare("dojox.widget.FileInputAuto",
+	dojox.widget.FileInput,
+	{
+	// summary: An extension on dojox.widget.FileInput providing background upload progress
+	//
+	// description: An extended version of FileInput - when the user focuses away from the input
+	//	the selected file is posted via dojo.io.iframe to the url. example implementation
+	//	comes with PHP solution for handling upload, and returning required data.
+	//	
+	// notes: the return data from the io.iframe is used to populate the input element with 
+	//	data regarding the results. it will be a JSON object, like:
+	//	
+	//	results = { size: "1024", filename: "file.txt" }
+	//	
+	//	all the parameters allowed to dojox.widget.FileInput apply
+
+	// url: String
+	// 	the URL where our background FileUpload will be sent
+	url: "",
+
+	// blurDelay: Integer
+	//	time in ms before an un-focused widget will wait before uploading the file to the url="" specified
+	//	default: 2 seconds
+	blurDelay: 2000,
+
+	// duration: Integer
+	//	The time in ms to use as the generic timing mechanism for the animations
+	//	set to 1 or 0 for "immediate respose"
+	duration: 500,
+
+	// uploadMessage: String
+	//	
+	//	FIXME: i18n somehow?
+	uploadMessage: "Uploading ...", 
+	
+	_sent: false,
+
+	// small template changes, new attachpoint: overlay
+	templateString:"<div class=\"dijitFileInput\">\n\t<input id=\"${id}\" name=\"${name}\" class=\"dijitFileInputReal\" type=\"file\" dojoAttachPoint=\"fileInput\" />\n\t<div class=\"dijitFakeInput\" dojoAttachPoint=\"fakeNodeHolder\">\n\t\t<input class=\"dijitFileInputVisible\" type=\"text\" dojoAttachPoint=\"focusNode, inputNode\" />\n\t\t<div class=\"dijitInline dijitFileInputText\" dojoAttachPoint=\"titleNode\">${label}</div>\n\t\t<div class=\"dijitInline dijitFileInputButton\" dojoAttachPoint=\"cancelNode\" dojoAttachEvent=\"onclick:_onClick\">${cancelText}</div>\n\t</div>\n\t<div class=\"dijitProgressOverlay\" dojoAttachPoint=\"overlay\">&nbsp;</div>\n</div>\n",
+
+	startup: function(){
+		// summary: add our extra blur listeners
+		this._blurListener = dojo.connect(this.fileInput,"onblur",this,"_onBlur");
+		this._focusListener = dojo.connect(this.fileInput,"onfocus",this,"_onFocus"); 
+		this.inherited("startup",arguments);
+	},
+
+	_onFocus: function(){
+		// summary: clear the upload timer
+		if(this._blurTimer){ clearTimeout(this._blurTimer); }
+	},
+
+	_onBlur: function(){
+		// summary: start the upload timer
+		if(this._blurTimer){ clearTimeout(this._blurTimer); }
+		if(!this._sent){
+			this._blurTimer = setTimeout(dojo.hitch(this,"_sendFile"),this.blurDelay);		
+		}
+	},
+
+
+	setMessage: function(/*String*/title){
+		// summary: set the text of the progressbar
+		
+		// FIXME: this throws errors in IE?!?!?!? egads.		
+		if(!dojo.isIE){ this.overlay.innerHTML = title;	}
+	},
+	
+	_sendFile: function(/* Event */e){
+		// summary: triggers the chain of events needed to upload a file in the background.
+		if(!this.fileInput.value || this._sent){ return; }
+		
+		dojo.style(this.fakeNodeHolder,"display","none");
+		dojo.style(this.overlay,"opacity","0");
+		dojo.style(this.overlay,"display","block");
+
+		this.setMessage(this.uploadMessage);
+
+		dojo.fadeIn({ node: this.overlay, duration:this.duration }).play();
+
+		var _newForm; 
+		if(dojo.isIE){
+			// just to reiterate, IE is a steaming pile of code. 
+			_newForm = document.createElement('<form enctype="multipart/form-data" method="post">');
+			_newForm.encoding = "multipart/form-data";
+			
+		}else{
+			// this is how all other sane browsers do it
+			_newForm = document.createElement('form');
+			_newForm.setAttribute("enctype","multipart/form-data");
+		}
+		_newForm.appendChild(this.fileInput);
+		dojo.body().appendChild(_newForm);
+	
+		dojo.io.iframe.send({
+			url: this.url+"?name="+this.name,
+			form: _newForm,
+			handleAs: "json",
+			handle: dojo.hitch(this,"_handleSend")
+		});
+	},
+
+	_handleSend: function(data,ioArgs){
+		// summary: The callback to toggle the progressbar, and fire the user-defined callback
+		if(!dojo.isIE){
+			// otherwise, this throws errors in ie? FIXME:
+			this.overlay.innerHTML = "";
+		}
+		
+		this._sent = true;
+		dojo.style(this.overlay,"opacity","0");
+		dojo.style(this.overlay,"border","none");
+		dojo.style(this.overlay,"background","none"); 
+
+		this.overlay.style.backgroundImage = "none";
+		this.fileInput.style.display = "none";
+		this.fakeNodeHolder.style.display = "none";
+		dojo.fadeIn({ node:this.overlay, duration:this.duration }).play(250);
+
+		dojo.disconnect(this._blurListener);
+		dojo.disconnect(this._focusListener);
+
+		this.onComplete(data,ioArgs,this);
+	},
+
+	_onClick: function(e){
+		// summary: accomodate our extra focusListeners
+		if(this._blurTimer){ clearTimeout(this._blurTimer); }
+
+		dojo.disconnect(this._blurListener);
+		dojo.disconnect(this._focusListener);
+
+		this.inherited("_onClick",arguments);
+
+		this._blurListener = dojo.connect(this.fileInput,"onblur",this,"_onBlur");
+		this._focusListener = dojo.connect(this.fileInput,"onfocus",this,"_onFocus"); 
+	},
+
+	onComplete: function(data,ioArgs,widgetRef){
+		// summary: stub function fired when an upload has finished. 
+		// data: the raw data found in the first [TEXTAREA] tag of the post url
+		// ioArgs: the dojo.Deferred data being passed from the handle: callback
+		// widgetRef: this widget pointer, so you can set this.overlay to a completed/error message easily
+	}
+});
+
+dojo.declare("dojox.widget.FileInputBlind",
+	dojox.widget.FileInputAuto,
+	{
+	// summary: An extended version of dojox.widget.FileInputAuto
+	//	that does not display an input node, but rather only a button
+	// 	and otherwise behaves just like FileInputAuto
+	
+	startup: function(){
+		// summary: hide our fileInput input field
+		this.inherited("startup",arguments);
+		this._off = dojo.style(this.inputNode,"width");
+		this.inputNode.style.display = "none";
+		this._fixPosition();
+	},
+	
+	_fixPosition: function(){		
+		// summary: in this case, set the button under where the visible button is 
+		if(dojo.isIE){
+			dojo.style(this.fileInput,"width","1px");
+		}else{
+			dojo.style(this.fileInput,"left","-"+(this._off)+"px");
+		}
+	},
+
+	_onClick: function(e){
+		// summary: onclick, we need to reposition our newly created input type="file"
+		this.inherited("_onClick",arguments);
+		this._fixPosition(); 
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/FisheyeList.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/FisheyeList.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/FisheyeList.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/FisheyeList.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/FisheyeList.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList/FisheyeList.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,708 @@
+if(!dojo._hasResource["dojox.widget.FisheyeList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.widget.FisheyeList"] = true;
+dojo.provide("dojox.widget.FisheyeList");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Container");
+
+dojo.declare("dojox.widget.FisheyeList", [dijit._Widget, dijit._Templated, dijit._Container], {
+	// summary:
+	//	Menu similar to the fish eye menu on the Mac OS
+	// example:
+	// |	<div dojoType="FisheyeList"
+	// |		itemWidth="40" itemHeight="40"
+	// |		itemMaxWidth="150" itemMaxHeight="150"
+	// |		orientation="horizontal"
+	// |		effectUnits="2"
+	// |		itemPadding="10"
+	// |		attachEdge="center"
+	// |		labelEdge="bottom">
+	// |
+	// |		<div dojoType="FisheyeListItem"
+	// |			id="item1"
+	// |			onclick="alert('click on' + this.label + '(from widget id ' + this.widgetId + ')!');"
+	// |			label="Item 1"
+	// |			iconSrc="images/fisheye_1.png">
+	// |		</div>
+	// |		...
+	// |	</div>
+	//
+	constructor: function(){
+		//
+		// TODO
+		// fix really long labels in vertical mode
+		//
+	
+		this.pos = {'x': -1, 'y': -1};	// current cursor position, relative to the grid
+		
+		// for conservative trigger mode, when triggered, timerScale is gradually increased from 0 to 1
+		this.timerScale = 1.0;
+	
+	},
+
+	EDGE: {
+		CENTER: 0,
+		LEFT: 1,
+		RIGHT: 2,
+		TOP: 3,
+		BOTTOM: 4
+	},
+
+	templateString: '<div class="dojoxFisheyeListBar" dojoAttachPoint="containerNode"></div>',
+
+	snarfChildDomOutput: true,
+	
+	// itemWidth: Integer
+	//	width of menu item (in pixels) in it's dormant state (when the mouse is far away)
+	itemWidth: 40,
+	
+	// itemHeight: Integer
+	//	height of menu item (in pixels) in it's dormant state (when the mouse is far away)
+	itemHeight: 40,
+	
+	// itemMaxWidth: Integer
+	//	width of menu item (in pixels) in it's fully enlarged state (when the mouse is directly over it)
+	itemMaxWidth: 150,
+	
+	// itemMaxHeight: Integer
+	//	height of menu item (in pixels) in it's fully enlarged state (when the mouse is directly over it)
+	itemMaxHeight: 150,
+
+	imgNode: null,
+	
+	// orientation: String
+	//	orientation of the menu, either "horizontal" or "vertical"
+	orientation: 'horizontal',
+
+	// isFixed: Boolean
+	//	toggle to enable additional listener (window scroll) if FisheyeList is in a fixed postion
+	isFixed: false,
+	
+	// conservativeTrigger: Boolean
+	//	if true, don't start enlarging menu items until mouse is over an image;
+	//	if false, start enlarging menu items as the mouse moves near them.
+	conservativeTrigger: false,
+	
+	// effectUnits: Number
+	//	controls how much reaction the menu makes, relative to the distance of the mouse from the menu
+	effectUnits: 2,
+		
+	// itemPadding: Integer
+	//	padding (in pixels) betweeen each menu item
+	itemPadding: 10,
+	
+	// attachEdge: String
+	//	controls the border that the menu items don't expand past;
+	//	for example, if set to "top", then the menu items will drop downwards as they expand.
+	// values
+	//	"center", "left", "right", "top", "bottom".
+	attachEdge: 'center',
+
+	// labelEdge: String
+	//	controls were the labels show up in relation to the menu item icons
+	// values
+	//	"center", "left", "right", "top", "bottom".
+	labelEdge: 'bottom',
+
+	postCreate: function(){
+		var e = this.EDGE;
+		dojo.setSelectable(this.domNode, false);
+
+		var isHorizontal = this.isHorizontal = (this.orientation == 'horizontal');
+		this.selectedNode = -1;
+
+		this.isOver = false;
+		this.hitX1 = -1;
+		this.hitY1 = -1;
+		this.hitX2 = -1;
+		this.hitY2 = -1;
+
+		//
+		// only some edges make sense...
+		//
+		this.anchorEdge = this._toEdge(this.attachEdge, e.CENTER);
+		this.labelEdge  = this._toEdge(this.labelEdge,  e.TOP);
+
+		if(this.labelEdge == e.CENTER){ this.labelEdge = e.TOP; }
+
+		if(isHorizontal){
+			if(this.anchorEdge == e.LEFT){ this.anchorEdge = e.CENTER; }
+			if(this.anchorEdge == e.RIGHT){ this.anchorEdge = e.CENTER; }
+			if(this.labelEdge == e.LEFT){ this.labelEdge = e.TOP; }
+			if(this.labelEdge == e.RIGHT){ this.labelEdge = e.TOP; }
+		}else{
+			if(this.anchorEdge == e.TOP){ this.anchorEdge = e.CENTER; }
+			if(this.anchorEdge == e.BOTTOM){ this.anchorEdge = e.CENTER; }
+			if(this.labelEdge == e.TOP){ this.labelEdge = e.LEFT; }
+			if(this.labelEdge == e.BOTTOM){ this.labelEdge = e.LEFT; }
+		}
+
+		//
+		// figure out the proximity size
+		//
+		var effectUnits = this.effectUnits;
+		this.proximityLeft   = this.itemWidth  * (effectUnits - 0.5);
+		this.proximityRight  = this.itemWidth  * (effectUnits - 0.5);
+		this.proximityTop    = this.itemHeight * (effectUnits - 0.5);
+		this.proximityBottom = this.itemHeight * (effectUnits - 0.5);
+	
+		if(this.anchorEdge == e.LEFT){
+			this.proximityLeft = 0;
+		}
+		if(this.anchorEdge == e.RIGHT){
+			this.proximityRight = 0;
+		}
+		if(this.anchorEdge == e.TOP){
+			this.proximityTop = 0;
+		}
+		if(this.anchorEdge == e.BOTTOM){
+			this.proximityBottom = 0;
+		}
+		if(this.anchorEdge == e.CENTER){
+			this.proximityLeft   /= 2;
+			this.proximityRight  /= 2;
+			this.proximityTop    /= 2;
+			this.proximityBottom /= 2;
+		}
+	},
+	
+	startup: function(){
+		// summary: create our connections and setup our FisheyeList
+		this.children = this.getChildren();
+		//original postCreate() --tk
+		this._initializePositioning();
+	
+		//
+		// in liberal trigger mode, activate menu whenever mouse is close
+		//
+		if(!this.conservativeTrigger){
+			this._onMouseMoveHandle = dojo.connect(document.documentElement, "onmousemove", this, "_onMouseMove");
+		}
+		if (this.isFixed){
+			this._onScrollHandle = dojo.connect(document,"onscroll",this,"_onScroll");
+		}
+			
+		// Deactivate the menu if mouse is moved off screen (doesn't work for FF?)
+		this._onMouseOutHandle = dojo.connect(document.documentElement, "onmouseout", this, "_onBodyOut");
+		this._addChildHandle = dojo.connect(this, "addChild", this, "_initializePositioning");
+		this._onResizeHandle = dojo.connect(window,"onresize", this, "_initializePositioning");
+	},
+	
+	_initializePositioning: function(){
+		this.itemCount = this.children.length;
+	
+		this.barWidth  = (this.isHorizontal ? this.itemCount : 1) * this.itemWidth;
+		this.barHeight = (this.isHorizontal ? 1 : this.itemCount) * this.itemHeight;
+	
+		this.totalWidth  = this.proximityLeft + this.proximityRight  + this.barWidth;
+		this.totalHeight = this.proximityTop  + this.proximityBottom + this.barHeight;
+	
+		//
+		// calculate effect ranges for each item
+		//
+
+		for(var i=0; i<this.children.length; i++){
+
+			this.children[i].posX = this.itemWidth  * (this.isHorizontal ? i : 0);
+			this.children[i].posY = this.itemHeight * (this.isHorizontal ? 0 : i);
+
+			this.children[i].cenX = this.children[i].posX + (this.itemWidth  / 2);
+			this.children[i].cenY = this.children[i].posY + (this.itemHeight / 2);
+
+			var isz = this.isHorizontal ? this.itemWidth : this.itemHeight;
+			var r = this.effectUnits * isz;
+			var c = this.isHorizontal ? this.children[i].cenX : this.children[i].cenY;
+			var lhs = this.isHorizontal ? this.proximityLeft : this.proximityTop;
+			var rhs = this.isHorizontal ? this.proximityRight : this.proximityBottom;
+			var siz = this.isHorizontal ? this.barWidth : this.barHeight;
+
+			var range_lhs = r;
+			var range_rhs = r;
+
+			if(range_lhs > c+lhs){ range_lhs = c+lhs; }
+			if(range_rhs > (siz-c+rhs)){ range_rhs = siz-c+rhs; }
+
+			this.children[i].effectRangeLeft = range_lhs / isz;
+			this.children[i].effectRangeRght = range_rhs / isz;
+
+			//dojo.debug('effect range for '+i+' is '+range_lhs+'/'+range_rhs);
+		}
+
+		//
+		// create the bar
+		//
+		this.domNode.style.width = this.barWidth + 'px';
+		this.domNode.style.height = this.barHeight + 'px';
+
+		//
+		// position the items
+		//
+		for(var i=0; i<this.children.length; i++){
+			var itm = this.children[i];
+			var elm = itm.domNode;
+			elm.style.left   = itm.posX + 'px';
+			elm.style.top    = itm.posY + 'px';
+			elm.style.width  = this.itemWidth + 'px';
+			elm.style.height = this.itemHeight + 'px';
+			
+			itm.imgNode.style.left = this.itemPadding+'%';
+			itm.imgNode.style.top = this.itemPadding+'%';
+			itm.imgNode.style.width = (100 - 2 * this.itemPadding) + '%';
+			itm.imgNode.style.height = (100 - 2 * this.itemPadding) + '%';
+		}
+
+		//
+		// calc the grid
+		//
+		this._calcHitGrid();
+	},
+
+	_overElement: function(/* DomNode|String */node, /* Event */e){
+		// summary:
+		//	Returns whether the mouse is over the passed element.
+		// Node: Must must be display:block (ie, not a <span>)
+		node = dojo.byId(node);
+		var mouse = {x: e.pageX, y: e.pageY};
+		var bb = dojo._getBorderBox(node);
+		var absolute = dojo.coords(node, true);
+		var top = absolute.y;
+		var bottom = top + bb.h;
+		var left = absolute.x;
+		var right = left + bb.w;
+
+		return (mouse.x >= left
+			&& mouse.x <= right
+			&& mouse.y >= top
+			&& mouse.y <= bottom
+		);	//	boolean
+	},
+
+	_onBodyOut: function(/*Event*/ e){
+		// clicking over an object inside of body causes this event to fire; ignore that case
+		if( this._overElement(dojo.body(), e) ){
+			return;
+		}
+		this._setDormant(e);
+	},
+
+	_setDormant: function(/*Event*/ e){
+		// summary: called when mouse moves out of menu's range
+
+		if(!this.isOver){ return; }	// already dormant?
+		this.isOver = false;
+
+		if(this.conservativeTrigger){
+			// user can't re-trigger the menu expansion
+			// until he mouses over a icon again
+			dojo.disconnect(this._onMouseMoveHandle);
+		}
+		this._onGridMouseMove(-1, -1);
+	},
+
+	_setActive: function(/*Event*/ e){
+		// summary: called when mouse is moved into menu's range
+
+		if(this.isOver){ return; }	// already activated?
+		this.isOver = true;
+
+		if(this.conservativeTrigger){
+			// switch event handlers so that we handle mouse events from anywhere near
+			// the menu
+			this._onMouseMoveHandle = dojo.connect(document.documentElement, "onmousemove", this, "_onMouseMove");
+
+			this.timerScale=0.0;
+
+			// call mouse handler to do some initial necessary calculations/positioning
+			this._onMouseMove(e);
+
+			// slowly expand the icon size so it isn't jumpy
+			this._expandSlowly();
+		}
+	},
+
+	_onMouseMove: function(/*Event*/ e){
+		// summary: called when mouse is moved
+		if(	(e.pageX >= this.hitX1) && (e.pageX <= this.hitX2) &&
+			(e.pageY >= this.hitY1) && (e.pageY <= this.hitY2)	){
+			if(!this.isOver){
+				this._setActive(e);
+			}
+			this._onGridMouseMove(e.pageX-this.hitX1, e.pageY-this.hitY1);
+		}else{
+			if(this.isOver){
+				this._setDormant(e);
+			}
+		}
+	},
+
+	_onScroll: function(){
+		this._calcHitGrid();	
+	},
+
+	onResized: function(){
+		this._calcHitGrid();
+	},
+
+	_onGridMouseMove: function(x, y){
+		// summary: called when mouse is moved in the vicinity of the menu
+		this.pos = {x:x, y:y};
+		this._paint();
+	},
+
+	_paint: function(){
+		var x=this.pos.x;
+		var y=this.pos.y;
+
+		if(this.itemCount <= 0){ return; }
+
+		//
+		// figure out our main index
+		//
+		var pos = this.isHorizontal ? x : y;
+		var prx = this.isHorizontal ? this.proximityLeft : this.proximityTop;
+		var siz = this.isHorizontal ? this.itemWidth : this.itemHeight;
+		var sim = this.isHorizontal ? 
+			(1.0-this.timerScale)*this.itemWidth + this.timerScale*this.itemMaxWidth :
+			(1.0-this.timerScale)*this.itemHeight + this.timerScale*this.itemMaxHeight ;
+
+		var cen = ((pos - prx) / siz) - 0.5;
+		var max_off_cen = (sim / siz) - 0.5;
+
+		if(max_off_cen > this.effectUnits){ max_off_cen = this.effectUnits; }
+
+		//
+		// figure out our off-axis weighting
+		//
+		var off_weight = 0;
+
+		if(this.anchorEdge == this.EDGE.BOTTOM){
+			var cen2 = (y - this.proximityTop) / this.itemHeight;
+			off_weight = (cen2 > 0.5) ? 1 : y / (this.proximityTop + (this.itemHeight / 2));
+		}
+		if(this.anchorEdge == this.EDGE.TOP){
+			var cen2 = (y - this.proximityTop) / this.itemHeight;
+			off_weight = (cen2 < 0.5) ? 1 : (this.totalHeight - y) / (this.proximityBottom + (this.itemHeight / 2));
+		}
+		if(this.anchorEdge == this.EDGE.RIGHT){
+			var cen2 = (x - this.proximityLeft) / this.itemWidth;
+			off_weight = (cen2 > 0.5) ? 1 : x / (this.proximityLeft + (this.itemWidth / 2));
+		}
+		if(this.anchorEdge == this.EDGE.LEFT){
+			var cen2 = (x - this.proximityLeft) / this.itemWidth;
+			off_weight = (cen2 < 0.5) ? 1 : (this.totalWidth - x) / (this.proximityRight + (this.itemWidth / 2));
+		}
+		if(this.anchorEdge == this.EDGE.CENTER){
+			if(this.isHorizontal){
+				off_weight = y / (this.totalHeight);
+			}else{
+				off_weight = x / (this.totalWidth);
+			}
+
+			if(off_weight > 0.5){
+				off_weight = 1 - off_weight;
+			}
+
+			off_weight *= 2;
+		}
+
+		//
+		// set the sizes
+		//
+		for(var i=0; i<this.itemCount; i++){
+			var weight = this._weighAt(cen, i);
+			if(weight < 0){weight = 0;}
+			this._setItemSize(i, weight * off_weight);
+		}
+
+		//
+		// set the positions
+		//
+
+		var main_p = Math.round(cen);
+		var offset = 0;
+
+		if(cen < 0){
+
+			main_p = 0;
+
+		}else if(cen > this.itemCount - 1){
+
+			main_p = this.itemCount -1;
+
+		}else{
+
+			offset = (cen - main_p) * ((this.isHorizontal ? this.itemWidth : this.itemHeight) - this.children[main_p].sizeMain);
+		}
+
+		this._positionElementsFrom(main_p, offset);
+	},
+
+	_weighAt: function(/*Integer*/ cen, /*Integer*/ i){
+		var dist = Math.abs(cen - i);
+		var limit = ((cen - i) > 0) ? this.children[i].effectRangeRght : this.children[i].effectRangeLeft;
+		return (dist > limit) ? 0 : (1 - dist / limit); // Integer
+	},
+
+	_setItemSize: function(p, scale){
+		scale *= this.timerScale;
+		var w = Math.round(this.itemWidth  + ((this.itemMaxWidth  - this.itemWidth ) * scale));
+		var h = Math.round(this.itemHeight + ((this.itemMaxHeight - this.itemHeight) * scale));
+
+		if(this.isHorizontal){
+
+			this.children[p].sizeW = w;
+			this.children[p].sizeH = h;
+
+			this.children[p].sizeMain = w;
+			this.children[p].sizeOff  = h;
+
+			var y = 0;
+			if(this.anchorEdge == this.EDGE.TOP){
+				y = (this.children[p].cenY - (this.itemHeight / 2));
+			}else if(this.anchorEdge == this.EDGE.BOTTOM){
+				y = (this.children[p].cenY - (h - (this.itemHeight / 2)));
+			}else{
+				y = (this.children[p].cenY - (h / 2));
+			}
+
+			this.children[p].usualX = Math.round(this.children[p].cenX - (w / 2));
+			this.children[p].domNode.style.top  = y + 'px';
+			this.children[p].domNode.style.left  = this.children[p].usualX + 'px';
+
+		}else{
+
+			this.children[p].sizeW = w;
+			this.children[p].sizeH = h;
+
+			this.children[p].sizeOff  = w;
+			this.children[p].sizeMain = h;
+
+			var x = 0;
+			if(this.anchorEdge == this.EDGE.LEFT){
+				x = this.children[p].cenX - (this.itemWidth / 2);
+			}else if (this.anchorEdge == this.EDGE.RIGHT){
+				x = this.children[p].cenX - (w - (this.itemWidth / 2));
+			}else{
+				x = this.children[p].cenX - (w / 2);
+			}
+
+			this.children[p].domNode.style.left = x + 'px';
+			this.children[p].usualY = Math.round(this.children[p].cenY - (h / 2));
+
+			this.children[p].domNode.style.top  = this.children[p].usualY + 'px';
+		}
+
+		this.children[p].domNode.style.width  = w + 'px';
+		this.children[p].domNode.style.height = h + 'px';
+
+		if(this.children[p].svgNode){
+			this.children[p].svgNode.setSize(w, h);
+		}
+	},
+
+	_positionElementsFrom: function(p, offset){
+		var pos = 0;
+
+		if(this.isHorizontal){
+			pos = Math.round(this.children[p].usualX + offset);
+			this.children[p].domNode.style.left = pos + 'px';
+		}else{
+			pos = Math.round(this.children[p].usualY + offset);
+			this.children[p].domNode.style.top = pos + 'px';
+		}
+		this._positionLabel(this.children[p]);
+
+		// position before
+		var bpos = pos;
+		for(var i=p-1; i>=0; i--){
+			bpos -= this.children[i].sizeMain;
+
+			if (this.isHorizontal){
+				this.children[i].domNode.style.left = bpos + 'px';
+			}else{
+				this.children[i].domNode.style.top = bpos + 'px';
+			}
+			this._positionLabel(this.children[i]);
+		}
+
+		// position after
+		var apos = pos;
+		for(var i=p+1; i<this.itemCount; i++){
+			apos += this.children[i-1].sizeMain;
+			if(this.isHorizontal){
+				this.children[i].domNode.style.left = apos + 'px';
+			}else{
+				this.children[i].domNode.style.top = apos + 'px';
+			}
+			this._positionLabel(this.children[i]);
+		}
+
+	},
+
+	_positionLabel: function(itm){
+		var x = 0;
+		var y = 0;
+		
+		var mb = dojo.marginBox(itm.lblNode);
+
+		if(this.labelEdge == this.EDGE.TOP){
+			x = Math.round((itm.sizeW / 2) - (mb.w / 2));
+			y = -mb.h;
+		}
+
+		if(this.labelEdge == this.EDGE.BOTTOM){
+			x = Math.round((itm.sizeW / 2) - (mb.w / 2));
+			y = itm.sizeH;
+		}
+
+		if(this.labelEdge == this.EDGE.LEFT){
+			x = -mb.w;
+			y = Math.round((itm.sizeH / 2) - (mb.h / 2));
+		}
+
+		if(this.labelEdge == this.EDGE.RIGHT){
+			x = itm.sizeW;
+			y = Math.round((itm.sizeH / 2) - (mb.h / 2));
+		}
+
+		itm.lblNode.style.left = x + 'px';
+		itm.lblNode.style.top  = y + 'px';
+	},
+
+	_calcHitGrid: function(){
+
+		var pos = dojo.coords(this.domNode, true);
+
+		this.hitX1 = pos.x - this.proximityLeft;
+		this.hitY1 = pos.y - this.proximityTop;
+		this.hitX2 = this.hitX1 + this.totalWidth;
+		this.hitY2 = this.hitY1 + this.totalHeight;
+
+	},
+
+	_toEdge: function(inp, def){
+		return this.EDGE[inp.toUpperCase()] || def;
+	},
+
+	_expandSlowly: function(){
+		// summary: slowly expand the image to user specified max size
+		if(!this.isOver){ return; }
+		this.timerScale += 0.2;
+		this._paint();
+		if(this.timerScale<1.0){
+			setTimeout(dojo.hitch(this, "_expandSlowly"), 10);
+		}
+	},
+
+	destroyRecursive: function(){
+		// need to disconnect when we destroy
+		dojo.disconnect(this._onMouseOutHandle);
+		dojo.disconnect(this._onMouseMoveHandle);
+		dojo.disconnect(this._addChildHandle);
+		if (this.isFixed) { dojo.disconnect(this._onScrollHandle); }
+		dojo.disconnect(this._onResizeHandle); 
+		this.inherited("destroyRecursive",arguments);
+	}
+});
+
+dojo.declare("dojox.widget.FisheyeListItem", [dijit._Widget, dijit._Templated, dijit._Contained], {
+	/*
+	 * summary
+	 *	Menu item inside of a FisheyeList.
+	 *	See FisheyeList documentation for details on usage.
+	 */
+
+	// iconSrc: String
+	//	pathname to image file (jpg, gif, png, etc.) of icon for this menu item
+	iconSrc: "",
+
+	// label: String
+	//	label to print next to the icon, when it is moused-over
+	label: "",
+
+	// id: String
+	//	will be set to the id of the orginal div element
+	id: "",
+
+	_blankImgPath: dojo.moduleUrl("dojo", "resources/blank.gif"),
+
+	templateString:
+		'<div class="dojoxFisheyeListItem">' +
+		'  <img class="dojoxFisheyeListItemImage" dojoAttachPoint="imgNode" dojoAttachEvent="onmouseover:onMouseOver,onmouseout:onMouseOut,onclick:onClick">' +
+		'  <div class="dojoxFisheyeListItemLabel" dojoAttachPoint="lblNode"></div>' +
+		'</div>',
+
+	_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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeLite.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeLite.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/FisheyeLite.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.
+	}
+		
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Iterator.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Iterator.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Iterator.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:
+	|	<span dojoType="dojo.data.ItemFileReadStore" 
+	|		jsId="cstore" url="countries.json"></span>
+	|	
+	|	<div>
+	|		<div dojoType="dojox.widget.Iterator" store="cstore"
+	|			query="{ name: 'A*'}">
+	|			${name} is a ${type}
+	|		</div>
+	|	</div>
+
+	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 = {};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/Loader.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/Loader.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/Loader.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/Loader.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/Loader.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/Loader.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,39 @@
+-------------------------------------------------------------------------------
+dojox.widget.Loader
+-------------------------------------------------------------------------------
+Version 0.1
+Release date: 07/15/2007
+-------------------------------------------------------------------------------
+Project state:
+prototype / expermental 
+-------------------------------------------------------------------------------
+Credits: Pete Higgins (phiggins@xxxxxxxxx)
+-------------------------------------------------------------------------------
+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:
+	<div dojoType="dojox.widget.Loader"></div>
+
+	Configuration options can be found in the API tool.
+
+	

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/honey.php
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/honey.php	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/honey.php	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,27 @@
+<? 
+/* honey.php - sample fake delay script to push data
+   - should use ob_flush() to send chunks rather than 
+   just take a long time ...
+*/
+
+session_start(); 
+
+$char = " "; 
+$fakeDelay = (empty($_GET['delay'])) ? 1 : $_GET['delay'];
+$dataSize = (empty($_GET['size'])) ? 2*1024 : $_GET['size'];
+if (empty($_SESSION['counter'])) $_SESSION['counter'] = 1; 
+$dataSent = 0;
+$blockSize = 1024;
+
+if ($fakeDelay) { sleep($fakeDelay); }
+
+print "view num: ".$_SESSION['counter']++;
+while ($dataSent<=$dataSize) {
+	for ($i=0; $i<$blockSize/4; $i++) {
+		print $char; 
+	} print "<br />"; 
+	$dataSent += $blockSize; 
+	sleep(1);
+}
+
+?>

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/icons/loading.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader/icons/loading.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Loader.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: '<div dojoAttachPoint="loadNode" class="dojoxLoader">'
+		+'<img src="${loadIcon}" class="dojoxLoaderIcon"> <span dojoAttachPoint="loadMessageNode" class="dojoxLoaderMessage"></span>'
+		+'</div>',
+	
+	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();
+		}
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/MultiComboBox.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/MultiComboBox.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/MultiComboBox.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}		
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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@xxxxxxxxx)
+	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 

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/Rating.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/Rating.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/Rating.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/Rating.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/Rating.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/Rating.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_empty.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_empty.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_empty.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_empty.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_full.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_full.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_full.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_full.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_half.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating/rating_half.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Rating.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 = '<div dojoAttachPoint="domNode" class="dojoxRating dijitInline">' +
+					'<input type="hidden" value="0" dojoAttachPoint="focusNode" /><ul>${stars}</ul>' +
+				'</div>';
+		// the value-attribute is used to "read" the value for processing in the widget class -->
+		var starTpl = '<li class="dojoxRatingStar dijitInline" dojoAttachEvent="onclick:onStarClick,onmouseover:_onMouse,onmouseout:_onMouse" value="${value}"></li>';
+		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!
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,57 @@
+.sortListBody { margin:0; padding:0; background:#fff; }
+.soria .sortListBody li,
+.tundra .sortListBody li {
+	border-bottom:1px solid #b7b7b7;
+	padding:2px 2px 2px 5px;	
+}
+.sortListTitle {
+	cursor:pointer; 
+	padding:4px 4px 3px 4px;
+}
+.sortList { height:100%; width:100%; }
+.sortListBodyWrapper { 
+	border:1px solid #b7b7b7; 
+	overflow:auto; 
+	height:100%; 
+	cursor:pointer;
+} 
+.soria .sortListBodyWrapper {
+	border:1px solid #333; 
+}
+.soria .sortListItemOdd,
+.tundra .sortListItemOdd { background:#f2f5f9; }
+.tundra .sortListTitle {
+	background:#fafafa url('../../../dijit/themes/tundra/images/titleBarBg.gif') repeat-x top left; 
+	border:1px solid #bfbfbf;
+	border-bottom:0;
+}
+.soria .sortListTitle {
+	background:#4f8ce5 url('../../../dijit/themes/soria/images/gradientTopBg.png') repeat-x top left;
+	background-position:0px -1px; 
+	border:1px solid #333; 
+	border-bottom:0;
+	font-weight:bold;
+	color:#fff; 
+}
+.sortListItemSelected { background:#b7cdee !important; }
+.sortListItemHover { background:#ff6 !important; }
+.soria .sortListIcon,
+.tundra .sortListIcon { 
+	float:right;
+	height:16px; 
+	width:16px;
+}
+.tundra .sortListDesc .sortListIcon {
+	background:url('../../../dijit/themes/tundra/images/arrowDown.png') no-repeat center center;
+}
+.tundra .sortListAsc .sortListIcon {
+	background:url('../../../dijit/themes/tundra/images/arrowUp.png') no-repeat center center;
+}
+.soria .sortListDesc .sortListIcon,
+.soria .sortListAsc .sortListIcon {
+	background:url('../../../dijit/themes/soria/images/arrows.png') no-repeat center center;
+	background-position:0px 0px; 
+}
+.soria .sortListDesc .sortListIcon {
+	background-position:-32px 0px; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,64 @@
+.sortListBody { margin:0; padding:0; background:#fff; }
+
+.soria .sortListBody li,
+.tundra .sortListBody li {
+	border-bottom:1px solid #b7b7b7;
+	padding:2px 2px 2px 5px;	
+}
+.sortListTitle {
+	cursor:pointer; 
+	padding:4px 4px 3px 4px;
+}
+.sortList { height:100%; width:100%; }
+.sortListBodyWrapper { 
+	border:1px solid #b7b7b7; 
+	overflow:auto; 
+	height:100%; 
+	cursor:pointer;
+} 
+
+.soria .sortListBodyWrapper {
+	border:1px solid #333; 
+}
+
+.soria .sortListItemOdd,
+.tundra .sortListItemOdd { background:#f2f5f9; }
+.tundra .sortListTitle {
+	background:#fafafa url('../../../dijit/themes/tundra/images/titleBarBg.gif') repeat-x top left; 
+	border:1px solid #bfbfbf;
+	border-bottom:0;
+}
+.soria .sortListTitle {
+	background:#4f8ce5 url('../../../dijit/themes/soria/images/gradientTopBg.png') repeat-x top left;
+	background-position:0px -1px; 
+	border:1px solid #333; 
+	border-bottom:0;
+	font-weight:bold;
+	color:#fff; 
+}
+
+.sortListItemSelected { background:#b7cdee !important; }
+.sortListItemHover { background:#ff6 !important; }
+
+.soria .sortListIcon,
+.tundra .sortListIcon { 
+	float:right;
+	height:16px; 
+	width:16px;
+}
+.tundra .sortListDesc .sortListIcon {
+	background:url('../../../dijit/themes/tundra/images/arrowDown.png') no-repeat center center;
+}
+.tundra .sortListAsc .sortListIcon {
+	background:url('../../../dijit/themes/tundra/images/arrowUp.png') no-repeat center center;
+}
+
+.soria .sortListDesc .sortListIcon,
+.soria .sortListAsc .sortListIcon {
+	background:url('../../../dijit/themes/soria/images/arrows.png') no-repeat center center;
+	background-position:0px 0px; 
+}
+
+.soria .sortListDesc .sortListIcon {
+	background-position:-32px 0px; 
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList/SortList.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+<div class="sortList" id="${id}">
+		<div class="sortListTitle" dojoAttachPoint="titleNode">
+		<div class="sortListIcon"></div>
+		<span dojoAttachPoint="focusNode">${title}</span>
+		</div>
+		<div class="sortListBodyWrapper" dojoAttachEvent="onmouseover: _set, onmouseout: _unset, onclick:_handleClick" dojoAttachPoint="bodyWrapper">
+		<ul dojoAttachPoint="containerNode" class="sortListBody"></ul>
+	</div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/SortList.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,151 @@
+if(!dojo._hasResource["dojox.widget.SortList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.widget.SortList"] = true;
+dojo.provide("dojox.widget.SortList");
+dojo.experimental("dojox.widget.SortList"); // level: prototype, designed for dijit.chat.demo
+
+dojo.require("dijit.layout._LayoutWidget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dojox.widget.SortList",
+	[dijit.layout._LayoutWidget, dijit._Templated],
+	{
+	// summary: A sortable unordered-list with a fixed header for use in dijit.demos.chat
+	//		for demonstration purposes only for now. feel free to make API suggestions
+	//		or fixes. 
+	//
+	// title: String 
+	//		The title in the header
+	title: "",
+	
+	// heading: String
+	//		In the event a parent container is expecting a title="" attribute, set it for the parent 
+	//		via title, and the title of this widget via heading="" ... assuming you want different 
+	//		titles for each. eg: TabContainer, AccordionContainer, etc. 
+	heading: "",
+
+	// descending: Boolean
+	//		Toggle sort order based on this value. 
+	descending: true,
+
+	// selected: Array
+	//		A list of the selected <li> 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:"<div class=\"sortList\" id=\"${id}\">\n\t\t<div class=\"sortListTitle\" dojoAttachPoint=\"titleNode\">\n\t\t<div class=\"sortListIcon\"></div>\n\t\t<span dojoAttachPoint=\"focusNode\">${title}</span>\n\t\t</div>\n\t\t<div class=\"sortListBodyWrapper\" dojoAttachEvent=\"onmouseover: _set, onmouseout: _unset, onclick:_handleClick\" dojoAttachPoint=\"bodyWrapper\">\n\t\t<ul dojoAttachPoint=\"containerNode\" class=\"sortListBody\"></ul>\n\t</div>\n</div>\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<bStr){ return -1; }
+		return 0;
+	},
+
+	setTitle: function(/* String */title){
+		// summary: Sets the widget title to a String
+		this.focusNode.innerHTML = this.title = title;
+	},
+
+	onChanged: function(){
+		// summary: stub function, passes the last changed item, and is fired after current state 
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/TimeSpinner.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/TimeSpinner.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/TimeSpinner.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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"
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/Toaster.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/Toaster.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/Toaster.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+ 

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/Toaster.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/Toaster.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster/Toaster.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+ 

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Toaster.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: '<div dojoAttachPoint="clipNode"><div dojoAttachPoint="containerNode" dojoAttachEvent="onclick:onSelect"><div dojoAttachPoint="contentNode"></div></div></div>',
+
+		// 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: "<hr></hr>",
+
+		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);
+		}
+	}
+);
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard/Wizard.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,9 @@
+<div class="dojoxWizard" dojoAttachPoint="wizardNode">
+    <div class="dojoxWizardContainer" dojoAttachPoint="containerNode"></div>
+    <div class="dojoxWizardButtons" dojoAttachPoint="wizardNav">
+        <button dojoType="dijit.form.Button" dojoAttachPoint="previousButton">${previousButtonLabel}</button>
+        <button dojoType="dijit.form.Button" dojoAttachPoint="nextButton">${nextButtonLabel}</button>
+        <button dojoType="dijit.form.Button" dojoAttachPoint="doneButton" style="display:none">${doneButtonLabel}</button>
+        <button dojoType="dijit.form.Button" dojoAttachPoint="cancelButton">${cancelButtonLabel}</button>
+    </div>
+</div>

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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:"<div class=\"dojoxWizard\" dojoAttachPoint=\"wizardNode\">\n    <div class=\"dojoxWizardContainer\" dojoAttachPoint=\"containerNode\"></div>\n    <div class=\"dojoxWizardButtons\" dojoAttachPoint=\"wizardNav\">\n        <button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"previousButton\">${previousButtonLabel}</button>\n        <button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"nextButton\">${nextButtonLabel}</button>\n        <button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"doneButton\" style=\"display:none\">${doneButtonLabel}</button>\n        <button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"cancelButton\">${cancelButtonLabel}</button>\n    </div>\n</div>\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();
+		}
+	}
+
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Next","done":"Done","previous":"Previous"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ar/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ar/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ar/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"تالي","done":"اتمام","previous":"سابق"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/cs/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/cs/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/cs/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Další","done":"Hotovo","previous":"Předchozí"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/da/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/da/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/da/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Næste","done":"Udført","previous":"Foregående"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/de/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/de/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/de/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Weiter","done":"Fertig","previous":"Zurück"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/el/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/el/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/el/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Επόμενο","done":"Ολοκλήρωση","previous":"Προηγούμενο"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/es/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/es/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/es/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Siguiente","done":"Terminado","previous":"Anterior"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fi/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fi/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fi/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Seuraava","done":"Valmis","previous":"Edellinen"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fr/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fr/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/fr/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Suivant","done":"Terminé","previous":"Précédent"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/he/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/he/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/he/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"הבא","done":"סיום","previous":"הקודם"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/hu/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/hu/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/hu/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Következő","done":"Kész","previous":"Előző"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/it/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/it/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/it/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Successivo","done":"Eseguito","previous":"Precedente"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ja/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ja/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ja/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"次へ","done":"完了","previous":"前へ"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ko/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ko/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ko/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"다음","done":"완료","previous":"이전"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nb/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nb/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nb/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Neste","done":"Ferdig","previous":"Forrige"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nl/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nl/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/nl/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Volgende","done":"Klaar","previous":"Vorige"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pl/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pl/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pl/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Dalej","done":"Gotowe","previous":"Wstecz"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Avançar","done":"Concluído","previous":"Voltar"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt-pt/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt-pt/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/pt-pt/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Seguinte","done":"Concluído","previous":"Anterior"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ru/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ru/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/ru/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Далее","done":"Готово","previous":"Назад"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/sv/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/sv/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/sv/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"Nästa","done":"Stäng","previous":"Föregående"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/tr/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/tr/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/tr/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"İleri","done":"Bitti","previous":"Geri"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"下一步","done":"完成","previous":"上一步"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh-tw/Wizard.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh-tw/Wizard.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/widget/nls/zh-tw/Wizard.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+({"next":"下一步","done":"完成","previous":"上一步"})
\ No newline at end of file

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/CompositeWire.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/CompositeWire.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/CompositeWire.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+			}
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/DataWire.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/DataWire.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/DataWire.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,53 @@
+-------------------------------------------------------------------------------
+DojoX Wire
+-------------------------------------------------------------------------------
+Version 1.0
+Release date: 05/29/2007
+-------------------------------------------------------------------------------
+Project state: stable
+-------------------------------------------------------------------------------
+Project authors
+	Jared Jurkiewicz (jared.jurkiewicz@xxxxxxxxx)
+-------------------------------------------------------------------------------
+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.<Class>.
+-------------------------------------------------------------------------------
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/TableAdapter.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/TableAdapter.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/TableAdapter.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/TextAdapter.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/TextAdapter.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/TextAdapter.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/TreeAdapter.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/TreeAdapter.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/TreeAdapter.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/Wire.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/Wire.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/Wire.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+			}
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/XmlWire.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/XmlWire.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/XmlWire.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/_base.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/_base.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/_base.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+	}
+};
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/TableContainer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: "<table class='tablecontainer'><tbody dojoAttachPoint='tableContainer'></tbody></table>",
+	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);
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/WidgetRepeater.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/WidgetRepeater.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/WidgetRepeater.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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: "<div class='WidgetRepeater' dojoAttachPoint='repeaterNode'></div>",
+	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); }
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/countries.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/countries.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/countries.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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' }
+]}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ActionChaining.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ActionChaining.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ActionChaining.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,108 @@
+<!--
+	This file demonstrates how the dojox.wire code can be used to do declarative
+	wiring of events.  Specifically, it shows how you can chain actions together
+	in a sequence.  In this case the setting of a value on one textbox triggers a 
+	copy over to another textbox.  That in turn triggers yet another copy to another
+	text box.
+-->
+<html>
+<head>
+	<title>Sample Action Chaining</title>
+	<style type="text/css">
+
+		@import "../../../../dijit/themes/tundra/tundra.css";
+		@import "../../../../dojo/resources/dojo.css";
+		@import "../../../../dijit/tests/css/dijitTests.css";
+		@import "../TableContainer.css";
+
+		.splitView {
+			width: 90%;
+			height: 90%;
+			border: 1px solid #bfbfbf;
+			border-collapse: separate;
+		}
+	</style>
+
+	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dojox.wire");
+		dojo.require("dojox.wire.ml.Invocation");
+		dojo.require("dojox.wire.ml.DataStore");
+		dojo.require("dojox.wire.ml.Transfer");
+		dojo.require("dojox.wire.ml.Data");
+		dojo.require("dijit.form.TextBox");
+	</script>
+</head>
+
+<body class="tundra">
+
+	<!-- Layout -->
+	<font size="3"><b>Demo of Chaining Actions:</b></font><br/><br/>
+	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
+	<br/>
+	<br/>
+	<table>
+		<tr>
+			<td>
+				<div dojoType="dijit.form.TextBox" id="inputField" value="" size="50"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<div dojoType="dijit.form.TextBox" id="targetField1" value="" disabled="true" size="50"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<div dojoType="dijit.form.TextBox" id="targetField2" value="" disabled="true" size="50"></div>
+			</td>
+		</tr>
+	</table>
+
+
+	<!-------------------------------- Using dojox.wire, declaratively wire up the widgets. --------------------------->
+
+	<!--
+		This is an example of using the declarative data value definition.
+		These are effectively declarative variables to act as placeholders
+		for data values.
+	-->
+	<div dojoType="dojox.wire.ml.Data"
+		id="data">
+		<div dojoType="dojox.wire.ml.DataProperty"
+			name="tempData"
+			value="">
+		</div>
+	</div>
+
+	<!-- 
+		Whenever a key is entered into the textbox, copy the value somewhere, then invoke a method on another widget, in this case
+		on just another text box.
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		id="action1"
+		trigger="inputField"
+		triggerEvent="onkeyup">
+		<div dojoType="dojox.wire.ml.Invocation" object="inputField"    method="getValue" result="data.tempData"></div>
+		<div dojoType="dojox.wire.ml.Invocation" id="targetCopy" object="targetField1"  method="setValue" parameters="data.tempData"></div>
+	</div>    
+
+	<!-- 
+		Whenever the primary cloning invocation completes, invoke a secondary cloning action.
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		id="action2"
+		trigger="targetCopy"
+		triggerEvent="onComplete">
+		<!--
+			Note that this uses the basic 'property' form of copying the property over and setting it.  The Wire
+			code supports both getX and setX functions of setting a property as well as direct access.  It first looks
+			for the getX/setX functions and if present, uses them.  If missing, it will just do direct access.  Because
+			of the standard getValue/setValue API of dijit form widgets, these transfers work really well and are very compact.   
+		-->
+		<div dojoType="dojox.wire.ml.Transfer" source="targetField1.value" target="targetField2.value"></div>
+	</div>    
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ActionWiring.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ActionWiring.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ActionWiring.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,142 @@
+<!--
+  This file demonstrates how the dojox.wire code can be used to do declarative
+  wiring of events on one item to trigger event on other widgets.  It also shows
+  how you can use the Transfer object to morph data values from one format to 
+  another.  In this specific case, it maps the values from a dojo.data Datastore
+  item into values stored in a JavaScript Array, which is the format required for
+  the addRow method of the demonstration TableContainer.
+
+  Note that this demo expects dojo, digit, and dojox to all be peers in the same directory
+  in order for it to execute.
+-->
+<html>
+<head>
+	<title>Sample declarative data binding</title>
+	<style type="text/css">
+
+		@import "../../../../dijit/themes/tundra/tundra.css";
+		@import "../../../../dojo/resources/dojo.css";
+		@import "../../../../dijit/tests/css/dijitTests.css";
+		@import "../TableContainer.css";
+
+		.splitView {
+			width: 90%;
+			height: 90%;
+			border: 1px solid #bfbfbf;
+			border-collapse: separate;
+		}
+	</style>
+
+	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dojox.wire.ml.Invocation");
+		dojo.require("dojox.wire.ml.DataStore");
+		dojo.require("dojox.wire.ml.Transfer");
+
+		dojo.require("dijit.layout.SplitContainer");
+		dojo.require("dijit.layout.LayoutContainer");
+		dojo.require("dijit.layout.ContentPane");
+		dojo.require("dijit.form.Button");
+		dojo.require("dijit.form.TextBox");
+
+		dojo.require("dojo.data.ItemFileReadStore");
+		dojo.require("dojox.wire");
+		dojo.require("dojox.wire.demos.TableContainer");
+
+		//Toplevel JS Object to contain a few basics for us, such as the request to pass to the store and a stub onItem function
+		// to trap on for triggering other events.
+		dataHolder = {
+			//Simple object definition to get all items and sort it by the attribute 'type'.
+			request: {query: {name: "*"}, onItem: function(item, req){}, sort: [{attribute: "type"}]},
+			//Spot to store off data values as they're generated by the declarative binding.
+			result: null
+		};
+
+	</script>
+</head>
+
+<body class="tundra">
+
+	<!-- The following is the basic layout.  A split container with a button and a text field.  Data will be displayed on the right. -->
+	<div dojoType="dijit.layout.SplitContainer"
+		orientation="horizontal"
+		sizerWidth="7"
+		activeSizing="true"
+		class="splitView">
+		<div dojoType="dijit.layout.ContentPane" sizeMin="50" sizeShare="50">
+			<font size="3"><b>Demo Searcher (Searches on Attribute 'name'):</b></font><br/><br/>
+			<b>Usage:</b><br/>
+			Enter the name you want to search the store for.  Wildcards * (multiple character), and ? (single character), are allowed.
+			<br/>
+			<br/>
+			<table style="width: 90%;">
+				<tr>
+					<td align="left">
+						<div dojoType="dijit.form.Button" jsId="searchButton">Search Datastore</div>
+					</td>
+					<td align="right">
+						<div dojoType="dijit.form.TextBox" jsId="inputField" value="*"></div>
+					</td>
+				</tr>
+			</table>
+		</div>
+		<div dojoType="dijit.layout.ContentPane" sizeMin="50" sizeShare="50">
+			<div class="dataTable" dojoType="dojox.wire.demos.TableContainer" jsId="dataTable" headers="Name,Location Type"></div>
+		</div>
+	</div>
+
+
+	<!-------------------------------- Using dojox.wire, declaratively wire up the widgets. --------------------------->
+
+	<!-- The store that is queried in this demo -->    
+	<div dojoType="dojo.data.ItemFileReadStore"
+		jsId="DataStore1"
+		url="countries.json">
+	</div>
+
+	<!-- 
+		When the search button is clicked, clear existing rows from table, 
+		Then invoke the fetch to repopulate the table.
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="searchButton"
+		triggerEvent="onClick">
+		<div dojoType="dojox.wire.ml.Invocation" object="dataTable"  method="clearTable"></div>
+		<div dojoType="dojox.wire.ml.Invocation" object="DataStore1" method="fetch" parameters="dataHolder.request"></div>
+	</div>    
+
+	<!-- 
+		Link existing of the text box to transfering the search string to the query param.
+		We are wiring the value of TextBox value of the widget to the name property of our request
+		object.  The copy of values to the search should occur on each keyup event (each keypress)
+	 -->
+	<div dojoType="dojox.wire.ml.Transfer"
+		trigger="inputField" triggerEvent="onkeyup"
+		source="inputField.textbox.value" 
+		target="dataHolder.request.query.name">
+	</div>
+
+	<!-- 
+	  On the call of the onItem function of 'dataHolder', trigger a binding/mapping of the
+	  item's attribute 'name' and 'type' attributes to specific columns in an array.  Note here that since
+	  sourceStore is set, it treats the arguments as items from that store and accesses the attributes
+	  appropriately.  In this case 'name' becomes array entry 0, type, array entry 1, and so on.
+
+	  Then take the result of the data mapping and pass it into the invoke of the addRow function on the
+	  TableContainer widget.
+	-->  
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="dataHolder.request" triggerEvent="onItem">
+		<div dojoType="dojox.wire.ml.Transfer"
+			source="arguments[0]" sourceStore="DataStore1"
+			target="dataHolder.result">
+			<div dojoType="dojox.wire.ml.ColumnWire" attribute="name"></div>
+			<div dojoType="dojox.wire.ml.ColumnWire" attribute="type"></div>
+		</div>
+		<div dojoType="dojox.wire.ml.Invocation"
+			object="dataTable" method="addRow" parameters='dataHolder.result'>
+		</div>
+	</div>         
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_BasicChildWire.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_BasicChildWire.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_BasicChildWire.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,78 @@
+<!--
+	This file demonstrates how the dojox.wire code can be used to do declarative
+	wiring of properties/attributes of some object to the properties/attributes of
+	another object.  It specifically uses the Child (Composite) wire type to perform
+	the mapping.
+
+	Note that this demo expects dojo, digit, and dojox to all be peers in the same directory
+	in order for it to execute.
+-->
+<html>
+	<head>
+	<title>Sample Composite (Child) Wire usage.</title>
+		<style type="text/css">
+			@import "../../../../dijit/themes/tundra/tundra.css";
+			@import "../../../../dojo/resources/dojo.css";
+			@import "../../../../dijit/tests/css/dijitTests.css";
+		</style>
+
+		<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+		<script type="text/javascript">
+			dojo.require("dojo.parser");
+			dojo.require("dijit.form.Button");
+			dojo.require("dojo.data.ItemFileReadStore");
+			dojo.require("dojox.wire.ml.Invocation");
+			dojo.require("dojox.wire.ml.DataStore");
+			dojo.require("dojox.wire.ml.Transfer");
+			dojo.require("dojox.wire");
+			dojo.require("dojox.wire.demos.WidgetRepeater");
+
+			dataHolder = {
+				request: {onItem: function(item){}},
+				result: null
+			};
+		</script>
+	</head>
+	<body class="tundra">
+		<!-- 
+			On load of the page, invoke the fetch method of the object 'DataStore1', 
+			get its parameters from the JS object 'sample.request
+		-->     
+		<div dojoType="dojox.wire.ml.Invocation"
+			triggerEvent="onLoad"
+			object="DataStore1" method="fetch" parameters="dataHolder.request">
+		</div>
+
+		<!-- 
+			The store that is queried in this demo 
+		-->    
+		<div dojoType="dojo.data.ItemFileReadStore"
+			jsId="DataStore1"
+			url="countries.json">
+		</div>
+
+		<!--
+			Simple container widget for creating a 'list' of some set of widgets
+			As defined by the widget type it contains.
+		-->
+		<div dojoType="dojox.wire.demos.WidgetRepeater"
+			widget="dijit.form.Button" jsId="r1">
+		</div>
+
+		<!-- 
+			On the call of the onItem function of 'sample', trigger a binding/mapping of the
+			item's attribute 'name' to the target object property: dataHolder.result.caption
+			Then invoke the WidgetRepeater (r1)'s createNew method, using the parameters from
+			dataHolder.result.
+		-->  
+		<div dojoType="dojox.wire.ml.Action"
+			trigger="dataHolder.request" triggerEvent="onItem">
+			<div dojoType="dojox.wire.ml.Transfer"
+				source="arguments[0]" sourceStore="DataStore1"
+				target="dataHolder.result">
+				<div dojoType="dojox.wire.ml.ChildWire" name="label" attribute="name"></div>
+			</div>
+			<div dojoType="dojox.wire.ml.Invocation" object="r1" method="createNew" parameters='dataHolder.result'></div>
+		</div>    
+	</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_BasicColumnWiring.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_BasicColumnWiring.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_BasicColumnWiring.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,90 @@
+<!--
+	This file demonstrates how the dojox.wire code can be used to do declarative
+	wiring of events on one item to trigger event on other items.  It also shows
+	how you can use the Transfer object to morph data values from one format to 
+	another.  In this specific case, it maps the values from a dojo.data Datastore
+	item into values stored in a JavaScript Array, which is the format required for
+	the addRow method of the demonstration TableContainer.
+
+	Note that this demo expects dojo, digit, and dojox to all be peers in the same directory
+	in order for it to execute.
+-->
+<html>
+<head>
+	<title>Sample Declarative Data Binding using ColumnWire</title>
+	<style type="text/css">
+		@import "../../../../dijit/themes/tundra/tundra.css";
+		@import "../../../../dojo/resources/dojo.css";
+		@import "../../../../dijit/tests/css/dijitTests.css";
+		@import "../TableContainer.css";
+	</style>
+
+	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dojox.wire.ml.Invocation");
+		dojo.require("dojox.wire.ml.DataStore");
+		dojo.require("dojox.wire.ml.Transfer");
+
+		dojo.require("dijit._Widget");
+		dojo.require("dijit._Templated");
+		dojo.require("dojo.data.ItemFileReadStore");
+		dojo.require("dojox.wire");
+		dojo.require("dojox.wire.demos.TableContainer");
+
+		//Toplevel JS Object to contain a few basics for us, such as the request to pass to the store and a stub onItem function
+		// to trap on for triggering other events.
+		dataHolder = {
+			//Simple object definition to get all items and sort it by the attribute 'type'.
+			request: {onItem: function(item){}, sort: [{attribute: "type"}]},
+			//Spot to store off data values as they're generated by the declarative binding.
+			result: null
+		};
+	</script>
+</head>
+
+<body class="tundra">
+	<!-- 
+		The store that is queried in this demo 
+	-->    
+	<div dojoType="dojo.data.ItemFileReadStore"
+		jsId="DataStore1"
+		url="countries.json">
+	</div>
+
+	<!-- 
+		On load of the page, invoke the fetch method of the object 'DataStore1', 
+		get its parameters from the JS object 'sample.request
+	-->     
+	<div dojoType="dojox.wire.ml.Invocation"
+		triggerEvent="onLoad"
+		object="DataStore1" method="fetch" parameters="dataHolder.request"></div>
+
+	<!--
+		Simple container widget for creating a 'table from rows defined by an array
+	-->    
+	<div dojoType="dojox.wire.demos.TableContainer" jsId="r1" headers="Name,Location Type"></div>
+
+	<!-- 
+		On the call of the onItem function of 'dataHolder', trigger a binding/mapping of the
+		item's attribute 'name' and 'type' attributes to specific columns in an array.  Note here that since
+		sourceStore is set, it treats the arguments as items from that store and accesses the attributes
+		appropriately.  In this case 'name' becomes array entry 0, type, array entry 1, and so on.
+
+		Then take the result of the data mapping and pass it into the invoke of the addRow function on the
+		TableContainer widget.
+	-->  
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="dataHolder.request" triggerEvent="onItem">
+		<div dojoType="dojox.wire.ml.Transfer"
+			source="arguments[0]" sourceStore="DataStore1"
+			target="dataHolder.result">
+			<div dojoType="dojox.wire.ml.ColumnWire" attribute="name"></div>
+			<div dojoType="dojox.wire.ml.ColumnWire" attribute="type"></div>
+		</div>
+		<div dojoType="dojox.wire.ml.Invocation"
+			object="r1" method="addRow" parameters='dataHolder.result'>
+		</div>
+	</div>         
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ConditionalActions.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ConditionalActions.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_ConditionalActions.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,221 @@
+<!--
+	This file demonstrates how the dojox.wire code can be used to do declarative
+	wiring of events.  Specifically, it shows how you can wire actions to set values 
+	across to other widgets, but only if certain conditions are met.
+-->
+<html>
+<head>
+	<title>Conditional Actions Demo</title>
+	<style type="text/css">
+
+		@import "../../../../dijit/themes/tundra/tundra.css";
+		@import "../../../../dojo/resources/dojo.css";
+		@import "../../../../dijit/tests/css/dijitTests.css";
+		@import "../TableContainer.css";
+
+		.splitView {
+			width: 90%;
+			height: 90%;
+			border: 1px solid #bfbfbf;
+			border-collapse: separate;
+		}
+
+		b {
+			float: left;
+		}
+
+		.rJustified {
+			float: right;
+		}
+
+	</style>
+
+	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dojo.data.ItemFileReadStore");
+		dojo.require("dojox.wire");
+		dojo.require("dojox.wire.ml.Invocation");
+		dojo.require("dojox.wire.ml.DataStore");
+		dojo.require("dojox.wire.ml.Transfer");
+		dojo.require("dojox.wire.ml.Data");
+		dojo.require("dijit.form.TextBox");
+		dojo.require("dijit.form.CheckBox");
+		dojo.require("dijit.form.ComboBox");
+	</script>
+</head>
+
+<body class="tundra">
+
+	<!-- Layout -->
+	<font size="3"><b>Demo of Conditional Actions:</b></font><br/><br/>
+	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.
+	<br/>
+	<br/>
+	<div dojoType="dojo.data.ItemFileReadStore" url="states.json" jsId="statesStore"></div>
+	<table width="100%">
+		<tr>
+			<td colspan="2" align="center">
+				Use Same Address: <div dojoType="dijit.form.CheckBox" id="useSameAddress" checked="true"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<b>Billing Address</b>
+			</td>
+			<td>
+				<b>Shipping Address</b>
+			</td>
+		</tr>
+
+		<tr>
+			<td>
+				<b>Name:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="BillingName" name="billingname" value=""  size="50"></div>
+			</td>
+			<td>
+				<b>Name:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="ShippingName" name="shippingname" value="" disabled="true" size="50"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<b>Address 1:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="BillingAddress1" name="billingaddress1" value=""  size="50"></div>
+			</td>
+			<td>
+				<b>Address 1:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="ShippingAddress1" name="shippingaddress1" value="" disabled="true" size="50"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<b>Address 2:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="BillingAddress2" name="billingaddress2" value=""  size="50"></div>
+			</td>
+			<td>
+				<b>Address 2:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="ShippingAddress2" name="shippingaddress2" value="" disabled="true" size="50"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<b>City:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="BillingCity" name="billingcity" value=""  size="50"></div>
+			</td>
+			<td>
+				<b>City:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="ShippingCity" name="shippingcity" value="" disabled="true" size="50"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<b>State:</b> <div class="rJustified" dojoType="dijit.form.ComboBox" searchAttr="name" id="BillingState" name="billingstate" value=""   store="statesStore" size="46"></div>
+			</td>
+			<td>
+				<b>State:</b> <div class="rJustified" dojoType="dijit.form.ComboBox" searchAttr="name" id="ShippingState" name="shippingstate" value="" store="statesStore" disabled="true" size="46"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<b>Zip code:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="BillingZip" name="billingzip" value=""  size="50"></div>
+			</td>
+			<td>
+				<b>Zip code:</b> <div class="rJustified" dojoType="dijit.form.TextBox" id="ShippingZip" name="shippingzip" value="" disabled="true" size="50"></div>
+			</td>
+		</tr>
+	</table>
+
+
+	<!-------------------------------- Using dojox.wire, declaratively wire up the widgets. --------------------------->
+
+	<!--
+		This is a simple data map so that the attributes we support modifying on ComboBox, TextField, etc, are lookupable.
+		since steAttribute(attr, value), replaced the single attribute setDisabled
+	-->
+	<div dojoType="dojox.wire.ml.Data"
+		id="attributesMap">
+		<div dojoType="dojox.wire.ml.DataProperty"
+			name="disabled"
+			value="disabled"></div>
+	</div>
+
+
+	<!-- 
+		Enable/disable the Right hand side of the shipping address view based on the checkbox events. 
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="useSameAddress"
+		triggerEvent="setChecked">
+		<!--
+			Trigger a setting of the Shipping fields' input state based on the state of the checkbox.
+		-->
+		<div dojoType="dojox.wire.ml.Invocation" object="ShippingName"    method="setAttribute" parameters="attributesMap.disabled, arguments[0]"></div>
+		<div dojoType="dojox.wire.ml.Invocation" object="ShippingAddress1"    method="setAttribute" parameters="attributesMap.disabled, arguments[0]"></div>
+		<div dojoType="dojox.wire.ml.Invocation" object="ShippingAddress2"    method="setAttribute" parameters="attributesMap.disabled, arguments[0]"></div>
+		<div dojoType="dojox.wire.ml.Invocation" object="ShippingCity"    method="setAttribute" parameters="attributesMap.disabled, arguments[0]"></div>
+		<div dojoType="dojox.wire.ml.Invocation" object="ShippingState"    method="setAttribute" parameters="attributesMap.disabled, arguments[0]"></div>
+		<div dojoType="dojox.wire.ml.Invocation" object="ShippingZip"    method="setAttribute" parameters="attributesMap.disabled, arguments[0]"></div>
+	</div>    
+
+	<!-- 
+		Clone the values of form fields while typing based on the setting of the checkbox.
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="BillingName"
+		triggerEvent="onkeyup">
+		<div dojoType="dojox.wire.ml.ActionFilter" required="useSameAddress.checked" requiredValue="true" type="boolean"></div>        
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingName.value" target="ShippingName.value"></div>
+	</div>    
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="BillingAddress1"
+		triggerEvent="onkeyup">
+		<div dojoType="dojox.wire.ml.ActionFilter" required="useSameAddress.checked" requiredValue="true" type="boolean"></div>        
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingAddress1.value" target="ShippingAddress1.value"></div>
+	</div>    
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="BillingAddress2"
+		triggerEvent="onkeyup">
+		<div dojoType="dojox.wire.ml.ActionFilter" required="useSameAddress.checked" requiredValue="true" type="boolean"></div>        
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingAddress2.value" target="ShippingAddress2.value"></div>
+	</div>
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="BillingCity"
+		triggerEvent="onkeyup">
+		<div dojoType="dojox.wire.ml.ActionFilter" required="useSameAddress.checked" requiredValue="true" type="boolean"></div>        
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingCity.value" target="ShippingCity.value"></div>
+	</div>    
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="BillingState"
+		triggerEvent="onChange">
+		<div dojoType="dojox.wire.ml.ActionFilter" required="useSameAddress.checked" requiredValue="true" type="boolean"></div>        
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingState.value" target="ShippingState.value"></div>
+	</div>    
+
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="BillingZip"
+		triggerEvent="onkeyup">
+		<div dojoType="dojox.wire.ml.ActionFilter" required="useSameAddress.checked" requiredValue="true" type="boolean"></div>        
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingZip.value" target="ShippingZip.value"></div>
+	</div>    
+
+
+	<!-- 
+		Clone the values of form fields from billing over to shipping  over if the 
+		useSameAddress checkbox is set back to true.
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="useSameAddress"
+		triggerEvent="setChecked">
+		<div dojoType="dojox.wire.ml.ActionFilter" required="arguments[0]" requiredValue="true" type="boolean"></div>        
+
+		<!--
+			Note that this uses the basic 'property' form of copying the property over and setting it.  The Wire
+			code supports both getX and setX functions of setting a property as well as direct access.  It first looks
+			for the getX/setX functions and if present, uses them.  If missing, it will just do direct access.  Because
+			of the standard getValue/setValue API of dijit form widgets, transfers work well and are compact.   
+		-->
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingName.value" target="ShippingName.value"></div>
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingAddress1.value" target="ShippingAddress1.value"></div>
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingAddress2.value" target="ShippingAddress2.value"></div>
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingCity.value" target="ShippingCity.value"></div>
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingState.value" target="ShippingState.value"></div>
+		<div dojoType="dojox.wire.ml.Transfer" source="BillingZip.value" target="ShippingZip.value"></div>
+	</div>
+
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_FlickrStoreWire.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_FlickrStoreWire.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_FlickrStoreWire.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,281 @@
+<!--
+  This file is a demo of the FlickrStore, a simple wrapper to the public feed service
+  of Flickr.  This just does very basic queries against Flickr and loads the results
+  into a list viewing widget.
+-->
+<html>
+<head>
+	<title>Demo of FlickrStore</title>
+	<style type="text/css">
+
+		@import "../../../../dijit/themes/tundra/tundra.css";
+		@import "../../../../dojo/resources/dojo.css";
+		@import "../../../../dijit/tests/css/dijitTests.css";
+		@import "./flickrDemo.css";
+	</style>
+
+	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dijit.form.TextBox");
+		dojo.require("dijit.form.Button");
+		dojo.require("dijit.form.ComboBox");
+		dojo.require("dijit.form.NumberSpinner");
+		dojo.require("dojox.data.FlickrStore");
+		dojo.require("dojox.wire.ml.Invocation");
+		dojo.require("dojox.wire.ml.Transfer");
+		dojo.require("dojox.wire.ml.Data");
+		dojo.require("dojox.wire");
+		dojo.require("dojox.data.demos.widgets.FlickrViewList");
+		dojo.require("dojox.data.demos.widgets.FlickrView");
+
+		//Toplevel JS Object to contain a few basics for us, such as the request to pass to the store and a stub onItem and onComplete function
+		// to trap on for triggering other events.
+		var dataHolder = {
+			//Simple stub datastore request
+			request: {query: {}, onItem: function(item, req){}, onComplete: function(items, req){}},
+			
+			//Spot to store off data values as they're generated by the declarative binding.
+			result: null
+		};
+
+		//Function to convert the input from a widget into a comma separated list.
+		//that is the format of the store parameter.
+		var tagsInputConverter = function(tags){
+			if(tags && tags !== ""){
+				var tagsArray = tags.split(" ");
+				tags = "";
+				for(var i = 0; i < tagsArray.length; i++){
+					tags = tags + tagsArray[i];
+					if(i < (tagsArray.length - 1)){
+						tags += ","
+					}
+				}
+			}
+			return tags
+		}
+
+	</script>
+</head>
+
+<body class="tundra">
+	<h1>
+		DEMO:  FlickrStore Search
+	</h1>
+	<hr>
+	<h3>
+		Description:
+	</h3>
+	<p>
+		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().
+	</p>
+	<p>
+		For fun, search on the 3dny tag!
+	</p>
+
+	<blockquote>
+
+	<!--
+		Layout.
+	-->
+	<table>
+		<tbody>
+			<tr>
+				<td>
+					<b>Status:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="status" jsId="statusWidget" disabled="true"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>ID:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="userid" jsId="idWidget"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Tags:</b>
+				</td>
+				<td>
+					<div dojoType="dijit.form.TextBox" size="50" id="tags" jsId="tagsWidget" value="3dny"></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Tagmode:</b>
+				</td>
+				<td>
+					<select id="tagmode"
+							jsId="tagmodeWidget"
+							dojoType="dijit.form.ComboBox"
+							autocomplete="false"
+							value="any"
+					>
+						<option>any</option>
+						<option>all</option>
+					</select>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<b>Number of Pictures:</b>
+				</td>
+				<td>
+					<div   
+						id="count"
+						jsId="countWidget"
+						dojoType="dijit.form.NumberSpinner"
+						value="20"
+						constraints="{min:1,max:20,places:0}" 
+					></div>
+				</td>
+			</tr>
+			<tr>
+				<td>
+				</td>
+				<td>
+					<div dojoType="dijit.form.Button" label="Search" id="searchButton" jsId="searchButtonWidget"></div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+    </blockquote>
+	<!--
+		The store instance used by this demo.
+	-->
+	<div dojoType="dojox.data.FlickrStore" jsId="flickrStore" label="title"></div>
+	<div dojoType="dojox.data.demos.widgets.FlickrViewList" id="flickrViews" jsId="flickrViewsWidget"></div>
+
+	<!-------------------------------- Using dojox.wire, declaratively wire up the widgets. --------------------------->
+
+
+	<!--
+		This is an example of using the declarative data value definition.
+		These are effectively declarative variables to act as placeholders
+		for data values.
+	-->
+	<div dojoType="dojox.wire.ml.Data"
+		id="messageData"
+		jsId="messageData">
+		<div dojoType="dojox.wire.ml.DataProperty"
+			name="processingStart"
+			value="PROCESSING REQUEST">
+		</div>
+		<div dojoType="dojox.wire.ml.DataProperty"
+			name="processingDone"
+			value="PROCESSING COMPLETE">
+		</div>
+	</div>
+
+
+	<!-- 
+		When the search button is clicked, do the following in order:
+		1.)  Map the widget values over to the request properties.
+		2.)  Clear existing rows from table, 
+		3.)  Set the status to processing
+		4.)  Invoke the fetch to repopulate the table.
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="searchButtonWidget"
+		triggerEvent="onClick">
+		
+		<!-- 
+			Read in the values from the widgets and bind them to the appropriate data locations 
+			For basic properties, you could use transfer directly, but since the text boxes are
+			designed to be accessed through getValue/setValue, it's better to do these as 
+			Invocations on widget methods.
+		-->
+		<div dojoType="dojox.wire.ml.Invocation" 
+			 object="idWidget" 
+			 method="getValue"
+			 result="dataHolder.request.query.id">
+		</div>
+		
+
+		<!--
+		   For the tags, we need to get the value and then perform a conversion on the result
+		   This is done by doing an invoke, then a transfer through a converter.
+		-->
+		<div dojoType="dojox.wire.ml.Invocation" 
+			 object="tagsWidget" 
+			 method="getValue"
+			 result="dataHolder.request.query.tags">
+		</div>
+		<div dojoType="dojox.wire.ml.Transfer"
+			source="dataHolder.request.query.tags"
+			target="dataHolder.request.query.tags"
+			converter="tagsInputConverter">
+		</div>
+
+		<div dojoType="dojox.wire.ml.Invocation" 
+			 object="tagmodeWidget" 
+			 method="getValue"
+			 result="dataHolder.request.query.tagmode">
+		</div>
+
+		<div dojoType="dojox.wire.ml.Invocation" 
+			 object="countWidget" 
+			 method="getValue"
+			 result="dataHolder.request.count">
+		</div>
+
+
+		<!-- Now invoke the actions in order. -->
+		<div dojoType="dojox.wire.ml.Invocation" object="flickrViewsWidget" method="clearList"></div>
+		<div dojoType="dojox.wire.ml.Invocation" object="statusWidget" method="setValue" parameters="messageData.processingStart"></div>
+		<div dojoType="dojox.wire.ml.Invocation" object="flickrStore" method="fetch" parameters="dataHolder.request"></div>
+	</div>    
+
+	<!-- 
+		When the fetch processing finishes (onComplete is called), then set status to complete.
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="dataHolder.request"
+		triggerEvent="onComplete">
+		<div dojoType="dojox.wire.ml.Invocation" object="statusWidget" method="setValue" parameters="messageData.processingDone"></div>
+	</div>    
+
+
+	<!-- 
+		On the call of the onItem function of 'dataHolder', trigger a binding/mapping of the
+		item's attributes to the requires parameters that are passed into addView.  In this case
+		FlikrItemAttribute  ->  viewItemParam
+		title                   title
+		imageUrlSmall           iconUrl
+		imageUrl                imageUrl
+		author                  author
+
+		Then take the result of the data mapping and pass it into the invoke of the addView function on the
+		FlickerViews widget.
+	-->  
+	<div dojoType="dojox.wire.ml.Action"
+		trigger="dataHolder.request" triggerEvent="onItem">
+		<div dojoType="dojox.wire.ml.Transfer"
+			source="arguments[0]" sourceStore="flickrStore"
+			target="dataHolder.result">
+			<!-- 
+				Map the attributes of the items to the property name defined 
+				in the wire on the object in the target 
+			-->
+			<div dojoType="dojox.wire.ml.ChildWire"
+				name="title" attribute="title"></div>
+			<div dojoType="dojox.wire.ml.ChildWire"
+				name="imageUrl" attribute="imageUrl"></div>
+			<div dojoType="dojox.wire.ml.ChildWire"
+				name="iconUrl" attribute="imageUrlSmall"></div>
+			<div dojoType="dojox.wire.ml.ChildWire"
+				name="author" attribute="author"></div>
+		</div>
+		<div dojoType="dojox.wire.ml.Invocation"
+			object="flickrViewsWidget" method="addView" parameters='dataHolder.result'>
+		</div>
+	</div>         
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_TopicWiring.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_TopicWiring.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/demo_TopicWiring.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,78 @@
+<!--
+	This file demonstrates how the dojox.wire code can be used to do declarative
+	wiring of events.  Specifically, it shows how you can publish and subscribe 
+	to topics.  In this case the setting of a value on one textbox triggers a 
+	publish of that value to a topic.  Another invoke is wired to fire when
+	values are published to that topic which is then displayed in another 
+	textbox.
+-->
+<html>
+<head>
+	<title>Sample Topic Wiring</title>
+	<style type="text/css">
+
+		@import "../../../../dijit/themes/tundra/tundra.css";
+		@import "../../../../dojo/resources/dojo.css";
+		@import "../../../../dijit/tests/css/dijitTests.css";
+		@import "../TableContainer.css";
+
+		.splitView {
+			width: 90%;
+			height: 90%;
+			border: 1px solid #bfbfbf;
+			border-collapse: separate;
+		}
+	</style>
+
+	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+	<script type="text/javascript">
+		dojo.require("dojo.parser");
+		dojo.require("dojox.wire");
+		dojo.require("dojox.wire.ml.Invocation");
+		dojo.require("dojox.wire.ml.DataStore");
+		dojo.require("dojox.wire.ml.Transfer");
+		dojo.require("dojox.wire.ml.Data");
+
+		dojo.require("dijit.form.TextBox");
+	</script>
+</head>
+
+<body class="tundra">
+
+	<!-- Layout -->
+	<font size="3"><b>Demo of Topic Wiring</b></font><br/><br/>
+	This demo shows how you can wire events to publish to a topic as well as recieve topic events
+	<br/>
+	<br/>
+	<table>
+		<tr>
+			<td>
+				<div dojoType="dijit.form.TextBox" jsId="inputField" value="" size="50"></div>
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<div dojoType="dijit.form.TextBox" jsId="targetField1" value="" disabled="true" size="50"></div>
+			</td>
+		</tr>
+	</table>
+
+
+	<!-------------------------------- Using dojox.wire, declaratively wire up the widgets. --------------------------->
+	
+	<!-- 
+		Whenever a key is entered into the textbox, publish the value of it to a topic.
+	-->
+	<div dojoType="dojox.wire.ml.Action"
+		id="action1"
+		trigger="inputField"
+		triggerEvent="onkeyup">
+		<div dojoType="dojox.wire.ml.Invocation" topic="sampleTopic"    parameters="inputField.value"></div>
+	</div>    
+
+	<!-- 
+		Whenever a value is published to a topic, set it as the value of the textbox by calling the setValue function.
+	-->
+	<div dojoType="dojox.wire.ml.Invocation" triggerTopic="sampleTopic" object="targetField1"    method="setValue" parameters="arguments[0]"></div>
+</body>
+</html>

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/flickrDemo.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/flickrDemo.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/flickrDemo.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/flickrDemo.css.commented.css
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/flickrDemo.css.commented.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/flickrDemo.css.commented.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+}
+

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/states.json
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/states.json	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/demos/markup/states.json	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Action.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Action.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Action.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Data.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Data.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Data.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/DataStore.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/DataStore.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/DataStore.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Invocation.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Invocation.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Invocation.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Service.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Service.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Service.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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 = "<?xml version=\"1.0\"?>"; // 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
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Transfer.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Transfer.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/Transfer.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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;
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/util.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/util.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire/ml/util.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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
+		}
+	}
+});
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/wire.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/wire.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/wire.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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");
+
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/xml/DomParser.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/xml/DomParser.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/xml/DomParser.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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=/<!ENTITY\s+([^"]*)\s+"([^"]*)">/g;
+	var reCData=/<!\[CDATA\[([\u0001-\uFFFF]*?)\]\]>/g;
+	var reComments=/<!--([\u0001-\uFFFF]*?)-->/g;
+	var trim=/^\s+|\s+$/g;
+	var normalize=/\s+/g;
+	var egt=/\&gt;/g;
+	var elt=/\&lt;/g;
+	var equot=/\&quot;/g;
+	var eapos=/\&apos;/g;
+	var eamp=/\&amp;/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; i<this.attributes.length; i++){
+			if(this.attributes[i].nodeName==name){
+				return this.attributes[i].nodeValue;
+			}
+		}
+		return null;
+	}
+	function getAttrNS(name, ns){
+		for(var i=0; i<this.attributes.length; i++){
+			if(this.ownerDocument._nsPaths[ns]==this.attributes[i].namespace
+				&&this.attributes[i].localName==name
+			){
+				return this.attributes[i].nodeValue;
+			}
+		}
+		return null;
+	}
+	//	note that you can only swap IDs using setAttribute, NOT with setAttributeNS.
+	function setAttr(name, val){
+		var old=null;
+		for(var i=0; i<this.attributes.length; i++){
+			if(this.attributes[i].nodeName==name){
+				old=this.attributes[i].nodeValue;
+				this.attributes[i].nodeValue=val;
+				break;
+			}
+		}
+		if(name=="id"){
+			if(old!=null){ this.ownerDocument._remove(old); }
+			this.ownerDocument._add(this);
+		}
+	}
+	function setAttrNS(name, val, ns){
+		for(var i=0; i<this.attributes.length; i++){
+			if(this.ownerDocument._nsPaths[ns]==this.attributes[i].namespace
+				&&this.attributes[i].localName==name
+			){
+				this.attributes[i].nodeValue=val;
+				return;
+			}
+		}
+	}
+
+	//	navigation
+	function prev(){
+		var p=this.parentNode;
+		if(p){
+			for(var i=0;i<p.childNodes.length;i++){
+				if(p.childNodes[i]==this&&i>0){
+					return p.childNodes[i-1];
+				}
+			}
+		}
+		return null;
+	}
+	function next(){
+		var p=this.parentNode;
+		if(p){
+			for(var i=0;i<p.childNodes.length;i++){
+				if(p.childNodes[i]==this&&(i+1)<p.childNodes.length){
+					return p.childNodes[i+1];
+				}
+			}
+		}
+		return null;
+	}
+
+	//	the main method.
+	this.parse=function(/* String */str){
+		var root=_doc();
+		if(str==null){ return root; }
+		if(str.length==0){ return root; }
+
+		//	preprocess custom entities
+		if(str.indexOf("<!ENTITY")>0){
+			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; i<eRe.length; i++){
+					str=str.replace(new RegExp(eRe[i].entity, "g"), eRe[i].expression);
+				}
+			}
+		}
+
+		//	pre-parse for CData, and tokenize.
+		var cdSections=[], cdata;
+		while((cdata=reCData.exec(str))!=null){ cdSections.push(cdata[1]); }
+		for(var i=0; i<cdSections.length; i++){ str=str.replace(cdSections[i], i); }
+		
+		//	pre-parse for comments, and tokenize.
+		var comments=[], comment;
+		while((comment=reComments.exec(str))!=null){ comments.push(comment[1]); }
+		for(i=0; i<comments.length; i++){ str=str.replace(comments[i], i); }
+
+		//	parse the document
+		var res, obj=root;
+		while((res=reTags.exec(str))!=null){
+			//	closing tags.
+			if(res[2].charAt(0)=="/"){
+				if(obj.parentNode){
+					obj=obj.parentNode;
+				}
+				var text=res[3];
+				if(text.length>0)
+					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<root.childNodes.length; i++){
+			var e=root.childNodes[i];
+			if(e.nodeType==nodeTypes.ELEMENT){
+				root.documentElement=e;
+				break;
+			}
+		}
+		return root;
+	};
+})();
+
+}

Added: branches/vhffs-design/vhffs-panel/js/dojox/xml/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/dojox/xml/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/dojox/xml/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,40 @@
+-------------------------------------------------------------------------------
+DojoX XML Utilities
+-------------------------------------------------------------------------------
+Version 0.1
+Release date: 05/30/2007	
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits 
+	Tom Trenka (ttrenka@xxxxxxxxx): DomParser
+	
+-------------------------------------------------------------------------------
+Project description
+
+The goal of DojoX XML Utilities is provide differing XML utilities for use
+in various places.  Currently this includes a native JS DomParser, but will
+most likely be expanded to include things as dealing with x-browser forks
+(like the Sarissa project), various DOM utilites, and more.
+-------------------------------------------------------------------------------
+Dependencies:
+
+DojoX XML relies only on the Dojo Base package system.
+-------------------------------------------------------------------------------
+Documentation
+
+None at the time of writing.  The only object is dojox.xml.DomParser (a singleton),
+which has one method: parse:
+
+dojox.xml.DomParser.parse(xmlString)
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/xml/*
+
+Install into the following directory structure:
+/dojox/xml/
+
+...which should be at the same level as your Dojo checkout.

Added: branches/vhffs-design/vhffs-panel/js/public.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/public.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/public.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,43 @@
+/*
+ *  Copyright (c) vhffs project and its contributors
+ *  All rights reserved.
+ * 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ * 
+ *  1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. Neither the name of vhffs 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.
+ */
+
+/**
+ * JS functions used in all the public part
+ */
+
+dojo.require('vhffs.Menu');
+
+
+
+dojo.addOnLoad(function() {
+	new vhffs.Menu(dojo.byId('left-menu'));
+});

Added: branches/vhffs-design/vhffs-panel/js/util/doh/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/util/doh/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/util/doh/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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.

Added: branches/vhffs-design/vhffs-panel/js/util/doh/README
===================================================================
--- branches/vhffs-design/vhffs-panel/js/util/doh/README	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/util/doh/README	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,12 @@
+DOH may be run standalone by issuing a command like the following:
+
+java -jar ../shrinksafe/custom_rhino.jar runner.js testModule=tests.colors
+
+where the testModule argument is optional and custom_rhino.jar is just a
+convenient copy of the Rhino JavaScript engine -- the custom patch is not
+required.
+
+Optional arguments include:
+ * dojoUrl - specifies the location of dojo.js
+ * testUrl - specifies a Javascript file to load with initialization code
+ * testModule - specifies a test module in the dojo package namespace

Added: branches/vhffs-design/vhffs-panel/js/util/doh/_browserRunner.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/util/doh/_browserRunner.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/util/doh/_browserRunner.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,465 @@
+if(window["dojo"]){
+	dojo.provide("doh._browserRunner");
+}
+
+// FIXME: need to add prompting for monkey-do testing
+// FIXME: need to implement progress bar
+// FIXME: need to implement errors in progress bar
+
+(function(){
+	if(window.parent == window){
+		// we're the top-dog window.
+
+		// borrowed from Dojo, etc.
+		var byId = function(id){
+			return document.getElementById(id);
+		}
+
+		var _addOnEvt = function(	type,		// string
+									refOrName,	// function or string
+									scope){		// object, defaults is window
+
+			if(!scope){ scope = window; }
+
+			var funcRef = refOrName;
+			if(typeof refOrName == "string"){
+				funcRef = scope[refOrName];
+			}
+			var enclosedFunc = function(){ return funcRef.apply(scope, arguments); };
+
+			if((window["dojo"])&&(type == "load")){
+				dojo.addOnLoad(enclosedFunc);
+			}else{
+				if(window["attachEvent"]){
+					window.attachEvent("on"+type, enclosedFunc);
+				}else if(window["addEventListener"]){
+					window.addEventListener(type, enclosedFunc, false);
+				}else if(document["addEventListener"]){
+					document.addEventListener(type, enclosedFunc, false);
+				}
+			}
+		};
+
+		//
+		// Over-ride or implement base runner.js-provided methods
+		//
+		var _logBacklog = [];
+		var sendToLogPane = function(args, skip){
+			var msg = "";
+			for(var x=0; x<args.length; x++){
+				msg += " "+args[x];
+			}
+			// workarounds for IE. Wheeee!!!
+			msg = msg.replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");
+			msg = msg.replace(" ", "&nbsp;");
+			msg = msg.replace("\n", "<br>&nbsp;");
+			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<arguments.length; x++){
+					msg += " "+arguments[x];
+				}
+				sendToLogPane([msg]);
+				opera.postError("DEBUG:"+msg);
+			}
+		}else if(window["console"]){
+			if(console.info){
+				doh.debug = function(){
+					sendToLogPane.call(window, arguments);
+					console.debug.apply(console, arguments);
+				}
+			}else{
+				doh.debug = function(){
+					var msg = "";
+					for(var x=0; x<arguments.length; x++){
+						msg += " "+arguments[x];
+					}
+					sendToLogPane([msg]);
+					console.log("DEBUG:"+msg);
+				}
+			}
+		}else{
+			doh.debug = function(){
+				sendToLogPane.call(window, arguments);
+			}
+		}
+
+		var loaded = false;
+		var groupTemplate = null;
+		var testTemplate = null;
+
+		var groupNodes = {};
+
+		var _groupTogglers = {};
+
+		var _getGroupToggler = function(group, toggle){
+			if(_groupTogglers[group]){ return _groupTogglers[group]; }
+			var rolledUp = true;
+			return _groupTogglers[group] = function(evt, forceOpen){
+				var nodes = groupNodes[group].__items;
+				if(rolledUp||forceOpen){
+					rolledUp = false;
+					for(var x=0; x<nodes.length; x++){
+						nodes[x].style.display = "";
+					}
+					toggle.innerHTML = "&#054;";
+				}else{
+					rolledUp = true;
+					for(var x=0; x<nodes.length; x++){
+						nodes[x].style.display = "none";
+					}
+					toggle.innerHTML = "&#052;";
+				}
+			};
+		}
+
+		var addGroupToList = function(group){
+			if(!byId("testList")){ return; }
+			var tb = byId("testList").tBodies[0];
+			var tg = groupTemplate.cloneNode(true);
+			var tds = tg.getElementsByTagName("td");
+			var toggle = tds[0];
+			toggle.onclick = _getGroupToggler(group, toggle);
+			var cb = tds[1].getElementsByTagName("input")[0];
+			cb.group = group;
+			cb.onclick = function(evt){
+				doh._groups[group].skip = (!this.checked);
+			}
+			tds[2].innerHTML = group;
+			tds[3].innerHTML = "";
+
+			tb.appendChild(tg);
+			return tg;
+		}
+
+		var addFixtureToList = function(group, fixture){
+			if(!testTemplate){ return; }
+			var cgn = groupNodes[group];
+			if(!cgn["__items"]){ cgn.__items = []; }
+			var tn = testTemplate.cloneNode(true);
+			var tds = tn.getElementsByTagName("td");
+
+			tds[2].innerHTML = fixture.name;
+			tds[3].innerHTML = "";
+
+			var nn = (cgn.__lastFixture||cgn.__groupNode).nextSibling;
+			if(nn){
+				nn.parentNode.insertBefore(tn, nn);
+			}else{
+				cgn.__groupNode.parentNode.appendChild(tn);
+			}
+			// FIXME: need to make group display toggleable!!
+			tn.style.display = "none";
+			cgn.__items.push(tn);
+			return cgn.__lastFixture = tn;
+		}
+
+		var getFixtureNode = function(group, fixture){
+			if(groupNodes[group]){
+				return groupNodes[group][fixture.name];
+			}
+			return null;
+		}
+
+		var getGroupNode = function(group){
+			if(groupNodes[group]){
+				return groupNodes[group].__groupNode;
+			}
+			return null;
+		}
+
+		var updateBacklog = [];
+		doh._updateTestList = function(group, fixture, unwindingBacklog){
+			if(!loaded){
+				if(group && fixture){
+					updateBacklog.push([group, fixture]);
+				}
+				return;
+			}else if((updateBacklog.length)&&(!unwindingBacklog)){
+				var tr;
+				while(tr=updateBacklog.shift()){
+					doh._updateTestList(tr[0], tr[1], true);
+				}
+			}
+			if(group && fixture){
+				if(!groupNodes[group]){
+					groupNodes[group] = {
+						"__groupNode": addGroupToList(group)
+					};
+				}
+				if(!groupNodes[group][fixture.name]){
+					groupNodes[group][fixture.name] = addFixtureToList(group, fixture)
+				}
+			}
+		}
+
+		doh._testRegistered = doh._updateTestList;
+
+		doh._groupStarted = function(group){
+			// console.debug("_groupStarted", group);
+			var gn = getGroupNode(group);
+			if(gn){
+				gn.className = "inProgress";
+			}
+		}
+
+		doh._groupFinished = function(group, success){
+			// console.debug("_groupFinished", group);
+			var gn = getGroupNode(group);
+			if(gn){
+				gn.className = (success) ? "success" : "failure";
+			}
+		}
+
+		doh._testStarted = function(group, fixture){
+			// console.debug("_testStarted", group, fixture.name);
+			var fn = getFixtureNode(group, fixture);
+			if(fn){
+				fn.className = "inProgress";
+			}
+		}
+
+		var _nameTimes = {};
+		var _playSound = function(name){
+			if(byId("hiddenAudio") && byId("audio") && byId("audio").checked){
+				// console.debug("playing:", name);
+				var nt = _nameTimes[name];
+				// only play sounds once every second or so
+				if((!nt)||(((new Date)-nt) > 700)){
+					_nameTimes[name] = new Date();
+					var tc = document.createElement("span");
+					byId("hiddenAudio").appendChild(tc);
+					tc.innerHTML = '<embed src="_sounds/'+name+'.wav" autostart="true" loop="false" hidden="true" width="1" height="1"></embed>';
+				}
+			}
+		}
+
+		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(){};
+		}
+	}
+
+})();

Added: branches/vhffs-design/vhffs-panel/js/util/doh/_rhinoRunner.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/util/doh/_rhinoRunner.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/util/doh/_rhinoRunner.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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);
+		}
+	}
+})();

Added: branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/LICENSE
===================================================================
--- branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/LICENSE	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/LICENSE	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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

Added: branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/doh.wav
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/doh.wav
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/dohaaa.wav
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/dohaaa.wav
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/woohoo.wav
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/util/doh/_sounds/woohoo.wav
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/util/doh/runner.html
===================================================================
--- branches/vhffs-design/vhffs-panel/js/util/doh/runner.html	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/util/doh/runner.html	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,283 @@
+<html>
+	<!--
+		NOTE: we are INTENTIONALLY in quirks mode. It makes it much easier to
+		get a "full screen" UI w/ straightforward CSS.
+	-->
+	<!--
+		// TODO: implement global progress bar
+		// TODO: provide a UI for prompted tests
+	-->
+	<head>
+		<title>The Dojo Unit Test Harness, $Rev$</title>
+		<script type="text/javascript">
+			window.dojoUrl = "../../dojo/dojo.js";
+			window.testUrl = "";
+			window.testModule = "";
+
+			// parse out our test URL and our Dojo URL from the query string
+			var qstr = window.location.search.substr(1);
+			if(qstr.length){
+				var qparts = qstr.split("&");
+				for(var x=0; x<qparts.length; x++){
+					var tp = qparts[x].split("=");
+					if(tp[0] == "dojoUrl"){
+						window.dojoUrl = tp[1];
+					}
+					if(tp[0] == "testUrl"){
+						window.testUrl = tp[1];
+					}
+					if(tp[0] == "testModule"){
+						window.testModule = tp[1];
+					}
+				}
+			}
+
+			document.write("<scr"+"ipt type='text/javascript' djConfig='isDebug: true' src='"+dojoUrl+"'></scr"+"ipt>");
+		</script>
+		<script type="text/javascript">
+			try{
+				dojo.require("doh.runner");
+			}catch(e){
+				document.write("<scr"+"ipt type='text/javascript' src='runner.js'></scr"+"ipt>");
+				document.write("<scr"+"ipt type='text/javascript' src='_browserRunner.js'></scr"+"ipt>");
+			}
+			if(testUrl.length){
+				document.write("<scr"+"ipt type='text/javascript' src='"+testUrl+".js'></scr"+"ipt>");
+			}
+		</script>
+		<style type="text/css">
+			@import "../../dojo/resources/dojo.css";
+			/*
+			body {
+				margin: 0px;
+				padding: 0px;
+				font-size: 13px;
+				color: #292929;
+				font-family: Myriad, Lucida Grande, Bitstream Vera Sans, Arial, Helvetica, sans-serif;
+				*font-size: small;
+				*font: x-small;
+			}
+
+			th, td {
+				font-size: 13px;
+				color: #292929;
+				font-family: Myriad, Lucida Grande, Bitstream Vera Sans, Arial, Helvetica, sans-serif;
+				font-weight: normal;
+			}
+
+			* body {
+				line-height: 1.25em;
+			}
+			
+			table {
+				border-collapse: collapse;
+			}
+			*/
+
+			#testLayout {
+				position: relative;
+				left: 0px;
+				top: 0px;
+				width: 100%;
+				height: 100%;
+				border: 1px solid black;
+				border: 0px;
+			}
+
+			.tabBody {
+				margin: 0px;
+				padding: 0px;
+				/*
+				border: 1px solid black;
+				*/
+				background-color: #DEDEDE;
+				border: 0px;
+				width: 100%;
+				height: 100%;
+				position: absolute;
+				left: 0px; 
+				top: 0px;
+				overflow: auto;
+			}
+
+			#logBody {
+				padding-left: 5px;
+				padding-top: 5px;
+				font-family: Monaco, monospace;
+				font-size: 11px;
+				white-space: pre;
+			}
+
+			#progressOuter {
+				background:#e9e9e9 url("http://svn.dojotoolkit.org/dojo/dijit/trunk/themes/tundra/images/dojoTundraGradientBg.png";) repeat-x 0 0;
+				/*
+				border-color: #e8e8e8;
+				*/
+			}
+
+			#progressInner {
+				background: blue;
+				width: 0%;
+				position: relative;
+				left: 0px;
+				top: 0px;
+				height: 100%;
+			}
+
+			#play, #pause {
+				font-family: Webdings;
+				font-size: 1.4em;
+				border: 1px solid #DEDEDE;
+				cursor: pointer;
+				padding-right: 0.5em;
+			}
+
+			.header {
+				border: 1px solid #DEDEDE;
+			}
+
+			button.tab {
+				border-width: 1px 1px 0px 1px;
+				border-style: solid;
+				border-color: #DEDEDE;
+				margin-right: 5px;
+			}
+
+			#testListContainer {
+				/*
+				border: 1px solid black;
+				*/
+				position: relative;
+				height: 99%;
+				width: 100%;
+				overflow: auto;
+			}
+
+			#testList {
+				border-collapse: collapse;
+				position: absolute;
+				left: 0px;
+				width: 100%;
+			}
+
+			#testList > tbody > tr > td {
+				border-bottom: 1px solid #DEDEDE;
+				border-right : 1px solid #DEDEDE;
+				padding: 3px;
+			}
+
+			#testListHeader th {
+				border-bottom: 1px solid #DEDEDE;
+				border-right : 1px solid #DEDEDE;
+				padding: 3px;
+				font-weight: bolder;
+				font-style: italic;
+			}
+
+			#toggleButtons {
+				float: left;
+				background-color: #DEDEDE;
+			}
+
+			tr.inProgress {
+				background-color: #85afde;
+			}
+
+			tr.success {
+				background-color: #7cdea7;
+			}
+
+			tr.failure {
+				background-color: #de827b;
+			}
+		</style>
+	</head>
+	<body>
+		<table id="testLayout" cellpadding="0" cellspacing="0" style="margin: 0;">
+			<tr valign="top" height="40">
+				<td colspan="2" id="logoBar">
+					<h3 style="margin: 5px 5px 0px 5px; float: left;">D.O.H.: The Dojo Objective Harness</h3>
+					<img src="small_logo.png" height="40" style="margin: 0px 5px 0px 5px; float: right;">
+					<span style="margin: 10px 5px 0px 5px; float: right;">
+						<input type="checkbox" id="audio" name="audio">
+						<label for="audio">sounds?</label>
+					</span>
+				</td>
+			</tr>
+			<!--
+			<tr valign="top" height="10">
+				<td colspan="2" id="progressOuter">
+					<div id="progressInner">blah</div>
+				</td>
+			</tr>
+			-->
+			<tr valign="top" height="30">
+				<td width="30%" class="header">
+					<span id="toggleButtons" onclick="doh.togglePaused();">
+						<button id="play">&#052;</button>
+						<button id="pause" style="display: none;">&#059;</button>
+					</span>
+					<span id="runningStatus">
+						<span id="pausedMsg">Stopped</span>
+						<span id="playingMsg" style="display: none;">Tests Running</span>
+					</span>
+				</td>
+				<td width="*" class="header" valign="bottom">
+					<button class="tab" onclick="showTestPage();">Test Page</button>
+					<button class="tab" onclick="showLogPage();">Log</button>
+				</td>
+			</tr>
+			<tr valign="top" style="border: 0; padding: 0; margin: 0;">
+				<td height="100%" style="border: 0; padding: 0; margin: 0;">
+					<div id="testListContainer">
+						<table cellpadding="0" cellspacing="0" border="0"
+							width="100%" id="testList" style="margin: 0;">
+							<thead>
+								<tr id="testListHeader" style="border: 0; padding: 0; margin: 0;" >
+									<th>&nbsp;</th>
+									<th width="20">
+										<input type="checkbox" checked 
+											onclick="toggleRunAll();">
+									</th>
+									<th width="*" style="text-align: left;">test</th>
+									<th width="50">time</th>
+								</tr>
+							</thead>
+							<tbody valign="top">
+								<tr id="groupTemplate" style="display: none;">
+									<td style="font-family: Webdings; width: 15px;">&#052;</td>
+									<td>
+										<input type="checkbox" checked>
+									</td>
+									<td>group name</td>
+									<td>10ms</td>
+								</tr>
+								<tr id="testTemplate" style="display: none;">
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td style="padding-left: 20px;">test name</td>
+									<td>10ms</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+				</td>
+				<td>
+					<div style="position: relative; width: 99%; height: 100%; top: 0px; left: 0px;">
+						<div class="tabBody"
+							style="z-index: 1;">
+<pre id="logBody"></pre>
+						</div>
+						<iframe id="testBody" class="tabBody"
+							style="z-index: 0;"></iframe>
+						<!--
+							src="http://redesign.dojotoolkit.org";></iframe>
+						-->
+					</div>
+				</td>
+			</tr>
+		</table>
+		<span id="hiddenAudio"></span>
+	</body>
+</html>
+

Added: branches/vhffs-design/vhffs-panel/js/util/doh/runner.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/util/doh/runner.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/util/doh/runner.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -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<arguments.length; x++){
+		args.push(arguments[x]);
+	}
+	var fcn = ((typeof method == "string") ? thisObject[method] : method) || function(){};
+	return function(){
+		var ta = args.concat([]); // make a copy
+		for(var x=0; x<arguments.length; x++){
+			ta.push(arguments[x]);
+		}
+		return fcn.apply(thisObject, ta); // Function
+	};
+}
+
+doh._mixin = function(/*Object*/ obj, /*Object*/ props){
+	// summary:
+	//		Adds all properties and methods of props to obj. This addition is
+	//		"prototype extension safe", so that instances of objects will not
+	//		pass along prototype defaults.
+	var tobj = {};
+	for(var x in props){
+		// the "tobj" condition avoid copying properties in "props"
+		// inherited from Object.prototype.  For example, if obj has a custom
+		// toString() method, don't overwrite it with the toString() method
+		// that props inherited from Object.protoype
+		if((typeof tobj[x] == "undefined") || (tobj[x] != props[x])){
+			obj[x] = props[x];
+		}
+	}
+	// IE doesn't recognize custom toStrings in for..in
+	if(	this["document"] 
+		&& document.all
+		&& (typeof props["toString"] == "function")
+		&& (props["toString"] != obj["toString"])
+		&& (props["toString"] != tobj["toString"])
+	){
+		obj.toString = props.toString;
+	}
+	return obj; // Object
+}
+
+doh.mixin = function(/*Object*/obj, /*Object...*/props){
+	// summary:	Adds all properties and methods of props to obj. 
+	for(var i=1, l=arguments.length; i<l; i++){
+		doh._mixin(obj, arguments[i]);
+	}
+	return obj; // Object
+}
+
+doh.extend = function(/*Object*/ constructor, /*Object...*/ props){
+	// summary:
+	//		Adds all properties and methods of props to constructor's
+	//		prototype, making them available to all instances created with
+	//		constructor.
+	for(var i=1, l=arguments.length; i<l; i++){
+		doh._mixin(constructor.prototype, arguments[i]);
+	}
+	return constructor; // Object
+}
+
+
+doh._line = "------------------------------------------------------------";
+
+/*
+doh._delegate = function(obj, props){
+	// boodman-crockford delegation
+	function TMP(){};
+	TMP.prototype = obj;
+	var tmp = new TMP();
+	if(props){
+		dojo.lang.mixin(tmp, props);
+	}
+	return tmp;
+}
+*/
+
+doh.debug = function(){
+	// summary:
+	//		takes any number of arguments and sends them to whatever debugging
+	//		or logging facility is available in this environment
+
+	// YOUR TEST RUNNER NEEDS TO IMPLEMENT THIS
+}
+
+doh._AssertFailure = function(msg){
+	// idea for this as way of dis-ambiguating error types is from JUM. 
+	// The JUM is dead! Long live the JUM!
+
+	if(!(this instanceof doh._AssertFailure)){
+		return new doh._AssertFailure(msg);
+	}
+	this.message = new String(msg||"");
+	return this;
+}
+doh._AssertFailure.prototype = new Error();
+doh._AssertFailure.prototype.constructor = doh._AssertFailure;
+doh._AssertFailure.prototype.name = "doh._AssertFailure";
+
+doh.Deferred = function(canceller){
+	this.chain = [];
+	this.id = this._nextId();
+	this.fired = -1;
+	this.paused = 0;
+	this.results = [null, null];
+	this.canceller = canceller;
+	this.silentlyCancelled = false;
+};
+
+doh.extend(doh.Deferred, {
+	getTestCallback: function(cb, scope){
+		var _this = this;
+		return function(){
+			try{
+				cb.apply(scope||dojo.global||_this, arguments);
+			}catch(e){
+				_this.errback(e);
+				return;
+			}
+			_this.callback(true);
+		}
+	},
+
+	getFunctionFromArgs: function(){
+		var a = arguments;
+		if((a[0])&&(!a[1])){
+			if(typeof a[0] == "function"){
+				return a[0];
+			}else if(typeof a[0] == "string"){
+				return dojo.global[a[0]];
+			}
+		}else if((a[0])&&(a[1])){
+			return doh.hitch(a[0], a[1]);
+		}
+		return null;
+	},
+
+	makeCalled: function() {
+		var deferred = new doh.Deferred();
+		deferred.callback();
+		return deferred;
+	},
+
+	_nextId: (function(){
+		var n = 1;
+		return function(){ return n++; };
+	})(),
+
+	cancel: function(){
+		if(this.fired == -1){
+			if (this.canceller){
+				this.canceller(this);
+			}else{
+				this.silentlyCancelled = true;
+			}
+			if(this.fired == -1){
+				this.errback(new Error("Deferred(unfired)"));
+			}
+		}else if(	(this.fired == 0)&&
+					(this.results[0] instanceof doh.Deferred)){
+			this.results[0].cancel();
+		}
+	},
+			
+
+	_pause: function(){
+		this.paused++;
+	},
+
+	_unpause: function(){
+		this.paused--;
+		if ((this.paused == 0) && (this.fired >= 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<testArr.length; x++){
+		this.registerTest(group, testArr[x]);
+	}
+}
+
+// FIXME: move implementation to _browserRunner?
+doh.registerUrl = function(	/*String*/ group, 
+								/*String*/ url, 
+								/*Integer*/ timeout){
+	this.debug("ERROR:");
+	this.debug("\tNO registerUrl() METHOD AVAILABLE.");
+	// this._urls.push(url);
+}
+
+doh.registerString = function(group, str){
+}
+
+// FIXME: remove the doh.add alias SRTL.
+doh.register = doh.add = function(groupOrNs, testOrNull){
+	// summary:
+	// 		"magical" variant of registerTests, registerTest, and
+	// 		registerTestNs. Will accept the calling arguments of any of these
+	// 		methods and will correctly guess the right one to register with.
+	if(	(arguments.length == 1)&&
+		(typeof groupOrNs == "string") ){
+		if(groupOrNs.substr(0, 4)=="url:"){
+			this.registerUrl(groupOrNs);
+		}else{
+			this.registerTest("ungrouped", groupOrNs);
+		}
+	}
+	if(arguments.length == 1){
+		this.debug("invalid args passed to doh.register():", groupOrNs, ",", testOrNull);
+		return;
+	}
+	if(typeof testOrNull == "string"){
+		if(testOrNull.substr(0, 4)=="url:"){
+			this.registerUrl(testOrNull);
+		}else{
+			this.registerTest(groupOrNs, testOrNull);
+		}
+		// this.registerTestNs(groupOrNs, testOrNull);
+		return;
+	}
+	if(doh._isArray(testOrNull)){
+		this.registerTests(groupOrNs, testOrNull);
+		return;
+	}
+	this.registerTest(groupOrNs, testOrNull);
+}
+
+//
+// Assertions and In-Test Utilities
+//
+
+doh.t = doh.assertTrue = function(/*Object*/ condition){
+	// summary:
+	//		is the passed item "truthy"?
+	if(arguments.length != 1){ 
+		throw doh._AssertFailure("assertTrue failed because it was not passed exactly 1 argument"); 
+	} 
+	if(!eval(condition)){
+		throw doh._AssertFailure("assertTrue('" + condition + "') failed");
+	}
+}
+
+doh.f = doh.assertFalse = function(/*Object*/ condition){
+	// summary:
+	//		is the passed item "falsey"?
+	if(arguments.length != 1){ 
+		throw doh._AssertFailure("assertFalse failed because it was not passed exactly 1 argument"); 
+	} 
+	if(eval(condition)){
+		throw doh._AssertFailure("assertFalse('" + condition + "') failed");
+	}
+}
+
+doh.e = doh.assertError = function(/*Error object*/expectedError, /*Object*/scope, /*String*/functionName, /*Array*/args){
+	//	summary:
+	//		Test for a certain error to be thrown by the given function.
+	//	example:
+	//		t.assertError(dojox.data.QueryReadStore.InvalidAttributeError, store, "getValue", [item, "NOT THERE"]);
+	//		t.assertError(dojox.data.QueryReadStore.InvalidItemError, store, "getValue", ["not an item", "NOT THERE"]);
+	try{
+		scope[functionName].apply(scope, args);
+	}catch (e){
+		if(e instanceof expectedError){
+			return true;
+		}else{
+			throw new doh._AssertFailure("assertError() failed:\n\texpected error\n\t\t"+expectedError+"\n\tbut got\n\t\t"+e+"\n\n");
+		}
+	}
+	throw new doh._AssertFailure("assertError() failed:\n\texpected error\n\t\t"+expectedError+"\n\tbut no error caught\n\n");
+}
+
+
+doh.is = doh.assertEqual = function(/*Object*/ expected, /*Object*/ actual){
+	// summary:
+	//		are the passed expected and actual objects/values deeply
+	//		equivalent?
+
+	// Compare undefined always with three equal signs, because undefined==null
+	// is true, but undefined===null is false. 
+	if((expected === undefined)&&(actual === undefined)){ 
+		return true;
+	}
+	if(arguments.length < 2){ 
+		throw doh._AssertFailure("assertEqual failed because it was not passed 2 arguments"); 
+	} 
+	if((expected === actual)||(expected == actual)){ 
+		return true;
+	}
+	if(	(this._isArray(expected) && this._isArray(actual))&&
+		(this._arrayEq(expected, actual)) ){
+		return true;
+	}
+	if( ((typeof expected == "object")&&((typeof actual == "object")))&&
+		(this._objPropEq(expected, actual)) ){
+		return true;
+	}
+	throw new doh._AssertFailure("assertEqual() failed:\n\texpected\n\t\t"+expected+"\n\tbut got\n\t\t"+actual+"\n\n");
+}
+
+doh._arrayEq = function(expected, actual){
+	if(expected.length != actual.length){ return false; }
+	// FIXME: we're not handling circular refs. Do we care?
+	for(var x=0; x<expected.length; x++){
+		if(!doh.assertEqual(expected[x], actual[x])){ return false; }
+	}
+	return true;
+}
+
+doh._objPropEq = function(expected, actual){
+	if(expected instanceof Date){
+		return actual instanceof Date && expected.getTime()==actual.getTime();
+	}
+	// Make sure ALL THE SAME properties are in both objects!
+	for(var x in actual){ // Lets check "actual" here, expected is checked below.
+		if(expected[x] === undefined){
+			return false;
+		}
+	};
+
+	for(var x in expected){
+		if(!doh.assertEqual(expected[x], actual[x])){
+			return false;
+		}
+	}
+	return true;
+}
+
+doh._isArray = function(it){
+	return (it && it instanceof Array || typeof it == "array" || (dojo["NodeList"] !== undefined && it instanceof dojo.NodeList));
+}
+
+//
+// Runner-Wrapper
+//
+
+doh._setupGroupForRun = function(/*String*/ groupName, /*Integer*/ idx){
+	var tg = this._groups[groupName];
+	this.debug(this._line);
+	this.debug("GROUP", "\""+groupName+"\"", "has", tg.length, "test"+((tg.length > 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<tg.length; y++){
+			if(this._paused){
+				this._currentTest = y;
+				// this.debug("PAUSED at:", tg[y].name, this._currentGroup, this._currentTest);
+				return;
+			}
+			doh._runFixture(groupName, tg[y]);
+			if(this._paused){
+				this._currentTest = y+1;
+				if(this._currentTest == tg.length){
+					tg.iterated = true;
+				}
+				// this.debug("PAUSED at:", tg[y].name, this._currentGroup, this._currentTest);
+				return;
+			}
+		}
+		tg.iterated = true;
+		if(!tg.inFlight){
+			if(tg["tearDown"]){ tg.tearDown(this); }
+			doh._groupFinished(groupName, (!tg.failures));
+		}
+	}
+}
+
+doh._onEnd = function(){}
+
+doh._report = function(){
+	// summary:
+	//		a private method to be implemented/replaced by the "locally
+	//		appropriate" test runner
+
+	// this.debug("ERROR:");
+	// this.debug("\tNO REPORTING OUTPUT AVAILABLE.");
+	// this.debug("\tIMPLEMENT doh._report() IN YOUR TEST RUNNER");
+
+	this.debug(this._line);
+	this.debug("| TEST SUMMARY:");
+	this.debug(this._line);
+	this.debug("\t", this._testCount, "tests in", this._groupCount, "groups");
+	this.debug("\t", this._errorCount, "errors");
+	this.debug("\t", this._failureCount, "failures");
+}
+
+doh.togglePaused = function(){
+	this[(this._paused) ? "run" : "pause"]();
+}
+
+doh.pause = function(){
+	// summary:
+	//		halt test run. Can be resumed.
+	this._paused = true;
+}
+
+doh.run = function(){
+	// summary:
+	//		begins or resumes the test process.
+	// this.debug("STARTING");
+	this._paused = false;
+	var cg = this._currentGroup;
+	var ct = this._currentTest;
+	var found = false;
+	if(!cg){
+		this._init(); // we weren't paused
+		found = true;
+	}
+	this._currentGroup = null;
+	this._currentTest = null;
+
+	for(var x in this._groups){
+		if(
+			( (!found)&&(x == cg) )||( found )
+		){
+			if(this._paused){ return; }
+			this._currentGroup = x;
+			if(!found){
+				found = true;
+				this.runGroup(x, ct);
+			}else{
+				this.runGroup(x);
+			}
+			if(this._paused){ return; }
+		}
+	}
+	this._currentGroup = null;
+	this._currentTest = null;
+	this._paused = false;
+	this._onEnd();
+	this._report();
+}
+
+tests = doh;
+
+(function(){
+	// scop protection
+	try{
+		if(typeof dojo != "undefined"){
+			dojo.platformRequire({
+				browser: ["doh._browserRunner"],
+				rhino: ["doh._rhinoRunner"],
+				spidermonkey: ["doh._rhinoRunner"]
+			});
+			var _shouldRequire = (dojo.isBrowser) ? (dojo.global == dojo.global["parent"]) : true;
+			if(_shouldRequire){
+				if(dojo.isBrowser){
+					dojo.addOnLoad(function(){
+						if(dojo.byId("testList")){
+							var _tm = ( (dojo.global.testModule && dojo.global.testModule.length) ? dojo.global.testModule : "dojo.tests.module");
+							dojo.forEach(_tm.split(","), dojo.require, dojo);
+							setTimeout(function(){
+								doh.run();
+							}, 500);
+						}
+					});
+				}else{
+					// dojo.require("doh._base");
+				}
+			}
+		}else{
+			if(
+				(typeof load == "function")&&
+				(	(typeof Packages == "function")||
+					(typeof Packages == "object")	)
+			){
+				throw new Error();
+			}else if(typeof load == "function"){
+				throw new Error();
+			}
+		}
+	}catch(e){
+		print("\n"+doh._line);
+		print("The Dojo Unit Test Harness, $Rev$");
+		print("Copyright (c) 2007, The Dojo Foundation, All Rights Reserved");
+		print(doh._line, "\n");
+
+		load("_rhinoRunner.js");
+
+		try{
+			var dojoUrl = "../../dojo/dojo.js";
+			var testUrl = "";
+			var testModule = "dojo.tests.module";
+			for(var x=0; x<arguments.length; x++){
+				if(arguments[x].indexOf("=") > 0){
+					var tp = arguments[x].split("=");
+					if(tp[0] == "dojoUrl"){
+						dojoUrl = tp[1];
+					}
+					if(tp[0] == "testUrl"){
+						testUrl = tp[1];
+					}
+					if(tp[0] == "testModule"){
+						testModule = tp[1];
+					}
+				}
+			}
+			if(dojoUrl.length){
+				if(!this["djConfig"]){
+					djConfig = {};
+				}
+				djConfig.baseUrl = dojoUrl.split("dojo.js")[0];
+				load(dojoUrl);
+			}
+			if(testUrl.length){
+				load(testUrl);
+			}
+			if(testModule.length){
+				dojo.forEach(testModule.split(","), dojo.require, dojo);
+			}
+		}catch(e){
+			print("An exception occurred: " + e);
+		}
+
+		doh.run();
+	}
+}).apply(this, typeof arguments != "undefined" ? arguments : [null]);

Added: branches/vhffs-design/vhffs-panel/js/util/doh/runner.sh
===================================================================
--- branches/vhffs-design/vhffs-panel/js/util/doh/runner.sh	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/util/doh/runner.sh	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+java -jar ../shrinksafe/custom_rhino.jar runner.js "$@"

Added: branches/vhffs-design/vhffs-panel/js/util/doh/small_logo.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-panel/js/util/doh/small_logo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-panel/js/vhffs/Menu.js
===================================================================
--- branches/vhffs-design/vhffs-panel/js/vhffs/Menu.js	                        (rev 0)
+++ branches/vhffs-design/vhffs-panel/js/vhffs/Menu.js	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,74 @@
+/*
+ *  Copyright (c) vhffs project and its contributors
+ *  All rights reserved.
+ * 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ * 
+ *  1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. Neither the name of vhffs 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.
+ */
+ 
+ 
+ /**
+  * Class handling the left menu.
+  * Accordion style, without effect (since it can be
+  * slow on some machine depending on the video hardware/driver).
+  */
+dojo.provide('vhffs.Menu');
+
+dojo.declare('vhffs.Menu', null, {
+	constructor: function(container, expandedIndex) {
+		
+		this.titles = dojo.query('h2', container);
+		this.items = dojo.query('div.menu', container);
+		
+		if(!expandedIndex) expandedIndex = 0;
+		
+		dojo.forEach(this.items, function(submenu, index) {
+			if(index == expandedIndex) {
+				dojo.style(submenu, 'display', '');
+			} else {
+				dojo.style(submenu, 'display', 'none');
+			}
+		}, this);
+		
+		dojo.forEach(this.titles, function(title) {
+			dojo.connect(title, 'onclick', this, this.toggleSubmenu);
+		}, this); 
+	},
+	
+	toggleSubmenu: function(e) {
+		dojo.stopEvent(e);
+		var title = e.currentTarget;
+		
+		dojo.forEach(this.titles, function(t, i) {
+			if(t == title) {
+				dojo.style(this.items[i], 'display', '');
+			} else {
+				dojo.style(this.items[i], 'display', 'none');
+			}
+		}, this);
+	}
+});

Modified: branches/vhffs-design/vhffs-public/index.pl
===================================================================
--- branches/vhffs-design/vhffs-public/index.pl	2008-08-02 19:11:50 UTC (rev 1247)
+++ branches/vhffs-design/vhffs-public/index.pl	2008-08-02 22:33:52 UTC (rev 1248)
@@ -35,6 +35,31 @@
 use POSIX qw(locale_h);
 use locale;
 use Locale::gettext;
+
+use lib '%VHFFS_LIB_DIR%';
+use Vhffs::Panel::Group;
+use Vhffs::Panel::Public;
+
+my $panel = new Vhffs::Panel::Public();
+
+my $hostname = $panel->{vhffs}->get_config->get_host_name;
+
+my $vars = {
+	lg_title => sprintf( gettext("Last groups on %s") , $hostname ),
+	groups => Vhffs::Panel::Group::get_last_groups( $panel->{vhffs} )
+};
+
+$panel->render('content/last-groups.tt', $vars);
+
+
+__END__
+
+use strict;
+use utf8;
+
+use POSIX qw(locale_h);
+use locale;
+use Locale::gettext;
 use CGI;
 
 use lib '%VHFFS_LIB_DIR%';

Modified: branches/vhffs-design/vhffs-public/templates/Makefile.am
===================================================================
--- branches/vhffs-design/vhffs-public/templates/Makefile.am	2008-08-02 19:11:50 UTC (rev 1247)
+++ branches/vhffs-design/vhffs-public/templates/Makefile.am	2008-08-02 22:33:52 UTC (rev 1248)
@@ -1,10 +1,12 @@
 publictemplatesdir = @TEMPLATESDIR@/public
 nobase_dist_publictemplates_DATA = \
 	banner.tmpl \
+	content/last-groups.tt \
 	group_part.tmpl \
 	group.tmpl \
 	groupslist.tmpl \
 	index.tmpl \
+	layouts/public.tt \
 	misc/cvs-part.tmpl \
 	misc/groupinfo.tmpl \
 	misc/list-part.tmpl \
@@ -13,6 +15,11 @@
 	misc/svn-part.tmpl \
 	misc/git-part.tmpl \
 	misc/web-part.tmpl \
+	parts/footer.tt \
+	parts/header.tt \
+	parts/left-menu.tt \
+	parts/tags-cloud.tt \
+	parts/top-menu.tt \
 	simplemsg.tmpl \
 	user_part.tmpl \
 	user.tmpl \

Added: branches/vhffs-design/vhffs-public/templates/content/last-groups.tt
===================================================================
--- branches/vhffs-design/vhffs-public/templates/content/last-groups.tt	                        (rev 0)
+++ branches/vhffs-design/vhffs-public/templates/content/last-groups.tt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+<h1>[% lg_title %]</h1>
+
+[% FOREACH g = groups %]
+<h2 class="groupname">[% g.realname | html%]</h2>
+[% g.get_groupname %]
+<div class="group-info">
+<img class="group-avatar" src="/avatar.pl?oid=[% g.object_id %]"/>
+<p><span class="groupname">[% g.groupname %]</span> (<span class="owner">[% g.owner_name %]</span>)</p>
+<div class="description">
+[% g.description | html | html_para %]
+</div>
+<p class="more-group"><a href="/group.pl?groupname=[% g.groupname %]">[% 'More info...' | i18n %]</a></p>
+</div>
+[% END %]

Added: branches/vhffs-design/vhffs-public/templates/layouts/public.tt
===================================================================
--- branches/vhffs-design/vhffs-public/templates/layouts/public.tt	                        (rev 0)
+++ branches/vhffs-design/vhffs-public/templates/layouts/public.tt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml"; lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta name="author" content="VHFFS Team, based on G. Wolfgang original design" />
+  <link rel="stylesheet" type="text/css" media="screen,projection" href="/themes/[% theme %]/main.css" />
+  
+[%# TODO: Add a parameter to include extra-js %]
+  
+  <script type="text/javascript" src="/js/dojo/dojo.js"></script>
+  <script type="text/javascript" src="/js/public.js"></script>
+  <title>Vhffs::Virtual hosting for free software</title>
+</head>
+<body>
+<div id="background-container">
+  <div class="page-container-public">
+    <div id="header">
+	[% INCLUDE parts/header.tt %]
+	</div>
+	<div id="top-menu">
+	[% INCLUDE $top %]
+	</div>
+	<div id="left-menu">
+	[% INCLUDE $left %]
+	</div>
+	<div id="right-menu">
+	[% INCLUDE $right %]
+	</div>
+	<div class="public-content">
+	[% PROCESS $template %]
+	</div>
+	<div id="footer">
+	[% INCLUDE parts/footer.tt %]
+	</div>
+  </div>
+</div>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-public/templates/parts/footer.tt
===================================================================
--- branches/vhffs-design/vhffs-public/templates/parts/footer.tt	                        (rev 0)
+++ branches/vhffs-design/vhffs-public/templates/parts/footer.tt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1 @@
+<p>[% 'Powered by <a href="http://www.vhffs.org";>VHFFS</a>' | i18n %]</p>
\ No newline at end of file

Added: branches/vhffs-design/vhffs-public/templates/parts/header.tt
===================================================================
--- branches/vhffs-design/vhffs-public/templates/parts/header.tt	                        (rev 0)
+++ branches/vhffs-design/vhffs-public/templates/parts/header.tt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,23 @@
+<!-- HEADER -->
+
+    <!-- Sitename -->
+	<div class="site-name">
+
+        <img src="/themes/[% theme %]/img/vhffs.png" alt="Virtual Hosting For Free Software"/>
+    </div>
+
+ 	<!-- Flag navigations -->
+    <div class="navflag">
+          <a href="?lang=fr_FR"><img class="img-navflag" src="/themes/[% theme %]/img/flag_fr.png" alt="[% 'French' | i18n %]" /></a>
+          <a href="?lang=es_ES"><img class="img-navflag" src="/themes/[% theme %]/img/flag_es.png" alt="[% 'Spanish' | i18n %]" /></a>
+          <a href="?lang=en_US"><img class="img-navflag" src="/themes/[% theme %]/img/flag_en.png" alt="[% 'English' | i18n %]" /></a>
+    </div>			
+
+    <!-- Navigation Level 1 -->
+
+    <div class="nav1">
+        <a href="#">[% 'Report a bug' | i18n %]</a>
+        <a href="#">[% 'Help' | i18n %]</a>
+                <a href="?page=login">[% 'Log in' | i18n %]</a>
+            </div>			
+

Added: branches/vhffs-design/vhffs-public/templates/parts/left-menu.tt
===================================================================
--- branches/vhffs-design/vhffs-public/templates/parts/left-menu.tt	                        (rev 0)
+++ branches/vhffs-design/vhffs-public/templates/parts/left-menu.tt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,14 @@
+<!-- LEFT MENU -->
+	<h1>[% 'Public' | i18n %]</h1>
+	<h2>[% 'Projects' | i18n %]</h2>
+	<div class="menu">
+		<a href="/groupsearch.pl">[% 'Search' | i18n %]</a>
+		<a href="/">[% 'Last projects' | i18n %]</a>
+		<a href="/allgroups.pl">[% 'All' | i18n %]</a>
+	</div>
+	<h2>[% 'Webareas' | i18n %]</h2>
+	<div class="menu">
+		<a href="#">[% 'Search' | i18n %]</a>
+		<a href="#">[% 'Last webareas' | i18n %]</a>
+		<a href="#">[% 'All' | i18n %]</a>
+	</div>

Added: branches/vhffs-design/vhffs-public/templates/parts/tags-cloud.tt
===================================================================
--- branches/vhffs-design/vhffs-public/templates/parts/tags-cloud.tt	                        (rev 0)
+++ branches/vhffs-design/vhffs-public/templates/parts/tags-cloud.tt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,23 @@
+<h1>[% 'Popular tags' | i18n %]</h1>
+<div class="menu tags-menu">
+	<p>
+[% FOREACH t = popular_tags %]
+	<a href="/tagsearch.pl?tag=[% t.tag_id %]" class="tag[%t.weight%]">
+	[<span title="[% t.category_description | html %]">[% t.category_label | html %]</span>::<span title="[% t.tag_description | html %]">[% t.tag_label | html %]</span>] 
+	</a>
+[% END %]
+	</p>
+	<p class="more-tags"><a href="?page=public-search">[% 'More...' | i18n%]</a></p>
+</div>
+
+<h1>[% 'Random tags' | i18n %]</h1>
+<div class="menu tags-menu">
+	<p>
+[% FOREACH t = random_tags %]
+	<a href="/tagsearch.pl?tag=[% t.tag_id %]" class="tag[%t.weight%]">
+	[<span title="[% t.category_description | html %]">[% t.category_label | html %]</span>::<span title="[% t.tag_description | html %]">[% t.tag_label | html %]</span>]
+	</a>
+[% END %]
+	</p>
+	<p class="more-tags"><a href="?page=public-search">[% 'More...' | i18n%]</a></p>
+</div>

Added: branches/vhffs-design/vhffs-public/templates/parts/top-menu.tt
===================================================================
--- branches/vhffs-design/vhffs-public/templates/parts/top-menu.tt	                        (rev 0)
+++ branches/vhffs-design/vhffs-public/templates/parts/top-menu.tt	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,4 @@
+<!-- Top Menu -->
+<ul>
+	<li><a href="?page=public" class="selected">Accueil</a></li>
+</ul>
\ No newline at end of file

Modified: branches/vhffs-design/vhffs-themes/Makefile.am
===================================================================
--- branches/vhffs-design/vhffs-themes/Makefile.am	2008-08-02 19:11:50 UTC (rev 1247)
+++ branches/vhffs-design/vhffs-themes/Makefile.am	2008-08-02 22:33:52 UTC (rev 1248)
@@ -70,10 +70,24 @@
 	vhffs/images/web.png \
 	vhffs/images/webs.png \
 	vhffs/images/cronentry.png \
-	vhffs/main.css
+	vhffs/main.css \
+	light-grey/main.css \
+	light-grey/img/flag_en.png \
+	light-grey/img/flag_es.png \
+	light-grey/img/flag_fr.png \
+	light-grey/img/background_layout_2.gif \
+	light-grey/img/new_tag.png \
+	light-grey/img/vhffs-big.png \
+	light-grey/img/background_layout_1.gif \
+	light-grey/img/loading.gif \
+	light-grey/img/vhffs.png \
+	light-grey/img/bullet.png \
+	light-grey/img/background_body.png \
+	light-grey/img/background_layout_3.gif
 
 
 
+
 if INSTALL_PANEL
 
 panelthemesdir = @PANELDIR@/themes

Added: branches/vhffs-design/vhffs-themes/light-grey/img/background_body.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/background_body.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_1.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_1.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_2.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_2.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_3.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/background_layout_3.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/bullet.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/bullet.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/flag_en.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/flag_en.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/flag_es.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/flag_es.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/flag_fr.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/flag_fr.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/loading.gif
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/loading.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/new_tag.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/new_tag.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/vhffs-big.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/vhffs-big.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/img/vhffs.png
===================================================================
(Binary files differ)


Property changes on: branches/vhffs-design/vhffs-themes/light-grey/img/vhffs.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/vhffs-design/vhffs-themes/light-grey/main.css
===================================================================
--- branches/vhffs-design/vhffs-themes/light-grey/main.css	                        (rev 0)
+++ branches/vhffs-design/vhffs-themes/light-grey/main.css	2008-08-02 22:33:52 UTC (rev 1248)
@@ -0,0 +1,1712 @@
+/*************************************************************/
+	/* VHFFS blue theme style sheet, based on the work of        */
+	/* G.Wolfgang. Found on Open Source Web Design               */
+	/* (http://www.oswd.org)                                     */
+	/*************************************************************/
+	/*************************/ /* SECTION 1 - MAIN BODY */
+	/*************************/
+body {
+	font-size: 10px;
+	margin: 0px auto;
+	padding: 0px;
+	background: rgb(227, 227, 227);
+	font-family: arial, sans-serif;
+}
+
+div#background-container {
+	background: url(img/background_body.png) top center repeat-y;
+}
+
+.page-container-login {
+	width: 770px;
+	margin: 0px auto;
+	padding: 0px;
+	background: white;
+	border: solid 1px rgb(100, 100, 100);
+}
+
+.page-container-1 {
+	width: 770px;
+	margin: 0px auto;
+	padding: 0px;
+	border: solid 1px rgb(100, 100, 100);
+}
+
+.page-container-panel {
+	width: 770px;
+	margin: 0px auto;
+	padding: 0px;
+	border: solid 1px rgb(100, 100, 100);;
+	background: url(img/background_layout_2.gif) top left repeat-y;
+}
+
+.page-container-public {
+	width: 770px;
+	margin: 0px auto;
+	padding: 0px;
+	border: solid 1px rgb(100, 100, 100);;
+	background: url(img/background_layout_1.gif) top left repeat-y;
+}
+
+/*************************************/
+	/* SECTION 2 - HEADER AND NAVIGATION */
+	/*************************************/
+#header {
+	width: 770px;
+	height: 65px;
+	margin: 0px;
+	padding: 0px;
+	background: white;
+}
+
+/*-----------------------------------*/
+	/* 2.1 - Sitename, slogan and banner */
+	/*-----------------------------------*/
+	/*.site-name {width: 300px; height: 50px; top: 12px; position: absolute; z-index: 4; overflow: hidden; margin: 0px; padding-left: 75px; color: rgb(69,140,204);}*/
+.site-name {
+	width: 300px;
+	height: 50px;
+	padding-top: 12px;
+	float: left;
+	overflow: hidden;
+	margin: 0px;
+	padding-left: 75px;
+	color: rgb(69, 140, 204);
+}
+
+/*--------------------------*/ /* 2.2 - Navigation - Flags */
+	/*--------------------------*/
+.navflag {
+	width: 750px;
+	top: 14px;
+	position: absolute;
+	z-index: 2;
+	background-color: transparent;;
+	text-align: right;;
+	padding: 0px 20px 0px 0px;
+}
+
+.navflag a {
+	margin: 0px;
+	padding: 0px 0px 0px 1px;
+}
+
+.navflag a:hover {
+	color: rgb(0, 0, 0);
+	text-decoration: none;
+}
+
+.navflag img {
+	margin: 0px;
+	padding: 0px;;
+	border: none;
+	height: 14px;
+}
+
+/*----------------------------*/ /* 2.3 - Navigation - Level 1 */
+	/*----------------------------*/
+.nav1 {
+	width: 750px;
+	top: 35px;
+	position: absolute;
+	z-index: 3;
+	background: transparent;;
+	font-family: verdana, arial, sans serif;;
+	font-size: 10px;;
+	text-align: right;;
+	padding: 2px 0px 20px 0px;;
+	font-weight: bold;
+}
+
+.nav1 a {
+	margin: 0px;
+	padding: 2px 4px 2px 4px;
+	border-right: solid 1px rgb(115, 162, 182);
+	color: rgb(115, 162, 182);
+	text-decoration: none;
+	font-size: 10px;
+}
+
+.nav1 a:first-child {
+	border-left: solid 1px rgb(115, 162, 182);
+}
+
+.nav1 a:hover,.nav1 a.selected {
+	color: rgb(50, 50, 50);
+	text-decoration: none;
+}
+
+/*----------------------------*/ /* 2.4 - Navigation - Level 2 */
+	/*----------------------------*/
+#top-menu {
+	clear: both;
+	margin: 0px;
+	padding: 0px;
+	font-family: verdana, arial, sans serif;
+	font-size: 10px;;
+	padding-bottom: 60px;;
+	background-color: rgb(255, 255, 255);
+}
+
+#top-menu ul {
+	float: left;
+	width: 770px;
+	margin: 0px;
+	padding: 0px;
+	border-top: solid 1px rgb(54, 83, 151);
+	border-bottom: solid 1px rgb(54, 83, 151);
+	background-color: rgb(127, 162, 202);
+	font-weight: bold;
+}
+
+#top-menu li {
+	display: inline;
+	list-style: none;
+	margin: 0px;
+	padding: 0px;
+}
+
+#top-menu li a {
+	display: block;
+	float: left;
+	margin: 0px 0px 0px 0px;
+	padding: 5px 10px 5px 10px;
+	border-right: solid 1px rgb(54, 83, 151);
+	color: rgb(255, 255, 255);
+	text-transform: uppercase;
+	text-decoration: none;
+	font-size: 100%;
+}
+
+#top-menu a:hover,#top-menu a.selected {
+	color: rgb(50, 50, 50);
+	text-decoration: none;
+}
+
+/*----------------------------*/ /* 2.5 - Navigation - Level 3 */
+	/*----------------------------*/
+div#left-menu {
+	overflow: hidden;
+	width: 160px;
+	margin: 0px 0px 40px 0px;
+	padding: 0px;
+	color: rgb(75, 75, 75);
+	background-color: rgb(255, 255, 255);
+	font-size: 10px;
+	float: left;
+}
+
+div#right-menu {
+	float: right;;
+	overflow: hidden;
+	left: 50%;
+	width: 160px;
+	margin: 0px 0px 40px 0px;
+	padding: 0px;
+	color: rgb(75, 75, 75);
+	background-color: rgb(255, 255, 255);
+	font-size: 10px;
+}
+
+div#left-menu h1,div#right-menu h1 {
+	margin: 0px 0px 0px 0px;
+	padding: 3px 5px 2px 7px;
+	background-color: rgb(156, 186, 214);
+	color: rgb(255, 255, 255);
+	text-transform: uppercase;
+	font-weight: bold;
+	font-size: 120%;
+	border: none;
+}
+
+div#left-menu h2,div#right-menu h2 {
+	background-color: rgb(219, 230, 241);
+	min-height: 1.7em;
+	height: auto !important;
+	height: 1.7em;
+	line-height: 1.7em;
+	margin: 0px;
+	padding: 0px 7px 0px 7px;
+	border-top: solid 1px rgb(200, 200, 200);;
+	color: rgb(75, 75, 75);
+	font-weight: bold;
+	font-size: 120%;;
+	cursor: pointer;
+}
+
+div#left-menu h2.empty,div#right-menu h2.empty {
+	font-style: italic;
+}
+
+div#left-menu div.menu,div#right-menu div.menu {
+	background-color: rgb(219, 230, 241);
+}
+
+div#left-menu a {
+	display: block;
+	min-height: 1.7em;
+	height: auto !important;
+	height: 1.7em;
+	line-height: 1.7em;
+	margin: 0px;
+	padding: 0px 7px 0px 7px;
+	border-left: solid 7px rgb(219, 230, 241);
+	color: rgb(75, 75, 75);
+	text-decoration: none;
+	font-size: 120%;
+}
+
+div#left-menu a:hover {
+	border-left: solid 7px rgb(156, 186, 214);
+	color: rgb(100, 100, 100);
+	text-decoration: none;;
+	padding: 0px 7px 0px 7px;
+}
+
+a.tag1 {
+	text-decoration: none;
+	color: rgb(75, 75, 75)
+}
+
+a.tag1:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag1:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag2 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 11px
+}
+
+a.tag2:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag2:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag3 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 12px
+}
+
+a.tag3:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag3:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag4 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 13px
+}
+
+a.tag4:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag4:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag5 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 14px
+}
+
+a.tag5:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag5:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag6 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 10px;
+	font-weight: bold;
+}
+
+a.tag6:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag6:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag7 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 11px;
+	font-weight: bold;
+}
+
+a.tag7:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag7:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag8 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 12px;
+	font-weight: bold;
+}
+
+a.tag8:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag8:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag9 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 13px;
+	font-weight: bold;
+}
+
+a.tag9:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag9:hover {
+	color: rgb(105, 105, 105)
+}
+
+a.tag10 {
+	text-decoration: none;
+	color: rgb(75, 75, 75);
+	font-size: 14px
+}
+
+a.tag10:visited {
+	color: rgb(75, 75, 75)
+}
+
+a.tag11:hover {
+	color: rgb(105, 105, 105)
+}
+
+div.tags-menu p.more-tags,div.public-content p.more-group {
+	font-size: 12px;
+	text-align: center
+}
+
+/******************************************************************************/
+	/* SECTION 3 - SPECIFIC CLASSES FOR LAYOUT #1 (With navigation, with sidebar )*/
+	/******************************************************************************/
+.public-content {
+	width: 410px;
+	min-height: 500px;
+	margin: 0px 0px 0px 0px;
+	padding: 0px 180px 10px 180px;
+	color: rgb(75, 75, 75);
+	font-size: 10px;
+}
+
+.public-content h2 {
+	margin: 10px 0px;
+}
+
+.public-content h1+h2 {
+	margin: 5px 0px 10px;
+}
+
+.public-content p {
+	font-size: 120%
+}
+
+div.group-info img.group-avatar {
+	width: 90px;
+	height: 60px;
+	float: left;
+	margin-right: 5px;
+	margin-bottom: 5px;
+	border: 1px dashed gray;
+}
+
+div.group-info div.description{
+	/* Should be rougly img.group-avatar height */
+	min-height: 60px;
+}
+
+div.group-info span.groupname {
+	font-weight: bold;
+}
+
+div.group-info span.owner {
+	font-style: italic;
+}
+
+p.tags a {
+	border-bottom: 1px dotted;
+	text-decoration: none;
+}
+
+.content1-container {
+	clear: both;
+	float: left;
+	width: 408px;
+	margin: 0px 0px 15px 0px;
+	padding: 0px;
+}
+
+.content1-container-1col {
+	overflow: hidden;
+	width: 408px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-1col-txtright-200px {
+	float: right;
+	width: 196px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-1col-txtright-160px {
+	float: right;
+	width: 236px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-1col-txtright-120px {
+	float: right;
+	width: 276px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-1col-txtright-100px {
+	float: right;
+	width: 296px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-1col-txtright-80px {
+	float: right;
+	width: 316px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-1col-txtright-60px {
+	float: right;
+	width: 336px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-1col-txtright-40px {
+	float: right;
+	width: 356px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-2col-left {
+	overflow: hidden;
+	float: left;
+	width: 191px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-2col-right {
+	overflow: hidden;
+	float: right;
+	width: 191px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-2col-txtright-100px {
+	float: right;
+	width: 79px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-2col-txtright-80px {
+	float: right;
+	width: 99px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-2col-txtright-60px {
+	float: right;
+	width: 119px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-2col-txtright-40px {
+	float: right;
+	width: 139px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-2col-txtright-20px {
+	float: right;
+	width: 159px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-3col-left {
+	overflow: hidden;
+	float: left;
+	width: 119px;
+	margin: 0px 25px 0px 0px;
+	padding: 0px;
+}
+
+.content1-container-3col-middle {
+	overflow: hidden;
+	float: left;
+	width: 119px;;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-3col-right {
+	overflow: hidden;
+	float: right;
+	width: 119px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-3col-txtright-60px {
+	float: right;
+	width: 47px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-3col-txtright-40px {
+	float: right;
+	width: 67px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-3col-txtright-20px {
+	float: right;
+	width: 87px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-container-3col-txtright-10px {
+	float: right;
+	width: 97px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content1-pagetitle {
+	overflow: hidden;
+	width: 408px;
+	margin: 0px 0px 10px 0px;
+	padding: 0px 0px 2px 0px;
+	border-bottom: solid 3px rgb(88, 144, 168);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 180%;
+}
+
+/******************************************************/
+	/* SECTION 4 - SPECIFIC CLASSES FOR LAYOUTS #2 and #3 */
+	/******************************************************/
+.content2 {
+	width: 580px;
+	margin: 0px 0px 0px 0px;
+	padding: 0px 10px 10px 180px;
+	color: rgb(75, 75, 75);
+	font-size: 10px;
+}
+
+.content-login {
+	width: 569px;
+	min-height: 300px;
+	margin: 0px auto 10px auto;
+	color: rgb(75, 75, 75);
+}
+
+.content3 {
+	float: left;
+	width: 590px;
+	min-height: 500px;
+	margin: 0px;
+	padding: 0px 0px 0px 20px;
+	color: rgb(75, 75, 75);
+	font-size: 10px;
+}
+
+.content2-container,.content3-container {
+	clear: both;
+	float: left;
+	width: 569px;
+	margin: 0px 0px 15px 0px;
+	padding: 0px;
+}
+
+.content2-container-1col,.content3-container-1col {
+	overflow: hidden;
+	width: 569px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-1col-txtright-200px,.content3-container-1col-txtright-200px
+	{
+	float: right;
+	width: 357px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-1col-txtright-160px,.content3-container-1col-txtright-160px
+	{
+	float: right;
+	width: 397px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-1col-txtright-120px,.content3-container-1col-txtright-120px
+	{
+	float: right;
+	width: 437px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-1col-txtright-100px,.content3-container-1col-txtright-100px
+	{
+	float: right;
+	width: 457px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-1col-txtright-80px,.content3-container-1col-txtright-80px
+	{
+	float: right;
+	width: 477px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-1col-txtright-60px,.content3-container-1col-txtright-60px
+	{
+	float: right;
+	width: 497px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-1col-txtright-40px,.content3-container-1col-txtright-40px
+	{
+	float: right;
+	width: 517px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-2col-left,.content3-container-2col-left {
+	overflow: hidden;
+	float: left;
+	width: 272px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-2col-right,.content3-container-2col-right {
+	overflow: hidden;
+	float: right;
+	width: 272px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-2col-txtright-100px,.content3-container-2col-txtright-100px
+	{
+	float: right;
+	width: 160px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-2col-txtright-80px,.content3-container-2col-txtright-80px
+	{
+	float: right;
+	width: 180px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-2col-txtright-60px,.content3-container-2col-txtright-60px
+	{
+	float: right;
+	width: 200px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-2col-txtright-40px,.content3-container-2col-txtright-40px
+	{
+	float: right;
+	width: 220px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-2col-txtright-20px,.content3-container-2col-txtright-20px
+	{
+	float: right;
+	width: 240px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-3col-left,.content3-container-3col-left {
+	overflow: hidden;
+	float: left;
+	width: 173px;
+	margin: 0px 25px 0px 0px;
+	padding: 0px;
+}
+
+.content2-container-3col-middle,.content3-container-3col-middle {
+	overflow: hidden;
+	float: left;
+	width: 173px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-3col-right,.content3-container-3col-right {
+	overflow: hidden;
+	float: right;
+	width: 173px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-3col-txtright-60px,.content3-container-3col-txtright-60px
+	{
+	overflow: hidden;
+	float: right;
+	width: 101px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-3col-txtright-40px,.content3-container-3col-txtright-40px
+	{
+	overflow: hidden;
+	float: right;
+	width: 121px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-3col-txtright-20px,.content3-container-3col-txtright-20px
+	{
+	overflow: hidden;
+	float: right;
+	width: 141px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.content2-container-3col-txtright-10px,.content3-container-3col-txtright-10px
+	{
+	overflow: hidden;
+	float: right;
+	width: 151px;
+	margin: 0px;
+	padding: 0px;
+}
+
+/*********************************/ /* SECTION 6 - COMMON PARAMETERS */
+	/*********************************/ /*--------------------*/
+	/* 6.1 - Content Area */ /*--------------------*/
+	/* Titles and textboxes*/
+h1 {
+	overflow: hidden;
+	margin: 0px 0px 10px 0px;
+	padding: 0px 0px 2px 0px;
+	border-bottom: solid 3px rgb(88, 144, 168);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 180%;
+}
+
+h1 a {
+	color: rgb(75, 75, 75);
+	text-decoration: none;
+}
+
+h2 {
+	margin: 0px;
+	margin-bottom: 5px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 160%;
+}
+
+h3 {
+	margin: 0px;
+	margin-bottom: 5px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 140%;
+}
+
+h4 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 120%;
+}
+
+p.subtitle {
+	margin: 0px;
+	padding: 0px 10px 3px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 110%;
+}
+
+.content-login h1 {
+	overflow: hidden;;
+	text-align: center;
+	margin: 0px 0px 10px 0px;
+	padding: 0px 0px 2px 0px;
+	font-weight: bold;
+	font-size: 200%;;
+	border: none;
+}
+
+.content-login h1 a:hover {
+	color: rgb(0, 0, 0);
+	text-decoration: none;
+}
+
+.content-login label {
+	display: block;;
+	float: left;;
+	width: 150px;
+}
+
+.content-login form#loginForm {
+	width: 410px;
+	margin: 0 auto 0 auto;
+}
+
+.content-login p#psubscribe,.content-login p#plostpass,.content-login p#pinfo,.content-login p#ppublic
+	{
+	text-align: center
+}
+
+/*----------------*/ /* - Forms        */ /*----------------*/
+input,textarea,select,button {
+	margin: 0px;
+	background-color: rgb(235, 235, 235);
+	color: rgb(30, 30, 30);
+	border: 1px solid rgb(150, 150, 150);;
+	font-size: 12px;
+}
+
+input:focus,textarea:focus,select:focus {
+	border: 1px solid rgb(120, 120, 120);;
+	background-color: rgb(225, 225, 225);;
+	color: rgb(0, 0, 0);
+}
+
+input [type="text"],input [type="password"] {
+	width: 250px
+}
+
+p.submit {
+	text-align: center
+}
+
+input [type="submit"],button,input [type="button"] {
+	background-color: rgb(210, 210, 210);
+}
+
+.content2 textarea {
+	width: 500px;
+	height: 200px;
+}
+
+.public-content textarea {
+	width: 400px;
+	height: 150px;
+}
+
+label {
+	display: block;
+	margin-bottom: 0.2em;
+	position: relative;
+	font-size: 12px;
+}
+
+.vhffs-tool-tip {
+	top: 0px;
+	display: block;
+	position: absolute;;
+	border: 1px solid rgb(150, 150, 150);
+	background-color: rgb(240, 240, 240);
+	z-index: 10;
+	left: 3em;;
+	max-width: 250px;
+}
+
+div.info {
+	position: absolute;
+	top: 0px;
+	visibility: hidden;
+	border: 1px solid rgb(150, 150, 150);
+	background-color: rgb(240, 240, 240);
+	max-width: 500px;
+	min-height: 50px;;
+	font-size: 12px;;
+	z-index: 200
+}
+
+div.infoCentered {
+	left: 50%;
+	margin-left: -160px;
+}
+
+div.info div.content {
+	padding: 10px 10px 1px 10px;
+}
+
+div.info div.content ul {
+	font-size: 12px
+}
+
+div.info div.content p.info {
+	font-style: italic;
+}
+
+div.info div.title {
+	padding: 0 14px 0 0;;
+	margin: 0;
+	border-bottom: 1px solid rgb(150, 150, 150);
+	background-color: rgb(220, 220, 220);
+	text-align: center;
+	line-height: 16px;
+}
+
+div.info div.content textarea {
+	width: 100%;
+}
+
+div.info div.toolbar {
+	text-align: center;
+	padding: 0px 0px 5px 0px;
+}
+
+div.info img.closeButton {
+	position: absolute;
+	z-index: 500;
+	top: 2px;
+	right: 2px;
+}
+
+div#moderationInfo textarea {
+	height: 150px
+}
+
+div#fieldHelp {
+	float: right;
+	margin-right: 30px;;
+	visibility: hidden;;
+	border: 1px solid rgb(150, 150, 150);
+	background-color: rgb(240, 240, 240);;
+	width: 250px;
+}
+
+div#fieldHelp div#fieldHelpTitle {
+	font-weight: bold
+}
+
+input+span.tooltip {
+	font-weight: bold;
+}
+
+.content-title-noshade-size1 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 130%;
+}
+
+.content-title-noshade-size2 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 150%;
+}
+
+.content-title-noshade-size3 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 160%;
+}
+
+.content-title-noshade-size4 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 180%;
+}
+
+.content-title-noshade-size5 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 200%;
+}
+
+.content-title-shade-size1 {
+	margin: 0px;
+	padding: 0px 10px 0px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(100, 100, 100);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 130%;
+}
+
+.content-title-shade-size2 {
+	margin: 0px;
+	padding: 0px 10px 0px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 150%;
+}
+
+.content-title-shade-size3 {
+	margin: 0px;
+	padding: 0px 10px 0px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 160%;
+}
+
+.content-title-shade-size4 {
+	margin: 0px;
+	padding: 0px 10px 0px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 180%;
+}
+
+.content-title-shade-size5 {
+	margin: 0px;
+	padding: 0px 10px 0px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 200%;
+}
+
+.content-subtitle-noshade-size1 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 110%;
+}
+
+.content-subtitle-noshade-size2 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 120%;
+}
+
+.content-subtitle-noshade-size3 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 130%;
+}
+
+.content-subtitle-noshade-size4 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 140%;
+}
+
+.content-subtitle-noshade-size5 {
+	margin: 0px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 150%;
+}
+
+.content-subtitle-shade-size1 {
+	margin: 0px;
+	padding: 0px 10px 3px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 110%;
+}
+
+.content-subtitle-shade-size2 {
+	margin: 0px;
+	padding: 0px 10px 3px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 120%;
+}
+
+.content-subtitle-shade-size3 {
+	margin: 0px;
+	padding: 0px 10px 3px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 130%;
+}
+
+.content-subtitle-shade-size4 {
+	margin: 0px;
+	padding: 0px 10px 3px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 140%;
+}
+
+.content-subtitle-shade-size5 {
+	margin: 0px;
+	padding: 0px 10px 3px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 150%;
+}
+
+.content-txtbox-noshade {
+	margin: 0px;
+	padding: 7px 0px 0px 0px;
+	background-color: rgb(255, 255, 255);
+}
+
+.content-txtbox-shade {
+	margin: 0px;
+	padding: 7px 10px 5px 10px;
+	background-color: rgb(235, 235, 235);
+}
+
+hr {
+	color: rgb(200, 200, 200);
+	background-color: rgb(200, 200, 200);
+	height: 1px;
+	margin: 0px 0px 15px 0px;;
+	border: 0;;
+	width: 569px
+}
+
+/* Paragraphs */
+p {
+	margin: 0px 0px 0.5em 0px;
+	padding: 0px;
+	line-height: 1.3em;
+	font-family: arial, sans serif;
+}
+
+p.readmore {
+	margin: 1.0em 0px 0.5em 0px;
+	padding: 0px;
+	line-height: 1.2em;
+	font-size: 110%;
+}
+
+p.quote {
+	margin: 0em 30px 0.6em 30px;
+	line-height: 120%;
+	font-size: 120%;
+}
+
+p.embed {
+	float: left;
+	width: 120px;
+	margin: 7px 7px 5px 0px;
+	padding: 5px 5px 5px 5px;
+	background-color: rgb(238, 237, 249);
+	font-style: italic;
+	font-weight: bold;
+	line-height: 1.2em;
+	font-size: 140%;
+}
+
+p.embed-caption {
+	float: left;
+	margin: 5px 0px 0px 0px;
+	padding: 0px;
+	font-style: italic;
+	font-weight: normal;
+	line-height: 1.2em;
+	font-size: 70%;
+}
+
+/* Quote */
+p.quote {
+	clear: left;
+	margin: 0em 30px 0.6em 30px;
+	line-height: 120%;
+	font-size: 110%;
+}
+
+/* Embedded emphasis */
+.embed {
+	float: left;
+	width: 120px;
+	margin: 2px 7px 2px 0px;
+	padding: 5px 5px 5px 5px;
+	background-color: rgb(238, 237, 249);
+	font-style: italic;
+	font-weight: bold;
+	line-height: 1.2em;
+	font-size: 140%;
+}
+
+.embed-caption {
+	float: left;
+	margin: 5px 0px 0px 0px;
+	padding: 0px;
+	font-style: italic;
+	font-weight: normal;
+	line-height: 1.2em;
+	font-size: 70%;
+}
+
+/* Lists */
+ul {
+	margin: 0px 0px 7px 15px;
+	padding: 0px 0px 0px 15px;
+	font-family: arial;
+	font-size: 120%;
+}
+
+ul li {
+	list-style-image: url('img/bullet.png');
+}
+
+.public-content ul li p {
+	font-size: 12px
+}
+
+.public-content a.webarea-link {
+	text-decoration: none;
+	font-weight: bold
+}
+
+ol {
+	margin: 0px 0px 0px 9px;
+	padding: 0px 0px 0px 25px;
+	list-style-type: decimal;
+	list-style-position: outside;
+	font-size: 120%;
+}
+
+ul.linklist-noindent {
+	margin: -0.3em 0px 0.5em 0px;
+	padding: 0px;
+	list-style-type: none;
+	line-height: 1.2em;
+	font-size: 120%;
+}
+
+ul.linklist-indent {
+	margin: -0.3em 0px 0.5em 0px;
+	padding: 0px 0px 0px 10px;
+	list-style-type: none;
+	line-height: 1.2em;
+	font-size: 120%;
+}
+
+/* Tables */
+table {
+	border: solid 1px rgb(150, 150, 150);
+	empty-cells: show;
+	border-collapse: collapse;
+	background-color: rgb(233, 232, 244);
+}
+
+table tr {
+	margin: 0px;
+	padding: 0px;
+}
+
+table td {
+	padding: 2px 7px 2px 7px;
+	border: solid 1px rgb(150, 150, 150);
+	text-align: left;
+	font-size: 120%;
+}
+
+table th {
+	margin: 0px;
+	padding: 2px 7px 2px 7px;
+	border: solid 1px rgb(150, 150, 150);
+	empty-cells: show;
+	text-align: left;
+	font-size: 120%;
+}
+
+table.moderation th {
+	border: none;
+	border-bottom: solid 1px rgb(150, 150, 150);
+}
+
+table.moderation td {
+	border: none;
+}
+
+table.moderation tr.buttons td {
+	text-align: center;
+	border-bottom: solid 1px rgb(150, 150, 150);;
+	padding-bottom: 5px
+}
+
+table.moderation tr.buttons td input {
+	font-size: 11px;
+}
+
+/* Images */
+.img-left-noborder-notopmargin {
+	float: left;
+	margin: 0px 10px 0px 0px;
+}
+
+.img-left-noborder-topmargin {
+	float: left;
+	margin: 3px 10px 0px 0px;
+}
+
+.img-left-border-notopmargin {
+	float: left;
+	margin: 0px 10px 0px 0px;
+	border: solid 1px rgb(150, 150, 150);
+}
+
+.img-left-border-topmargin {
+	float: left;
+	margin: 3px 10px 0px 0px;
+	border: solid 1px rgb(150, 150, 150);
+}
+
+.img-right-noborder-notopmargin {
+	float: right;
+	margin: 0px 0px 0px 10px;
+}
+
+.img-right-noborder-topmargin {
+	float: right;
+	margin: 3px 0px 0px 10px;
+}
+
+.img-right-border-notopmargin {
+	float: right;
+	margin: 0px 0px 0px 10px;
+	border: solid 1px rgb(150, 150, 150);
+}
+
+.img-right-border-topmargin {
+	float: right;
+	margin: 3px 0px 0px 10px;
+	border: solid 1px rgb(150, 150, 150);
+}
+
+/*--------------------*/ /* 6.2 - Sidebar Area */
+	/*--------------------*/
+.sidebar {
+	overflow: hidden;
+	float: right;
+	width: 160px;
+	min-height: 500px;
+	margin: 0px;
+	padding: 0px 0px 10px 0px;
+	text-align: left;
+	color: rgb(75, 75, 75);
+}
+
+.sidebar-maintitle {
+	margin: 0px 0px 10px 0px;
+	padding: 3px 10px 2px 10px;
+	background-color: rgb(156, 186, 214);
+	color: rgb(255, 255, 255);
+	text-transform: uppercase;
+	font-weight: bold;
+	font-size: 120%;
+}
+
+.sidebar-title-noshade {
+	margin: 0px;
+	padding: 2px 10px 3px 10px;
+	border-top: solid 1px rgb(215, 215, 215);
+	color: rgb(75, 75, 75);
+	font-weight: bold;
+	font-size: 120%;
+}
+
+.sidebar-title-shade {
+	margin: 0px;
+	padding: 2px 10px 3px 10px;
+	background-color: rgb(215, 215, 215);
+	color: rgb(75, 75, 75);
+	font-weight: bold;
+	font-size: 120%;
+}
+
+.sidebar-txtbox-noshade {
+	margin: 0px 0px 10px 0px;
+	padding: 2px 10px 3px 10px;
+}
+
+.sidebar-txtbox-shade {
+	margin: 0px 0px 10px 0px;
+	padding: 2px 10px 3px 10px;
+	background-color: rgb(235, 235, 235);
+}
+
+.sidebar-txtbox-noshade p {
+	margin: 0px 0px 5px 0px;
+	padding: 0px;
+	line-height: 1.25em;
+	font-size: 110%;
+}
+
+.sidebar-txtbox-shade p {
+	margin: 0px 0px 5px 0px;
+	padding: 0px;
+	line-height: 1.25em;
+	font-size: 110%;
+}
+
+/*--------------------*/ /* 6.3 - Footer Area  */
+	/*--------------------*/
+#footer {
+	overflow: hidden;
+	clear: both;
+	width: 770px;
+	height: 1.4em;
+	margin: 0px;
+	padding: 0.5em 0px 0.5em 0px;
+	border-top: solid 1px rgb(125, 125, 125);
+	background-color: rgb(128, 161, 202);
+	color: rgb(255, 255, 255);
+	font-size: 10px;
+}
+
+#footer p {
+	margin: 0px;
+	padding: 0px;
+	text-align: center;
+	line-height: 1.3em;
+	font-size: 110%;
+}
+
+/*-------------------*/ /* 6.4 - Hyperlinks  */ /*-------------------*/
+a {
+	color: rgb(75, 75, 75);
+	text-decoration: underline;
+}
+
+a:hover {
+	color: rgb(0, 0, 0);
+	text-decoration: none;
+}
+
+a:visited {
+	color: rgb(150, 150, 150);
+}
+
+#footer a {
+	color: rgb(255, 255, 255);
+	text-decoration: underline;
+}
+
+#footer a:hover {
+	color: rgb(0, 0, 0);
+	text-decoration: none;
+}
+
+/*******************************/ /* SECTION 7 - GENERIC CLASSES */
+	/*******************************/ /*-----------------------------*/
+	/* 7.2 - Horizontal alignments */ /*-----------------------------*/
+.align-left {
+	text-align: left;
+}
+
+.align-right {
+	text-align: right;
+}
+
+.align-center {
+	text-align: center;
+}
+
+/*------------------*/ /* 7.3  Text colors */ /*------------------*/
+.txt-white {
+	color: rgb(255, 255, 255);
+}
+
+.txt-black {
+	color: rgb(0, 0, 0);
+}
+
+.txt-grey01 {
+	color: rgb(242, 242, 242);
+}
+
+.txt-grey02 {
+	color: rgb(230, 230, 230);
+}
+
+.txt-grey03 {
+	color: rgb(217, 217, 217);
+}
+
+.txt-grey04 {
+	color: rgb(204, 204, 204);
+}
+
+.txt-grey05 {
+	color: rgb(191, 191, 191);
+}
+
+.txt-grey06 {
+	color: rgb(178, 178, 178);
+}
+
+.txt-grey07 {
+	color: rgb(153, 153, 153);
+}
+
+.txt-grey08 {
+	color: rgb(127, 127, 127);
+}
+
+.txt-grey09 {
+	color: rgb(89, 89, 89);
+}
+
+.txt-grey10 {
+	color: rgb(51, 51, 51);
+}
+
+/*****************************/ /* SECTION 8 - MISCELLANEOUS */
+	/*****************************/
+.clear {
+	clear: both;
+}
+
+.hide {
+	display: none;
+}
+
+br {
+	clear: none;
+}
+
+/**************************/ /*        Login           */
+.page-container-login div.logo {
+	text-align: center;
+	margin-bottom: 20px
+}
+
+div#tagging-panel {
+	margin-top:5px;
+}
+
+div#tagging-panel h1 {
+	margin: 0px;
+	margin-bottom: 10px;
+	padding: 0px;
+	color: rgb(88, 144, 168);
+	font-weight: bold;
+	font-size: 140%;
+	border: none;
+}
+
+div#tagging-panel div.categories {
+	width: 285px;
+	margin-right: 5px;
+	float: left;
+}
+
+div#tagging-panel div.tags {
+	width: 285px;
+	margin-right: 5px;
+	float: right;
+}
+
+div#tagging-panel div.request {
+	clear:both;
+	padding-top:10px;
+}
+
+div#tagging-panel div.request label {
+	position:static;
+	float: none;
+	display:inline;
+	margin-right:5px;
+}
+


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/